以下通过一个具体实例向读者介绍将程序添加到uClinux的标准方法。 例如要把前面提到的源程序lednxy.c添加到运行于目标板上的uClinux操作系统中,则 文件应在目录/home/nie/uClinux-Samsung/user下,进入uClinux-Samsung/user目录并建立 个自己的子目录,比如键入: mkdir myapp, 这样在user目录下就建立了一个新的子目录myapp,把lednxy.c拷贝到myapp目录下, 将该源文件相应的makefile文件也拷贝到该目录下。注意,为了使用标准方法,我们应该 改一下刚才的makefile文件,这个文件名应为Makefile,写成这样的形式: EXEC = lednxy OBJS = lednxy.o all: $(EXEC) $(EXEC): $(OBJS) $(CC) $(LDFLAGS) –o $@ $(OBJS) $(LDLIBS) romfs: $(ROMFSINST) /bin/$(EXEC) clean: rm –f $(EXEC) *.elf *.gdb *.o 进入user目录,增加一行语句到该目录下的Makefile文件中, dir_$(CONFIG_USER_MYAPP_LEDNXY) += myapp 该语句的作用是让编译器可以访问到我们所创建的myapp目录下的makefile文件,保 后退出。 切换到目录/home/nie/uClinux-Samsung/config下,编辑Configure.help文件,即输入一 命令 cd ../config vi Configure.help 这是一个包含了在配置的时候出现的所有文本信息的文件。在这个文件中加入类似下面
的语句块: CONFIG_USER_ MYAPP_LEDNXY This program is an example. 注意第二行文本信息必须要空两格开始。每行的字符要小于70个。添加完毕后,保存退出。 不过,用户也可不必修改该文件,因为它仅仅是提供一个在线文本信息显示的功能,对于添加用户程序到uCllinux影响不大。 接下来需要修改uClinux系统中对编译器来讲比较重要的一个文件config.in。 仍然是在config目录下,打开该文件,在最后增加类似下面的语句: ################################################################# mainmenu_option next_comment comment ‘ My Application ‘ bool ‘lednxy’ CONFIG_USER_MYAPP_LEDNXY comment ‘ My Application’ endmenu ################################################################# 现在我们已经把要做的修改的相关工作完成了,接下来需要进行内核的编译工作,按照在7.3.3 中谈到的编译uClinux内核的步骤进行就可以了。 值
得注意的一点是在第一步make menuconfig 进行内核配置的时候,在Target Platform Selection
,要选中Customize Vendor/User Settings (NEW)
如图7.10所示,选中了该选项后,与最初我们配置内核过程不同的是,它还会在 make
menuconfig的最后出现如图7.11所示对话框,让你进行用户应用程序的配置,在对话框里出现的文字是在config.in文件中添加的文字,选
中要编译的应用程序所在路径,就会出现如图7.12所示的对话框,显示所选中目录下的,在config.in中所设定的应用程序文件名,选中要编译的文件
名,保存好内核配置后退出。用这种方法生成的可执行文件在romfs/bin下。 图7.10 添加用户应用程序配置 ARM 应用系统开发详解──基于 S3C4510B 的系统设计 图7.11 选择要配置的用户应用程序 图7.12 选择要编译的源文件 当用户应用程序做了修改后,需要重新编译内核,但是此时只要进行内核编译的后四步,即从make user_only开始即可,不必再从内核配置开始了。 以上介绍的是一种基本的添加用户应用程序的方法,如果读者觉得比较麻烦,还可以使用下面一种较为简单的方法,这种方式是将用户的应用程序作为uClinux自身的应用程序对待,在内核编译时一起完成。 在uClinux-Samsung/romfs/usr下面编写用户应用程序源代码以及它对应的makefile文件,就在该目录下编译这个makefile文件,将生成的可执行文件拷贝到uClinux-Samsung/romfs/bin下。 进行内核的部分编译工作,用这种方法只需要做编译内核的最后三步工作,即: make romfs make iamge make 最后都把在uClinux-Samsung/images下生成的image.rom文件烧写到系统的FLASH存 ARM 应用系统开发详解──基于 S3C4510B 的系统设计 储器中,uClinux启动后,用户的应用程序在/bin目录下,此时可运行用户程序。 在Windows环境中,可以使用超级终端建立串口与目标硬件连接。超级终端的一些端口属性需要设置,该内核默认的端口设置为:COM1,波特率为19200,数据位为8,无校验,停止位为1,无流控。通过超级终端可以看到整个uClinux的启动过程。 对于本例,在uClinux启动后,从超级终端中键入cd bin,进入到bin目录下,运行lednxy程序,可以看到该程序对两个LED显示器的控制效果。 上
面介绍的方法中,在将用户应用程序添加到uClinux内核运行时,都需要对内核进行部分或全部的编译,每次对内核编译完成后,都要先将FLASH存储器
中的内容擦除,然后重新烧写新编译好的内核到FLASH存储器中去,这对于程序开发来说,是非常不方便的。下面介绍一种通过网络来传输可执行文件,避免每
次测试程序运行效果时都要编译一次内核。
通过网络添加应用程序到目标系统
作为一款优秀的网路控制器,基于S3C4510B的系统一般都提供以太网接
口,通过以太网接口从网络添加用户程序到目标系统运行,显然比前面所介绍的方法方便得多,特别是在用户应用程序的调试过程中,若每做一点修改都要求重新编
译内核并烧写入FLASH存储器运行,其工作量是可想而知的。 事实上,鉴于uClinux操作系统本身强大的网络功能,同时基于S3C4510B
的系统提供以太网接口,通过局域网可方便的在运行uClinux目标系统和运行Linux宿主机上进行文件传输。运行目标系统的uClinux内核在编译
的过程中,已默认选择了FTP和其他一些网络服务,同时,宿主机上的Linux在默认时,也会安装运行FTP
服务,因此,当目标系统的uClinux启动运行以后,可将目标系统作为FTP客户端,而运行Linux宿主机作为FTP服务器,进行双向的文件传输。 但
由于目前所使用的uClinux操作系统内核采用ROMFS作为其根文件系统,当目标系统的uClinux启动运行以后,其目录大多数是建在FLASH存
储器中,因而是不可写的,只有/var、/tmp等少数几个目录是建立在SDRAM,是可读写的,但若目标系统掉电,内容就丢失了,因此只能作为应用程序
调试之用,当应用程序调试完成后,还应将其写入FLASH存储器。当然,若能在目标系统中使用JFFS/JFFS2,用以代替ROMFS作为其根文件系
统,则整个目标系统就像有磁盘一样方便,用户应用程序的加载再也不用像前面介绍的方式进行了。关于JFFS/JFFS2文件系统的建立,请读者参考相关技
术资料,在此仅描述如何将用户程序通过局域网,从FTP服务器(运行Linux宿主机)上,传输到运行uClinux的目标系统(FTP客户机)并执行的
过程: 将目标系统与Linux宿主机连接在同一网段中,在宿主机的任意目录下编写应用程序,并用交*编译工具生成flat格式的文件。 启动目标系统的uClinux,通过超级终端,输入下面的命令: ifconfig eth0 192.168.100.50 ifconfig
命令用于显示及设置目标系统的网卡配置,例如,IP地址,子网掩码,IRQ及IO
Port等。在上述命令中,参数eth0代表目标系统的网络设备,IP地址192.168.100.50为目标系统的IP地址,注意应与宿主机在同一网段
内(此时宿主机的IP地址为:192.1681.100.21)。 执行命令: ifconfig –all 可以看到目标系统的IP地址已被正确配置,显示信息如下: ARM 应用系统开发详解──基于 S3C4510B 的系统设计 /var/tmp> ifconfig -all eth0 Link encap:Ethernet HWaddr 00:40:95:36:35:34 inet addr:192.168.100.52 Bcast:192.168.100.255 Mask:255.255.255.0 UP BROADCAST RUNNING MTU:1500 Metric:1 RX packets:30533 errors:10 dropped:0 overruns:0 frame:0 TX packets:21090 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:100 Interrupt:17 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:19 errors:0 dropped:0 overruns:0 frame:0 TX packets:19 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 这里我们介绍几个比较重要的名词。 Link encap即Link encapsulate,是用来表示将信息分割为数据包的方法,比如Ethernet。 Hwaddr即Hardware address,网卡的硬件地址,又称为MAC(Media Access Control)地址,它是直接烧写到网卡芯片上的。由12个16进制值组成,每两个数字为一组,每组之间用“:”分割开。 inet addr即internet address,就是主机的IP地址。 Bcast即Broadcast,这个是指广播地址,若接收者的地址为广播地址,则表示该信息可在同一时间发送到网络中的所有计算机。通常,广播地址是由主机的IP地址所属的地址类来决定, Mask
是子网掩码,主要是用来将IP地址分成网络ID和主机ID两部分。它是由一连串的“1”和一连串的“0”组成。“1”对应于网络号码和子网号码字段,而
“0”对应于主机号码字段。对于不同类的IP地址,对应的子网掩码是不同的。表7.2是不同类的IP地址使用范围,表7.3是不同类的IP地址所使用的子
网掩码。 表7.2 IP地址使用范围 网络类别 最大网络数目 第一个可用的 网络号码 最后一个可用的网络号码 每个网络中的最大主机数 A 126 1 126 16777214 B 16382 128.1 191.254 65534 C 2097150 192.0.1 223.255.254 254 表7.3 不同类的IP地址使用的子网掩码 Class IP 子网掩码 A 255.0.0.0 B 255.255.0.0 C 255.255.255.0 子网掩码和IP地址转换为二进制数后,将两者相“与”,相与之后得到的结果就是网络ID。 MTU即Maximum Transmission Unit,网络传输时,数据包最大的传输单位,Ethernet的MTU默认值是1500字节。 Metric来源主机将信息送至目的地主机,所需经过的转送次数,有些路由通信协议,在 ARM 应用系统开发详解──基于 S3C4510B 的系统设计 计算最短路径时,必须参考此数值。 RX表示已经接收的数据包总数,数据包流失数量以及碰撞的数量。 TX表示已经发送的数据包总数,数据包流失数量以及碰撞的数量。 测试一下与宿主机的连接,键入命令: ping 192.168.100.21 应能得到宿主机的应答信息,类似如下所示: /var/tmp> ping 192.168.100.21 PING 192.168.100.21 (192.168.100.21): 56 data bytes 64 bytes from 192.168.100.21: icmp_seq=0 ttl=255 time=0.0 ms 64 bytes from 192.168.100.21: icmp_seq=1 ttl=255 time=0.0 ms 64 bytes from 192.168.100.21: icmp_seq=2 ttl=255 time=0.0 ms 64 bytes from 192.168.100.21: icmp_seq=3 ttl=255 time=0.0 ms 64 bytes from 192.168.100.21: icmp_seq=4 ttl=255 time=0.0 ms 当目标系统与宿主机已正确建立连接后,进入目标系统的可写目录/var或/tmp,并登录到宿主机: cd var ftp 192.168.100.21 此时输入宿主机上的合法用户名及密码,便与宿主机建立了FTP连接。为传输二进制文件,键入命令: ftp>binary 200 Type set to I 这
里请读者注意:在用FTP进行文件传输的时候,一定要选好文件传输的模式,FTP缺省模式为二进制模式,但是为了保险起见,还是手动把传输模式显式改写为
二进制模式。通常的txt,html和绝大多数PS文件都是文本格式的,而其他的可执行文件,压缩文件都是二进制格式。两种格式之间要用ascii和
binary命令切换,两者都可以适当缩写。 传输已编译好的可执行文件(如lednxy)到目标系统并退出FTP服务,键入如下所示命令: ftp>get lednxy ftp>bye 此时,可执行文件lednxy已传输至目录/var或/tmp下,但文件的可执行属性未被设置,添加文件的可执行属性,键入命令: chmod 755 lednxy chmod是一个文件权限修改的命令,在文件创建的时候会自动设置存取权限,若是这些默认权限无法适合企业环境的需求,就可以利用chmod命令来修改存取权限。通常在权限修改的时候可以用两种方式表示权限类,数字表示法和文字表示法。 这里我们采用的是数字表示法,就是说将读取(r),写入(w)和执行(x)分别以4,2,1来代表,没有授予的权限的部分就表示值为0,然后再把所授予的权限先加而成。表7.4为读者列出了几个例子。 表7.4 存取权限范例 原始权限 转换为数字 数字表示法 rwxrwxr-x (421) (421)(421) 775 rwxr-xr-x (421)(401)(401) 755 rw-rw-r-- (420)(420)(400) 664 rw-r--r-- (420)(400)(400) 644 ARM 应用系统开发详解──基于 S3C4510B 的系统设计 每三位字符为一组,这样权限可以被分为三组,第一组表示此文件拥有者的存取权限,第二组表示该文件拥有者所属组成员的存取权限,最后一组表示该文件拥有者所属组之外的用户存取权限。希望读者能够研究清楚权限的分配。 这里所键入的命令表示授予文件拥有者读取写入和执行的权限,而该文件拥有者所属组成员和该文件拥有者所属组之外的用户只拥有读取和执行的权限。 执行程序lednxy,键入命令: ./lednxy 显
然,这种方法在应用程序的开发中是比较有用的,使用这种方式可以使用户在宿主机的开发环境下,编译代码,但编译出来的flat格式的文件并没有放到硬件目
标系统的FLASH存储器,而是在系统的SDRAM中运行,这就大大节省了调试的时间,内核编译只需要进行一次,使开发人员能够将更多的精力投入到应用程
序的开发中来。
|