关于作者

用户名:SJTUBME
笔名:SJTUBME
地区:
行业:其他

日历  

快速登录

+ 用户名:
+ 密 码:

在线留言



访问统计:
文章个数:13
评论个数:6
留言条数:6




Powered by BlogDriver 2.1

ARM+ucLinux开发

 

文章

常用的tar和rpm命令参数列表

常用的tar和rpm命令参数列表
uClinuxer 于 2005年 01月12日 发表
一. tar
1.压缩一组文件为tar.gz后缀。
# tar cvf backup.tar /etc
#gzip -q backup.tar

# tar cvfz backup.tar.gz /etc/
2.释放一个后缀为tar.gz的文件。
#gunzip backup.tar.gz
#tar xvf backup.tar

# tar xvfz backup.tar.gz
3.用一个命令完成压缩
#tar cvf - /etc/ | gzip -qc > backup.tar.gz
4.用一个命令完成释放
# gunzip -c backup.tar.gz | tar xvf -
5.如何解开tar.Z的文件?
# tar xvfz backup.tar.Z

# uncompress backup.tar.Z
#tar xvf backup.tar
6.如何解开.tgz文件?
#gunzip backup.tgz
7.如何压缩和解压缩.bz2的包?
#bzip2 /etc/smb.conf
这将压缩文件smb.conf成smb.conf.bz2
#bunzip2 /etc/smb.conf.bz2
这将在当前目录下还原smb.conf.bz2为smb.conf
注: .bz2压缩格式不是很常用,你可以man bzip2

二. rpm
1.安装一个包
# rpm -ivh
2.升级一个包
# rpm -Uvh
3.移走一个包
# rpm -e
4.安装参数
--force 即使覆盖属于其它包的文件也强迫安装
--nodeps 如果该RPM包的安装依赖其它包,即使其它包没装,也强迫
安装。
5.查询一个包是否被安装
# rpm -q < rpm package name>
6.得到被安装的包的信息
# rpm -qi < rpm package name>
7.列出该包中有哪些文件
# rpm -ql < rpm package name>
8.列出服务器上的一个文件属于哪一个RPM包
#rpm -qf
9.可综合好几个参数一起用
# rpm -qil < rpm package name>
10.列出所有被安装的rpm package
# rpm -qa
11.列出一个未被安装进系统的RPM包文件中包含有哪些文件?
# rpm -qilp < rpm package name>


- 作者: SJTUBME 2005年01月17日, 星期一 19:02  回复(1) |  引用(0) 加入博采

Kelvin Chu 2004年12月20日 周三
Kelvin Chu 2004年12月20日 周三
今天着手做了用tftp传输文件以及改进“hello有点小错,原因不明,提示pid 19: failed 256”。
A.首先关于tftp文件传输,我们发现如果使用自己编写的bootloader,则无法正常使用网络ip协议,原因不明。
B.使用tftp需要:
1. 在母机上使用tftp server,设定本机地址192.192.192.10及端口69,保持监听
2. 在目标板使用如下格式登陆:
tftp –g –l /var/hello(一定要在var目录下才可写) –r hello(在tftp server文件夹下) 192.192.192.10(目标IP)
3. Chmod 777 hello (设定全写状态)
4. 使用./hello运行(./表示当前目录,不加则默认在/bin目录)
C.其次,我们发现在cygwin下编译的文件在板上运行出现了如下提示的错误:
BINFMT_FLAT: reloc outside program 0x1000000 (0 - 0x7064/0x5d80), killing hello!
BINFMT_FLAT: reloc outside program 0x1000000 (0 - 0x7064/0x5d80), killing hello
而在Linux下编译的程序则能非常顺利的运行,原因不明。
D.还解决了12月18日的hello程序的“提示pid 19: failed 256”问题,解决方法是跳出程序改为return(0)而不是return 1.
E.今天由于以上问题引出了ld的使用,这个东东是关于物理地址内存映射的,具体使用尚不明了。

- 作者: SJTUBME 2004年12月20日, 星期一 21:48  回复(0) |  引用(0) 加入博采

Kelvin Chu 2004年12月18日 周六

Kelvin Chu 2004年12月18日 周六

在实验室里机器上装了Redhat 9 ES, 并按照前两天摸索在Linux上编译的步骤,成功编译出可以正常运行的纯镜像686K+426.4K!

两天没睡了,发贴纪念!

紧接着做hello.c和example.c(fork)的实现:

两个都运行成功,但是hello.c有点小问题:

运行结果:
/bin> hello
Hello world!
pid 19: failed 256
/bin> example
in child
        child pid = 21
        child ppid = 20
in parent
        parent pid = 20
        parent ppid = 18

附:八、 uClinux应用程序开发
8.1 应用程序编写
8.1.1编写应用程序
 基于uClinux系统的应用程序的开发通常是在标准Linux平台上或者使用Cygwin的Windows平台用交叉编译工具来完成。
本章主要介绍如何编写、移植、编译应用程序并将应用程序添加到文件系统的过程。
uClinux针对没有内存管理单元(MMU)的处理器和控制器而设计的,部分标准C函数在标准Linux下可以使用而在uClinux下不能使用,需要用户编写相应的库函数,但是绝大多数的函数还是通用的。因此在x86版本的gcc编译器下编译通过的软件,通常不需要做太大的改动就可以编译成可以在uClinux上运行的文件格式。
 开发在uClinux 下运行的程序,基本上和开发在Linux下运行的程序是一样的,使用文本编辑器编写一个最简单的hello程序,代码如下:
 #include
 int main(void)
 { printf("Hello world!\n"); return 1; }
将其保存为hello.c文件,同时在/usr目录下面新建app目录作为应用程序的存放位置:
$:mkdir -p /usr/local/src/uclinux-dist/user/app 将hello.c拷贝到该目录下。

移植步骤
假定需移植Linux下源程序如example.c,确认编译生成的程序example能在Linux下正确执行。
$gcc -o example example.c $./example
按照移植注意事项改写源代码example.c,改写以后的文件命名为example_uc.c。
使用交叉编译工具编译example_uc.c,生成example_uc执行文件,下载到目标板上运行(下载方法见第九章)
如果出错则返回第二步。
编译命令如下:
$arm-elf-gcc -o example_uc example_uc.c -elf2flt

8.2 添加应用程序到文件系统中
将编写好的应用程序添加到文件系统中需要进行以下三个方面的工作。
 (1) 编写Makefile 编写此程序的工程管理文件Makefile,代码如下:
 GNUEXEC = hello
 OBJS = hello.o
 all: $(EXEC)
 $(EXEC): $(OBJS)
 $(CC) $(LDFLAGS) -o $@ $(OBJS) $(LDLIBS)
 romfs:
     $(ROMFSINST) /bin/$(EXEC)
 clean:
     -rm -f $(EXEC) *.elf *.gdb *.o

(2) 修改配置相关文件
 修改./config/config.in,在最后面增加菜单:
 ########################################################################
 mainmenu_option next_comment
 comment 'User Application'
 bool 'Hello' CONFIG_USER_HELLO
 comment "User Application"
 endmenu
########################################################################
或者在合适的菜单块中增加一行:
bool 'Hello' CONFIG_USER_HELLO
 修改 ./config/Configure.help,Configure.help包含配置时显示的描述文本,在文件中增加:
CONFIG_USER_HELLO This program print hello on screen.
注意描述文本必须缩进两空格,不能包括空行且必须少于70各字符

(3) 修改用户程序工程管理文件
 在 ../user/Makefile 中,增加行 dir_$(CONFIG_USER_HELLO) += app
 增加了用户工程目录到待编译工程目录列表,通常按照目录名称的字母顺序插入该行。

(4) 编译并执行
 执行命令
 make config
 make dep
 make lib_only
 make user_only
 make romfs
 make image
 make
 其中在make config命令中必须选择 hello!
如果修改了应用程序重新编译,从make user_only开始执行命令即可。
 用户在固化 uclinux 内核文件和romfs文件系统后,进入文件系统的bin目录执行hello应用程序。

8.3 快速添加应用程序
 上节所述增加应用程序以及编译执行的过程比较正式,但也比较繁琐,在用户开发调试时并不方便,用户可以采用下述方法在开发调试过程中快速添加应用程序。

  编译生成可执行文件 输入以下命令直接编译程序源代码文件,对于复杂一点的工程可以使用上节中的Makefile.

  arm-elf-gcc -Wall -O2 -Wl,-elf2flt -o led led.c
  生成的led是flat格式文件,可以在uClinux下直接运行。
  复制可执行文件到文件系统 romfs目录是生成的文件系统目录,在执行make romfs命令时生成,如果已经执行过make romfs命令,用户可将生成的可执行文件led复制到romfs/bin目录,不必重复该命令。需要注意的是如果用户执行了make clean命令,romfs下的全部内容将被清除。   生成文件系统映像 直接执行下面的命令生成文件系统映像romfs.img:
 genromfs -v -V "ROMdisk" -f romfs.img -d /usr/local/src/uclinux-s3cev40/romfs
 这里的文件系统映像romfs.img包含了新增的应用程序led。


- 作者: SJTUBME 2004年12月18日, 星期六 12:44  回复(3) |  引用(0) 加入博采

有用的地址(dd maple一齐来添加)
ARM开发网--如何在uClinux上写应用程序
http://www.cnarm.com/Article_Show.asp?ArticleID=22

uClinux内核代码:
http://www.uclinux.org/ports/coldfire/source.html上的Full Source Distribution

黄嘴企鹅论坛
http://www.linuxsir.org/bbs/

中国Linux公社
http://www.linuxfans.org/nuke/index.php
SKYEYE
http://www-900.ibm.com/developerworks/cn/linux/l-skyeye/part1/index.shtml#IDATFWNB

- 作者: SJTUBME 2004年12月18日, 星期六 01:39  回复(0) |  引用(0) 加入博采

基于ARM-μCLinux嵌入式系统启动引导的实现
摘要:介绍了ARM-μCLinux嵌入式系统的结构组成,重点分析了ARM--μCLinux嵌入式系统启动引导的过程实现该系统启动引导的技术难点,提出了一种有效的启动引导方案。

关键词:嵌入式系统 引导 ARM μCLinux

32位ARM嵌入式处理器具有高性能、低轼耗的特性,已被广泛应用于消费电子产品、无线通信和网络通信等领域。ΜCLinux是专门为无MMU处理器设计的嵌入式操作系统,支持ARM、Motorola等微处理器。目前国内外采用ARM-μCLinux作为嵌入式系统非常普遍。而嵌入式系统的启动引导技术是嵌入式系统开发的一个难点。系统启动引导的成功与否决定了应用程序的运行环境是否能正确构建,即系统启动成功是应用正确运行的前提。
摘要:介绍了ARM-μCLinux嵌入式系统的结构组成,重点分析了ARM--μCLinux嵌入式系统启动引导的过程实现该系统启动引导的技术难点,提出了一种有效的启动引导方案。

关键词:嵌入式系统 引导 ARM μCLinux

32位ARM嵌入式处理器具有高性能、低轼耗的特性,已被广泛应用于消费电子产品、无线通信和网络通信等领域。ΜCLinux是专门为无MMU处理器设计的嵌入式操作系统,支持ARM、Motorola等微处理器。目前国内外采用ARM-μCLinux作为嵌入式系统非常普遍。而嵌入式系统的启动引导技术是嵌入式系统开发的一个难点。系统启动引导的成功与否决定了应用程序的运行环境是否能正确构建,即系统启动成功是应用正确运行的前提。

常用的嵌入式系统启动方法是先通过JTAG将嵌入式操作系统内核与进Flash,再由其带的引导程序bootloader完成嵌放式系统的启动引导工作。这种方法要借助昂贵的JTAG设备完成操作系统内核的烧写工作,并且不能方便地更新嵌入式系统中的软件平台。本文提出一种基于ARM-μCLinux嵌入式系统的启动引导方案,不但可以通过简易的串口方便地更新嵌入式系统内的软件平台,而且成功解决了这种架构的嵌入式系统的启动、初始化、操作系统内核的固化和引导等问题。本文简略说明ARM-μCLinux嵌入式系统的硬件平台和软件平台;描述系统引导程序bootloader的设计,阐述设计时考虑的因素和需解决的技术难点,给出一套可行的引导程序流程;针对μCLinux内核的引导程序,说明μCLinux内核的加载和初始化过程。

1 系统组成

典型的ARM嵌入式系统硬件平台一般包括一个以ARM为内核的处理器、存储器和必要的外部接口与设备。在本系统中,采用内嵌ARM7TDMI的Samsung公司的S3C4510处理器,存储器使用2MB的Flash和16MB的SDRAM,外部接口除了用于下载和通信的串口,还配备了一个以太网接口,以支持S3C4510的网络功能。

软件平台由以下部分组成:系统引导程序、嵌入式操作系统内核、文件系统。系统引导程序通常也称为bootloader,代码量虽少,但是作用非常大,相当于PC上的BIOS,负责将操作系统内核固化到Flash中和系统初始化工作,然后将系统控制权交给操作系统。嵌入式操作系统内核是嵌入式系统加电运行后的管理平台,负责实时性任务和多任务的管理。ARM7TDMI是一款没有MMU的处理器,因此采用μCLinux作为本系统的操作系统内核。ΜCLinux是Linux是一个分支,专为无MMU的处理器设计,它继承了Linux强大的网络功能和多任务管理功能,并对内存管理和进程管理进行了改写,满足无MMU处理器的开发要求。文件系统是嵌入式系统软件平台占用存储量最大的一部分,也是与用户开发最相关的一部分。它存储了系统配置文件、系统程序、用户应用程序和必需的驱动程序。

软件平台固化在Flash中。通常根据软件平台的内容对Flash的地址空间进行分区,一般分三个区,分别丰放bootloader、μCLinux内核和文件系统。分区的方式一般有两种:一种是根据三个部分预定的存储空量,允许bootloader、内核和文件系统拥有自己固定的分区和首地址;另一种就是按照这三部分的实际分配区间,一个部分紧跟着另一个部分后存储,没有固定的分区和首地址。通常采用第一种方式,虽然可能会浪费一部分Flash空间,但是方便内核的加载和文件系统的挂载,同时也利于系统的调试和开发。而如果充分利用Flash的存储区间,节约成本,那么可采用第二种方式。

2 系统引导程序的设计

系统引导程序bootloader是嵌入式系统加电后执行的第一个程序,进行功能设计时首先要考虑以下问题:

(1)将μCLinux内核和文件系统固化在Flash中

目地μCLinux内核和文件系统固化在Flash的手段很多。主机可以通过JTAG口,将内核和文件系统的映像文件烧写到指定的Flash位置上;也可以通过以太网接口,将映像文件下载到Flash中;另外还可以通过串口烧写到Flash。前两种方法的下载速度比后一种方法快得多。在本系统中,采用串口烧写Flash。这是因为一方面配置一个串口方便且廉价,而JTAG烧写还要配置昂贵的JTAG仿真器和相关的驱动程序以及协议转换程序,网口下载还要有以太网支持;另一方面μCLinux默认通过串口打印其运行的信息,那么串口不但可以提供烧写Flash的功能,还可作为调试μCLinux内核的通道。

在本系统中,Flash在刚开始时,只存储了bootloader,还没有存储μCLinux内核和文件系统。因此bootloader在系统加电完成初始化工作后,要初始化一条链接主机和目标机的串口通道,并提供串口下载功能。

图1

(2)系统初始化

因为系统刚加电时,操作系统的内核还没有被加载,系统的初始化工作由bootloader完成。它主要是将系统、初始化存储系统、配置ARM各种模式下的数据栈、使能屏常中断、根据需要切换处理器模式和状态。

(3)μCLinux内核加载方式

固化在Flash中的μCLinux内核有两种运行方式:一种方式是直接在Flash中运行μCLinux自带的引导程序;另一种方式是将固化在Flash中的内核先拷贝到SDRAM的某一段地址区间,再从该段地址区间的首地址运行uCLinux内核。

第一种方式是bootloader进行系统初始化工作后,跳到内核固化在Flash中的首地址处,将控制权交给μCLinux,开始在Flash中逐句执行内核自带的引导程序,由该引导程序完成内核的加载工作。这种方式是目前很多嵌入式系统启动内核所采用的方式,也是本系统采用的内核加载方式。

第二种方式是bootloader完成系统初始化工作后,把内核的映像文件由Flash拷贝到SDRAM中,再从SDRAM中执行μCLinux内核的引导程序,加载μCLinux内核。

第二种加载方式在SDRAM中运行程序,因此执行速度比第一种方式快一些,并且可以通过RAM快速引导技术实现这种加载方式。其主要是针对NAND型Flash的情况。与NOR型Flash最大的不同点是:NOR型Flash使用内存随机读取技术,与SDRAM一样,可以直接执行存储在Flash中的程序;而NAND一样,可以直接内存随机读取技术,它是一次读取一整块内存,因此不能直接执行存储在NAND型Flash中的程序,必须把NAND型Flash中的程序先拷贝到SDRAM,再在SDRAM中执行该程序。但是NAND型Flash价格比NOR型Flash廉价,所以很多嵌入式系统还是采用NOR型Flash(几百K字节)+NAND型Flash(几兆字节)的存储模式。其中NOR型Flash存放可执行的且代码量小的bootloader和一些必要的数据,而NAND型Flash保存存储量较大的内核和文件系统。

在本系统中,由于采用NOR型Flash存储bootloader、内核和文件系统,所以可以直接访问内核所在地址区间的首地址,执行内核自己的引导程序,而且内核自带的引导程序功能强大,可以方便地内核的加载,向内核传递有关的硬件参数。本系统采用第一种加载方式。

(4)自举模式和内核启动模式的切换

Bootloader一般要实现两种启动模式:自举模式和内核启动模式。自举模式也称为bootstrap模式,该模式的主要作用是目标机通过串口与主机通信,可以接收主机发送过来的映像文件,例如内核、文件系统和应用程序,并将其固化在Flash中,也可以将Flash中的映像文件上传到主机。内核启动模式允许嵌入式系统加电启动后加载μCLinux内核,将系统交由μCLinux操作系统管理。

在本系统中,采用一个开关实现两种模式的切抽象。在系统的Flash中只有bootloader时,首先将开关拔上去,提示系统进入自举模式,加电启动后,bootloader根据开关的状态,进入自举模式,接收主机发送过来的内核和文件系统的映像文件。接着将开关拔下来,提示系统进入内核启动模式,再按链,bootloader根据此时的开关状态进入内核启动模式,加载内核和文件系统,由操作系统接管系统。以后也可以根据需要,设置开关的状态,以提示系统进入不同的启动模式。

(5)地址映射表的配置和重映射

地址映射表的配置包括设置Flash地址空间、SDRAM地址空间、外部I/O地址范围和处理器寄存器地址范围。ARM处理器加电后执行在地址0x0处的代码,因此在加电启动时,首先将存储了bootlader的Flash地址空间设置为0x0-0x200000,将SDRAM的地址空间设置为0x1000000-0x2000000,当内核引导程序将内核拷贝到SDRAM后,再设置SDRAM的地址空间为0x00x1000000,而Flash的地址空间为0x1800000-0x1A00000。这需要在内核引导程序中对Flash和SDRAM的地址空间进行重映射。

本文采用的系统启动引导方案流程图如图1。

3 μCLinux内核的加载和初始化

本启动方案中采用μCLinux自带的引导程序加载内核。该引导程序代码在linux/arch/armnommu/boot/compressed目录,其中Head.s的作用最关键,它完成了加载内核的大部分工作;Misc.c则提供加载内核所需要的子程序,其中解压内核的子程序是Head.s调用的重要程序,另外内核的加载还必须知道系统必要的硬件信息,该硬件信息在hardware.h中并被Head.s所引用。

当bootloader将控制权交给内核的引导程序时,第一个执行的程序就是Head.s。下面基于本系统介绍Head.s加载内核的主要过程。Head.s首先配置S3C4510的系统寄存器;再初始化S3C4510的ROM、RAM以及总线等控制寄存器,将Flash和SDRAM的地址范围分别设置为0x0-0x200000和0x1000000-0x2000000;接着将内核的映像文件从Flash拷贝到SDRAM,并将Flash和SDRAM的地址区间分别重映射为0x1800000-0x1A00000和0x0-0x1000000;然后调用Misc.c中的解压内核函数(decompress_kernel),对拷贝到SDRAM的内核映像文件进行解压缩;最后跳转到执行调用内核函数(call_kernel),将控制权交给解压后的μCLinux系统。

执行Call_kernel函数实际上是执行linux/init/main.c中的start_kernel函数,中包括处理器结构的初始化、中断的初始化、进程相关的初始化以及内存初始化等重要工作。

该启动引导方案实现了自举模式和内核启动模式以及两种模式的切换,使得开人员既可以采用自举模式方便地烧写Flash,更新嵌入式系统中的软件平台,又能够切换到内核启动模式,自动安全地启动系统;其次,本方案采用简易的串口通道作业主机与目标系统的通信渠道,既可以方便地将操作系统内核、文件系统和其他应用下载到目标系统中,又可以作为调试μCLinux内核和应用程序通道;此外针对ARM7TDMI的无MMU特性,采用修改后的μCLinux内核引导程序加载操作系统和初始化操作系统环境,解决内核加载的地址重映射问题和操作系统的内存管理问题。

- 作者: SJTUBME 2004年12月18日, 星期六 01:22  回复(0) |  引用(0) 加入博采

SkyEye 技术报告 Port uClinux on real hardware
SkyEye 技术报告 Port uClinux on real hardware
第 1 页 共 7 页
Port uClinux on real hardware
李明 lmcs00@mails.tsinghua.edu.cn
在 SkyEye 的仿真环境下,我们已经看到一个完整的 uClinux 内核和基于 romfs 文件
系统的 Shell 界面启动起来,我们也可以向其中添加自己的 helloworld 程序,没有问题.
但这一切工作都只是在一个软件仿真的环境下,离真正将 uClinux 移植到真实的硬件平台
上还有多远呢
SkyEye 技术报告 Port uClinux on real hardware
第 1 页 共 7 页
Port uClinux on real hardware
李明 lmcs00@mails.tsinghua.edu.cn
在 SkyEye 的仿真环境下,我们已经看到一个完整的 uClinux 内核和基于 romfs 文件
系统的 Shell 界面启动起来,我们也可以向其中添加自己的 helloworld 程序,没有问题.
但这一切工作都只是在一个软件仿真的环境下,离真正将 uClinux 移植到真实的硬件平台
上还有多远呢
今年四月份,我尝试了将 uClinux 移植到基于ARM7TDMI核的Evaluator-7T评估板上,
这是一款 ARM 公司推出的采用 Samsung 4510x微控制器的评估板.板上集成了最小核心
设备,预装了 Bootstrap Loader 和 Angle 等驻留模块,可以很方便地进行程序下载.但是,
由于该评估板仅仅是用于学习和实验,板上的 RAM 和 Flash 都只有512k,因此要将
uClinux 移植到 Evaluator-7T 评估板上,必须进行内核的裁减和定制.
这里我想把自己移植过程中的一些体会和心得写出来与大家一起交流,如果这篇文章对
正准备做类似移植和内核裁减的朋友有所帮助的话,那我将非常高兴.下面的内容主要分两
个部分,前面主要是介绍一些uClinux的基本概念和背景知识,后面则是针对 Evaluator-7T
所做的移植分析.大家也可以直接跳到后面看,没有关系. SkyEye 技术报告 Port uClinux on real hardware
第 1 页 共 7 页
Port uClinux on real hardware
李明 lmcs00@mails.tsinghua.edu.cn
在 SkyEye 的仿真环境下,我们已经看到一个完整的 uClinux 内核和基于 romfs 文件
系统的 Shell 界面启动起来,我们也可以向其中添加自己的 helloworld 程序,没有问题.
但这一切工作都只是在一个软件仿真的环境下,离真正将 uClinux 移植到真实的硬件平台
上还有多远呢
今年四月份,我尝试了将 uClinux 移植到基于ARM7TDMI核的Evaluator-7T评估板上,
这是一款 ARM 公司推出的采用 Samsung 4510x微控制器的评估板.板上集成了最小核心
设备,预装了 Bootstrap Loader 和 Angle 等驻留模块,可以很方便地进行程序下载.但是,
由于该评估板仅仅是用于学习和实验,板上的 RAM 和 Flash 都只有512k,因此要将
uClinux 移植到 Evaluator-7T 评估板上,必须进行内核的裁减和定制.
这里我想把自己移植过程中的一些体会和心得写出来与大家一起交流,如果这篇文章对
正准备做类似移植和内核裁减的朋友有所帮助的话,那我将非常高兴.下面的内容主要分两
个部分,前面主要是介绍一些uClinux的基本概念和背景知识,后面则是针对 Evaluator-7T
所做的移植分析.大家也可以直接跳到后面看,没有关系.
I. uClinux 的基本概念和背景知识
一,uClinux 概述
uClinux 是在 Linux kernel 2.0 之后出现的一个 Linux 的变种,它的目标是将 Linux
应用于没有内存管理单元(Memory Management Units)的处理器.uClinux 中u就是 Micro,
表示微,小的意思;C 就是 Control,即控制.因此可以说,uClinux是针对"微控制领域
而设计的Linux系统".
由于uClinux 是在 Linux 的基础之上添加了对没有 MMU 的微处理器的支持,所以它
一方面继承了 Linux 的大部分优点:例如稳定性,各种网络协议栈的支持以及不同类型的
文件系统支持等等,另一方面,它广泛地应用于嵌入式领域,内核精简(一般小于 512k),
并支持很多常用的嵌入式微控制器系列,例如 Motorola Dragon Ball,ColdFire,ARM7TDMI
( Atmel AT91x,Samsung S3C4510x)等.
与标准Linux操作系统相比,uClinux 最大的区别就在于内存管理.标准 Linux 是针对
有内存管理单元的处理器而设计的,使用虚拟存储器技术通过分页的方式来载入进程.这样
每个进程在其虚拟地址空间上相互独立,通过 MMU 实现从虚拟地址到物理地址的映射.
现代操作系统的内存管理大多采用这种方式,这种做法带来的好处有很多,比如:
1) 可以使用比实际物理内存大得多的内存空间,程序在运行时不必全部装入内存,只
加载需要的部分程序,这样既节省了内存空间,又缩短了程序启动的时间.
2) 可以运行重定位的程序,同时也可以使多个程序驻留在内存中.
SkyEye 技术报告 Port uClinux on real hardware
第 2 页 共 7 页
3) 可以方便地实现程序代码的共享.即多个进程共享程序的同一个副本.
4) 由于每个进程只在自己的虚拟地址空间上运行,通过 MMU 做虚拟地址->物理地
址的转换,进程的虚拟空间被映射到了不同的内存区域中,因而一个进程不能随意访问和修
改其他进程空间的内容,有利于不同进程之间的保护.
但是,在嵌入式领域 NOMMU 的处理器是相当普遍的,这是因为,一方面 MMU 在
处理器中会占用相当大比例的硅片面积,基于成本和尺寸的考虑,没有 MMU 会更适合于
嵌入式设备的应用;另一方面,当发生页面失效时,从磁盘加载进程的页面到内存中,会相
当消耗时间和处理器资源,这对系统工作的影响很大,容易带来不稳定的因素.
基于上述原因,uClinux 对 NOMMU 的处理器采用了实存储器管理策略(real memory
management).这样一个进程在执行前,系统必须为之分配足够的连续地址空间,然后全部
载入主存储器中.因为在嵌入式开发中,通常都是针对特定环境下的应用,所以这样的实现
也是可行的,从执行效率上讲也更会高一些.
uClinux 的官方网站是 http://www.uclinux.org ,基本上 uClinux 的发布是和 Linux 的
版本发布保持同步更新的.可以直接从主页上下载 uClinux 代码包和开发工具,也可以从
国内一些比较大的 FTP 上下载,例如 SkyEye 和 www.akaembed.org.在下载的同时,一
般需要将与之对应的 patch 文件也一起下载,大部分的内核都有与之对应的补丁文件.
目前最新支持的内核版本是 2003-5-1 发布的2.5.68 .
二,uClinux 的内核配置与裁减
uClinux 是一个可配置,可裁减的系统.和标准Linux 一样,它也是源码公开,使用者
可以自由修改,以便进行移植.同时,uClinux也大量采用了条件编译,通过条件编译,在
内核中选择需要的模块,去掉不必要的模块不参与编译,这样就能将内核的大小控制在一定
的范围内,以适合嵌入的需求.
在影响内核大小的因素中,有以下几个方面起比较重要的作用:
1) 选择的内核版本.一般 2.0 的内核会比 2.4 的内核小.
2) 是否选择网络支持.uClinux 支持的网络类型有ARCnet,Ethernet
10M/100M/1000M,Wireless LAN,Token Ring,WA N等.
3) 文件系统的支持类型.uClinux支持文件系统的类型包括 Ext2,ROM filesystem,
DOS FAT,JFFS,ISO 9660,/proc 等.
4) 设备驱动的支持.包括块设备驱动,字符设备驱动,USB设备,ISDN支持,SCSI
设备支持等等.
如何选择以上的这些内核功能支持,通常需要根据各自特定的需求和硬件情况做相应的
定制,不能一概而论.
除了可以在配置内核(make menuconfig)时对内核大小做裁减之外,还可以通过修改
参与链接模块的办法,来减少最终编入内核的模块数量.
上面的代码就是最终链接生成 linux 内核的所有模块,这里可酌情裁减.
SkyEye 技术报告 Port uClinux on real hardware
第 3 页 共 7 页
三,uClinux 的内核组成
通常,一个编译好的内核主要是由以下几个部分组成的:
1)初始化程序段 (init)
由内核中所有初始化程序的代码组成.这部分代码是用 __init 来定义,在内核初始化
结束后,它们所占的存储空间就会被释放以节省 RAM 资源.一般有 32k 左右.
2)数据段 (data)
由内核中所有含初始化值的全局变量,数据结构组成.因为这些数据都是在内核运行的
过程中被读写的变量,所以这个段必须放在 RAM 中,.一般有 50~100k 左右.
3)未初始化数据段 (bss)
由内核中所有未被初始化的全局变量,数据结构组成.这个段也必须放在 RAM 中,
但这个段中的变量只有地址和大小,没有初始值,在最后生成的二进制下载映像文件中并不
占用空间.这个段所对应的 RAM 区域通常在内核启动前用"0"值来初始化.一般在 RAM
中将会占用100k~150k 左右.
4)代码段 (text)
由内核中所有非初始化程序的代码组成.这个段是内核代码的主体部分,为了节省
RAM 空间,可以把它放到 ROM 中执行,这个段的大小通常为 300k 左右.
5)文件系统 (romfs)
romfs 是 uClinux 缺省使用的一种文件系统类型,它比较简单实用,支持 romfs 文件
系统的代码占用的RAM也比 Ext2 的小很多,非常适合嵌入式应用的需求.romfs 可以放
在 RAM 中,也可以放在 ROM 中,它的大小要视添加应用程序的多少而定,比较典型的
一个包含 init 和 sh 程序的 romfs 大小为80k左右.
配置内核的一个重要工作就是决定上述的各个内核组成模块在 RAM 或者 ROM 中的
地址.通常,init,data,bss和text的地址是由编译链接时的定位文件 vmlinux.lds 决定的,
在这个文件中定义了各个段的起始地址,而 romfs 的文件系统的地址是在 blkmem.c 文件
中给出的.通常要将 uClinux 移植到特定的硬件平台上,都会需要根据各自的情况对上述
文件做一定的修改.
四,uClinux 的下载映像文件
在编译成功之后,通常会在 images 目录下生成一些文件,这里简要解释如下:
文件名 含义
linux.text 编译后的内核中 text 段,一般放在 flash 中,只读.
linux.data 编译后的内核中 data,init 段,一般放在 sdram 中,读写.
romfs.img make romfs时通过 tools/romfs-inst.sh 脚本,生成 romfs/ 目录及其下面的文件,然后通过
genromfs 程序将 romfs/* 打包生成这个文件 romfs.img
image.bin 上面三个文件顺序连接而生成的 = linux.text + linux.data + romfs.img
image.rom 是一个压缩过的内核,前面加上一小段解压程序负责把内核解压后搬到指定位置.这个文件
实际上就是通常 linux 生成的 zImage 文件,可以直接烧进 flash 中运行,它可以形象的表
示成 image.rom = gunzip program + gzipped(image.ram)
image.ram 这个内核没有压缩过,而且必须在 ram 里运行,所以需要通过板子上的 bootloader将它下
载到指定位置后开始执行.相对 image.rom 而言,从 ram 里启动内核,则代码段和数据段
都在 ram 里.image.ram = linuex.text + linux.data
boot.rom 就是 uClinux 编译完成后的文件 images/romfs.img,它通常只是一个连接.
SkyEye 技术报告 Port uClinux on real hardware
第 4 页 共 7 页
II. uClinux 在 Evaluator-7T 上的移植
一,Evaluator-7T 介绍
在该评估板上主要集成了如下的器件:
Samsung KS32C50100 (4510x) 微控制器,
512K FLASH EEPROM boot ROM,
512K+ 32bit wide SRAM,
2 个 9-pin D-type RS232 连接器,
4 个LEDs ,1 个七段数码管,一个4 位 DIP 开关
Multi-ICE 连接器等.
该评估板的硬件结构如图所示:
这里可以看出, Evaluator-7T 是采用 Samsung 4510x 微处理器,与 4510B 非常接近.
基本可以采用 uClinux for Samsung4510 的移植.在移植前找到已有的和自己微处理器最接
近的移植版本,是非常重要的.如何判断所选择的移植版本是否适合,最好是看一看
linux-2.4.x/include/asm-armnommu/arch/hardware.h ,对照一下芯片的手册,检查这个头文件
里描述的寄存器地址和当前所用的微处理器的差别.
二,uClinux 的内核配置
在编译 uClinux 的内核之前,首先需要通过 make menuconfig 来配置内核.为了能够
使得最后生成的内核在 512k 的 RAM 中运行,这里只能保留那些必须的编译选项,而将
其他可有可无的删去.uClinux 在 Evaluator-7T 上的配置如下:
1)系统类型配置
SkyEye 技术报告 Port uClinux on real hardware
第 5 页 共 7 页
在 System Type 中,选定
(Samsung) ARM system type
[ ] Generate big endian code
[*] Set flash/sdram size and base addr
(00000000) (S)DRAM Base Address
(00080000) (S)DRAM Size
(01800000) FLASH Base Address
(00080000) FLASH Size
这里,选择了 Samsung 芯片,编译时生成 little endian code,以及设置了flash/sdram 相
应的起始地址和大小.
2)文件系统支持
在 File systems 中,选定
[*] ROM file system support
这里,选择了 ROM fs 的文件系统支持,其他的文件系统暂时不选.
3)字符设备驱动
在 Character devices 中,选定
[*] Samsung serial port support
[*] Support for console on Samsung serial port
这里,选择了 Samsung 串口支持,这样就可以通过串口将内核打印的信息传递给主机.
上面的这些选项可以说是一个能够让 uClinux 运行起来的最小配置了.
三,uClinux 的内核裁减
在完成上面的配置之后,获得的内核尺寸仍然不能满足在评估板上运行的需要,因此还
需要进一步对内核中的代码进行裁减.这里我们通过修改源码来满足裁减的要求.
1)修改 linux-2.4.x/makefile
去掉链接时无用的设备驱动,例如 drivers/net/net.o,drivers/media/media.o,net/network.o
等,这样修改之后,编译时会报告一些链接错误,需要手工修改或者注释部分内核源码,这
部分代码基本都是和 sock 相关的.
linux-2.4.x/init/main.c
linux-2.4.x/arch/armnommu/kernel/calls.S
linux-2.4.x/fs/fcntl.c
2)修改链接文件 arch/armnommu/vmlinux-armv.lds.in
内核编译链接后得到的代码,主要由4个段 (segment) 组成.其中包括init(初始化段),
data(数据段),bss(未初始化数据段)和text(代码段).这4个段中,前面三个都需要有
写权限,因此只能放在 RAM 中,而最后的代码段则只需要可读就行了,因此可以放在 Flash
中以节省 RAM 空间.
3)修改 romfs 的连接位置 drivers/block/blkmem.c
romfs.img 可以放在 RAM 里,但为了节省 RAM 空间,将 romfs 放在 Flash 里也可
以,具体做法就是修改 blkmem.c 文件中关于 romfs 的链接地址.由于 romfs 的大小变化
很大,从 30k 到 xM 都行,将 romfs 部分放置在 Flash 中,这样内核在 RAM. 中就能获
得更多的运行空间.
4)配置 romfs 中的应用程序
在内核启动之后,就会将 romfs 作为根文件系统,而 romfs 中的应用程序必须保证有
init 和 sh ,这样在内核运行的最后,将有一个简单的 shell 界面,用户也可以在 romfs 中
SkyEye 技术报告 Port uClinux on real hardware
第 6 页 共 7 页
添加自己的应用.
这样配置之后,生成的内核可以通过串口输出启动时的信息,可以在启动之后挂上
romfs 文件系统,并运行 /bin/sh 建立一个简单的 shell 环境.
四,我的一点移植体会
1)bootloader 很重要
从开始移植到最终 uClinux 能够正常启动打印出启动信息,前后大概有一个星期左右,
其中下载,运行内核至少有50次.每次下载都是通过串口,使用 115200 bps 的波特率,
一次试验调试就要花去10分钟.所以,这样时间耗费是相当大的,当时我就一边等待下载,
一边上bbs,呵呵.
如果能有一个高速下载的 bootloader ,会大大提高调试效率.要是用串口,建议至少
是用 115200 的,否则会慢的让你无法忍受.当然要是能通过网口,或者是 usb 口下载的
bootloader ,就更好了.如果你没有把握能一次把 kernel run 起来,那就先考虑一下怎么能
让下载内核的速度快一些.
2)串口其实很简单
如果不能从串口输出那些激动人心的启动信息,相信没人会相信你的内核已经 boot 起
来了.所以移植内核成功的首要标志就是 printk 函数可以通过串口输出.
怎么调通串口呢 如果移植版本里面关于串口的驱动足够好,那么不用做任何修改就能
输出了.但相信不是每个人都有这么好的运气,至少这个好运气没被我撞到.我差不多花了
两天时间才研究出怎么调试串口,实在是以前的硬件底子太烂了.
其实很简单,一般 bootloader 起来之后,证明串口已经可以工作了.这时可以在内核
代码中添加一个简单的 my_putc( const char c ) 函数,通过这个函数来向串口发送一个字符.
至于怎么发送读一下芯片的 manual 好了,一般就是往某个发送寄存器里写字符就可以了.
当测试 my_putc 能够工作之后,可以把它加入到当前移植版本中的串口驱动文件里,我所
移植的 Samsung 4510 的文件是 drivers/char/serial_samsung.c ,这种文件都能找到一个底层
的串口读写函数,找到之后,把 my_putc 加进去就可以了.
当然标准的做法应该是修改驱动文件,不过要去读懂底层的驱动比较费时,尤其是那些
冗长无比的头文件和一大堆的宏定义.上面的方法虽然有点取巧,但还比较好用.
3)SkyEye 很有帮助
说到这里,回到最开始我们提出的问题:我在 SkyEye 里面已经能够把 uClinux 运行
起来了,可离到真实硬件上的移植还有多远
SkyEye 不能替代真正的硬件移植.当在 SkyEye 中可以轻易的设置断点观察变量,而
在实验室里花了10多分钟下载了内核到板子上运行,可超级终端上什么反应都没有的时候,
你就知道要让硬件工作是多么痛苦,当它不输出时什么信息都没有,既不知道有没有运行,
也不知道运行到了哪里.所以当习惯了 SkyEye 里面的 ctrl+c 停下来看,以后做硬件移植
会很不习惯的,呵呵.
但我可以举两个例子,来说明 SkyEye 对真实硬件上移植工作的帮助.
一个就是上面调试串口的时候,当时我想测试一下怎么能够让 printk 工作,因为在
start_kernel 里面包含了太多的初始化函数,到底哪些是和 printk 输出有关的,哪些是无关
的 通过 SkyEye 很快我就验证了这个结论:setup_arch 和 console_init 是必须的,而其他
都可以注释不影响 printk 的输出.如果没有 SkyEye 的软件仿真,要在真实的硬件上完成
这个实验工作,估计至少需要一天时间,而用 SkyEye 不到一个小时就调试出来了.这个
SkyEye 技术报告 Port uClinux on real hardware
第 7 页 共 7 页
例子说明,如果你想验证内核中函数之间的调用和影响关系时,SkyEye 很有帮助.
另一个是在移植 ARM Linux 的时候,需要制作 RAM disk 来挂接根文件系统,当时
SkyEye 里面制作的 initrd.img 是 1.46M 的,这样要下载下去非常费时间.我尝试自己做
了一个 512k 的 RAM disk,但究竟哪些文件和设备是必须的呢 同样还是在 SkyEye 中就
可以马上验证保留哪些文件不影响一个最小 ARM Linux 系统的启动.如果你也想了解一下
根文件系统中不可缺少的程序和设备文件,那么 SkyEye 很有帮助.
相信在不久的将来,SkyEye 能够支持越来越多的 ARM 处理器平台时,在 SkyEye 里
调试通过的内核,可以直接下载到板子上启动并运行,那将是多么激动的一天!
李明
lmcs00@mails.tsinghua.edu.cn
2003-5-7

- 作者: SJTUBME 2004年12月18日, 星期六 01:21  回复(0) |  引用(0) 加入博采

构建ARM7-uClinux开发板

构建ARM7-uClinux开发板
uClinux只需要极少的硬件资源就可运行起来,以ARM7TDMI为例,只需要以下硬件:
1.CPU - Samsung S3C4510B
2.SDRAM 8M以上
3.一个简易的串口
4.2M Flash
5.一个以太网接口(可选)
目前各嵌入式微处理器的厂商在推出每款处理器的同时都会提供一个Demo板,供用户来测试微处理器的性能。Samsung公司对S3C4510B处理器提供了一款SNDS100的Demo板。Demo板的原理图可以从Samsung公司的网站上免费下载,对这个原理图作一些修改,只保留上面列出的5个部分,去掉其他多余的部分。修改以后的原理图就是一个能够运行uClinux的ARM7目标板原理图,然后根据这个原理图去加工几张PCB板,焊上相应的元件,一块能运行uClinux的ARM7开发板就做成了(这款开发板相应得原理图、PCB图可以从http://www.dailzh.net上免费下载得到)。
慢着,虽然这块开发板已经焊接完成,但目前它只是一堆电子零件的简单组合,要在它上面跑uClinux,还需要相应的软件来管理这些硬件。

构建ARM7-uClinux开发板
uClinux只需要极少的硬件资源就可运行起来,以ARM7TDMI为例,只需要以下硬件:
1.CPU - Samsung S3C4510B
2.SDRAM 8M以上
3.一个简易的串口
4.2M Flash
5.一个以太网接口(可选)
目前各嵌入式微处理器的厂商在推出每款处理器的同时都会提供一个Demo板,供用户来测试微处理器的性能。Samsung公司对S3C4510B处理器提供了一款SNDS100的Demo板。Demo板的原理图可以从Samsung公司的网站上免费下载,对这个原理图作一些修改,只保留上面列出的5个部分,去掉其他多余的部分。修改以后的原理图就是一个能够运行uClinux的ARM7目标板原理图,然后根据这个原理图去加工几张PCB板,焊上相应的元件,一块能运行uClinux的ARM7开发板就做成了(这款开发板相应得原理图、PCB图可以从http://www.dailzh.net上免费下载得到)。
慢着,虽然这块开发板已经焊接完成,但目前它只是一堆电子零件的简单组合,要在它上面跑uClinux,还需要相应的软件来管理这些硬件。
前面提到uClinux可以从Flash中直接运行,就是说可以将uClinux的映像文件直接烧写到Flash中,然后上电,uClinux会从Flash中启动吗?是的,确实如此。现在要做的就是如何将uClinux的内核映像烧写到Flash中。用写入器将uClinux内核映像写入到Flash中,然后将Flash焊接到pcb板上或插到开发板的flash的插座上可以吗?当然可以,如果你有写入器的话。不过,很少有人手里能有这种写入器。我们需要的是一个廉价的Flash写入方案。用JTAG,S3C4510B上集成了一个JTAG,通过JTAG我们可以控制S3C4510B上所有管脚,这样可以通过向JTAG接口输入相应的指令和数据,用软件的方法在S3C4510B的数据、地址和控制总线上产生出Flash器件的读写操作时序,将uClinux的内核映像文件烧写到Flash中(关于S3C4510B的JTAG接口电缆的制作和下载烧写uClinux映像文件到Flash中的程序可执行文件和源代码请参阅http://www.dailzh.net上相关内容)。

终于将uClinux的映像文件烧写到Flash中了,用一根串口电缆将ARM7开发板和开发主机的Com1口连接起来,从网上下载一个tip程序,执行这个命令:
tip -l /dev/ttyS0 -s 19200
等屏幕上显示 connected.以后,将ARM7开发板的电源接通。如果够幸运的话,你应该看到下面的信息:
>>Linux version 2.4.20-uc0 (root@dailzh) (gcc version 2.95.3
>>20010315 (release)(ColdFire patches - 20010318 from http://fiddes.net/coldfire/)
>>(uClinux XIP and shared lib patches from http://www.snapgear.com/)) 一 5月19 23:44:11 CST 2003
>>Processor: Samsung S3C4510B revision 6
>>Architecture: SNDS100
>>On node 0 totalpages: 4096
>>zone(0): 0 pages.
>>zone(1): 4096 pages.
>>zone(2): 0 pages.
>>Kernel command line: root=/dev/rom0
>>Calibrating delay loop... 49.76 BogoMIPS
...
>>Command: cat /etc/motd
>>Welcome to uClinux.org
>>For further information check: http://www.uclinux.org/
>>\>
uClinux在ARM7目标板上已经运行起来了,键入熟悉的ls命令,看有什么输出。

通过JTAG接口烧写uClinux映像文件到Flash中速度太慢,调试uClinux内核非常不方便,有没有其他的方法?有,uClinux除了可以从Flash中直接运行外,还可以加载到内存中运行。我们来为ARM7开发板写一个Bootloader,Bootloader的作用是初始化ARM7开发板,然后通过以太网接口将uClinux映像下载到内存中,然后从内存中运行uClinux。这种方法下载uClinux内核映像只需要10几秒,适合于开发阶段经常修改uClinux内核时使用(Bootloader for ARM7的源代码可以从http://www.dailzh.net 上下载得到)。调试完uClinux的内核以后,可以再通过JTAG接口烧写uClinux映像文件到Flash中,这样又可以直接从Flash中运行调试好的uClinux了。

uClinux下用户程序的开发和调试
现在ARM7开发板可以运行uClinux了,如何开发uClinux下的应用程序呢?和在普通计算机上开发Linux程序一样,首先编写应用程序的源代码,只不过编译的时候不能用gcc编译,需要用arm-elf-gcc编译。编译以后的可执行文件必须下载到ARM7开发板上才能运行,下载程序到目标板上可以通过在uClinux中启用tftpd程序,在开发主机端用tftpcmd 程序来下载,然后在uClinux的控制台窗口键入可执行文件名的方法来运行。如果想要应用程序在uClinux启动时自动运行,可以修改uClinux系统中/etc/rc文件的内容来来实现。如果要用gdb来调试用户程序,可以参考.
关于作者
dai lizhou , 爱好嵌入式系统和Linux开发, 如果你对嵌入式Linux开发有兴趣请访问我们的网站http://www.dailzh.net, 诚邀你的加盟。

- 作者: SJTUBME 2004年12月18日, 星期六 01:12  回复(0) |  引用(0) 加入博采

Kelvin Chu 2004年12月17日 周五

2004年12月17日 周五
今天为了试着搭建一个好一点的平台,重装了寝室的机器,现在的环境和dd maple的环境应该一样了,可是...
现在的环境是winxp sp1+Linux Redhat ES 9, 其中C盘系统盘是NTFS,我装cygwin的I盘也是NTFS.
安装Cygwin,编译链,解压源文件,make xconfig仍然是在保存退出的时候出错.若是直接make dep,结果还是生成一个大一点的镜像,和以前在实验室作的一样,估计不能使用.

于是,在Linux环境下编译:

make xconfig出现以下错误:
[root@Chufei uclinux-s3cev40]# make xconfig
config/mkconfig > config.in
make -C /usr/local/src/uclinux-s3cev40/config/scripts tkparse
make[1]: Entering directory `/usr/local/src/uclinux-s3cev40/config/scripts'
unset GCC_EXEC_PREFIX; cc -o tkparse tkparse.o tkcond.o tkgen.o
tkparse.o: file not recognized: File format not recognized
collect2: ld returned 1 exit status
make[1]: *** [tkparse] Error 1
make[1]: Leaving directory `/usr/local/src/uclinux-s3cev40/config/scripts'
make: *** [config.tk] Error 2
(思考:可以用dd maple 12月14日的方法解决?但是我并没有遇到cpp0问题)
但是make menuconfig可以使用,并成功设置.

然后设置环境变量 PATH="/usr/local/armtools/bin:$PATH"

然后make dep,但是提示出错说arm-elf-gcc NOT FOUND,环境变量设置错误?

疑点:
1.arm-elf-compile.tar.gz文件解压的目录?
2.PATH中有重复的环境变量设置(多次执行PATH=命令)

从http://www.uclinux.org/pub/uClinux/arm-elf-tools/ 上下载ARM交叉编译器:arm-elf-tools-20030314.sh。得到这个文件以后,执行以下命令:sh arm-elf-tools-20030314.sh,这个命令会在开发主机上自动建立一个uClinux-ARM的交叉编译环境。键入arm-elf-gcc, 如果能看到下面的输出信息:
Reading specs from /usr/local/lib/gcc-lib/arm-elf/2.95.3/specsgcc version 2.95.3 20010315 (release)
(ColdFire patches - 20010318 from http://fiddes.net/coldfire/)(uClinux XIP and shared lib patches
from http://www.snapgear.com/)
表示uClinux-ARM的交叉编译环境已经建立起来了。
于是,归纳上面的错误,arm-elf-compile.tar.gz文件解压的目录是usr/local/armtools/bin,而实际用sh命令安装的编译链的目录是/usr/local !!! 而且,既然现在与系统关联的目录是/usr/local/, gcc文件放在/usr/local/bin中,这个目录因为是系统默认的环境变量之一,因此,不再需要设置环境变量??(加上/usr/local/arm-elf也无妨)
注意! 回想起以前,在cygwin中似乎编译链也被装在了usr/local/armtools/, 这可能是一个极为严重的错误????

于是继续作make dep和make clean ,make lib_only

另:
在翻资料时,发现Embest在帮助文件中的一句话,可以解决dd maple在12月15日遇到的问题:
"编译时在make user_only之前,一定要将/user/busybox下的config.h恢复,config.h.original是
其备份文件,可以在/user/busybox下执行cp config.h.original config.h命令。 "
而且,的确如dd maple所说的,需要将config.h文件名改为Config.h(大小写敏感)

之后作make romfs,竟然得到一个628.0k的文件系统??

之后make image,出错于:(svc4proc.c是/usr/local/src/uclinux-s3cev40/linux-2.4.x/fs/lockd/下一个文件)
arm-elf-gcc -D__KERNEL__ -I/usr/local/src/uclinux-s3cev40/linux-2.4.x/include -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -fno-common -pipe -fno-builtin -D__linux__ -DNO_MM -mapcs-32 -mtune=arm7tdmi -mshort-load-by tes -msoft-float -c -o svc4proc.o svc4proc.c
svc4proc.c:538: `nlm4svc_decode_void' undeclared here (not in a function)
svc4proc.c:538: initializer element is not constant
svc4proc.c:538: (near initialization for `nlmsvc_procedures4[0].pc_decode')
svc4proc.c:538: `nlm4svc_encode_void' undeclared here (not in a function)
svc4proc.c:538: initializer element is not constant
svc4proc.c:538: (near initialization for `nlmsvc_procedures4[0].pc_encode')
svc4proc.c:539: `nlm4svc_decode_testargs' undeclared here (not in a function)
svc4proc.c:539: initializer element is not constant
svc4proc.c:539: (near initialization for `nlmsvc_procedures4[1].pc_decode')
svc4proc.c:539: `nlm4svc_encode_testres' undeclared here (not in a function)
svc4proc.c:539: initializer element is not constant
svc4proc.c:539: (near initialization for `nlmsvc_procedures4[1].pc_encode')
svc4proc.c:540: `nlm4svc_decode_lockargs' undeclared here (not in a function)
svc4proc.c:540: initializer element is not constant
svc4proc.c:540: (near initialization for `nlmsvc_procedures4[2].pc_decode')
svc4proc.c:540: `nlm4svc_encode_res' undeclared here (not in a function)
svc4proc.c:540: initializer element is not constant

附:
1.在Linux下环境变量的设置:
看一下PATH #echo $PATH
或者 # set (以上#是命令提示符)

root@linuxsir01 root]# echo $PATH
/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/bin

用下面的命令就能加入
#PATH="$PATH:您想要加入的路径
比如
#PATH="$PATH:/tmp"
这样应该能行。
然后看一下,是不是成功了
完整的过程就是这样的。。

[root@linuxsir01 root]# PATH="$PATH:/tmp"
[root@linuxsir01 root]# echo $PATH
/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/X11R6/bin:/root/bin:/tmp
[root@linuxsir01 root]#

2.在LINUX下建立arm-elf-gcc交叉编译环境
arm-elf-tools-200314.sh是一个自解压的脚本文件,在CDROM的根目录下。
用root用户登录,进入到arm-elf-tools-20030314.sh所在的目录,
安装:
# sh ./arm-elf-tools-20030314.sh
这个命令会在你的/usr/local/arm-elf目录下安装 gcc, g++, binutils, genromfs, flthdr and elf2flt等程序。
测试:
# arm-elf-gcc -v
3.编写uClinux下的应用程序

1)添加一个应用程序
uCLinux内核之外的所有程序都可以称为用户程序。应用程序都放在 CLinux-dailzh/user 目录下, 这些程序都是已经 移植到 uCLinux下的应用程序。如果用户想将自己编写的应用程序 添加 到 uCLinux下时,假设这个应用程序名称为hello,则需要增加和修改以下文件:
1、 在 uCLinux-dailzh/user/目录下增加一个hello目录,将应用程序源代码复制到这个目录下。参考user目录下其他应用程序的Makefile文件编写方式,为hello程序编写Makefile
2 、 修改 uCLinux-dailzh/venders/config.in 文件,在该文件合适的位置增加下面一句:
bool 'hello' CONFIG_USER_APP
这样,在 Make menuconfig时,uCLinux就会提示你是否需要编译这个hello应用程序。
3 、 修改 uCLinux-dailzh/users/Makefile 文件,在该文件合适的位置增加下面一句
DIRS$(CONFIG_USER_APP) += hello
4 、 修改 uCLinux-coldfire/romfs/romfs.mk 文件,在该文件合适的位置增加下面一句 . 这里假设新添加的应用程序的可执行文件名称为hello, 在user/hello目录下。最后编译成的可执行二进制影象中,root文件系统的/bin/目录下就会增加一个新的应用程序 hello.
BIN$(CONFIG_USER_ APP) += $(USER)/hello/hello
5、uClinux启动Shell后第一个运行的脚本文件。假如我们需要在操作系统运行起来后立刻运行/bin/app这个应用程序,只需要在文件 Clinux-dailzh/vendors/Samsung/4510/rc最后加一行:
/bin/hello
如果需要将该应用程序在后台运行,则增加这一行:
/bin/app &
(完)


- 作者: SJTUBME 2004年12月18日, 星期六 00:40  回复(1) |  引用(0) 加入博采

Kelvin Chu 2004年12月16日 周四

今天把C盘文件格式转换成了NTFS,将cygwin删除(包括c:\winnt\system32中的cygwin1.dll)重新安装,但是编译出来的镜像仍然是693+427K,估计还是不可以使用。(以上没有make xconfig过程)

根据张丹枫的建议,尝试进行make xconfig,但是保存退出后得到以下提示后,无响应。

config/mkconfig > config.in

config/mkconfig > config.in

make -C /usr/local/src/uclinux-s3cev40/config/scripts tkparse

make[1]: Entering directory `/usr/local/src/uclinux-s3cev40/config/scripts'

make[1]: `tkparse' is up to date.

make[1]: Leaving directory `/usr/local/src/uclinux-s3cev40/config/scripts'

ARCH=dummy /usr/local/src/uclinux-s3cev40/config/scripts/tkparse < config.in > config.tmp

cat /usr/local/src/uclinux-s3cev40/config/scripts/header.tk >> ./config.tk

cat config.tmp >> config.tk

rm -f config.tmp

echo "set defaults \"/dev/null\"" >> config.tk

echo "set help_file \"config/Configure.help\"" >> config.tk

cat /usr/local/src/uclinux-s3cev40/config/scripts/tail.tk >> config.tk

chmod 755 config.tk 

*** Cleaning tree for old settings ****

*** Cleaning tree for old settings ****rm -rf romfs; make clean > /dev/null 2>&1 

失败。。。(看来真的是有RPWT!)还是操作系统为win2000而不是winxp的问题?

今天两个不能用的img还放在h:\cygwin\usr\local\src\uclinux-s3cev40\image中

估计是操作系统为win2000的问题?今天两个不能用的img还放在h:\cygwin\usr\local\src\uclinux-s3cev40\image中

另,To dandan maple: 麻烦把新编译的文件路径写一下,我找找看看。谢谢!:)


- 作者: SJTUBME 2004年12月16日, 星期四 21:36  回复(1) |  引用(0) 加入博采

ddmaple 2004.12.15 周三
2004.12.15 周三

    下午16:40分,FC3下。发现Embest公司光盘给的ARM工具链fot Linux的GCC版本是2001年的!!找了一个新一点的换上,果然就没有can not execute "cpp0"

       然后又一个问题,我在应用程序中加了busy boxmake user_only时说busybox下的Config.h找不到,然后busybox看里面有config.h 想到Linux对文件大小写敏感,在Makefile中把几个C改成了c,成功!!再回头想想Cygwin里面,大约对这个大小写不敏感,唉
       今天编译成功了两套镜像,基本上只有Network支持,tftp应用程序。romfx130k。还有一个多了BusyBox的一些小程序,romfs 178k。网上烧写,失败。在引导到start_kernel 9的时候就死机了。后来把光盘上的zImage烧进去,启动成功。注意!此时烧的Romfs还是我自己写的,故启动的时候有不少错误,但都不是致命的。进到bin里面果然只有tftp,很多程序都没有了。
       使用tftp失败,归结原因是没有加载Ramdisk。下次编译要加入mount
       使用光盘上的镜像烧入,tftp成功。
       后来在uclinux网站上下到了最新的arm-elf-toolsfor Fedora 2,明天尝试。
备忘:1、明天烧光盘上的镜像,编写helloword,使用tftp下载该程序,尝试运行
       2、尝试用新的arm-elf-tools,编译20040408版的源码(担心硬盘空间不够)。
       3、尝试用linux-2.4.27加上path做成自己的uclinux源码。
       4、找到bootloader之后运行的代码,尝试修改。
       5、若用原来的uclinux源码,一定要加上sash expandmount两个东东。进一步整理内核那些要那些不必。


2004.12.15 周三

    下午16:40分,FC3下。发现Embest公司光盘给的ARM工具链fot Linux的GCC版本是2001年的!!找了一个新一点的换上,果然就没有can not execute "cpp0"。这个Embest公司啊...

       然后又一个问题,我在应用程序中加了busy boxmake user_only时说busybox下的Config.h找不到,然后busybox看里面有config.h 想到Linux对文件大小写敏感,在Makefile中把几个C改成了c,成功!!再回头想想Cygwin里面,大约对这个大小写不敏感,唉
       今天编译成功了两套镜像,基本上只有Network支持,tftp应用程序。romfx130k。还有一个多了BusyBox的一些小程序,romfs 178k。网上烧写,失败。在引导到start_kernel 9的时候就死机了。后来把光盘上的zImage烧进去,启动成功。注意!此时烧的Romfs还是我自己写的,故启动的时候有不少错误,但都不是致命的。进到bin里面果然只有tftp,很多程序都没有了。
       使用tftp失败,归结原因是没有加载Ramdisk。下次编译要加入mount
       使用光盘上的镜像烧入,tftp成功。
       后来在uclinux网站上下到了最新的arm-elf-toolsfor Fedora 2,明天尝试。
备忘:1、明天烧光盘上的镜像,编写helloword,使用tftp下载该程序,尝试运行
       2、尝试用新的arm-elf-tools,编译20040408版的源码(担心硬盘空间不够)。
       3、尝试用linux-2.4.27加上path做成自己的uclinux源码。
       4、找到bootloader之后运行的代码,尝试修改。
       5、若用原来的uclinux源码,一定要加上sash expandmount两个东东。进一步整理内核那些要那些不必。

- 作者: SJTUBME 2004年12月15日, 星期三 23:15  回复(0) |  引用(0) 加入博采

ddmaple 2004.12.14 周二
2004.12.14 周二
       中午一点,由于之前xconfig说是tkprase.o文件格式不对,考虑用FC3gcc重新编译一下。(这时才深刻体会到GNU是多么贴心啊),找到那个o文件是在config/scripts之中,读了Makefile (之前学过一点点make语法,能读懂一些),终于实现了FC3下了xconfig界面。具体命令如下:
       cd /usr/local/src/uc-s3cev40/config/scripts
       make clean     //读一下该目录的Makefile便知
       make tkparse //重新生成那些.o文件
然后退到外面,make xconfig成功!(虚拟机上面运行FC3很慢),但是后面make lib_only还是显示can not execute "cpp0".开始怀疑gcc有问题,但没研究下去
    晚上,在Cygwin下面重新编译uClinux,加上了minix文件系统,tftp程序,但是make user_only还是出错,仍旧是permmision denied.(RPWT?)
    在实验室的PC上,Cygwin还是不对,一执行arm-elf-gcc就说一个函数入口无法连接到cygwin1.dll。什么时候考虑重装一下,换个路径什么的。
2004.12.14 周二
       中午一点,由于之前xconfig说是tkprase.o文件格式不对,考虑用FC3gcc重新编译一下。(这时才深刻体会到GNU是多么贴心啊),找到那个o文件是在config/scripts之中,读了Makefile (之前学过一点点make语法,能读懂一些),终于实现了FC3下了xconfig界面。具体命令如下:
       cd /usr/local/src/uc-s3cev40/config/scripts
       make clean     //读一下该目录的Makefile便知
       make tkparse //重新生成那些.o文件
然后退到外面,make xconfig成功!(虚拟机上面运行FC3很慢),但是后面make lib_only还是显示can not execute "cpp0".开始怀疑gcc有问题,但没研究下去
    晚上,在Cygwin下面重新编译uClinux,加上了minix文件系统,tftp程序,但是make user_only还是出错,仍旧是permmision denied.(RPWT?)
    在实验室的PC上,Cygwin还是不对,一执行arm-elf-gcc就说一个函数入口无法连接到cygwin1.dll。什么时候考虑重装一下,换个路径什么的。

- 作者: SJTUBME 2004年12月15日, 星期三 23:14  回复(0) |  引用(0) 加入博采

DDMaple手记 2004.12.13 周一
2004.12.13 周一

       今天等于没进展。自己的VAIO上装好了FC3(Fedora),用的是VMware虚拟计算机。但是在其中用Embest公司的ARM工具链、uClinux源代码编译失败。首先xconfig时就说错误,说是.o文件格式不对(猜测是Embest公司用Cygwin下工具链编译出来的.oLinux下不能用),menuconfig到可以用,make dep可以(一般这个只要指定了工具链PATH就没啥问题),make lib_only时,在用arm-elf-gcc编译第一个文件的时候就报错,can not execute "cpp0" 不解,猜测是否这个ARM工具链(此工具链是光盘上的arm-elf-compiler.tar.gz解压而得)不支持Fedora? 至此,在我的VAIO上没做更多工作。

       同步地,在实验室用企业版LinuxES 企图编译。先是想做20040408那个源码,好不容易学了下patch的用法(见今天的备忘),make xconfig不行,说是wish找不到,不解..make

menuconfig可用,个别选项与Embest提供的源码config稍有不同。到了make lib_only 同样是can not execute "cpp0" .难道这个工具链对企业版Linux也不支持??我用的还是光盘上说的for linux的工具链。然后用光盘上的源码编译,仍是xconfig不行,menuconfig可以。(快晕了)make lib_only同上的错误,十点半了,撤...

       另外我将昨天编译的镜像烧了一下,arm启动可以,但启动中有不少错误,RAMDISK mount失败什么的,执行一些程序也报错。用光盘的镜像就基本没错。

       今天比较失败,明天休息一下,看看文档思考思考,该抬头看路了。接下来要解决的问题:(储飞若有别的想法一起讨论)

       1、在uClinux中添加入自己的程序,实现HelloWorld.

       2uClinux如何启动自动执行用户程序?

       3、外加设备的驱动如何添加?

       4、在uClinux下加键盘的驱动,获取键盘中断,并向串口传数据

       5uClinux下的LCD驱动,编程实现绘图,按键盘显示信息

两人最好协调一下,各自有工作的侧重点,避免重复劳动。

备忘:1patch的标准格式为patch [options] [originalfile] [patchfile]

如果patchfile为空则从标准输入读取patchfile内容;如果originalfile也为空,则从patchfile(肯定来自标准输入)中读取需要打补丁的文件名。因此,如果需要修改的是目录,一般都必须在patchfile中记录目录下的各个文件名。

       绝大多数情况下,patch都用以下这种简单的方式使用:patch -p[num] [patchfile]

       这里提到的-p参数决定了是否使用读出的源文件名的前缀目录信息,不提供-p参数,则忽略所有目录信息,-p0(或者-p 0)表示使用全部的路径信息,-p1将忽略第一个"/"以前的目录,依此类推。如/usr/src/linux-2.4.15/Makefile这样的文件名,在提供-p3参数时将使用linux-2.4.15/Makefile作为所要patch的文件。对于刚才举的Linux内核源码2.4.16升级包的例子,假定源码目录位于/usr/src/linux中,则在当前目录为/usr/src时使用"patch -p0 <patch-2.4.16"可以工作,在当前目录为/usr/src/linux时,"patch -p1<patch-2.4.16"也可以正常工作。

       2、明天争取把helloworld做到uxlinux里面去,能在超级终端显示


2004.12.13 周一

       今天等于没进展。自己的VAIO上装好了FC3(Fedora),用的是VMware虚拟计算机。但是在其中用Embest公司的ARM工具链、uClinux源代码编译失败。首先xconfig时就说错误,说是.o文件格式不对(猜测是Embest公司用Cygwin下工具链编译出来的.oLinux下不能用),menuconfig到可以用,make dep可以(一般这个只要指定了工具链PATH就没啥问题),make lib_only时,在用arm-elf-gcc编译第一个文件的时候就报错,can not execute "cpp0" 不解,猜测是否这个ARM工具链(此工具链是光盘上的arm-elf-compiler.tar.gz解压而得)不支持Fedora? 至此,在我的VAIO上没做更多工作。

       同步地,在实验室用企业版LinuxES 企图编译。先是想做20040408那个源码,好不容易学了下patch的用法(见今天的备忘),make xconfig不行,说是wish找不到,不解..make

menuconfig可用,个别选项与Embest提供的源码config稍有不同。到了make lib_only 同样是can not execute "cpp0" .难道这个工具链对企业版Linux也不支持??我用的还是光盘上说的for linux的工具链。然后用光盘上的源码编译,仍是xconfig不行,menuconfig可以。(快晕了)make lib_only同上的错误,十点半了,撤...

       另外我将昨天编译的镜像烧了一下,arm启动可以,但启动中有不少错误,RAMDISK mount失败什么的,执行一些程序也报错。用光盘的镜像就基本没错。

       今天比较失败,明天休息一下,看看文档思考思考,该抬头看路了。接下来要解决的问题:(储飞若有别的想法一起讨论)

       1、在uClinux中添加入自己的程序,实现HelloWorld.

       2uClinux如何启动自动执行用户程序?

       3、外加设备的驱动如何添加?

       4、在uClinux下加键盘的驱动,获取键盘中断,并向串口传数据

       5uClinux下的LCD驱动,编程实现绘图,按键盘显示信息

两人最好协调一下,各自有工作的侧重点,避免重复劳动。

备忘:1patch的标准格式为patch [options] [originalfile] [patchfile]

如果patchfile为空则从标准输入读取patchfile内容;如果originalfile也为空,则从patchfile(肯定来自标准输入)中读取需要打补丁的文件名。因此,如果需要修改的是目录,一般都必须在patchfile中记录目录下的各个文件名。

       绝大多数情况下,patch都用以下这种简单的方式使用:patch -p[num] [patchfile]

       这里提到的-p参数决定了是否使用读出的源文件名的前缀目录信息,不提供-p参数,则忽略所有目录信息,-p0(或者-p 0)表示使用全部的路径信息,-p1将忽略第一个"/"以前的目录,依此类推。如/usr/src/linux-2.4.15/Makefile这样的文件名,在提供-p3参数时将使用linux-2.4.15/Makefile作为所要patch的文件。对于刚才举的Linux内核源码2.4.16升级包的例子,假定源码目录位于/usr/src/linux中,则在当前目录为/usr/src时使用"patch -p0 <patch-2.4.16"可以工作,在当前目录为/usr/src/linux时,"patch -p1<patch-2.4.16"也可以正常工作。

       2、明天争取把helloworld做到uxlinux里面去,能在超级终端显示

- 作者: SJTUBME 2004年12月14日, 星期二 00:38  回复(0) |  引用(0) 加入博采

今天(王经理和深圳黄工)交谈摘要

1. 明确了开发平台:win2000(已证实xp也可) cygwin需要安装在NTFS格式非系统盘下

2. 环境变量只需要设置一次即可

3. LCD可以开发实时性好的程序,问题在于三星看门狗计时器Delay需要先初始化Delay 0

4. Bootloader要重新编译下,其中一句704*1024改为1024*1024(给了我们最新loader

5. 可以使用USB口做下数据传输试验

6. 搭载自己的应用程序可以参照操作手册做

7. Embest出了新的IDEUnetICE

8. MiniGUI的协议正在进行中将在不久后把源码发过来

9. 给我们快速的烧写开发工具Prog

10. Make xconfig可以正常的裁减,make menuconfig不提供

11. UC/OS可以搭载WIP(?)协议栈,使用很广泛


- 作者: SJTUBME 2004年12月11日, 星期六 21:49  回复(0) |  引用(0) 加入博采