第一篇:七款嵌入式Linux操作系统简介
除了智能数字终端领域以外,Linux在移动计算平台、智能工业控制、金融业终端系统,甚至军事领域都有着广泛的应用前景。这些Linux被统称为“嵌入式Linux”。下面就来看看都有哪些嵌入式Linux在以上领域纵横驰骋吧!
RT-Linux
这是由美国墨西哥理工学院开发的嵌入式Linux操作系统。到目前为止,RT-Linux已经成功地应用于航天飞机的空间数据采集、科学仪器测控和电影特技图像处理等广泛领域。RT-Linux开发者并没有针对实时操作系统的特性而重写Linux的内核,因为这样做的工作量非常大,而且要保证兼容性也非常困难。为此,RT-Linux提出了精巧的内核,并把标准的Linux核心作为实时核心的一个进程,同用户的实时进程一起调度。这样对Linux内核的改动非常小,并且充分利用了Linux下现有的丰富的软件资源。
uClinux
uCLinux是Lineo公司的主打产品,同时也是开放源码的嵌入式Linux的典范之作。uCLinux主要是针对目标处理器没有存储管理单元MMU(Memory Management Unit)的嵌入式系统而设计的。它已经被成功地移植到了很多平台上。由于没有MMU,其多任务的实现需要一定技巧。uCLinux是一种优秀的嵌入式 Linux版本,是micro-Conrol-Linux的缩写。它秉承了标准Linux的优良特性,经过各方面的小型化改造,形成了一个高度优化的、代码紧凑的嵌入式Linux。虽然它的体积很小,却仍然保留了Linux的大多数的优点:稳定、良好的移植性、优秀的网络功能、对各种文件系统完备的支持和标准丰富的API。它专为嵌入式系统做了许多小型化的工作,目前已支持多款CPU。其编译后目标文件可控制在几百KB数量级,并已经被成功地移植到很多平台上。
Embedix
Embedix是由嵌入式Linux行业主要厂商之一Luneo推出的,是根据嵌入式应用系统的特点重新设计的Linux发行版本。Embedix提供了超过25种的Linux系统服务,包括Web服务器等。系统需要最小8MB内存,3MB ROM或快速闪存。Embedix基于Linux 2.2内核,并已经成功地移植到了Intel x86和PowerPC处理器系列上。像其它的Linux版本一样,Embedix可以免费获得。Luneo还发布了另一个重要的软件产品,它可以让在 Windows CE上运行的程序能够在Embedix上运行。Luneo还将计划推出Embedix的开发调试工具包、基于图形界面的浏览器等。可以说,Embedix 是一种完整的嵌入式Linux解决方案。
XLinux
XLinux是由美国网虎公司推出,主要开发者是陈盈豪。他在加盟网虎几个月后便开发出了基于XLinux的、号称是世界上最小的嵌入式Linux系统,内核只有143KB,而且还在不断减小。XLinux核心采用了“超字元集”专利技术,让Linux核心不仅可能与标准字符集相容,还含盖了12个国家和地区的字符集。因此,XLinux在推广Linux的国际应用方面有独特的优势。
PoketLinux
PoketLinux由Agenda公司采用、作为其新产品“VR3 PDA”的嵌入式Linux操作系统。它可以提供跨操作系统构造统一的、标准化的和开放的信息通信基础结构,在此结构上实现端到端方案的完整平台。PoketLinux资源框架开放,使普通的软件结构可以为所有用户提供一致的服务。PoketLinux平台使用户的视线从设备、平台和网络上移开,由此引发了信息技术新时代的产生。在PoketLinux中,称之为用户化信息交换(CIE),也就是提供和访问为每个用户需求而定制的“主题”信息的能力,而不管正在使用的设备是什么。
MidoriLinux
由Transmeta公司推出的MidoriLinux操作系统代码开放,在GUN普通公共许可(GPL)下发布,可以在http://midori.transmeta.com上立即获得。该公司有个名为“MidoriLinux计划”。
“MidoriLinux”这个名字来源于日本的“绿色”——Midori,用来反映其Linux操作系统的环保外观。
红旗嵌入式Linux
由北京中科院红旗软件公司推出的嵌入式Linux是国内做得较好的一款嵌入式操作系统。目前,中科院计算所自行开发的开放源码的嵌入式操作系统—— Easy Embedded OS(EEOS)也已经开始进入实用阶段了。该款嵌入式操作系统重点支持p-Java。系统目标一方面是小型化,另一方面能重用Linux的驱动和其它模块。由于有中科院计算所的强大科研力量做后盾,EEOS有望发展成为功能完善、稳定、可靠的国产嵌入式操作系统平台。
思考与展望
以上列举的众多嵌入式Linux操作系统中,国内对于uClinux和RT-Linux研究的较多,很多基于它们的产品已经面世,比如华恒公司已经把uClinux成功移植,并投放到市场。
正是由于Linux开放源代码的特点,所以全世界的开发厂商都站在同一个起跑线上。国内的研究机构和企业也正在积极投入人力、物力,力争在嵌入式操作系统上有所为。但应该清醒认识到,绝大多数的嵌入式系统的硬件平台还掌握在外国公司的手中。国产的嵌入式操作系统在技术含量、兼容性、市
场运作模式等方面还有很多工作要做。国家对嵌入式领域的发展也极为重视。信息产业部《2003年度电子发展基金项目指南》在软件类重点产品项目中,第五小类就是关于嵌入式软件与系统开发的,并提出要重点进行如下重点项目的研制与开发:嵌入式实时操作系统、嵌入式软件集成开发平台和嵌入式数据库管理软件。由于嵌入式系统研发在国内起步比较晚,我国目前还基本处于实验室阶段。但是嵌入式操作系统的巨大的商业价值和Linux的开放性,为民族软件产业的发展提供了难得的机会。在跟踪国外嵌入式操作系统最新技术的同时,国内厂商要坚持自主产权,力争找到自己的突破点,探索出一条适合中国国情的嵌入式操作系统的发展道路。
第二篇:嵌入式linu学习心得
嵌入式Linux学习心得
1、Linux命令
ls:查看目录-l以列表方式查看;ls –l 与ll的功能一样 pwd: 查看当前的目录
cd:改变当前操作目录cd /直接跳到根目录 cd..回到上一级目录 cat: 打印显示当前文件的内容信息
mkdir:创建目录
fdisk: 查看硬盘分区信息,-l以列表方式查看
->代表是链接文件,类似window下的快捷方式。
cp: 复制命令,例子cp 文件名 /home/dir/
mv: 移动或改名,如mv sonf.confsonf.txt(改名)移动:mv sonf.conf / rm:删除命令,如rm –f test.c;如删除目录rm –fr d
man:查看某个命令的帮助,man 命令
2、各系统目录的功能
drw—r—w--:d代表是目录,drw代表当前用户的权限,r代表组用户的权限,w代表其它用户的权限。x代表有执行权限。
/boot/gruff.conf: 启动引导程序
/dev:brw—rw--:b代表是块设备。Linux设备有三种,块设备(b开头)、字符设备(c开头)、网络设备。had代表第一个硬盘,hdb代表第二个硬盘。Hdb2代表第二块硬盘的第二个分区。3,67代表主设备为3,从设备为67./etc:存放的是系统的配置文件。Inittab文件存放不同启动方式下必须启动的进程。Inittab文件中有6个启动level,wait中对应着6个level的目录,respawn代表当一个进程被意外终止了,但会自动启动的进程,如守护进程。rc.d目录中存放了一个rc.sysinit文件,里面存放系统初始化配置信息。/etc还有一个vsftpd里面存放tcp、ftp的配置。
/home : 用户目录,存放用户的文件,/lib:存放库文件,后缀为so的文件代表动态链接库。
/lost+found:系统意外终止,存放一些可以找回的文件。
/mnt:挂载外部设备,如挂载光驱:mount –t /dev/cdrom/mnt/cdrom,如
果在双系统中,要查看windows中D盘的文件,首先应该将D盘的文件映射过来,mount –t /dev/hda2/mnt/windows/d
/opt:用户安装的应用程序
/proc:是系统运行的映射,比较重要。里面的文件数字代表进程号。每个进程号目录下包含进程的基本信息。还有其他信息,如cpuinfo等,内核支持的文件系统filesystem等。系统支持的中断interrupts,iomen代表内存分配情况。ioport存放IO端口号。还有分区信息,modole信息,状态信息,版本信息
对于Linux的设备驱动程序,有两种加载模式,一种是直接加载进linux内核,一种是以模块的方式加载到内核。
/sbin: 系统管理的一些工具。如poweroff关机工具。
/usr: 安装系统时很多文件放在此目录下面,包含一些更新等,include包含的头文件,lib 是Linux的库文件,src包含Linux2.4的内核源码
/var:存放是临时变量
3、
第三篇:嵌入式操作系统实验报告
实验一 嵌入式开发环境的建立
一、实验目的
通过此实验系统,读者可以了解嵌入式实时操作系统 uC/OS-II 的内核机制和运行原理。本实验系统展示了 uC/OS-II 各方面的管理功能,包括信号量、队列、内存、时钟等。在各个实验中具体介绍了 uC/OS-II 的相关函数。读者在做实验的同时能够结合理论知识加以分析,了解各个函数的作用和嵌入式应用程序的设计方法,最终对整个 uC/OS-II 和嵌入式操作系统的应用有较为清楚的认识。
二、实验步骤
1.安装集成开发环境LambdaEDU 集成开发环境LambdaEDU 的安装文件夹为 LambdaEDU,其中有一个名为“Setup.exe” 的文件,直接双击该文件便可启动安装过程。具体的安装指导请看“LambdaEDU 安装手 册.doc”文件。
当 LambdaEDU 安装完毕之后,我们看到的是一个空的界面,现在就开始一步一步地将 我们的实验项目建立并运行起来。
2.建立项目
为了我们的实验运行起来,需要建立1 个项目基于x86 虚拟机的标准应用项目。通过点 击“文件”、“新建”、“项目”开始根据向导创建一个项目。
在随后出现的对话框中选择“Tool/标准应用项目”,点击下一步,开始创建一个标准的 可执行的应用程序项目。
在随后出现的对话框中填入项目名称“ucos_x86_demo”。点击“下一步”。
选择“pc386 uC/OS-II 应用(x86)”作为该项目的应用框架。点击“下一步”
选择“pc386_elf_tra_debug”作为该项目的基本配置。点击“完成”。
新创建的项目“ucos_x86_demo”将会被添加到项目列表。src 文件夹下保存了该项目中 包含的源文件。ucos2 文件夹中包含了移植到x86 虚拟机的全部代码。init.c 文件是基于ucos2 和本虚拟机的一个应用程序。在进行ucos2 内核实验中,只需要替换init.c 文件,即可。文
件名不限,但是文件名中最好不要使用英文符号和数字以外的其他字符,3.构建项目
到这里,项目配置全部完成。接下来就可以进行构建项目了。
第一次构建本项目,在此项目上点击右键,选择“重建BSP 及项目”。即可开始构建。
之后弹出的对话框显示了构建的进度。可以点击“在后台运行”,以隐藏该对话框
在构建的同时,在右下角的“构建信息”视图输出构建过程中的详细信息:
注:“重新构建”将本项目中的全部源代码进行一次完全的编译和连接,花费时间较多。“构建项目”则仅仅将新修改过的源代码进行编译和连接,花费时间最少。“重建BSP及项 目”,不但要完成“重新构建”的全部工作,另外还要编译与该项目有关的的LambdaEDU 中内置的部分代码,花费时间最多。但是在项目刚建立后,第一次构建时需要选择“重建 BSP 及项目”。以后的构建中选择“重新构建”或“构建项目”即可。另外,在替换了源代 码中的文件后,需要选择“重新构建”来完成该项目的构建。
4.配置虚拟机和目标机代理
(1)制作X86启动盘
在 LambdaEDU 中依次点击“工具”、“Bochs”、“制作虚拟机启动映象”。对启动盘进行一些参数设置后(如下图所示),系统将自动为你生成一个PC 虚拟机的 启动盘映像。
(2)配置虚拟机 选择使用的网络适配器(网卡)后,点击“确定”完成配置。
注意:如果计算机上有多网卡,请将其他网卡停用(包括 VMware 虚拟机添加的虚拟 网卡)。
(3)创建目标机代理
配置好虚拟机后,创建目标机代理:点击LambdaEDU 左下方窗口中绿色的十字符号,在弹出的窗口中选择“基于TA 的连接方式”,并点击“下一步”。
在弹出的“新目标机连接配置中”的这些参数,应该与之前制作启动盘时设置的参数一致。
注意:
名字:输入目标机的名字(缺省是 default),注意如果和现有目标机重名的话,改个名 字。
连接类型:默认选择 UDP IP地址:这里输入目标机(在本实验系统中是虚拟机)的 IP地址;
最后点击“确定”,在目标机管理窗口中,可以看到新增加了一个名为default 的目标机 节点
(4)调试应用 启动虚拟机。
虚拟机启动后的画面如下(其中显示的IP 地址创建虚拟机启动盘时填入的IP 地址)中设置的IP 地址):
在成功完成构建的项目ucos_x86_demo 中的“pc386_elf_tra_debug”上点击鼠标右键,在弹出的菜单中选择“调试”,启动调试器调试生成的程序:
第一次进行调试/运行,需要选择目标机,如下图,选择“Default”,点击“确定”,开 始向目标机(虚拟机)下载应用程序。程序下载完成后,会弹出一个“确认透视图切换”对话框,选择“是”,切换到调试透 视图。
调试的界面如下:
点击绿色的按钮,全速运行。
注意:全速运行后,程序不能够被暂停和停止。
三、实验过程中遇到的问题及体会
在设置IP地址时,要求该IP地址与本计算机在同一个子网中,同时要求该 IP地址没有被网络上其他计算机使用。此外,通过构建开发环境,处次体验到了嵌入式开发工作的乐趣。
实验二 任务的基本管理
一、实验目的
1.理解任务管理的基本原理,了解任务的各个基本状态及其变迁过程; 2.掌握 uC/OS-II 中任务管理的基本方法(创建、启动、挂起、解挂任务); 3.熟练使用 uC/OS-II 任务管理的基本系统调用。
二、实验原理及程序结构
1.实验设计
为了展现任务的各种基本状态及其变迁过程,本实验设计了 Task0、Task1 两个任务: 任务 Task0 不断地挂起自己,再被任务 Task1 解挂,两个任务不断地切换执行。通过本实验,读者可以清晰地了解到任务在各个时刻的状态以及状态变迁的原因。2.运行流程 描述如下:
(1)系统经历一系列的初始化过程后进入 boot_card()函数,在其中调用 ucBsp_init()进 行板级初始化后,调用 main()函数;
(2)main()函数调用 OSInit()函数对 uC/OS-II 内核进行初始化,调用 OSTaskCreate 创 建起始任务 TaskStart;
(3)main()函数调用函数 OSStart()启动 uC/OS-II 内核的运行,开始多任务的调度,执 行当前优先级最高的就绪任务 TaskStart;(4)TaskStart 完成如下工作:
a、安装时钟中断并初始化时钟,创建 2 个应用任务;
b、挂起自己(不再被其它任务唤醒),系统切换到当前优先级最高的就绪任务Task0。之后整个系统的运行流程如下:
t1 时刻,Task0 开始执行,它运行到 t2 时刻挂起自己;
t2 时刻,系统调度处于就绪状态的优先级最高任务 Task1 执行,它在 t3 时刻唤醒Task0,后者由于优先级较高而抢占 CPU;
Task0 执行到 t4 时刻又挂起自己,内核调度 Task1 执行; Task1 运行至 t5 时刻再度唤醒 Task0; ……
3.µC/OS-Ⅱ中的任务描述
一个任务通常是一个无限的循环,由于任务的执行是由操作系统内核调度的,因此任务是绝不会返回的,其返回参数必须定义成 void。在μC/OS-Ⅱ中,当一个运行着的任务使一个比它优先级高的任务进入了就绪态,当前任务的 CPU 使用权就会被抢占,高优先级任务会立刻得到 CPU 的控制权(在系统允许调度和任务切换的前提下)。μC/OS-Ⅱ可以管理多达 64 个任务,但目前版本的μC/OS-Ⅱ有两个任务已经被系统占用了(即空闲任务和统计任务)。必须给每个任务赋以不同的优先级,任务的优先级号就是任务编号(ID),优先级可以从 0 到 OS_LOWEST_PR10-2。优先级号越低,任务的优先级越高。μC/OS-Ⅱ总是运行进入就绪态的优先级最高的任务。4.源程序说明(1)TaskStart任务
TaskStart 任务负责安装操作系统的时钟中断服务例程、初始化操作系统时钟,并创建所 有的应用任务:
UCOS_CPU_INIT();/* Install uC/OS-II's clock tick ISR */ UCOS_TIMER_START();/*Timer 初始化*/ TaskStartCreateTasks();/* Create all the application tasks */ OSTaskSuspend(OS_PRIO_SELF);
具体负责应用任务创建的 TaskStartCreateTasks 函数代码如下,它创建了两个应用任务 Task0 和 Task1:
void TaskStartCreateTasks(void){
INT8U i;
for(i = 0;i < N_TASKS;i++)// Create tasks {
TaskData[i] = i;// Each task will display itsown information }
OSTaskCreate(Task0,(void *)&TaskData[0], &TaskStk[0][TASK_STK_SIZE1], 6);}
TaskStart 任务完成上述操作后将自己挂起,操作系统将调度当前优先级最高的应用任务Task0 运行。(2)应用任务
应用任务 Task0 运行后将自己挂起,之后操作系统就会调度处于就绪状态的优先级最高的任务,具体代码如下: void Task0(void *pdata){
INT8U i;INT8U err;i=*(int *)pdata;for(;;){
printf(“Application tasks switched %d times!nr”,++count);
printf(“TASK_0 IS RUNNING..............................................................nr”);printf(“task_1 is suspended!nr”);
printf(“**************************************************nr”);err=OSTaskSuspend(5);// suspend itself } }
应用任务 Task1 运行后将 Task0 唤醒,使其进入到就绪队列中: void Task1(void *pdata){
INT8U i;INT8U err;i=*(int *)pdata;for(;;){
OSTimeDly(150);
printf(“Application tasks switched %d times!nr”,++count);printf(“task_0 is suspended!nr”);printf(“TASK_1 IS RUNNING..............................................................nr”);printf(“**************************************************nr”);OSTimeDly(150);
err=OSTaskResume(5);/* resume task0 */ } }
三、运行及观察应用输出信息
按照本实验手册第一部分所描述的方法建立应用项目并完成构建,当我们在 LambdaEDU 调试器的控制下运行构建好的程序后,将看到在μC/OS-Ⅱ内核的调度管理下,两个应用任务不断切换执行的情形:
四、本实验中用到的µC/OS-Ⅱ相关函数
4.1 OSTaskCreate()
OSTaskCreate()建立一个新任务。任务的建立可以在多任务环境启动之前,也可以在 正在运行的任务中建立。中断处理程序中不能建立任务。一个任务必须为无限循环结构,且 不能有返回点。
OSTaskCreate()是为与先前的μC/OS 版本保持兼容,新增的特性在 OSTaskCreateExt()函数中。
无论用户程序中是否产生中断,在初始化任务堆栈时,堆栈的结构必须与 CPU 中断后 寄存器入栈的顺序结构相同。详细说明请参考所用处理器的手册。函数原型:
INT8U OSTaskCreate(void(*task)(void *pd), void *pdata, OS_STK *ptos, INT8U prio);
参数说明:
task 是指向任务代码首地址的指针。
pdata 指向一个数据结构,该结构用来在建立任务时向任务传递参数。
ptos 为指向任务堆栈栈顶的指针。任务堆栈用来保存局部变量,函数参数,返回地址 以及任务被中断时的 CPU 寄存器内容。任务堆栈的大小决定于任务的需要及预计的中断嵌 套层数。计算堆栈的大小,需要知道任务的局部变量所占的空间,可能产生嵌套调用的函数,及中断嵌套所需空间。如果初始化常量 OS_STK_GROWTH 设为 1,堆栈被设为从内存高地址 向 低 地 址 增 长,此时 ptos 应 该 指 向任 务堆 栈 空 间 的 最 高 地 址。反 之,如 果OS_STK_GROWTH 设为 0,堆栈将从内存的低地址向高地址增长。prio 为任务的优先级。每个任务必须有一个唯一的优先级作为标识。数字越小,优先级越高。返回值:
OSTaskCreate()的返回值为下述之一: OS_NO_ERR:函数调用成功。
OS_PRIO_EXIST:具有该优先级的任务已经存在。
OS_PRIO_INVALID:参数指定的优先级大于 OS_LOWEST_PRIO。 OS_NO_MORE_TCB:系统中没有 OS_TCB 可以分配给任务了。注意:
任务堆栈必须声明为 OS_STK 类型。
在任务中必须调用μC/OS 提供的下述过程之一:延时等待、任务挂起、等待事件发生(等待信号量,消息邮箱、消息队列),以使其他任务得到 CPU。用 户 程 序 中 不 能 使 用 优 先 级 0,1,2,3,以 及 OS_LOWEST_PRIO-3, OS_LOWEST_PRIO-2, OS_LOWEST_PRIO-1, OS_LOWEST_PRIO。这些优先级μC/OS 系统
保留,其余的 56 个优先级提供给应用程序。4.2 OSTaskSuspend()
OSTaskSuspend()无条件挂起一个任务。调用此函数的任务也可以传递参数
OS_PRIO_SELF,挂起调用任务本身。当前任务挂起后,只有其他任务才能唤醒。任务挂起 后,系统会重新进行任务调度,运行下一个优先级最高的就绪任务。唤醒挂起任务需要调用 函数 OSTaskResume()。
任务的挂起是可以叠加到其他操作上的。例如,任务被挂起时正在进行延时操作,那么 任务的唤醒就需要两个条件:延时的结束以及其他任务的唤醒操作。又如,任务被挂起时正 在等待信号量,当任务从信号量的等待对列中清除后也不能立即运行,而必须等到被唤醒后。函数原型:
INT8U OSTaskSuspend(INT8U prio);参数说明:
prio 为指定要获取挂起的任务优先级,也可以指定参数 OS_PRIO_SELF,挂起任务本 身。此时,下一个优先级最高的就绪任务将运行。返回值:
OSTaskSuspend()的返回值为下述之一: OS_NO_ERR:函数调用成功。
OS_TASK_ SUSPEND_IDLE:试图挂起 µC/OS-II 中的空闲任务(Idle task)。此为非法操作。
OS_PRIO_INVALID :参数指定的优先级大于 OS_LOWEST_PRIO 或没有设定 OS_PRIO_SELF 的值。
OS_TASK_ SUSPEND _PRIO:要挂起的任务不存在。注意:
在程序中 OSTaskSuspend()和 OSTaskResume()应该成对使用。用 OSTaskSuspend()挂起的任务只能用 OSTaskResume()唤醒。4.3 OSTaskResume()
OSTaskResume()唤醒一个用 OSTaskSuspend()函数挂起的任务。OSTaskResume()也是唯一能“解挂”挂起任务的函数。函数原型:
INT8UOSTaskResume(INT8U prio);参数说明:
prio 指定要唤醒任务的优先级。返回值:
OSTaskResume()的返回值为下述之一: OS_NO_ERR:函数调用成功。
OS_TASK_RESUME_PRIO:要唤醒的任务不存在。
OS_TASK_NOT_SUSPENDED:要唤醒的任务不在挂起状态。
OS_PRIO_INVALID:参数指定的优先级大于或等于 OS_LOWEST_PRIO。
五、实验过程中遇到的问题及体会
实验过程中体会到了嵌入式开发的乐趣,对上课老师所讲的内容有了进一步的认识与理解。17 实验三 信号量:哲学家就餐问题的实现
一、实验目的
掌握在基于嵌入式实时操作系统 uC/OS-II 的应用中,任务使用信号量的一般原理。通 过经典的哲学家就餐实验,了解如何利用信号量来对共享资源进行互斥访问。
二、实验原理及程序结构
1.实验设计
掌握在基于嵌入式实时操作系统 uC/OS-II 的应用中,任务使用信号量的一般原理。通 过经典的哲学家就餐实验,了解如何利用信号量来对共享资源进行互斥访问。2.源程序说明
五个哲学家任务(ph1、ph2、ph3、ph4、ph5)主要有两种过程:思考(即睡眠一段时
间)和就餐。每个哲学家任务在就餐前必须申请并获得一左一右两支筷子,就餐完毕后释放 这两支筷子。五个哲学家围成一圈,每两人之间有一支筷子。一共有五支筷子,在该实验中 用了五个互斥信号量来代表。每个任务的代码都一样,如下所示: void Task(void *pdata){
INT8U err;INT8U i;INT8U j;
i=*(int *)pdata;j=(i+1)% 5;
uC/OS-II 实验指导书 for(;;){
TaskThinking2Hungry(i);OSSemPend(fork[i], 0, &err);
OSSemPend(fork[j], 0, &err);/* Acquire semaphores to eat */ TaskEat(i);
OSSemPost(fork[j]);
OSSemPost(fork[i]);/* Release semaphore */ OSTimeDly(200);/* Delay 10 clock tick */ } }
操作系统配置
修改 uC_OS-II/OS_CFG.h: :: :
#define OS_MAX_EVENTS 10 /*最多可以有 10 个事件*/ #define OS_MAX_FLAGS 5 /*最多可以有 5 个事件标志*/
#define OS_MAX_MEM_PART 5 /*最多可以划分 5 个内存块*/ #define OS_MAX_QS 2 /*最多可以使用 2 个队列*/ #define OS_MAX_TASKS 8 /*最多可以创建 8 个任务*/
#define OS_LOWEST_PRIO 14 /*任务优先级不可以大于 14*/ #define OS_TASK_IDLE_STK_SIZE 1024 /*空闲任务堆栈大小*/ #define OS_TASK_STAT_EN 1 /*是否允许使用统计任务*/ #define OS_TASK_STAT_STK_SIZE 1024 /*统计任务堆栈大小*/ #define OS_FLAG_EN 1 /*是否允许使用事件标志功能*/
#define OS_FLAG_WAIT_CLR_EN 1 /*是否允许等待清除事件标志*/ #define OS_FLAG_ACCEPT_EN 1 /*是否允许使用 OSFlagAccept()*/ #define OS_FLAG_DEL_EN 1 /*是否允许使用 OSFlagDel()*/
#define OS_FLAG_QUERY_EN 1 /*是否允许使用 OSFlagQuery()*/ #define OS_MBOX_EN 0 /*是否允许使用邮箱功能*/
#define OS_MEM_EN 0 /*是否允许使用内存管理的功能*/
#define OS_MUTEX_EN 0 /*是否允许使用互斥信号量的功能*/ #define OS_Q_EN 0 /*是否允许使用队列功能*/ #define OS_SEM_EN 1 /*是否允许使用信号量功能*/
#define OS_SEM_ACCEPT_EN 1 /*是否允许使用 OSSemAccept()*/ #define OS_SEM_DEL_EN 1 /*是否允许使用OSSemDel()*/
#define OS_SEM_QUERY_EN 1 /*是否允许使用OSSemQuery()*/ #define OS_TASK_CHANGE_PRIO_EN 1 /* 是 否 允 许 使 用 OSTaskChangePrio()*/
#define OS_TASK_CREATE_EN 1 /*是否允许使用 OSTaskCreate()*/
#define OS_TASK_CREATE_EXT_EN 1 /*是否允许使用 OSTaskCreateExt()*/ #define OS_TASK_DEL_EN 1 /*是否允许使用 OSTaskDel()*/
#define OS_TASK_SUSPEND_EN 1 /* 是 否 允 许 使 用 OSTaskSuspend()and OSTaskResume()*/
#define OS_TASK_QUERY_EN 1 /*是否允许使用 OSTaskQuery()*/ #define OS_TIME_DLY_HMSM_EN 1 /* 是 否 允 许 使 用 OSTimeDlyHMSM()*/
#define OS_TIME_DLY_RESUME_EN 1 /* 是 否 允 许 使 用 OSTimeDlyResume()*/
#define OS_TIME_GET_SET_EN 1 /* 是否允许使用 OSTimeGet()和 OSTimeSet()*/
#define OS_SCHED_LOCK_EN 1 /* 是 否 允 许 使 用 OSSchedLock()和 OSSchedUnlock()*/
#define OS_TICKS_PER_SEC 200 /*设置每秒之内的时钟节拍数目*/
三、运行及观察应用输出信息
开始,所有的哲学家先处于 thinking 状态,然后都进入 hungry 状态:
后首先获得两个信号量的 1、3 号哲学家开始 eating,待他们释放相关信号量之后,哲
学家 2、5、4 获得所需的信号量并 eating: 应用如此这般地循环执行程序下去„„
四、本实验中用到的µC/OS-Ⅱ相关函数
4.1 OSSemCreate()
OSSemCreate()函数建立并初始化一个信号量。信号量的作用如下: 允许一个任务和其他任务或者中断同步 取得设备的使用权 标志事件的发生
函数原型:
OS_EVENT *OSSemCreate((((WORD value))))参数说明:
value 参数是所建立的信号量的初始值,可以取 0 到 65535 之间的任何值。返回值:
OSSemCreate()函数返回指向分配给所建立的信号量的控制块的指针。如果没有可用的 控制块,OSSemCreate()函数返回空指针。注意:
必须先建立信号量,然后使用。4.2 OSSemPend()
OSSemPend()函数用于任务试图取得设备的使用权,任务需要和其他任务或中断同
步,任务需要等待特定事件的发生的场合。如果任务调用 OSSemPend()函数时,信号量 的值大于零,OSSemPend()函数递减该值并返回该值。如果调用时信号量等于零,OSSemPend()函数函数将任务加入该信号量的等待队列。OSSemPend()函数挂起当前 任务直到其他的任务或中断置起信号量或超出等待的预期时间。如果在预期的时钟节拍内信 号量被置起,μC/OS-Ⅱ默认最高优先级的任务取得信号量恢复执行。一个被 OSTaskSuspend()函数挂起的任务也可以接受信号量,但这个任务将一直保持挂起状态直到通过调用 OSTaskResume()函数恢复任务的运行。函数原型: :: :
Void OSSemPend(OS_EVNNT *pevent, INT16U timeout, int8u *err);参数说明: :: :
pevent
是指向信号量的指针。该指针的值在建立该信号量时可以得到。(参考 OSSemCreate()函数)。
Timeout
允许一个任务在经过了指定数目的时钟节拍后还没有得到需要的信号量时 恢复就绪状态。如果该值为零表示任务将持续地等待信号量,最大的等待时间为 65535 个时
钟节拍。这个时间长度并不是非常严格的,可能存在一个时钟节拍的误差。
Err 是指向包含错误码的变量的指针。OSSemPend()函数返回的错误码可能为下述几 种:
OS_NO_ERR :信号量不为零。
OS_TIMEOUT :信号量没有在指定数目的时钟周期内被设置。
OS_ERR_PEND_ISR :从中断调用该函数。虽然规定了不允许从中断调用该函数,但 µC/OS-Ⅱ仍然包含了检测这种情况的功能。
OS_ERR_EVENT_TYPE :pevent 不是指向信号量的指针。返回值: 无 注意:
必须先建立信号量,然后使用。不允许从中断调用该函数。
4.3 OSSemPost()
OSSemPost()函数置起指定的信号量。如果指定的信号量是零或大于零,OSSemPost()函数递增该信号量并返回。如果有任何任务在等待信号量,最高优先级的任务将得到信
号量并进入就绪状态。任务调度函数将进行任务调度,决定当前运行的任务是否仍然为最高 优先级的就绪状态的任务。函数原型:
INT8U OSSemPost(OS_EVENT *pevent);参数说明:
pevent
是指向信号量的指针。该指针的值在建立该信号量时可以得到。(参考 OSSemCreate()函数)。返回值:
OSSemPost()函数的返回值为下述之一:
OS_NO_ERR :信号量被成功地设置
OS_SEM_OVF :信号量的值溢出
OS_ERR_EVENT_TYPE :pevent 不是指向信号量的指针 注意:
必须先建立信号量,然后使用。4.4 OSTimeDly()
OSTimeDly()将一个任务延时若干个时钟节拍。如果延时时间大于 0,系统将立即进 行任务调度。延时时间的长度可从 0 到 65535 个时钟节拍。延时时间 0 表示不进行延时,函
数将立即返回调用者。延时的具体时间依赖于系统每秒钟有多少时钟节拍(由文件 SO_CFG.H 中的常量 OS_TICKS_PER_SEC 设定)。函数原型:
void OSTimeDly(INT16U ticks);参数说明:
ticks 为要延时的时钟节拍数。返回值:
无
注意:
注意到延时时间 0 表示不进行延时操作,而立即返回调用者。为了确保设定的延时时间,建议用户设定的时钟节拍数加 1。例如,希望延时 10 个时钟节拍,可设定参数为 11。
五、实验过程中遇到的问题及体会
在实验前要对该问题进行深入的理解,即五个哲学家任务(ph1、ph2、ph3、ph4、ph5)主要有两种过程:思考(即睡眠一段时间)和就餐。每个哲学家任务在就餐前必须申请并获得一左一右两支筷子,就餐完毕后释放这两支筷子。五个哲学家围成一圈,每两人之间有一支筷子。只有理解了,才能更好的进行实验。
第四篇:嵌入式操作系统课程报告
华北水利水电大学
North China University of Water Resources and Electric Power
嵌入式操作系统课程报告
题目 嵌入式系统课程综和论述
学 院 物理与电子学院
专 业 电子信息工程
姓 名 李天泽
学 号 201816516
组 员
完成时间 2020.12.22
目 录
一、嵌入式系统的介绍
(1)、嵌入式系统的概念……………………………………3
(2)、嵌入式系统的特点……………………………………4
二、嵌入式系统的发展和应用……………………………5
三、总结和心得……………………………………………7
参考文献……………………………………………7
附录…………………………………………………8
摘要:
如今,嵌入式系统经过半个多实际的发展和革新,在各个产业都可以看见它的身影。在电子消费领域,它已经广泛应用于手机、VCD、数字电视和路由器等常见家用电器和电子产品,或许在你的家里有着几十甚至几百个微型嵌入式计算机无时无刻地不在为你服务。
在工业控制方面,一辆豪华轿车的控制系统就包含着至少50个嵌入式微处理器,它们分布于火花塞、传动轴和安全气囊等等。而一架先进的飞机,一台人造卫星就可能包含着几十套嵌入式系统和上百台微型嵌入式计算机,没有这些装载,飞机和卫星的控制系统就不能有效地工作,它们的导航系统就不能满足严格的要求。
在通信领域也有着数不胜数的嵌入式系统的应用,由于带宽网络的发展,交换机、路由器和各种传输设备等都逐渐需要更多的嵌入式系统来满足它们互联的需求,而这些基于32位的嵌入式系统品种多样,绝大多数都价格低廉,能够为企业和家庭的网络选择提供更加廉价而多样的方案。
一、嵌入式系统的介绍
1、嵌入式系统的概念:
上世纪的40年代人类社会诞生了当时最伟大的发明之一——计算机。1946年宾夕法尼亚大学研制出了世界上第一台计算机“ENIAC”,吹响了人类向信息时代进发的号角。如今半个多世纪过去了,总体来看,计算机已经经历了两个大的发展阶段:大型计算机阶段和个人中小型计算机阶段。而今后,计算机技术将迈入下一个充满机遇和挑战的新阶段—— “无处不在的计算机”阶段,即“后PC发展阶段”。“无处不在的计算机”是指在数以千计乃至万计的计算机之间彼此相互关联,其与使用者的比例高达100%,这些计算机中包括有传统的通用式计算机和嵌入式计算机,而后者占绝大多数,可以达到95%的比例。
施乐公司研究中心的主任Mark Weiser 认为:“以长远的发展来看,PC和计算机工作站将逐渐衰落,因为计算机将会变得无处不在,它们会在墙上,在手腕上,在口袋里等等,计算机将会像手写纸一样,随用随取,伸手可得。”
目前全世界范围的计算机研究者都在逐步形成一种共识,那就是在计算机将来的发展中,它必然不会成为像科幻电影中的那种会背叛人类,伤害人类的机械怪物,恰恰相反它们将变得小巧玲珑而且无处不在。它们会出现在任何你能看的见、听得到、摸得着的地方,功能强大而且随处可用,这就是“无处不在的计算机”。
嵌入式计算机系统就是所谓的“看不见的计算机”,一般情况下它只是运行平台,并不能作为独立的开发平台来使用。而且它不能够被用户编程,对用户的I/O接口是专用的。所以不严谨地说:任意包含可编程计算机的设备而且这种设备不是作为通用计算机而设计的都可以称作嵌入式系统。
时至今日嵌入式系统已经逐渐渗透到人们的日常生活中,但因为其不同的应用形式和相异的名称,目前对嵌入式系统还没有一个统一的定义。但一般认为,它有以下概念:
(1)嵌入式系统的中心是应用功能,基础是计算机技术,其软件和硬件可以裁剪,对应用系统的功能、可靠性、成本、体积大小和功率损耗都有十分严格的要求和指标。
(2)国际电气和电子工程师协会认为嵌入式系统的定义是“Device used to control, monitor, or assist the operation of equipment , machinery or plants.”
(3)嵌入式系统是计算机技术、半导体技术、电子技术等与各个行业的具体应用相结合后的产物,是一个技术集中、资源集中、应用高度分散、技术不断革新的集成系统。
2、嵌入式系统的特点:
1)嵌入式系统通常都是多样的有特定应用功能的软硬件综合体,用于特定的任务,其硬件和软件设计都是高效而简洁的。其中嵌入式软件的应用程序和操作程序是一体化的,不同于传统的通用计算机操作系统和应用程序有着分明的界限。
2)嵌入式系统能够受到多个处理器和体系结构的支持,不同于通用的计算机只能够使用少数的处理器类型和体系结构。目前已经生产有上千种嵌人式微处理器和几十种微处理器的体系结构,其中比较主流常见的有ARM,MIPS, PowerPC,X86和SuperH等。
4)嵌入式系统有实时性和可靠性的特点,其主要表现在:目前绝大多数实时操作系统都是嵌人式系统;嵌人式系统都有实时性的要求,其软件通常都是固化或直接加载到内存中运行的,启动十分快速
另外,嵌人式系统通常都有处错能力和自动复位的功能,目前在绝大多数嵌式系统中都包含着用于保证系统运行可靠性的软硬件处理机制,比如看门狗定时器和内存保护重启机制等。
5)嵌入式系统通常都使用可以适应多种类型处理器、可裁剪量轻、实时性和可靠性高以及可以固化的。同嵌入式微处理器,嵌入式的操作系统也是多种多样的,不仅可以支持多种处理器,还可以进行裁剪量轻来匹配应用的功能,而且规模较小,能够节省资源等等。
二、嵌入式系统的发展和应用
第一代电子计算机体积大,耗电快,而且可靠性和实时性都无法满足嵌入式计算的要求。到了20世纪60年代,由晶体管、磁芯存储制造的第二代计算机开始用于航海航空等领域,它的CPU能够处理从电子系统传来的信号,具有了数据总线的一些基本特性。而与此同时,嵌人式计算机也逐步应用于工业和制造等方面。
至60年代末,采用集成电路的第三代计算机问世,1965年发射Gemini3号是人们第一次使用机载数字计算机。而后的阿波罗探测飞船则使用了嵌人式计算机系统来提供和保障人机的交互功能来用于引导飞行。1963年DEC公司推广了第一台商用小型机,它具有嵌入式系统的结构,具备单总线结构、高速寄存器和实时性、可靠性强的中断系统以及交叉存取功能,标志着嵌入式系统的兴起。
1971 年,英特尔公司成功推出了世界上第一片微处理器Intel 4004。它的体积小、质量轻、价格实惠、使用方便,在当时销量很好,Intel公司将它进一步改进后推出了4位的微处理器4040和8位的8008。
1973-1977 年短短四年之间全球许多厂家推出了各种各样的8位微处理器,其中比较流行的有英特尔公司的8080/ 8085系列,摩托罗拉公司的6800/6802系列,齐洛格公司的Z80和罗克韦尔公司的6502等。这些微处理器的广泛应用为嵌入式系统开辟了广阔的市场,促成了嵌入式系统的快速发展。计算机厂商开始以插件的形式为用户提供所需的OEM产品,并构成符合用户要求的微型控制计算机,嵌入到系统设备中。
嵌入式系统的大发展还要归功于20世纪80年代软件技术的进步。最初的嵌入式计算机的软件都是十分专用的,其程序也只能用汇编语言来编写,因此嵌入式系统的开发周期过长,效率太低,不利于广泛地推广和应用。得益于微电子技术的进步,嵌入式计算机的软件开发不再局限于汇编语言,可以使用C或PL等高级语言,是编程更加多样和简洁化,加快了嵌入式系统的开发效率。时间步入20世纪90年代,当时对分布控制、柔性制造和数字通信电等技术有着巨大需求,而这种需求也刺激着嵌人式系统的软硬技术的革新和发展,促进了嵌入式系统的应用扩大化。
如今,嵌入式系统经过半个多实际的发展和革新,在各个产业都可以看见它的身影。在电子消费领域,它已经广泛应用于手机、VCD、数字电视和路由器等常见家用电器和电子产品,或许在你的家里有着几十甚至几百个微型嵌入式计算机无时无刻地不在为你服务。
在工业控制方面,一辆豪华轿车的控制系统就包含着至少50个嵌入式微处理器,它们分布于火花塞、传动轴和安全气囊等等。而一架先进的飞机,一台人造卫星就可能包含着几十套嵌入式系统和上百台微型嵌入式计算机,没有这些装载,飞机和卫星的控制系统就不能有效地工作,它们的导航系统就不能满足严格的要求。
在通信领域也有着数不胜数的嵌入式系统的应用,由于带宽网络的发展,交换机、路由器和各种传输设备等都逐渐需要更多的嵌入式系统来满足它们互联的需求,而这些基于32位的嵌入式系统品种多样,绝大多数都价格低廉,能够为企业和家庭的网络选择提供更加廉价而多样的方案。
时至今日,嵌入式系统的应用已经从微至著,广泛分布。但它还在不断地更新发展,其构成的计算机也会变得更小巧,更灵敏,更高效,更智能,相信在未来的某一天,会如Mark Weiser所说的那样:“它们会在墙上,在手腕上,在口袋里,就像手写纸一样,随用随取,伸手可得。”
三、总结和心得
嵌入式系统作为一门计算机开发的学科,有着不同于传统通用计算机系统的特点和概念,具有独特长处。同时它的应用遍布于电子消费、通信工程、工业控制和军事国防等多种领域,其发展前景是非常广阔的,是一门十分值得深入学习和研究的学科。
通过一个学期的学习,我了解了许多嵌入式实时操作系统的应用知识,比如“任务的管理和调度”、“同步、互斥与通信”以及“中断和时间管理”等全新的理论知识,同时也通过多次的实验操作理解了对嵌入式系统软硬件工作方式和应用。所谓温故而知新,通过撰写课程报告,我对嵌入式系统的各个方面有了新的了解,大大提高了对这门学科的兴趣,在今后的学习中,我也会更加深入地去学习这门课程的相关内容,丰富自己的知识领域,开阔眼界,掌握更多的技能,为自己将来的发展做好铺垫。
参考文献:
甄鹏------《嵌入式实时Linux的移植及应用技术的研究》2008,(02)
郭军------《基于Petri网的嵌入式系统高层级设计方法与技术研究》2007,(04)
吴敏------《基于嵌入式的家庭网关控制平台的研究与设计》2007,(05)
刘青云;焦铬-------《嵌入式Web Service模型实现及应用》2019,(01)
田婧---------《嵌入式μCOSⅡ在DSP中的移植与应用研究》2007,(04)
附录
附查重报告:
第五篇:嵌入式Linux操作系统学习规划
嵌入式Linux操作系统学习规划
嵌入式Linux操作系统学习规划
ARM+LINUX路线,主攻嵌入式Linux操作系统及其上应用软件开发目标:
(1)掌握主流嵌入式微处理器的结构与原理(初步定为arm9)
(2)必须掌握一个嵌入式操作系统(初步定为uclinux或linux,版本待定)
(3)必须熟悉嵌入式软件开发流程并至少做一个嵌入式软件项目。
从事嵌入式软件开发的好处是:
(1)目前国内外这方面的人都很稀缺。这一领域入门门槛较高,所以非专业IT人员很难切入这一领域;另一方面,是因为这一领域较新,目前发展太快,大多数人无条件接触。
(2)与企业计算等应用软件不同,嵌入式领域人才的工作强度通常低一些(但收入不低)。
(3)哪天若想创业,搞自已的产品,嵌入式不像应用软件那样容易被盗版。硬件设计一般都是请其它公司给订做(这叫“贴牌”:OEM),都是通用的硬件,我们只管设计软件就变成自己的产品了。
(4)兴趣所在,这是最主要的。
从事嵌入式软件开发的缺点是:
(1)入门起点较高,所用到的技术往往都有一定难度,若软硬件基础不好,特别是操作系统级软件功底不深,则可能不适于此行。
(2)这方面的企业数量要远少于企业计算类企业。
(3)有少数公司经常要硕士以上的人搞嵌入式,主要是基于嵌入式的难度。但大多数公司也并无此要求,只要有经验即可。
(4)平台依托强,换平台比较辛苦。
兴趣的由来:
1、成功观念不同,不虚度此生,就是我的成功。
2、喜欢思考,挑战逻辑思维。
3、喜欢C
C是一种能发挥思维极限的语言。关于C的精神的一些方面可以被概述成短句如下:相信程序员。
不要阻止程序员做那些需要去做的。
保持语言短小精干。
一种方法做一个操作。
使得它运行的够快,尽管它并不能保证将是可移植的。
4、喜欢底层开发,讨厌vb类开发工具(并不是说vb不好)。
5、发展前景好,适合创业,不想自己要死了的时候还是一个工程师。
方法步骤:
1、基础知识:
目的:能看懂硬件工作原理,但重点在嵌入式软件,特别是操作系统级软件,那将是我的优势。
科目:数字电路、计算机组成原理、嵌入式微处理器结构。
汇编语言、C/C++、编译原理、离散数学。
数据结构和算法、操作系统、软件工程、网络、数据库。
方法:虽科目众多,但都是较简单的基础,且大部分已掌握。不一定全学,可根据需要选修。主攻书籍:the c++ programming language(一直没时间读)、数据结构-C2。
2、学习linux:
目的:深入掌握linux系统。
方法:使用linux—〉linxu系统编程开发—〉驱动开发和分析linux内核。先看深,那主讲原理。看几遍后,看情景分析,对照深看,两本交叉,深是纲,情是目。剖析则是0.11版,适合学习。最后深入代码。
主攻书籍:linux内核完全剖析、unix环境高级编程、深入理解linux内核、情景分析和源代。
3、学习嵌入式linux:
目的:掌握嵌入式处理器其及系统。
方法:(1)嵌入式微处理器结构与应用:直接arm原理及汇编即可,不要重复x86。
(2)嵌入式操作系统类:ucOS/II简单,开源,可供入门。而后深入研究uClinux。
(3)必须有块开发板(arm9以上),有条件可参加培训(进步快,能认识些朋友)。主攻书籍:毛德操的《嵌入式系统》及其他arm9手册与arm汇编指令等。
4、深入学习:
A、数字图像压缩技术:主要是应掌握MPEG、mp3等编解码算法和技术。
B、通信协议及编程技术:TCP/IP协议、802.11,Bluetooth,GPRS、GSM、CDMA等。
C、网络与信息安全技术:如加密技术,数字证书CA等。
D、DSP技术:Digital Signal Process,DSP处理器通过硬件实现数字信号处理算法。说明:太多细节未说明,可根据实际情况调整。重点在于1、3,不必完全按照顺序作。对于学习c++,理由是c++不只是一种语言,一种工具,她还是一种艺术,一种文化,一种哲学理念、但不是拿来炫耀得东西。对于linux内核,学习编程,读一些优秀代码也是有必要的。
注意:要学会举一反多,有强大的基础,很多东西简单看看就能会。想成为合格的程序员,前提是必须熟练至少一种编程语言,并具有良好的逻辑思维。一定要理论结合实践。不要一味钻研技术,虽然挤出时间是很难做到的,但还是要留点余地去完善其他的爱好,比如宇宙,素描、机械、管理,心理学、游戏、科幻电影。还有一些不愿意做但必须要做的!技术是通过编程编程在编程编出来的。永远不要梦想一步登天,不要做浮躁的人,不要觉得路途漫上。而是要编程编程在编程,完了在编程,在编程!等机会来了在创业(不要相信有奇迹发生,盲目创业很难成功,即便成功了发展空间也不一定很大)。
嵌入式书籍推荐
Linux基础
1、《Linux与Unix Shell 编程指南》
C语言基础
1、《C Primer Plus,5th Edition》【美】Stephen Prata着
2、《The C Programming Language, 2nd Edition》【美】Brian W.Kernighan David M.Rithie(K & R)着
3、《Advanced Programming in the UNIX Environment,2nd Edition》(APUE)
4、《嵌入式Linux应用程序开发详解》
Linux内核
1、《深入理解Linux内核》(第三版)
2、《Linux内核源代码情景分析》毛德操 胡希明著
研发方向
1、《UNIX Network Programming》(UNP)
2、《TCP/IP详解》
3、《Linux内核编程》
4、《Linux设备驱动开发》(LDD)
5、《Linux高级程序设计》 杨宗德著
硬件基础
1、《ARM体系结构与编程》杜春雷着
2、S3C2410 Datasheet
英语基础
1、《计算机与通信专业英语》
系统教程
1、《嵌入式系统――体系结构、编程与设计》
2、《嵌入式系统――采用公开源代码和StrongARM/Xscale处理器》毛德操 胡希明着
3、《Building Embedded Linux Systems》
4、《嵌入式ARM系统原理与实例开发》 杨宗德著
理论基础
1、《算法导论》
2、《数据结构(C语言版)》
3、《计算机组织与体系结构?性能分析》
4、《深入理解计算机系统》【美】Randal E.Bryant David O''Hallaron着
5、《操作系统:精髓与设计原理》
6、《编译原理》
7、《数据通信与计算机网络》
8、《数据压缩原理与应用》
C语言书籍推荐
1.The C programming language 《C程序设计语言》
2.Pointers on C 《C和指针》
3.C traps and pitfalls 《C陷阱与缺陷》
4.Expert C Lanuage 《专家C编程》
5.Writing Clean Code-----Microsoft Techiniques for Developing Bug-free C Programs
《编程精粹--Microsoft 编写优质无错C程序秘诀》
6.Programming Embedded Systems in C and C++ 《嵌入式系统编程》
7.《C语言嵌入式系统编程修炼》
8.《高质量C++/C编程指南》林锐
尽可能多的编码,要学好C,不能只注重C本身。算法,架构方式等都很重要。