首先在/uclinux-dist/usr中建立一个目录:hello,再在这个目录上添加自己的应用程序hello.c
(参考uClinux-dist/REAMDME)
1>在config/config.help中最后一行添加
CONFIG_PROP_HELLO_HELLO
THIS IS MY PROGRAM
2>在config/config.in中添加
mainmenu_option next_comment
comment 'User Application'
bool 'Hello' CONFIG_USER_HELLO
comment "User Application"
endmenu
###################################################################
3>在user/makefile中添加一行:
dir_$(CONFIG_USER_HELLO_HELLO) += hello
4>在user/hello/目录下添加一个makefile文件:
EXEC = hello
OBJS = hello.o
all: $(EXEC)
//在这里要注意,每行开头不能以空格开头,而要以TAB键开始
$(EXEC): $(OBJS)
$(CC) $(LDFLAGS) -o $@ $(OBJS) $(LDLIBS)
romfs:
$(ROMFSINST) /bin/$(EXEC)
clean:
-rm -f $(EXEC) *.elf *.gdb *.o
注意这里的Makefile在转行对齐时一定要用Tab键,否则编译的时候会出错,我刚入门时就被这个地方绊了很久。
如果在uClinux中让自己的应用程序在内核启动的时候自动运行 <script src="http://blog.csdn.net/count.aspx?ID=1775182&Type=Rank" type="text/javascript"></script>
仍然以已经编译成功的例子--hello(具体内容可以参阅前面的文章)来说明这个过程.也就是假设程序已经编译好了!(hello的编译过程可以参看http://www.itsn.cn/bbs/dispbbs.asp?boardID=2&ID=1&page=1中第7个问题)
在网上搜索了一些相关内容,都提到了如果想实现程序自启动,需要修改一个etc/rc文件的内容.这个文件大家都不陌生,就是一个负责启动或运行级别变化的脚本文件.但uClinux-dist目录下并没有etc这个目录,所以定位rc文件的位置成了关键.
最开始我找到了uClinux-dist/romfs/etc/rc这个文件,并在文件的最后添加了一行:
/bin/hello --也就是编译好的可执行文件
保存,重新编译uClinux,并不需要从头开始编译
只需执行下面的4步就可以了.
make user_only
make romfs
make image
make
之后下载uClinux的镜象到ITSN的开发板中,重新启动.
但是结果让我很失望,程序并没有自动运行起来,分析一下原因,我错误的以为是由于没有重新编译内核的原因,所以我重新编译了一次(重头开始),步骤如下:
make mrproper
make menuconfig
make clean
make lib_only
make user_only
make romfs
make image
make
这些过程都是按照ITSN上的说明来做的.
可是结果还是一样让人失望.
冷静下来仔细分析,编译的时候执行了make romfs,也就是说romfs目录中的内容应该是根据其他文件的内容生成的,并用于下载到开发板中的镜象文件的源代码,这样说来,它的内容是不能直接修改的,为了验证我的想法,我又打开了这个rc文件,果然,刚才的改动已经自动消失了.
我又开始在uclinux-dist目录下搜索可能的rc文件,发现了uClinux- dist/vendors/Samsung/44B0/rc这个文件(vendors目录下保存的是所有厂商和产品的备选),由于在设置内核的时候使用的就是44B0这个选项,猜想大概就是它了,增加一行:
/bin/hello
保存并编译,也是只执行了后4步.
重新启动,竟然ok了!
超级终端上显示出"hello andy"
===================================
/*
*file:led1.c
*description:make the led flash 10 times,
* the ITSN_44b0 board is used for this program
*use this command to compile: arm-elf-gcc -elf2flt -o led1 led1.c
*Date:2007/10/13
*Author:m_pzhang@163.com
*/
#include <stdio.h>
#define PCONC (*(volatile unsigned *)0x01D20010)
#define PDATC (*(volatile unsigned *)0x01D20014)
main()
{ int i = 0;
PCONC&=0XF05FF55;
for(i=10;i>0;i--)
{
printf("led light/n");
PDATC &= ~(0x1<<1);
sleep(1);
printf("led unlight/n");
PDATC |=0x1<<1;
sleep(1);
}
exit(0);
}
一、快速添加
1
复制可执行文件到文件系统 romfs目录是生成的文件系统目录,在执行make romfs命令时生
成,如果已经执行过make romfs命令,用户可将生成的可执行文件led复制到romfs/bin目录
,不必重复该命令。需要注意的是如果用户执行了make clean命令,romfs下的全部内容将
被清除。
2
执行make image
执行make
例如将程序led1添加进uclinux
二、标准添加方法(待续)
三、让程序开机自动运行(已测试通过)
向uClinux- dist/vendors/Samsung/44B0/rc添加
/bin/led1
而不是在uClinux- dist/romfs/etc/rc中添加
实验发现:编译后uClinux- dist/romfs/etc/rc将被uClinux-
dist/vendors/Samsung/44B0/rc覆盖(make romfs 时)
执行
make user_only
make romfs
make image
make
=======================================
========================================
========================================
文中所用的路径为uclinux 安装的相对路径, 比如: /uClinux-Samsung)编译uclinux 并运行成功后, 下一步的工作就是写个最经典、最简单的程序“ hello, world” 。
在uclinux下, 当然要比在普通的OS下麻烦些。( 我用的是ANYWHERE-Ⅱ 开发板, 不同的开发板的过程应相似)我基本是按照 Documentation/Adding-User-Apps-HOWTO 的步骤进行, 有部分修改。
1、在user 目录下创建新目录 user/sample, 用来存放源代码。写“ hello.c” 文件。( “ hello.c” 文件如何写,不用我说了吧。)
2、编辑文件 user/Makefile,
增加下面这行 dir_$(CONFIG_USER_SAMPLE_HELLO) += sample
具体增加到哪里, 你打开文件就会发现相似的语句, 按照字母顺序, 放到合适的位置。
$(CONFIG_USER_SAMPLE_HELLO)是一个变量,如果在配置用户应用程序时选择此程序那么它的值将是y,反之为n。在下一步中有更详细的介绍。这一行的意思是如果配置此程序,则将第一步新建的目录(即sample)添加到dir_y变量中,稍后进入dir_y变量里的各个目录进行编译。
3、编辑文件 config/Configure.help,
增加下行
CONFIG_USER_SAMPLE_HELLO
A example C program. This Program print "hello, world" on screen.
注意: 第2行以2个空格开头, 总长度小于70 个字符。
4、编辑文件 config/config.in
在 ‘ Games’ 后添加新的部分
##################################################
mainmenu_option next_comment
comment 'Sample'
bool 'hello' CONFIG_USER_SAMPLE_HELLO
endmenu
( 注意这里的单引号字符不对, 不要直接COPY这里的字符, 最好自己手工输入, 或参考文件中已有的行修改。)
第一句表示下面将是一个菜单,
第二句表示菜单名称是 Sample,
第三句是一个选项,名字是hello,由变量CONFIG_USER_MYAPP保存这个选现的值,y或n。
第四句表示菜单结束。
以上各步完成后,在用make menuconfig配置用户程序时即可见到最后有个 Sample,将焦点调到此选项上,回车就进入了哪个菜单,只有一项hello,按空格选中,按两次ESC保存配置退出即可。
若想在系统启动时运行此程序,则需要编辑vendors/Samsung/44B0/rc,在最后一行添加此程序编译后的名字即可(如hello)。此文件编译后会被放在目标系统的/etc目录下。此rc文件实际上是一个shell脚本,在系统启动后会自动执行。因为myapp编译后会放在目标系统 /bin目录下,此目录已包含在系统路径中,所以在rc文件中写入hello系统会找到它并运行。
##################################################
5、创建合适的 user/sample/Makefile 文件
HELLO = hello
HELLOOBJS = hello.o
all: $(HELLO)
$(HELLO): $(HELLOOBJS)
$(CC) $(LDFLAGS) -o $@ $(HELLOOBJS) $(LDLIBS)
romfs:
["$(CONFIG_USER_SAMPLE_HELLO)" != y] || cp hello $(ROMFSDIR)/bin/.
clean:
-rm -f $(HELLO) *.elf *.gdb *.o
6、重新编译生成image.rom。注意在运行make config 或make menuconfig时选择生成"hello" 。
是否Makefile 文件中修改如下:
romfs:
["$(CONFIG_USER_SAMPLE_HELLO)" == y] || cp hello $(ROMFSDIR)/bin/.
是否能默认选择“ hello” , 我还未试。
7、烧写image.rom, 运行 >hello 即可看到输出“ hello, world"
8、完毕。
注意:GCC前必须要用[Tab],否则会出现错误:missing separator. Stop.