添加uclinux程序,转自lumit 文档 相关faq

第一步:1. cd uClinux-dist2. cd user3. mkdir myapp4. cd myapp5. vi demo.c#include <stdlib.h>#include <stdio.h>int main(void){ printf(“Hello world! /n”); printf(“[lumit] – let us make it together /n”); printf(“——————–/n”); printf(“http://www.lumit.org/n”); return 0;}第2步:修改相关makefile1.vi MakefileEXEC = demoOBJS = demo.oall: $(EXEC)$(EXEC): $(OBJS) $(CC) $(LDFLAGS) -o $@ $(OBJS) $(LDLIBS)romfs: $(ROMFSINST) /bin/$(EXEC)clean: rm -f $(EXEC) *.elf *.gdb *.o2.vi uClinux-dist/user/Makefile,:set number 加行号在 324 行再添加一行 dir_$(CONFIG_USER_MYAPP_DEMO) += myapp324 # add by lumit325 dir_$(CONFIG_USER_MYAPP_DEMO) += myapp326第3步:修改相关 config.in 文件增添以下内容到文件最后#####################################################################mainmenu_option next_commentcomment ‘My New Application’bool ‘demo’ CONFIG_USER_MYAPP_DEMObool ‘app1’ CONFIG_USER_MYAPP_APP1bool ‘app2’ CONFIG_USER_MYAPP_APP2bool ‘app3’ CONFIG_USER_MYAPP_APP3comment “My New Application”endmenu#####################################################################第4步 重新编译内核make user_onlymake romfsmake make image第5步在>cd binbin>ls>demo就会出现hello world!为什么我的会出现 pid= 等的字符?相关FAQQ: 请问 uclinux 启动时最先执行哪一个程序文件中的代码?A: 如果是不压缩的内核,则执行 linux-2.4.x/arch/armnommu/kernel/head-armv.S 如果是压缩的内核,则先执行解压的程序 linux-2.4.x/arch/armnommu/boot/compressed/head.S当然,如果是其他的 arch ,应该可以依此类推。Q : 程序在 ram 中运行和在 rom 中运行有什么不同?A: 至少有以下这些情况是需要 ram 的 : 程序中定义了全局变量,并进行了赋值。 例如 int a; a = 1; 程序中进行了函数调用,使用了堆栈。 例如 function(); 在函数内部使用了局部变量,同样也会使用堆栈。 例如 void f() { int a = 5; } 程序中对某内存地址进行了写操作。例如 str r1, [r2]; *paddr = 1; 如果一个程序没有上面的这些,那么 rom 中也是可以跑的,比如点 led 的小汇Q: uclinux 中,与具体的 cpu 相关的代码都分布在哪几个目录中?A: 以 Samsung 4510B 为例,以下目录的相关文件比较重要。 芯片级 uClinux-Samsung/linux-2.4.x/arch/armnommu/mach-samsung/* 如何生成 image, romfs uClinux-Samsung/vendors/Samsung/4510B/makefile 串口驱动 uClinux-Samsung/linux-2.4.x/drivers/char/serial_samsung.c 头文件定义 uClinux-Samsung/linux-2.4.x/include/asm-armnommu/arch-samsungQ: 编译之后在 images 目录下生成的那些文件都是什么意思?A: 对于一些可能出现的文件,这里做一个解释: 这个文件是通过 tools/romfs-inst.sh 脚本,生成 romfs 目录及其romfs.img:下面的文件,然后通过 genromfs 程序打包成一个文件 romfs.img.romfs.img 既可以放在 flash 中,也可以放在 ram 中,但需要在编译内核时在 driver/block/blkmem.c 里指定地址,以便内核找到。linux.text: 编译后的内核中 text 段,一般放在 flash 中,只读。linux.data: 编译后的内核中 data,init 段,一般放在 sdram 中,读写。 上面三个文件顺序连接而生成的 = linux.text + linux.data + romfs.imgimage.bin:有的时候还会得到: 通常 image.rom 的文件大小要比 image.ram 小很多,这是因为 image.rom 是image.rom: 一个压缩过的内核,前面加上一个小的解压程序负责把内核解压后搬到指定位置。 这个文件可以直接烧进 flash 中,当然也可以在 ram 中运行。这个文件实际上 就是通常 linux 生成的 zImage 文件。 这个内核没有压缩过,而且必须在 ram 里运行。所以需要通过板子上的 bootloaderimage.ram: 将它下载到指定位置后开始执行。相对 image.rom 而言,从 ram 里启动内核,则 代码段和数据段都在 ram 里面。这个文件是编译生成的 elf 格式的 linux 内核,通过 arm-elf-objcopy 工具生成的二进制映像文件。可以这样形象的说: image.rom = gunzip program + gzipped(image.ram) 其实就是 uClinux 编译完成后的文件 images/romfs.img,可以看一下它就是一个boot.rom连接。Q: 在 make menuconfig 时读取的配置文件是什么?A: make menuconfig 是用的的配置文件主要有以下几个: vi config.in 主要是处理 top level config ,包括 vendor/product, linux-2.4.x 版本选择, Libc version,还有是否选择配置 Kernel Settings,Vendor/User Settings 等。 这个 config.in 文件是通过执行 config/mkconfig > config.in 脚本自动生成的。 ( 因此修改 config.in 不起作用哟! ) vi arch/armnommu/config.in 主要是处理和 kernel settings 相关的配置,比如 选择 cpu 类型,选择设备驱动, 文件系统支持,网络支持 等等。这些也是裁减内核最重要的配置文件。 可以修改 arch/armnommu/config.in 来调整 make menuconfig 时的选项设置。 vi config/config.in 主要是处理 Vendor/User Settings 相关的部分,也就是 romfs 中添加的应用程序, 可以修改 config/config.in 来改变相关的选项设置。 vi vendors/Samsung/4510B/config.linux-2.4.xQ: kernel 链接时用的 vmlinux.lds 是怎么得到的?A: vi linux-2.4.x/arch/armnommu/vmlinux-armv.lds.in 这个是原始文件, vi arch/armnommu/Makefile 在这里定义了如何通过 sed 命令生成 lds。 其实就是把 Makefile 里面定义的 TEXTADDR 替换到 lds.in 文件里。Q: kernel 链接时的起始地址 TEXTADDR 在哪里指定?A: vi arch/armnommu/Makefile 在相应的 ARCH 下找, 一般缺省的是 0xC0008000 。但不同的芯片会有不同的定义,例如 148 ifeq ($(CONFIG_ARCH_ATMEL),y) 149 TEXTADDR = 0x1000000 150 MACHINE = atmel 151 endif 166 ifeq ($(CONFIG_ARCH_SAMSUNG),y)

每一天都不可追回,所以更要珍惜每一寸光阴,

添加uclinux程序,转自lumit 文档 相关faq

相关文章:

你感兴趣的文章:

标签云: