第一篇:基于ARM的嵌入式设备中uCLinux系统开发.
基于ARM的嵌入式设备中uCLinux系统开发
1引言信息家电和手持设备大大加速了嵌入式系统的发展,而ARM体系32位高性能、低功耗处理器和嵌入式操作系统Linux无疑成为佼佼者。因为Linux源代码开放、免费,任何将其定制于PDA、掌上机或者便携式设备感兴趣的人都可以从因特网免费下载其内核和应用程序,并开始移植或开发,所以Linux在嵌入式开发领域得到稳步发展。uCLinux即是目前嵌入式linux中最流行的一种,它是针对微控制领域而设计的Linux系统,其最大特征就是没有MMU(内存 1 引言
信息家电和手持设备大大加速了嵌入式系统的发展,而ARM体系32位高性能、低功耗处理器和嵌入式操作系统Linux无疑成为佼佼者。因为Linux源代码开放、免费,任何将其定制于PDA、掌上机或者便携式设备感兴趣的人都可以从因特网免费下载其内核和应用程序,并开始移植或开发,所以Linux在嵌入式开发领域得到稳步发展。uCLinux 即是目前嵌入式linux 中最流行的一种,它是针对微控制领域而设计的Linux系统,其最大特征就是没有MMU(内存管理单元模块),适合嵌入式系统小型化应用。
uCLinux支持多任务,支持多种文件系统,提供了对网络的强大支持,具有完整的TCP/IP协议栈,以及标准丰富的API。由于它的很多核心代码都为没有被MMU的处理器重新编写过,对标准Linux庞大的应用程序库和驱动程序库作了删改,所以它的内核要比常规的Linux 内核小很多;uCLinux包含Linux常用的API和小于512k的内核及相关的工具,总代码只有900k左右,但同时保留了常规Linux 操作系统绝大多数的优点。2 基于ARM的硬件平台
嵌入式领域32位处理器以ARM公司的ARM核最为流行,本文以Samsung公司的ARM7TDMI芯片S3C4510为处理器开发板为硬件平台,开发板上与S3C4510相关的部分主要集成了如下器件:
(2M+512k)B 的Flash,其中AT29C010A为512B作为BootLoader,一片SST49VF160为1M×16bitFlash;
16MB 的DRAM,由两片4M×16bits的HY57V641620提供 ; 16MB 的SRAM,由M-systems的新一代闪存盘DOC2000构成; Ethernet接口; ARM JTAG 接口。
开发板上与S3C4510相关部分功能框图如图1 所示。
IO
UART
S3C4510 JTAG
Ethernet
FLASH
F
DOC2000
232串口
JTAG接口
LED
以太网接口
用户自定义逻辑
DRAM uCLinux内核移植
嵌入式 Linux 开发大致涉及三个层次:引导装载程序、Linux 内核和驱动及应用程序。我们将讨论涉及这三层的一些基本概念;深入了解引导装载程序、内核和文件系统是如何交互的。
引导程序BootLoader的主要作用包括初始化处理器;初始化必备的设备;下载系统映象;初始化操作系统系统并准备执行。
引导装载程序有两种方法:专用软件和微小的引导代码。专用软件可以直接与远程系统上的闪存设备进行交互并将引导装载程序安装在闪存的给定位置中。而某些种类的嵌入式设备具有微小的引导代码:根据几个字节的指令,它将初始化一些 DRAM 设置并启用目标上的一个串行(或者USB,或者以太网)端口与主机程序通信;然后,主机程序或装入程序可以使用这个连接将引导装载程序传送到目标上,并将它写入闪存。
嵌入式设备上一些流行的并可免费使用的 Linux 引导装载程序有
Blob、Redboot 和 Bootldr。所有这些引导装载程序都用于基于 ARM 设备上的 Linux,并需要Jflash-linux 工具用于安装。一旦将引导装载程序安装到目标的闪存中,它就会执行我们上面提到的所有初始化工作。然后,它准备接收来自主机的内核和文件系统。一旦装入了内核,引导装载程序就将控制转给内核。
Linux内核移植首先需要配置内核,可以用make menuconfig进行,根据板卡选择必要的选项。主要包括系统类型选定(ARM system type),配置SDRAM/Flash地址;对块设备、字符设备进行选择和配置;配置文件系统;是否配置图形用户界面(GUI)。修改内核,我们选用上的uClinux-2.4.26-uc0.diff,已经为S3C4510移植好的内核,需要修改的地方很少。编译内核,首先要在宿主机(安装有Linux)上建立交*编译环境,下载arm-elf-tools安装在Linux 宿主机上的/usr/local/bin 目录下。现在的BLOB 和将来的uClinux 都要在这个环境下编译。开始编译uClinux 编译内核:执行命令:
make menuconfig 在出现的对话框选Samsung/4510B 和 uC-libc,然后退出。如果选择uC-libc编译出错,可以改选uClibc!
make dep
make lib_only
make user_only
make romfs
make image 产生 romfs.o,这一步将会出现一些错误报告,可忽略继续下面的命令
make 如果make无错误,在images的目录下你会看到有 image.ram 和 image.rom 两个二进制的内核文件。即image.ram和image.rom。image.ram可以通过Bootloader下载到SDRAM中运行。image.rom可以写入到Flash SST39VF160中直接运行。
down image.ram看看能不能运行
最后一步,uClinux调试完毕,通过jflashp将其写入到Flash中:开发板断电,把JTAG仿真器接到计算机的并口和板子的14PinJTAG插座上;接通5V电源;执行 FlashP w-f image.rom,大约30分钟以后烧写完毕。撤掉JTAG仿真器以后再上电就应该运行uClinux了。如果想把BootLoader写回Flash,执行FlashP w-f bios.img即可。4 uCLinux驱动程序开发
嵌入式系统通常有许多设备用于与用户交互,象触摸屏、小键盘、滚动轮、传感器、RS232接口、LCD等等。除了这些设备外,还有许多其它专用设备,包括闪存、USB、GSM、GPS等。内核通过所有这些设备各自的设备驱动程序来控制它们,包括 GUI 用户应用程序也通过访问这些驱动程序来访问设备。uClinux 的驱动程序库不可能包括实际项目系统中所有外围硬件的驱动,所以在应用开发中,编写驱动程序是一个重要步骤,驱动程序设计的好坏直接影响系统运行的稳定性和运行效率。
在uClinux 内核编写驱动程序并不像其他操作系统那么复杂,实际上,所要做的只是为相应的设备编写几个基本函数并向VFS(virtual file system)注册即可。当上层应用要使用该设备时,VFS 就会调用相应的设备函数。设备驱动程序通常可归为以下3 类: a)块设备(block),以块为单位,允许随机访问,多用缓存技术; b)字符设备(char),以字节为单位,只能按顺序访问,不用缓存; c)网络接口(net)。
在本系统中,DOC作为块设备可被模拟为IDE设备进行识别,系统用主设备号(MAJOR)和次设备号(MINOR)来唯一标识一般设备;相同主设备号表示同一类设备,次设备号表示同类设备的个数。所有设备在适当的目录(通常是/dev目录)下必须有相应的文件,这样字符设备和块设备都可以通过文件操作的系统调用完成。不同的是,块设备操作经常和缓冲区联系在一起。
字符设备的驱动程序通过在device_struct数据结构的chrdevs向量中增加一项的方法来向内核注册自己。然后对这个设备的所有调用都用这个设备号来实现;
块设备和字符设备都需要定义功能函数:对于每一个驱动函数来说,都有一些和此设备密切相关的功能函数,就最常用的字符设备来说,都存在着诸如open()、read()、write()、ioctrol()这一类的操作。当系统调用这些操作时,将自动的使用file-operations 结构中对应的函数来实现具体的操作;块设备由于使用高速缓存,其驱动程序不需要保护自己的read()、write()和fsync()函数,但必须使用自己的open()、release()和ioctl()函数,函数原型为:
static int my_open(struct inode *inode,struct file *file);static int my_release(struct inode *inode,struct file *file);static int my_ioctl(struct inode *inode,struct file *file,unsigned int cmd,unsigned long age);
块设备驱动程序的请求处理函数一般通过中断实现。驱动程序被调用时CPU由内核程序控制,故不可抢占,驱动程序必须调用sleep_on()函数释放对CPU的占用,在中断服务子程序将数据复制到内核内核后,再发出wake_up()调用。
字符设备如LCD、USB应用广泛,下面以此为例详细说明添加设备驱动的过程。设备名称为scre,设备号为254。块设备与网络设备可以比照处理。
在目录/linux_2.4/drives/char编写源程序scre.c,编写字符设备的处理函数。
1.设备驱动原文件必须包括这样的一个函数:
void scre_init(void){register(254, 'scre', &scre_fops)} 这个函数完成注册.在linux-2.4.x/driver/mem.c 将会调用它。2.修改 linux-2.4.x/driver/char/Makefile 在适当位置添加一行:obj_$(CONFIG_SCRE)+= scre.o 3.修改linux-2.4.x/driver/char/Config.in, 添加一行:
bool 'scre device' CONFIG_SCRE,便于在 make menuconfig 时选择
4.修改linux-2.4.x/driver/char/mem.c,在适当位置(你去找就会发现,在文件头部)添加:
#ifdef CONFIG_SCRE
extern void scre_init(void);
#endif
在chr_dev_init()函数添加:
#ifdef CONFIG_SCRE
scre_init();
#endif
5.修改vendor/Samsung/4510b/Makefile,建立设备节点;在12---35行间,DEVICE 部分添加如下内容 :scre,c,254,0。
6.make menuconfig 选中scre device,编译,下载;启动后你会看到 /proc/devices 中字符设备多了一项 scre 254。
uClinux的Web技术,主要有三个Web服务器:httpd,thttpd和boa。Httpd简单,但只能Web浏览,不支持认证、CGI,thttpd和boa Web服务器功能较全;而boa Web代码简单、速度快,适合嵌入式应用。Boa作为一个简单的http服务器,与传统服务器的主要区别是它是单进程的。boa在uClinux下的实现需要对boa.conf和mime.types作一些配置和修改,并且需在命令行指定配置文件所在目录。配置完成后需要重新编译内核,并选中boa选项,将编译好的内核下载到开发板,启动uClinux,完成IP设置,启动boa Web后便可通过IE访问网页了。5 结语
uClinux在嵌入式领域凭借其稳定、良好的移植性,优秀的网络功能,灵活完备的文件系统以及众多的技术支持等优点得到广泛应用,并将有更广阔的应用前景。本文针对uClinux的开发应用步骤作了大致的阐述,对ARM应用平台上的系统移植和应用开发作了分析,具有一定的指导意义。
参考文献
[1].刘安昱 温晓辉 刘志红,基于S3C44B0X的uClinux的移植,《单片机与嵌入式系统应用》[J]2003.12.[2].徐雪松等,基于嵌入式Linux的DiskOnChip设备的驱动开发实现,《电子设计应用》[J]2003.12 [3].Linux on module project-Lom ARM7 ,.[4].朱珂等译,《Linux编程白皮书》[M],机械工业出版社,2000.[5].赵炯,《Linux内核完全注释(内核版本0.11)》[M],2003
第二篇:实习总结-嵌入式ARM
实训总结
班级 卓越1301姓名***
通过这段时间的学习使我学到了很多知识,并且了解到ARM的应用以及对开发板的应用,为以后的学习奠定了一定的基础。
嵌入式系统一般定义为以应用为中心、以计算机技术为基础,软硬件可裁剪,应用系统对功能、可靠性、成本、体积、功耗和应用环境有特殊要求的专用计算机系统。是将应用程序、操作系统和计算机硬件集成在一起的系统这是从技术角度。从系统角度上是设计完成复杂功能的硬件和软件,并使其紧密耦合在一起的计算机系统。
广义上讲,凡是带有微处理器的专用软硬件系统都可称为嵌入式系统。如各类单片机和DSP系统。这些系统在完成较为单一的专业功能时具有简洁高效的特点。但由于他们没有操作系统,管理系统硬件核软件的能力有限,在实现复杂多任务功能时,往往困难重重,甚至无法实现。从狭义上讲,我们更加强调那些使用嵌入式微处理器构成独立系统,具有自己操作系统,具有特定功能,用于特定场合的嵌入式系统。
嵌入式的应用也比较广泛涉及军事国防、工业控制、消费电子和网络。在家用方面更是数字电视、信息家电、智能玩具、手持通讯、存储设备的核心。
在ARM指令集中了解到ARM的寻址方式以及它的的特性,具有高效、快速的特点,还有Thumb指令集具有灵活、小巧的特点。
在这次实训中做了两个项目,一个是LED灯,实现LED灯的点亮是比较简单的,通过查找手册可以很快的了解到要使用的寄存器和方法,另一个项目是DS18B20这个比较复杂,除了要掌握对寄存器的使用,还要对了解对串口的初始化,读写字节等等。
感谢这次实训,通过这次的实训项目,使我大体了解制作项目的步骤,了解了嵌入式技术的掌握是需要一个过程的。实事求是的说,嵌入式技术的全面掌握是有相当难度的,通过积累和动手总会有收获的,从实验中也明白了一个大的项目并不是一个人可以完成的,团队协作很重要。
姓名:***
年级:卓越1301
2014-7-5
第三篇:嵌入式系统ARM实验报告
南京邮电大学通信与信息工程学院
实验报告
实验名称:实验一基于ADS开发环境的设计
实验二嵌入式Linux交叉开发环境的建立 实验三嵌入式Linux环境下的程序设计
课程名称嵌入式系统B
班级学号B13010711 姓名马俊民
开课时间 2015/2016学年第1学期
实验一基于ADS开发环境的程序设计
一、实验目的
1、学习ADS开发环境的使用;
2、学习和掌握ADS环境下的汇编语言及C语言程序设计;
3、学习和掌握汇编语言及C语言的混合编程方法。
二、实验内容
1、编写和调试汇编语言程序;
2、编写和调试C语言程序;
3、编写和调试汇编语言及C语言的混合程序;
4、编写程序测试多寄存器传送指令的用法。
三、实验原理
ADS全称为ARM Developer Suite,是ARM公司推出的新一代ARM集成开发工具。现在常用的ADS版本是ADS1.2,它取代了早期的ADS1.1和ADS1.0。
ADS用于无操作系统的ARM系统开发,是对裸机(可理解成一个高级单片机)的开发。ADS具有极佳的测试环境和良好的侦错功能,它可使硬件开发工作者更深入地从底层去理解ARM处理器的工作原理和操作方法,为日后自行设计打基础,为BootLoader的编写和调试打基础。
1.ADS软件的组成
ADS由命令行开发工具、ARM运行时库、GUI开发环境(CodeWarrior和AXD)、实用程序、支持软件等组成。
2.GUI开发环境
ADS GUI开发环境包含CodeWarrior和AXD两种,其中Code Warrior是集成开发工具,而AXD是调试工具。
使用汇编语言进行编程简单、方便,适用于初始化硬件代码、启动代码等。汇编语言具有一些相同的基本特征:
1.一条指令一行。
2.使用标号(label)给内存单元提供名称,从第一列开始书写。3.指令必须从第二列或能区分标号的地方开始书写。4.注释必须跟在指定的注释字符后面,一直书写到行尾。
在ARM汇编程序中,每个段必须以AREA作为段的开始,以碰到下一个AREA作为该段的结束,段名必须唯一。程序的开始和结束需以ENTRY和END来标识。嵌入式C语言设计是利用基本的C语言知识,面向嵌入式工程实际应用进行程序设计。为了使单独编译的C语言程序和汇编程序之间能够相互调用,必须为子程序之间的调用规定一定的规则。ATPCS就是ARM程序和Thumb程序中子程序调用的基本规则。
四、实验过程与关键代码分析
1.创建项目工程
在File菜单中选择New命令,打开一个新建工程对话框。在Project选项卡下,选择ARM Executable Image, 然后在Project name文本框里输入项目名称,点击确定。弹出工程窗口。
选择File菜单中的New命令,选择File标签页,在File name文本框中输入要创建的文件名。汇编程序以.s结尾,c程序以.c结尾。在Location文本框中指定文件的存放位置,选中Add to Project,在Targets中选中DebugRel,单击确定关闭窗口。
2.用汇编语言设计程序实现10的阶乘
AREA EXAMPLE, CODE, READONLY ENTRY start MOV R0, #10 MOV R1, #1 LOOP MUL R0, R0, R1 SUB R0, R0, 1 CMP R0, #1 BHI LOOP END 在这个程序中,我们首先对R0和R1赋值,将R0作为一个变量,而R1作为一个存贮阶乘值的寄存器。在每进行一次乘法之后,将R0减1。同时在做完减法后进行判断,如果此时R0大于1,则返回继续乘法,否则结束程序,输出结果。
3.用调用子程序的方法实现1!+2!+3!+„+10!,代码如下: asmp.s
AREA JC, CODE, READONLY
EXPORT JCP
ENTRY JCP
ADD R3, R0, #1
MOV R2, #1
MOV R1, #1 LOOP MUL R0, R1, R2
MOV R1, R0
ADD R2, R2, #1
CMP R2, R3
BNE LOOP
NOP
NOP
MOV PC, LR
END
PROGC.c #include
int main(){ int res=0;int m=10;int i;for(i=1;i<=m;i++)
res=res+JCP(i);printf(“The result =%dn”,res);return 0;} 在这个程序中,主程序由c语言完成作求和,子程序由汇编语言写成作阶乘。
5.实现字符串的逆序复制TEXT1=“HELLO”=>TEXT2=“OLLEH”
AREA invstring, CODE, READONLY start
ADR R1,TEXT1
ADR R2,TEXT2
MOV R3, #0 LOOP
LDRB R0,[R1], #1
ADD R3,R3,#1
CMP R0,#0
BNE LOOP
SUB R1,R1,#2
LOOP1
LDRB R0,[R1], #-1
STRB R0,[R2], #1
SUB R3,R3, #1
CMP R3,#1
BNE LOOP1
MOV R5,#&55
TEXT1
TEXT2 NOP =“HELLO”,0 ALIGN =“OELLH” END
五、实验小结
在这次实验中,学会了如何使用汇编程序进行编程。对汇编程序编程一些基本的要求有了一定的了解,学习了C语言的语法和在其中调用汇编程序的方法。学会了利用CodeWarrior IDE开发C和ARM汇编代码。学会了在AXD中进行代码调试的方法和过程,对AXD的调试有初步的了解。,实验二嵌入式Linux交叉开发环境的建立
一、实验目的
1、掌握嵌入式Linux交叉开发环境的建立方法
2、学习和掌握Linux常用命令
3、学习和掌握vi编辑器的使用
二、实验内容
1、搭建嵌入式Linux交叉开发环境
2、熟悉Linux的常用命令
3、熟悉vi编辑器的常用命令
三、实验原理
Linux系统是UNIX系统的分支,是UNIX的微机版。Linux具有异常丰富的驱动程序资源,支持各种主流的硬件设备与技术。Linux包含了现代的UNIX操作系统的所有功能特性,这些功能包括多任务、虚拟内存、虚拟文件系统、进程间通信、对称所处理器、多用户支持等。
Vi编辑器是所有UNIX和Linux下的标准编辑器。它包含3种工作模式。嵌入式系统是专用的计算机系统,它对系统的功能、可靠性、成本、体积、功耗等有严格的要求。大部分嵌入式系统没有大容量存储设备,一般不能安装大型开发软件,系统的开发需要采用交叉开发模式。
四、实验过程与关键代码分析
实验用的是UP-NetARM2410-S试验箱,里面配有三星的芯片S3c2410X。打开电脑上VMWare软件,在Windows系统下启动虚拟机里的Linux系统。接着需要
1.宿主机的环境搭建
下载并运行VMWare,根据向导创建一台新虚拟机并选择Linux作为客户操作系统,再根据向导安装RedHat Linux 9.0。
2.虚拟机中启动Linux操作系统
使用root登陆,用户名为root,密码为123456。之后对共享文件设置进行调整:打开settings界面,打开shared folders功能,同时将路径设置到有课前下载的软件的目录下。
3.开发工具软件的安装(1)安装gcc 打开Linux后,打开终端窗口,在共享的目录下找到install.sh并运行,命令如下: ls./ install.sh 安装程序将自动建立/arm2410s目录,并将所有的开发软件包安装到/arm2410s 目录下,同时自动配置编译环境,建立合适的符号链接。安装完成后在目录/opt/host/armv4l/bin/下应该能看到主编译器。(2)配置PATH路径
vi.bash.profile 将里面PATH变量改为PATH=$PATH:$HOME/bin:/opt/host/armv41/bin/;存盘后执行
source.bash_profile 以后armv4l-unknown-linux-gcc将被自动搜索到
4.宿主机上的开发环境配置(1)配置IP地址
ifconfig eth0 192.168.0.121 命令配置了宿主机的IP地址。然后打开网络配置窗口,重新探测MAC地址。重新激活。(2)关闭防火墙
单击“Red”菜单→“系统设置”→“安全级别”→打开“安全级别配置”窗口,选择“无防火墙选项。”(3)配置NFS。
单击“Red”菜单→“系统设置”→“服务器设置”→“服务”,在“服务配置”窗口中勾选nfs,单击“开始”(4)NFS设置
单击“Red”菜单→“系统设置”→“服务器设置”→“NFS服务器”,打开“NFS服务器配置”窗口,设置NFS共享。
然后在NFS服务器中增加主机IP地址的链接许可和目录。完成配置。
5.目标机的信息输出
Windows系统下,“开始”→“所有程序”→“附件”→“通讯”→“超级终端”,新建一个通信终端。区号、电话号码随意输入。设置每秒位数为“115200”,数据位为“8”,无奇偶校验,停止位为“1”,无数据流控制。单击“确定”。
6.程序的运行
打开超级终端,启动Linux,屏幕显示:
[/mnt/yaffs] 在超级终端上执行挂载命令:
[/mnt] mount –t nfs 192.168.0.121:/arm2410s /mnt/nfs 挂载成功后可执行程序。
五、实验小结
在这次实验中,学会建立Linux交叉开发环境,学会了ls和vi,cd等常用的Linux命令,并掌握了Vi编辑器的使用方法。同时知道了如何在搭建失败时寻找错误进行排错。
实验三嵌入式Linux环境下的程序设计
一、实验目的
1、掌握嵌入式Linux环境下的程序设计方法
2、学会编写Makefile文件
二、实验内容
1、熟悉嵌入式教学实验箱的使用
2、编写C程序和Makefile文件
3、编译程序产生可执行程序
4、完成主机的挂载和程序的执行
三、实验原理
在嵌入式Linux环境下的程序设计方法有一下几个步骤:
1.编写源程序
2.编写Makefile文件 3.编译程序
4.运行和调试程序
5.将生产的可执行文件加入文件系统。
前三个步骤在宿主机上完成,后面的步骤在目标机上完成。
四、实验过程与关键代码分析
1.建立工作目录
mkdir hello cd hello
2.编写源程序
用vi编辑器编辑Hello.c文件
vi Hello.c 在Vi中输入源程序如下:
#include
printf(“hello world n”);}
3.编写Makefile文件
vi Makefile 在vi中编辑Makefile文件如下:
CC= armv4l-unknown-linux-gcc EXEC = hello OBJS = hello.o CFLAGS += LDFLAGS+=-static all: $(EXEC)$(EXEC):(OBJS)$(CC)$(LDFLAGS)–o $@ $(OBJS)clean:
-rm –f $(EXEC)*.elf *.gdb *.o
4.编译程序
在hello目录下运行“make”来编译程序。
make clean
make 编译成功后,生成可执行文件Hello.o。
5.下载调试
在宿主机上启动nfs服务,并将/arms2410s设置为共享目录。接下来启动超级终端,建立通讯,挂载。
[/mnt] mount –t nfs 192.168.0.121:/arm2410s /mnt/nfs 挂载成功后,进入/mnt/nfs,再进入/mnt/nfs/hello,直接运行刚刚编译生成的可执行文件Hello.o,查看运行结果
cd hello./hello 可以看见“Hello world”
只需要挂载一次便可,只要实验箱没有重启,就可以一直保持连接。反复修改、编译、调试,直至程序调试通过。
6.可执行文件加入文件系统
程序调试通过后,可以把可执行文件拖放到usr/bin目录下,然后使用mkcramfs制作工具生成新的文件系统。当系统启动后,就可以在相应目录下执行可执行程序hello.五、实验小结 在这次实验中,学会了在嵌入式Linux环境下设计程序。同时知道了如何对目标机进行挂载。以及如何在发现挂载不成功寻找错误进行修改。另外在编译文件时需要注意的也都有所了解。
实验四多线程程序设计
一、实验目的1、2、二、实验内容1、2、3、4、三、实验原理
四、实验过程与关键代码分析
五、实验小结
3+
第四篇:学习嵌入式系统开发心得
你好,我是一名嵌入式开发爱好者.近来总是看到很多初学者(多数是在校大学生)由于没有条件,想学习却不知道如何下手。
本人绝对能体会到学习的艰辛,而且视任何对知识技术有强烈追求的人(不管目前水平高低)为同路人,所以整理短文一篇写出一些学习感受,替所有渴望知识的人企盼高手指点学习之路,分享经验。
爱因斯坦说过,”我是站在巨人的肩膀上“
实践当然是最锻炼人的方式,但是我想在校生很少有这样的机会,别说本科生,硕士生也未必有条件。所以我想学习嵌入式要从个人的知识背景和现实条件出发。订立合适的阶段目标,在允许的条件下多动手多思考。
一般情况下对于硬件设备是比较短缺的。但是可以从软件方面和嵌入式系统开发模式上下功夫,提醒大家一点,嵌入式系统开发设计的内容知识很多,所以大家不要乱,在了解嵌入式系统开发的体系结构后,一步一步的下手,最容易上手的是linux下的C,比如ucos(有开放源代码),虽然可能无法在硬件上仿真,但也不必着急。wince,palmos上手都很容易。无论对于初学者还是自以为是高手的人来说,编程水平(这可不受硬件条件限制)绝对是没有止境的,有了较高的编程水平(嵌入式主要是C,当然OO的几种语言c++,java是发展趋势),等到有机会的时候及时的补充硬件知识,会很快的成为高手。
还有,一定记住,学习嵌入式,”要想办法,不要找理由“。当年在dos下用tc编程时的条件,现在回想起来建筑就是奇迹。
我推荐一条学习之路吧,仅供参考,1、C开发经验
条件:linux(这都有吧)
方法:随便,主要是掌握ansiC编程(不包括gtk,qt等图形可视化开发)
2、网络、操作系统、体系结构
条件:linux,各种书,算法、例程。
方法:通过C编程实现简单的网络等知识的算法和过程。
3、嵌入式系统概念
条件:各个嵌入式网站,讨论组,书籍
方法:少提问(尤其是等着天上掉馅饼,这主要是防止增长惰性,也解决不了实际问题),多思考。
4、嵌入式开发实践
条件:各种嵌入式系统开发工具的demo版(或者D版,如果有的话),包括编译器,仿真器。可以找高手们要,也可以下载。
方法:这里有两个分支,一个是基于mcu/dsp的嵌入式系统开发,一个是象palmos,wince,ucos等rtos下的应用软件开发。对硬件感兴趣,想成为真正高手的由第一个分支入手,以后进入第二个分支;如果十分厌烦硬件,只想停留在软件开发上的,可以只由第二个分支入手,以后就和pc上的开发没有什么本质上的区别了,找份不错的工作应该没问题,可以不用进行下面的步骤了,感兴趣可以参考第6条。
5、硬件开发
条件:各种嵌入式芯片、存储器等电路器件,protel99等电路设计软件,电路板制作。
方法:这时候该有开发条件了,最起码是51系列,这个比较方便。电路的设计内容较多,不过看起来吓人,实际上比软件要简单的多。只要下功夫,实践会告诉你一切。
6、硬件工程/软件工程/项目管理
条件: 各个芯片详细资料和使用经验,软件工程知识,项目管理知识,培训,大型项目参与经验
方法:已经是高手了,但是学无止境,沾沾自喜于已有的知识是致命的。那个下一步。。,你该是管理者了。
抛砖引玉,以上出自我的经验,欢迎各路高手们补一下 再告诉你一些我的收藏夹的网站
国内有关嵌入式开发的论坛
电子产品世界的论坛
http://bbs.edw.com.cn/index.asp
恒颐高科论坛
http://www.xiexiebang.com/
中国单片机公共实验室
http://www.xiexiebang.com/
北京科银京成技术公司
http://www.xiexiebang.com/
微芯力科技
http://www.xiexiebang.com
驱动开发网之嵌入式版块,挺综合的一个网站
http://www.xiexiebang.com/index.php
电子爱好者家园[2004年09月30日] http://home.ee521.com/main.asp
广州友善之臂电子有限公司
http://www.arm9.net/index.asp
好了 兄弟 开始努力 我们一起加油哈...
第五篇:嵌入式系统开发总结(uCCOS+uCGUI+uCFS)
嵌入式系统开发总结(uC/COS+uC/GUI+uC/FS)
今天终于把做了一个多月的嵌入式系统软件交了上去。终于可以轻松一下了,但是期末临近,看来没得闲了。现在总结一下整个开发过程,希望对想要入门嵌入式系统开发的朋友有所帮助。
首先要说的是,整个开发过程很艰苦,主要是因为第一次接触嵌入式开发,入门很难,同时由于大三有很多专业课,还有六级、实习面试等,在此对我的队友陈、马表示感谢,谢谢他们和我一直坚持到最后。
该系统实现基于uC/COS、uC/GUI、uC/FS的整合。首先要根据硬件配置三者。根据uC/GUI、uC/FS的文档资料很容易移植到操作系统uC/COS。其文档资料的下载地址请参见文章最后。
uC/COS是基于嵌入式的实时操作系统,它管理任务、内存、文件、电源等,为嵌入式系统提供多任务的开发环境。uC/GUI是一种用于嵌入式应用的图形支持软件,本系统借用uC/GUI实现系统所需要的各种界面。uC/FS是一种文件系统,本系统借用其来管理存储器中的文件,在book、message中都用到文件的读写,可以说uC/FS是本系统实现的不可或缺的部分。
该系统所有界面由uC/GUI 实现。主界面一窗口(Frame)为容器,添加菜单栏(Menu)来控制整个系统。其他界面以Dialog为容器,在Dialog中添加按钮(Button)、列表(ListView)、多行编辑框(MultiEdit)等。系统采用了“回调函数”机制,回调函数在用户程序中定义,当一个指定的事件发生时,通知图形系统调用指定的函数。通常应用于一个窗口内容改变时自动重绘的场合。该系统利用回调函数初始化窗口,当窗口内容改变时重绘窗口,同时处理事件响应,例如当鼠标点击“Read”按钮是,通过回调函数调用txtTask()函数弹出电子书显示对话框(Txt)。
总的来说,该设计结构合理,逻辑严密,各个模块相互协调实现了复杂的功能。系统界面小组力求简单大方,各个模块的功能实现都用到了不少精妙的算法。但是,由于小组能力有限,前期对嵌入式的了解浅薄,以及时间等各方面的限制,系统并没有完全实现所预期的功能,也可以说仅实现了一些辅助功能。首先说message模块,设计预期是用到红外发送,实现与红外手机的数据传输和操纵手机的短信发送,但是在实际操作中小组发现需要扩展外围电路(红外发送),由于资金问题,小组讨论放弃该功能,仅实现了信息编辑和信息保存功能。其实该功能的实现小组也是有很清晰的思路的,如果有足够的资金和时间,小组完全可以实现该功能,这里很有些遗憾。
然后是文件系统,最后的几天里,我们发现了一个严重的问题,也就是我们所用文件系统所管理的RAM是可挥发性的(一时没有意识到),我们保存到其中的文件在系统下一次启动的时候都会消失。小组发现norflash是不可挥发的存储器,于是我们考虑将文件存储到norflash中,但是在将norflash添加到uC/FS中的过程中,我们发现必须为其编写驱动程序。经过数天的努力,我们编辑出了norflash的uC/FS驱动,但是很遗憾,没有成功,竞赛举办方给出的norflash模块的实验太过简单,无法编辑驱动程序的底层控制存储器算法。(本小组编写的norflash驱动将在附件中给出)
Music模块,其实music仅仅实现了简单的mp3播放功能,同时提供暂停、下一首等功能,但是经过小组的不懈努力仍然没有声音。于是我们怀疑是硬件模块(UCB1400、AC97CODEC)的问题。
系统整体功能也有待改进,比如开机,进行一段时间的操作后,系统就会不正常的死掉。虽然我们做了大量的性能改良功能,但这个问题依然存在。
小组在近期做了此次竞赛的总结,一直表示此次竞赛给我们提供了一个很好的学习机会,大家都有了很大的提高,至少是对嵌入式有了切身的认识。大家对嵌入式系统设计也有了很大的兴趣,同时表示将在以后对嵌入式进行更深层次的研究。
在此,我们对同类设计提供一些建议。前期应该对资金、时间等做准确的估计,同时选择最主要的功能模块,这样可以集中有限精力将单个模块的功能实现的更加强大。在功能设计的阶段应尽量考虑到所有细节,这样可以避免在最后时刻发现关键因素致使系统功能大打折扣。系统的创新点:
1、使用uC/FS管理文件
电子书模块和短信编辑模块的Save功能都需要大量操作文件的代码。由于实时操作系统uC/GUI没有实现文件系统,在参考了各种版本的文件系统后,小组决定选用uC/FS。uC/FS是一种FAT格式的文件系统,它可以用于所有的存储媒体,但你必须提供存储媒体的底层接口函数。
引进uC/FS后,小组很方便地实现了系统的各种主要功能。
2、借用软键盘代替手写字体识别功能
当考虑到手写字体识别功能的难度和时间的有限,小组讨论果断决定使用软件盘实现字符的输入功能。
首先,小键盘界面小巧简洁。我们以woindow系统中的软键盘为模板,删除掉不需要的复杂按键,形成了独具风格的嵌入式版软键盘。
其次,由于界面大小限制,软键盘进入了”shift”键,实现键盘按键的切换,实现了所有字符(包括数字、大小写字母和各种操作符)的输入功能。
3、系统内容丰富多彩
这一点可以说是系统的坏处也可以说是系统的好处,坏处就是由于本次竞赛时间有限,有些功能实现的也比较简单,但是可惜的是该系统脉络清晰,很合理地将各个模块有机地结合到了一起。而且各个模块并不是相互独立的,而是相互约束、相互协作的。例如:message模块的Save功能,将文本信息保存到存储器中,保存的文件有可以在book中查阅;通讯录协助message模块中Send功能的手机号码查询。
这些都可以说是本系统的一大特色。
主界面:
(各个模块的界面以及具体实现请参看后续文章)程序流程框图:
uC/GUI中文手册下载:http://download.csdn.net/source/466900
uC/FS正式版(内含使用手册)下载:http://download.csdn.net/source/466918 uC/COS中文手册下载:http://download.csdn.net/source/466905 uC/GUI完整实例(超有用):http://download.csdn.net/source/467738