uclinux内核移植:打造嵌入式系统的新选择 (uclinux 内核移植)

随着物联网的发展,嵌入式系统的需求不断增加。嵌入式系统是指集成有限的计算资源,在现有的硬件平台上运行的操作系统,这些系统具有响应速度快、功耗低、可靠性高等特点。而在嵌入式系统中,操作系统内核是不可或缺的一部分,它负责管理系统的资源,使硬件和应用程序之间形成必要的抽象层,因此嵌入式系统的开发者需要考虑选择适合自己的操作系统内核。在很长一段时间内,嵌入式系统中使用较多的是Linux内核,但随着技术进步,不同版本的Linux内核越来越复杂,导致嵌入式系统的开发难度也不断增加。而在这个背景下,uclinux内核的出现给嵌入式系统的开发提供了新的选择。

uclinux是一个精简版Linux内核,与标准的Linux内核相比,uclinux内核对于嵌入式系统的资源要求更低,占用更少的内存和存储空间,针对嵌入式系统设计了易于移植的接口。在uclinux内核的基础上,嵌入式系统的开发者可以灵活地选择需要的功能模块,根据实际的需求定制自己的内核。这样一来,嵌入式系统的开发难度被降低了不少,同时也使得系统的运行效率得到了提升。因此,uclinux内核在嵌入式系统开发领域中受到了广泛的关注和应用。

那么,如何进行uclinux内核移植呢?嵌入式系统的开发者需要确定自己的硬件平台,并了解平台的具体技术规范。然后,需要针对硬件平台对uclinux内核进行移植。针对不同的硬件平台,uclinux内核的移植方式也不同,但一般情况下,uclinux内核移植的流程可归纳为以下几个步骤:

1. 总体规划。需要确定uclinux内核移植的具体目标和范围,以及开发过程和测试过程中需要考虑的问题,以确保整个移植过程的成功。

2. 环境搭建。需要准备开发环境和测试环境,包括安装必要的软件和硬件设备,并进行适当的配置。

3. 硬件适配。需要根据硬件平台的技术规范,对uclinux内核进行适配,其中包括对设备驱动程序的开发和调试。

4. 测试验证。需要对移植的uclinux内核进行测试验证,并对测试结果进行分析和修正,以确保其符合要求。

5. 优化改进。需要对移植的uclinux内核进行优化和改进,以进一步提高其运行效率和稳定性。

有了以上步骤的指导,就能够顺利地进行uclinux内核移植。但是值得注意的是,uclinux内核和标准的Linux内核有着一些区别,因此在进行移植时需要注意以下几点:

1. 内核配置。需要使用适当的配置选项并且配置适合嵌入式系统的系统调用接口。

2. 设备驱动。需要根据硬件平台要求开发驱动程序,并且需要针对不同的设备进行合适的选择和适配。

3. 系统库。需要适当地选择系统库,并对其进行裁剪,以满足硬件平台的要求。

4. 内存管理。需要根据硬件平台的内存情况对内存管理进行优化和调整。

通过对uclinux内核移植的学习和实践,可以发现,uclinux内核的移植并不是一件容易的事情,需要系统的学习和实践,尤其需要对硬件平台的了解和熟悉。但是,一旦完成了uclinux内核移植,就能够在嵌入式系统中享受到更加灵活、高效和可靠的运行环境。因此,uclinux内核的出现,为嵌入式系统的开发提供了全新的选择,同时也在一定程度上推动了嵌入式系统技术的发展和创新。

相关问题拓展阅读:

单片机与OS区别在哪

1、两个是不同的概念,单片机是微处理的范畴,OS是操作系统的简称,包括WINDOW系统,linux系统都属于OS领域。而我们最早接触的单片机,代表有89C51,AVR系列,以及现在用的比较多的M3内核单片机。

2、目前高端一点的单片机上面可以移植简单的OS系统,比如在M3或者M4内核的单片机上移植RTOS,uclinux等等。

3、拥有ARM9或者CORTEX内核的处理器,可以直接移植linux或者wince系统了,该处理器由于能处理大量复杂运算,这个地方就不叫单片机了,

关于Linux

Linux正在嵌入式开发领域稳步发展。因为Linux使用GPL(请参阅本文后面的参考资料),所以任何对将Linux定制于PDA、掌上机或者可佩带设备感兴趣的人都可以从因特网免费下载其内核和应用程序,并开始移植或开发。许多仔毕Linux改良品种迎合了嵌入式/实时市场。它们包括RTLinux(实时Linux)、uclinux(用于非MMU设备的Linux)、MontavistaLinux(用于ARM、MIPS、PPC的Linux分发版)、ARM-Linux(ARM上的Linux)和其它Linux系统

嵌入式Linux开发大致涉及三个层次:引导装载程序、Linux内核和图形用户界面(或称GUI)。引导装载程序通常是在任何硬件上执行的之一段代码。在象台式机这样的常规系统中,通常将引导装载程序装入主引导记录(MasterBootRecord,(MBR))中,或者装入Linux驻留的磁盘的之一个扇区中。通常,在台式机或其它系统上,BIOS将控制移交给引导装载程序。

专用软件可以直接与远程系统上的闪存设备进行交互并将引导装载程序安装在闪存的给定位置中。闪存设备是与存储设备功能类似的特殊芯片,而且它们能持久存储信息—即,在重新引导时不会擦除其内容。

某些种类的嵌入式设备具有微小的引导代码—根据几个字节的指令—它将初始化一些DRAM设置并启用目标上的一个串行(或者USB,或者以太网)端口与主机程序通信。然后,主机程序或装入程序可以使用这个连接将引导装载程序传送到目标上,并将它写入闪存。设置工具链在主机机器上创建一个用于编译将在目标上运行的内核和应用程序的构建环境—这是因为目标硬件可能没有与主机兼容的二进制执行级别。

工具链由一套用于编译、汇编和链接内核及应用程序的组件组成。这些组件包括:Binutils—用哪档于操作二进制文件的实用程序。它们包括诸如ar、as、objmp、objcopy这样的实用程序。G—GNUC编译器。Glibc—所有用户应用程序都将链接到的C库。避免使用任何C库函数的内核和其它应用程序可以在没有该库的情况下进行编译。构建工具链建立了一个交叉编译器环境。本地编译器编译与本机同类的处理器的指令。交叉编译器运行在某一种处理器上,却可以编译另一种处理器的指令。重头设置交叉编译器工具链可不是一项简单的任务:它包括下载源代码、修补补丁、配置、编译、设置头文件、安装以及很多很多的操作。另外,这样一个彻底的构建过程对内存和硬盘的需求是巨大的。如果没有足够的内存和硬盘空间,那么在构建阶段由于相关性、配置或头文件设置等念缓芹问题会突然冒出许多问题。

因此能够从因特网上获得已预编译的二进制文件是一件好事(但不太好的一点是,它们大多数只限于基于ARM的系统,但迟早会改变的)。一些比较流行的已预编译的工具链包括那些来自Compaq(FamiliarLinux)、LART(LARTLinux)和Embedian(基于Debian但与它无关)的工具链—所有这些工具链都用于基于ARM的平台。从用户的观点来看,图形用户界面(GUI)是系统的一个最至关重要的方面:用户通过GUI与系统进行交互。所以GUI应该易于使用并且非常可靠。但它还需要是有内存意识的,以便在内存受限的、微型嵌入式设备上可以无缝执行。所以,它应该是轻量级的,并且能够快速装入。

另一个要考虑的重要方面涉及许可证问题。一些GUI分发版具有允许免费使用的许可证,甚至在一些商业产品中也是如此。另一些许可证要求如果想将GUI合并入项目中则要支付版税。

最后,大多数开发人员可能会选择XFree86,因为XFree86为他们提供了一个能使用他们喜欢的工具的熟悉环境。但是市场上较新的GUI,象CenturySoftware的(Nano-X)和TrolltechQT/Embedded,与X在嵌入式Linux的竞技舞台中展开了激烈竞争,这主要是因为它们占用很少的资源、执行的速度很快并且具有定制窗口构件的支持。

求嵌入式linux开发详细流程(步骤)?

1.首先,建立交叉编译环境:交叉编译是指:在PC机上编译,在目标板上执行,我PC是linux+ arm-elf-gcc编译器.扳子是ARM3000.板子上的系统是uclinux,这时一个剪裁的很小的实时嵌入式linux操作系统.推荐使用这个.

2.然后就是你写程序喽,不过注意可能有些库函数不能用,因为哪个编译器稍微受限一点,不是所由的c库函数都支持,不过一般开发的都有.

3.连起你的主机和开发板,这个你会不?要连两个:串口(用来控制板子)和以太口(用来下载程序),我们板子上这些外设都有,你要使没有可以用其他的口代替传程序,但串口可是该有的阿!

4.在你主机上编译程序生成目标代码,建议用makefile文件来组织你的联编关系.

5.把生成代码下载到目标板执行调试.我是用的主机的NFS(网落文件)服务,下载到目标板的.

6.注:目标板是怎么控制的呢?是用串口控制的,可用minicom,设置好你要控制的串口,也应该是你连板子的那个.在命令行里敲上minicom,即进入minicom截面,开启你的板子,应该就是板子uclinux系统解压安装的画面了.然后用ifconfig eth0…..

配置ip,这个ip就是你板子的ip了,注意与主机一个网段.然后mount -t nfs 主机ip:/uclinux /板子上的一个目录,就把主机的 uclinux目录放到板子上了(这么说其实不合理,应该叫挂载). 然后找到你刚才一经编译好的哪个目标代码执行即可.

因不了解你的具体环境和配置,暂说这些,有问题可再联系:)

嵌入式LINUX开发入门

V1.5

华恒对社区的贡献华恒对社区的贡献

本文适用于对嵌入式系统没有概念和经验,

渴望进入嵌入式系统开发的领域,

但又觉得系统太复杂,要学的东西太多,

感觉完全无从学起,无从下手

初级开发人员

简述简述

1,嵌入式系统必须以实践入门,所以要学习必须购买嵌入式开发系统

(开发板或实验箱),否则永远只能停留在纸上谈兵的阶段.

2,学习嵌入式LINUX开发,必须注意学习的方式和方法!就把这个嵌

入式开发板当作一台WINDOWS PC,就像用VC一样在上面做开发(只是

开发模式由原来完全的本地开发变成宿主机–目标板的模式了).

绝对不要去盲目阅读LINUX内核分析之类的书籍,对于初学者一两年内

根本用不到这个!就像在WINDOWS下开发永远不要关心WINDOWS内核一

个道理,不要因为LINUX内核是源代码开放的,就非要去研究LINUX内

核.90%的开发人员关心的还是”外设接口驱动+应用程序(如GUI)”

,所以对于初学者,进入嵌入式LINUX开发的殿堂,必须迈过如下两个

台阶:

嵌入式基本C程序开发及调试方法

基本驱动的概念和开发调试方法

嵌入式开发上手学习大纲嵌入式开发上手学习大纲

安装配置一台REDHAT 9的LINUX PC机.宿主机配置(TFTP/NFS)

参见:

通过终端软件minicom熟悉一下嵌入式系统的基本操作,否则你

根本就不会操作板子!

通过NFS mount的方式,学习用C语言开发最基本的嵌入式应用程

序,并熟悉嵌入式的调试方法.(HHARM9-EDU实验1)

熟悉掌握嵌入式LINUX下的编译方法和技巧,并进一步掌握调试

复杂嵌入式应用程序的方法和技巧.(HHARM9-EDU实验2,3)

通过NFS mount的方式,学习如何使用一个基本的嵌入式LINUX下

的设备驱动(inod驱动+测试用应用程序),并尝试着改改看

如何发生变化和如何调试.(HHARM9-EDU实验6中断,

14GPIO/key,AD/DA,I2C等)

进一步深入学习其它的接口技术.(HHARM9-EDU其它剩余实验)

【注意】

做到这里您一次都不需要烧写FLASH!

Tips–再谈学习的方式方法Tips–再谈学习的方式方法

早早安装一台REDHAT 9 LINUX的PC,下面这些必须熟悉了解(因为它将是我

们日后开发更佳的测试伙伴):

telnet/ncftp/tar(xzf/czf)/vi/grep/find/NFS/tftp等常用操作;熟悉了解

LINUX系统的文件目录构成(/bin/in/etc/home/dev/usr等的意义,系统搜

索路径PATH因为嵌入式LINUX上和这个完全一样)(关于这些LINUX常用知识

请参见HHARM2410产品技术手册附录B,那里没有无用的抄袭,而是一线研发

人员实际的总结)

大致了解LINUX内核源代码的文件目录的构成(主要就是drivers目录,它是我

们最常打交道的驱动的目录).因为我们对于LINUX下驱动的开发最重要的工

作学习的方法就是:”搜索+模仿”.大家都知道LINUX是开放源代码的,但

其实很多人并没有意识到这个对于我们实际的开发有什么意义.就像面前摆

了一座宝库,但却不知如何去寻宝.我们寻宝的手段就是搜索.对于驱动,

LINUX开放的代码(drivers目录+google网络)里面提供了无数常见接口芯片

的驱动代码或模板(如串口serial.c,framebuffer驱动等),我们首先要知道

这些文件在哪个目录下,找到后就是大致读一下,找出与自己实际硬件的差

异,以此为基础修修改改即可.而修改时一个重要的手段就是模仿现有的代

码!

Tips–再谈学习的方式方法Tips–再谈学习的方式方法

在嵌入式板卡上做任何稍微复杂些的工作,心里没底的话,就一定养成先在

REDHAT LINUX PC上测试的好习惯.无论你做GPRS/CDMA/PPP/ADSL拨号还是做

USB无线网卡驱动,还是做SAMBA/VPN/SNMP等协议软件,都先在REDHAT LINUX

上配置好,测试通过有了感觉之后再到嵌入式上试,因为ARMLINUX跟REDHAT

LINUX对于我们开发人员而言几乎没有任何区别!切忌冒进!

不要试图去通读CPU的manual,没有用的,就像不要为了做嵌入式LINUX就要

通读LINUX内核源代码分析一个道流.以目前实际的工作为主线,涉及到什么

再去大致了解一下相关内容,例如我们第二步要做MODULES形式的驱动,那么

这时去大致翻翻那本《LINUX驱动开发》一书的几页还是会有些帮助的,但也

没有必要全部通读!

嵌入式开发模式嵌入式开发模式

【宿主机】

网线

网线

交换机

串口线

HHARM开发板

假设IP为:192.168.2.120

【目标板】

运行RedhatLinux的PC机

假设IP为:192.168.2.2.122

交叉编译

之一部分

嵌入式基本C程序开发和调试

嵌入式基本C程序开发和调试嵌入式基本C程序开发和调试

关于Makefile关于Makefile

Makefile就是一个批处理的脚本!通过执行make来调用

EXEC = hello

OB = hello1.o #hello2.o hello3.o

LIBS += #-lcrypt -lm

all: $(EXEC)

$(EXEC) : $(OB)

$(CC) $(CFLAGS) $(LDFLAGS) -o $(EXEC) $(OB) $(LIBS)

clean:

rm-f $(OB) $(EXEC)

#Note

#表示注释,这是个通用的模板,我们的例子里面只用到一个hello1.c,而

且也不需要链接加密库(libcrypt.a)和数学库(libm.a).hello1.c的

内容就不需要写了吧,就一个printf语句

NFS mount调试方法进阶NFS mount调试方法进阶

前面./hello的方式用来调试最简单的主动执行的应用程序.还有很多的

应用程序要复杂一些,例如minigui/qt/microwin等GUI系统,它除了

可执行文件外,还涉及自己的动态库lib.so;还有另外一些如CGI类

的被动的被其它程序激发执行的程序对于这样的复杂程序调试,可如下

操作: (细节处有一些操作目录的变化)

在REDHAT LINUX PC上执行:

mkdir /2410lib;

gunzip ramdisk.image.gz

mount -o loop ramdisk.image /tmp

cp -f /tmp/lib/* /2410lib

在minicom等终端里执行:

mount -o nolock

192.168.2.122:/2410lib /lib

mount -o nolock 192.168.2.122:/ /mnt

/mnt/treeview&

#这样就可以NFS调试带动态库的复杂程序了

注意:

从上可见,板子可以多次mount多个目录,或者多个不同IP的PC的不同硬盘目录,甚至可以将

板子上所有的目录都用PC硬盘上的同类目录覆盖掉

同时可以看出这时的目标板就像一台UNIX主机一样可以为多个开发人员提供并行开发的环境.

第二部分

基本驱动的概念和开发调试方法

基本驱动的概念和开发调试方法基本驱动的概念和开发调试方法

ARMLINUX不同于uClinux,因为启动了MMU,所以应用程序不能直接

读写物理地址(包括CPU寄存器,

MEMORY,外设芯片内部寄存器等),而必须借助与驱动的形式,切入

内核用ioremap来实现对这些物理地址的访问.

下面以一个最常见的GPIO操作为例来说明:

就是选择S3C2410的GPIO_C6口作为一个输出口线,用户通过一个应用程序调用驱

动程序来控制这个口线输出1或者0,即高低电平.

例子由两部分构成:”驱动(gpio_driv.c)+应用程序(gpio_test.c)”

LINUX下的驱动有两种形式:

MODULES形式的可动态加载的驱动(这是LINUX内核一个非常重要

的特点),我们测试用建议都用这种形式的,因为它调试就和普通应用

程序一样,可以通过NFS mount的方式来调试,非常方便.

静态编译到内核里面的驱动

基本驱动的概念和开发调试方法基本驱动的概念和开发调试方法

样例modules形式驱动的测试用法如下:

NFS mount宿主机后,

inod gpio_driv.o #在板上嵌入式LINUX内核已经跑起来之后动态加载驱动module

mknod/dev/gpiotest c 220 0

./gpio_test#执行测试用的应用程序来调用驱动,来驱动IO输出高低电平

0:set ,1:clear,2: quit :

用户输入0,则C6口输出3.3V高电平;用户输入1,则C6口输出0低电平.

应用程序如何调用驱动以及驱动要注意的一些细节在下面的详细代码中通过注释

的形式一一说明.

驱动MODULE源代码驱动MODULE源代码

#include //FILE: gpio_driv.c

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define IOPORT_MAJOR 220 //定义主设备号,和前面的mknod/dev/gpiotestc 220 0匹配

typedefchar ioport_device_t; long port_addr;

static ioport_device_t gpio_devices;

int gpio_open(struct inode*, structfile *);

int gpio_release(struct inode*, structfile *);

int gpio_ctl_ioctl(struct inode *, struct file *, unsigned int, unsigned long);

驱动MODULE源代码驱动MODULE源代码

static structfile_operations gpio_ctl_fops= {

ioctl: gpio_ctl_ioctl,

open: gpio_open,

release: gpio_release,

};

//所有的操作系统将硬件设备当作文件处理,所有外设的操作就封装在这个file_operations 结构体里面

//就是文件的open/read/write/close等操作,剩余的都放到一个ioctl函数里面做处理.

int__init gpio_init(void)

{

inti;

//可以看到下面这句向操作系统注册的函数里面和前面我们在minicom里面手工创建的设备文件是

//要完全匹配的:mknod/dev/gpiotestc 220 0,这表明创建的是一个字符设备(chrdev),

//主设备号220,次设备号0,因为操作系统不理会”gpiotest”这个设备名字符串的,它只认数字的主次

//设备号,而应用程序到时是open(“/dev/gpiotest”,xx)的,中间就是通过这两个数字联系起来的.

register_chrdev(IOPORT_MAJOR, “gpiotest”, &gpio_ctl_fops);

return 0;

}

module_init(gpio_init); //用户加载该驱动时执行inod gpio_driv.o就会自动调用gpio_init函数,它是驱动

//的入口点,相当于应用程序的main函数.

module_exit(gpio_release); //用户卸载该驱动rmmod gpio_driv时执行

驱动MODULE源代码驱动MODULE源代码

int gpio_open(struct inode*inode, structfile *filp)

{

intminor;

minor = MINOR(inode->i_rdev);

#if 0 //这里是通常的做法,因为S3C2410的LINUX内核提供了set_gpio_ctrl专用函数,所以不要下面

这样做了

(void *)(port_addr) = ioremap(0x,0x8);

*(volatile unsigned int*)(port_addr)|=0x;

#endif

//驱动里面在open这个设备的时候设置这个口为输出(因为GPIO必须设置方向,做输入还是输出)

set_gpio_ctrl(GPIO_MODE_OUT | GPIO_C6);

gpio_devices++;

return 0;

}

驱动MODULE源代码驱动MODULE源代码

int gpio_release(struct inode*inode, structfile *filp)

{ intminor;

minor = MINOR(inode->i_rdev);

if (gpio_devices)

gpio_devices–;

return 0;

}

int gpio_ctl_ioctl(struct inode*inode,structfile *flip,unsigned intcommand,unsigned long arg)

{

interr = 0;

intminor = MINOR(inode->i_rdev);

switch (command) {

case IOWRITE:

write_gpio_bit(GPIO_MODE_OUT | GPIO_C6,1); //输出3.3V电平

return 0;

case IOCLEAR:

write_gpio_bit(GPIO_MODE_OUT | GPIO_C6,0); //输出0电平

return 0;

}

return err;

}

基本驱动MODULE的Makefile基本驱动MODULE的Makefile

注意!驱动程序的Makefile和应用程序的参数不同!

CC = /opt/host/armv4l/bin/armv4l-unknown-linux-gcc

LD = /opt/host/armv4l/bin/armv4l-unknown-linux-ld

CFLAGS = -D__KERNEL__ -I/HHARM2410-R3/kernel/include/linux

-I/HHARM2410-R3/kernel/include -Wall -Wstrict-prototypes -Wno-trigraphs-

Os -mapcs-fno-strict-aliasing-fno-common -fno-common -pipe -mapcs-32

-march=armv4 -mtune=arm9tdmi -mshort-load-bytes -msoft-float

-DKBUILD_BASENAME= gpio_driv

-I/opt/host/armv4l/src/linux/include -DMODULE

gpio_driv.o: gpio_driv.c

$(CC) $(CFLAGS) -c $^ -o $@

cp gpio_driv.o / -f

clean:

-rm-f *.o

测试驱动的应用程序测试驱动的应用程序

#include //FILE: gpio_test.c

#include

#include …//省略一些头文件

#include

#define DEVICE_GPIOTEST “/dev/gpiotest”

intmain()

{

int fd; int val=-1;

if((fd=open(DEVICE_ GPIOTEST,O_RDON | O_NONBLOCK))i_rdev);

#if 0 //这里是通常的做法,因为S3C2410的LINUX内核提供了set_gpio_ctrl专用函数,所以不要下面

这样做了

(void *)(port_addr) = ioremap(0x,0x8);

*(volatile unsigned int*)(port_addr)|=0x;

#endif

//驱动里面在open这个设备的时候设置这个口为输出(因为GPIO必须设置方向,做输入还是输出)

set_gpio_ctrl(GPIO_MODE_OUT | GPIO_C6);

gpio_devices++;

return 0;

}

18

驱动MODULE源代码驱动MODULE源代码

int gpio_release(struct inode*inode, structfile *filp)

{ intminor;

minor = MINOR(inode->i_rdev);

if (gpio_devices)

gpio_devices–;

return 0;

}

int gpio_ctl_ioctl(struct inode*inode,structfile *flip,unsigned intcommand,unsigned long arg)

{

interr = 0;

intminor = MINOR(inode->i_rdev);

switch (command) {

case IOWRITE:

write_gpio_bit(GPIO_MODE_OUT | GPIO_C6,1); //输出3.3V电平

return 0;

case IOCLEAR:

write_gpio_bit(GPIO_MODE_OUT | GPIO_C6,0); //输出0电平

return 0;

}

return err;

}

19

基本驱动MODULE的Makefile基本驱动MODULE的Makefile

注意!驱动程序的Makefile和应用程序的参数不同!

CC = /opt/host/armv4l/bin/armv4l-unknown-linux-gcc

LD = /opt/host/armv4l/bin/armv4l-unknown-linux-ld

CFLAGS = -D__KERNEL__ -I/HHARM2410-R3/kernel/include/linux

-I/HHARM2410-R3/kernel/include -Wall -Wstrict-prototypes -Wno-trigraphs-

Os -mapcs-fno-strict-aliasing-fno-common -fno-common -pipe -mapcs-32

-march=armv4 -mtune=arm9tdmi -mshort-load-bytes -msoft-float

-DKBUILD_BASENAME= gpio_driv

-I/opt/host/armv4l/src/linux/include -DMODULE

gpio_driv.o: gpio_driv.c

$(CC) $(CFLAGS) -c $^ -o $@

cp gpio_driv.o / -f

clean:

-rm-f *.o

20

测试驱动的应用程序测试驱动的应用程序

#include //FILE: gpio_test.c

#include

#include …//省略一些头文件

#include

#define DEVICE_GPIOTEST “/dev/gpiotest”

intmain()

{

int fd; int val=-1;

if((fd=open(DEVICE_ GPIOTEST,O_RDON | O_NONBLOCK))

{ perror(“can not open device”); exit(1); }

while(1){

printf(“0:set ,1:clear,2: quit :”);

scanf(“%d”,&val);

if(val==0)

ioctl(fd,IOWRITE,0);//应用程序就是这样调用驱动的

else if(val==1)

ioctl(fd,IOCLEAR,0);//应用程序就是这样调用驱动的

else if(val==2){

close(fd); …

}

}

21

最后可试试烧写FLASH了最后可试试烧写FLASH了

完成自己的小驱动和测试用应用程序后,您可以将自己的初步成就烧写到板子里去了,具体的烧

写可参见我们产品手册或者HHARM FAQ

如何加入到板子的文件系统里

文件系统就是用来存放用户应用程序的.

HHARM9系列嵌入式LINUX开发系统的根文件系统采用的是ramdisk.

下面举例说明用户如何把自己的hello程序烧写到板子上去:

先把ramdisk.image.gz解压后mount -o loop 到一个目录上,这样就可以看到ramdisk里面的文

件及目录内容,这时再把你编译号的hello这个可执行文件复制到这个目录的bin目录下面,再

umount这个目录,再gzip压缩,这样你所作的改动就被带到这个新生成的ramdisk.image.gz文件

里面了,然后你烧写这个文件就可以在板子上看到你的hello了.

简单命令序列:注意要自己调整目录路径,所有操作均在REDHAT LINUX PC机上完成:

gunzip ramdisk.image.gz

mkdir tmnt

mount -o loop ramdisk.image tmnt

cp -f busybox tmnt/bin

umount tmnt

gzip ramdisk.image

cp -f ramdisk.image.gz /tftpboot ;再后面的烧写步骤这里就不再赘述,参见HHARM FAQ或者我们手册即可

22

参考资料参考资料

HHARM9-EDU实验指导书

参见:华恒ARM9+LINUX+WINCE双系统嵌入式教学实验箱

HHARM FAQ

华恒HHARM2410系列产品手册

可EMAIL至华恒ARM产品系列技术支持信箱:

华恒嵌入式LINUX技术论坛

嵌入式LINUX开发资源

回答者:bingxiang81 – 经理 四级:46

Tips–再谈学习的方式方法Tips–再谈学习的方式方法

在嵌入式板卡上做任何稍微复杂些的工作,心里没底的话,就一定养成先在

REDHAT LINUX PC上测试的好习惯.无论你做GPRS/CDMA/PPP/ADSL拨号还是做

USB无线网卡驱动,还是做SAMBA/VPN/SNMP等协议软件,都先在REDHAT LINUX

上配置好,测试通过有了感觉之后再到嵌入式上试,因为ARMLINUX跟REDHAT

LINUX对于我们开发人员而言几乎没有任何区别!切忌冒进!

不要试图去通读CPU的manual,没有用的,就像不要为了做嵌入式LINUX就要

通读LINUX内核源代码分析一个道流.以目前实际的工作为主线,涉及到什么

再去大致了解一下相关内容,例如我们第二步要做MODULES形式的驱动,那么

这时去大致翻翻那本《LINUX驱动开发》一书的几页还是会有些帮助的,但也

没有必要全部通读!好好看把

建立以Linux系统为基础的开发环境;

配置开发主机(MINICOM调试嵌入式开发板、NFS网络文件系统,防火墙);

建立引导装载程序BOOTLOADER(公开源代码的BOOTLOADER,如U-BOOT、BLOB、VIVI、LILO、ARM-BOOT、RED-BOOT等);

下载别人已经移植好的Linux操作系统(如μCLinux、ARM-Linux、PPC-Linux等);

建立根文件系统(包括:/etc/init.d/rc.S、/etc/profile、/etc/.profile等);

建立应用程序的Flash磁盘分区,一般使用JFFS2或YAFFS文件系统;

开发应用程序,应用程序可以放入根文件系统中,也可以放入YAFFS、JFFS2文件系统中;

uclinux 内核移植的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于uclinux 内核移植,uclinux内核移植:打造嵌入式系统的新选择,单片机与OS区别在哪,关于Linux,求嵌入式linux开发详细流程(步骤)?的信息别忘了在本站进行查找喔。


数据运维技术 » uclinux内核移植:打造嵌入式系统的新选择 (uclinux 内核移植)