今天测试了其他项目,比如LTDC,LCD,USBOTG的两个,还了解到kconfig和linux的内核编译有一些关系,虽然我还没有试过编译内核。
先找一个例子吧。例如LTDC。
LTDC文件夹下有文档:
Configure and build
cd tools
./configure stm32f429i-disco/ltdc
cd ..
make
编译方法还是老样子。
编译下载
然后在串口的 NuttX Shell
中输入 help
便可以看到目前支持的指令以及编译好的APP:
已经编译好的APP有:
- ltdc
- nx
测试一下 ltdc
:
开发板屏幕开始播放一组测试程序
看起来还行。
就是没法停下来。。。
试试 nx
,出现了一堆窗口,看起来图形操作界面都可以啊。
这两个 apps
都在 aps/examples
下。分别为 ltdc
, nx
。
先来看看 ltdc
的文件夹吧。
总体来说分为两部分:一部分是代码,还有一部分是配置文件。这些配置文件在 apps/README
中有说明。
Example Built-In Application
An example application skeleton can be found under the examples/hello
sub-directory. This example shows how a builtin application can be added
to the project. One must:
- Create sub-directory as: appname
In this directory there should be:
- A
Make.defs
file that would be included by the apps/Makefile- A
Kconfig
file that would be used by the configuration tool (see the
file kconfig-language.txt in the NuttX tools repository). This
Kconfig file should be included by the apps/Kconfig file- A
Makefile
, and- The application source code.
The application source code should provide the entry point:
appname_main()
Set the requirements in the file: Makefile, specially the lines:
APPNAME = appname
PRIORITY = SCHED_PRIORITY_DEFAULT
STACKSIZE = 768
ASRCS = asm source file list as a.asm b.asm …
CSRCS = C source file list as foo1.c foo2.c ..The Make.defs file should include a line like:
ifeq ($(CONFIG_APPNAME),y)
CONFIGURED_APPS += appname
endif
这部分就是讲如何建立一个新的 app
。按照步骤操作一遍好了。就比方说 hello world
。
为了方便,直接把 hello world
的工程文件夹建在 example
里。
按照说明,需要创建文件 Make.defs
, Kconfig
和 Makefile
这三个文件。先从第一个开始,因为接触Linux的机会也不是很多,对于 vi 这个听起来很牛逼的编辑器并没有下功夫练习,所以直接用 nano 好了。。或许图形界面的 gedit 更好用一点。左边顺手打开 ltdc 的Make.defs
文件进行比对。
看起来关键段就是下面的类似 if
语句的代码了。在参照文档中所说的:
ifeq ($(CONFIG_APPNAME),y)
CONFIGURED_APPS += appname
endif
很容易就能写出
ifeq ($(CONFIG_EXAMPLES_Hello_TEST),y)
CONFIGURED_APPS += examples/hello_test
endif
再来是 Kconfig
文件。
文档当前部分说该部分的语法要到 tools/
文件夹下看。。先打开 ltdc
文件夹中的例子看一下。
先不看文档,分析一下。
很明显
#
:注释符。
config
:配置,感觉一直都在配置中。。。。
bool
:这个应该是显示在 menuconfig
中的选项栏的名称。
bool
:显示在 menuconfig
中的选项栏的名称,此外,此选项为开关选项。
default
:默认为否。编译时跳过。
depends on
:这个有点像自然语言啊,中间还有空格,这个不太确定,看起来可以依附在某个 config
下,待会看文档。
---help---
:就是帮助。
而且该文档有明显的格式规范,以 TAB
制表符来缩进。
看起来这个文件也很简单。赶快看看README.txt
.
.
.
文档开头部分就说明了如何配置:
这段是个例子,是在配置某个模块的某个版本 MODVERSIONS
而该版本是在该模块 MODULES
下,看样子分析的没错,下面还有一个更直观的:
这样一来就很明显了。所以新的 Kconfig
文件应该这样写:
好,下一个, Makefile
文件。
文档中说,该文件中要有:
APPNAME = appname
PRIORITY = SCHED_PRIORITY_DEFAULT
STACKSIZE = 768
ASRCS = asm source file list as a.asm b.asm …
CSRCS = C source file list as foo1.c foo2.c ..
好,把例子拿出来。
看起来有点不同啊。
多了一个 -include
和 include
先按照 README
文档来写。
(我有预感,这个可能不行。)
下面写 C 文件。
参考一下 example
中的 helloworld
在编辑时,我下载了 eclipse 来帮忙,导入工程后,发现意外的好用。
然后 make menuconfig
结果。。
果然,和我预想的一样,出现问题了。查看原因,是因为没有为例子创建 preconfig
的规则。
加上我怀疑缺失的 -include
和 include
。
然后make menuconfig
配置界面出现了,在 example
里寻找hello test。并用空格设置启用。
然后退出编译。
好吧,这里翻了个小错误。C 文件中的变量名没有按照规定起。
改成 hello_test_main
再试一下。
完成,出现了 nuttx.bin
。下载测试。
完全没有问题。就先到这里吧。