第一篇:改进嵌入式Linux系统实时性新方案
改进嵌入式Linux系统实时性新方案
时间:2009-05-12 23:31来源:Linux Website 作者:尚观 点击: 7
3次
对嵌入式Linux进行实时性改进是嵌入式操作系统领域的一个研究热点。本文在分析了现有嵌入式操作系统实时性不足的基础上,提出了一种新型的改进方案(将RTAI和uClinux相结合),并给出
对嵌入式Linux进行实时性改进是嵌入式操作系统领域的一个研究热点。本文在分析了现有嵌入式操作系统实时性不足的基础上,提出了一种新型的改进方案(将RTAI和uClinux相结合),并给出具体的工控应用实例,进一步对这种系统的功能进行有效验证。
图1:双内核实时系统嵌入式实时Linux架构。嵌入式Linux以代码开放、价格低廉、功能强大又易于移植的特性正在被广泛应用,为嵌入式操作系统提供了一个极具吸引力的选择。但许多实际应用,譬如多媒体通信、生产过程控制、在线事务处理等等都要求对外部事件在限定的时间内做出反应。因而嵌入式系统实时性问题越来越受到关注,对嵌入式Linux进行实时性改进也成为嵌入式操作系统领域的一个研究热点。
本文提出了一种基于uClinux的嵌入式实时操作系统方案。将RTAI和uClinux相结合,既满足了嵌入式应用的需求,同时又保证了系统的硬实时性。此外,还有强大的网络功能、易升级性、易移植性等优点。最后结合基于这一操作系统开发的重大装备远程监控系统的应用案例,进一步从功能和性能上对其进行验证。
现有嵌入式操作系统应用中存在的问题 一个优秀的嵌入式操作系统是嵌入式系统成功的关键。它除了具备一般操作系统最基本的功能,如任务调度、同步机制、中断处理、文件功能等,还需要具有以下特点:1.更好的硬件适应性,也就是良好的移植性;2.占有更少的硬件资源;3.高可靠性;4.提供强大的网络功能,支持TCP/IP协议及其他协议;5.有些应用要求具有实时性能。
现有的嵌入式操作系统大致可分为商用型和免费型两类:商用型操作系统由于功能稳定、可靠,有完善的技术支持和售后服务,在嵌入式市场占有一定的份额。但它同时也存在价格昂贵、需要版权、源代码不公开等一系列问题;免费型操作系统(如Linux)源码公开,有价格方面的优势,但在严格满足嵌入式实时应用需求方面还有欠缺。
图2:实时内核实现机理
RTAI对Linux的实时性改进
现有几种针对Linux的实时系统解决方案,实现方法主要包括两种:1)直接修改Linux内核、增加实时性,如:Montavista;2)在普通Linux内核之上增加实时模块、双内核结构,如:RTLinux或RTAI。
Montavista可以满足用户的软实时要求,RTLinux或RTAI着重增强Linux的硬实时特性。软实时系统的时限是柔性灵活的,它可以容忍偶然的超时错误。失败造成的后果并不严重,仅仅是轻微地降低了系统的吞吐量。硬实时系统有一个刚性的、不可改变的时间限制,它不允许任何超出时限的错误。超时错误会带来损害甚至导致系统失败、或者导致系统不能实现它的预期目标。
RTAI采用双内核方法,不直接使用Linux的任何功能,而是把需要高度时间精度的工作写成一个驱动程序的形式,然后直接用PC时序芯片所产生的中断调用这个驱动程序。RTAI与NMTRT-Linux的最大不同之处在于,它在Linux上定义了一组实时硬件抽象层(RTHAL)。RTHAL将RTAI需要在Linux中修改的部分定义成一组程序界面,RTAI只使用这组界面和Linux沟通。这样做的好处在于,用户可以将直接修改的Linux核心程序代码减至最小,这有可能使得将RTHAL移植到新版Linux的工作量减至最低。但是,RTAI虽然满足了硬实时性要求,却没有被裁减为足够小且适用于嵌入式系统。
RTAI+uClinux的实时方案
uClinux是为嵌入式应用设计的,它本身并没有更多地关注实时问题。uClinux经过小型化改造,形成了一个高度优化、代码紧凑的嵌入式Linux,并保留了Linux大多数的优点。它专门针对无MMU的CPU,去除了普通Linux内核中的虚拟内存管理部分。更重要的是,uClinux提供了完整的TCP/IP协议栈,并支持大量其他的网络协议,为嵌入式系统提供了强大的网络支持。而从前面的分析可以看出,RTAI是基于普通Linux内核,相对于嵌入式应用其内核过于庞大;而uClinux本身并没有更多地关注实时问题。因此,可以将RTAI和uClinux相结合,采用双内核的设计方案,既满足了嵌入式应用的需求,又保证了系统的硬实时性。
1.硬件抽象层
图3:系统中断处理流程图
系统的实现基础是硬件抽象层,通过硬件抽象层进行硬件管理,把基本内核和实时内核结合在一起,其中一个内核的改变,不会影响另一个内核的执行。硬件抽象层定义了本系统同硬件之间的抽象接口,主要用来截取硬件中断,并且依据实时内核调度器的需求,重定向为基本内核任务或是实时任务。RTHAL包含一个关键的组件:中断描述符表(IDT,InterruptDetorTable),它定义了一套指针用来处理中断例程。RTHAL本身定义了一个结构,使得基本内核中断处理函数能够很容易地被实时处理函数所替代。这样,当实时内核通过RTHAL激活后,新的IDT表为合法。在以上控制下,基本内核作为实时系统的任务提供服务。
2.双内核结构
双内核实时系统的总体结构模型如图1所示,主要包含了基本内核、实时内核、硬件抽象层、硬件部分。
其中基本内核(uClinux)和实时内核(RTAI)分别处理非实时和实时任务的调度和执行,而实时任务和非实时任务之间信息的交换要通过管道(FIFO)或共享内存(MBUFF)来实现。当实时任务运行时,基本内核被硬件抽象层屏蔽。即实时内核将基本内核作为优先级最低的一个任务来运行,只有在没有实时任务运行的时候才予以调度。
3.实时内核动态加载
嵌入式实时Linux的实时内核是动态加载的。实时任务被激活前,实时内核并没有启动,基本内核通过RTHAL透明访问硬件,就像RTHAL不存在一样。当实时任务被激活时,RTHAL结构发生变化,基本内核被实时内核接管,图2表明了实时内核启动前后,系统发生的变化。
4.调度处理
当中断到来时,实时内核判断它是基本内核中断还是属于实时中断,分别进行处理。若是基本内核中断,如果当前有实时任务正在运行,则只是设置一下中断标志位,悬挂此中断,如果没有实时任务运行,则调用基本内核的中断处理程序;如果此中断是实时中断,就直接调用相对应的实时中断处理程序。注意,实时中断可以抢先基本内核任务的执行。系统的中断处理流程如图3所示。
应用案例
工业控制是嵌入式实时操作系统的传统应用领域,需要严格的实时处理功能、高可靠性和良好的开放性,对开发环境、可操作性、成本等也有特别的要求。因此本项研究以重大装备的远程监控系统作为其应用之一。
1.嵌入式远程监控系统结构
应用针对工业生产中使用的大型设备在连续运转状态下的远程监控问题,研究用于重大装备远程监控的嵌入式装置。系统主要包括输入/输出模块(NetIO)和输入/输出上位模块(NetWeb),前者用于实现现场数据的采集(输入),或用于现场装置的控制(输出),后者集成了Web功能,使得用户可以通过互联网对输入/输出模块进行访问。两类模块通过网络相连接,在本系统中为通过串行485总线。嵌入式远程监控系统结构如图4所示。
2.NetWeb对嵌入式Linux的功能验证
图4:嵌入式远程监控体系结构
NetWeb的开发基于前面介绍的嵌入式实时Linux操作系统。特殊的双内核操作系统结构决定了应用开发的特殊性。
1)任务管理功能
系统中的任务可以分为实时性任务和非实时性任务,实时任务包括实时数据采集、处理等方面,这部分的功能要在实时内核RTAI之上进行实现;另外,非实时任务主要包括数据存储、远程通讯的实现,这部分功能要在基本内核uClinux之上实现。
嵌入式实时Linux将实时任务与非实时任务分开管理,实施不同的调度策略和任务间通信方式,至于实时任务与非实时任务之间的通信可以通过实时的FIFO或共享内存实现。这样的功能使应用的编写简洁清晰、功能明确、调度灵活,方便了用户。
2)网络功能
嵌入式实时Linux实现了嵌入式互联网技术,将Web服务器引入到现场测试和控制设备中,在相应的硬件平台和软件系统的支持下,使传统的测试和控制设备转变为具备了以TCP/IP为底层通信协议,Web技术为核心的基于互联网的网络测试和控制设备。
嵌入式Web与传统Web应用相比,简化了系统结构,将信息采集和信息发布都集成到现场的测控设备中。由于有了标准的接口形式和通信协议,内嵌于设备的Web服务器可以向任何接入它所在网络的合法用户提供统一的基于浏览器方式的操作和控制界面,浏览器成了设备的前端控制板。
3)实时性
嵌入式实时Linux是硬实时的嵌入式操作系统。当中断到来时,若是基本内核中断,如果当前有实时任务正在运行,则只是设置一下中断标志位,悬挂此中断;如果此中断是实时中断,就直接调用相对应的实时中断处理程序。这样的调度机制可以保证远程监控系统中实时任务在确定的时间限度内完成,为系统故障的实时预报、诊断、控制提供了强有力的支持。
此外,系统还从时间管理、内存管理、中断管理、同步、互斥管理以及设备管理等方面对这一操作系统的功能进行评估验证。
本文小结
尽管将Linux进行嵌入式实时性改进的方案很多,但是采用RTAI+uClinux的还未见到成型的产品。这一方案既符合嵌入式系统的需求,又达到硬实时性标准,同时还有强大的网络功能、易升级性、易移植性等优点。同时,在其上进行应用编程时实时任务(基于RTAI)和非实时任务(基于uClinux)是分开编写的,清晰简洁,但由于用户需要直接在内核空间编程,从系统的安全性角度存在很大隐患。希望可以通过进一步讨论研究使其更加完善。
第二篇:嵌入式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、
第三篇:全高清实时视频显示嵌入式系统设计与调试
实验名称
全高清实时视频显示
嵌入式系统设计与调试
课程名称
姓名学号
年级专业
嵌入式系统设计
彭嘉乔
3130104084
大三
电子信息工程
所在学院
电气工程学院 全高清实时视频显示嵌入式系统设计与调试报告
3130104084 彭嘉乔
心得体会:
我想了想,还是决定把心得体会放在这里。毕竟基础实验大家做的都是一样的内容,何况我们做的水平也就那样,Phase5还没有做完。但我的感想是独一无二的,不如把最有价值的部分排版到最前面。
如果让我直观总结下这22天小学期的感受,我会毫不犹豫地说:“累”。如果要具体点的话,“真的很累”。这种累,不仅是身体上的累,更是心累,大部分时候是一种深深的绝望。
我对这门课是有心理准备的。上课前我就看过往届学生写的报告,无一例外充斥着“大学最累的课”“大学生涯难度最高的课”“累得昏天黑地”这种话,然而我还是有着迷之自信。其实如果我不是有着迷之自信的话我压根就不会选这门课,毕竟我之前没有上过数字系统设计,没有任何与FPGA板开发有关的经验,对这门课的内容完全是两眼一抹黑。
这门课一开始是早上八点开始,到下午五点结束,后来才改成了早上八点半开始。最初我根本不适应这样的强度,而且由于这样改变了我睡午觉的习惯,导致我第一周每天回寝室后都先补觉睡到九点,再起来继续白天的进度到凌晨三点再睡觉,作息严重混乱。后面稍微调整过来了,回寝不需要补觉了,只是昏昏沉沉一晚上而已。
从Phase2第一次要求自己写代码开始我就感觉到了巨大的压力。因为没有上过数字系统设计,我压根就不会Verilog语言,得拿着数设的书从零开始自学,以致于连写个激励源文件都要折腾一天时间。这门课的玄学之处也从写这第一个testbench开始出现,我照着书上的例子一模一样的形式写的都运行不了。
当然这只算小儿科的,Phase2.3把之前的几个文件综合起来,本来分别检验都符合要求,综合起来后出现了严重的bug,仿真显示scl的输出有一半是高阻态,sda的输出始终为高阻态。即使将其强制赋值为1再输出仍然不行。我在i2c文件里通过注释掉其余语句逐句检验也发现不了问题。偶然间我发现,当注释掉与sda有关的一切,删掉sda的输出引脚后仿真显示scl正常,注释掉scl后sda仍然全为高阻态。我开始猜测是不是sda引脚出现了干扰,甚至去检查约束文件。为了这个bug我整整耽误了两天,最终在万念俱灰走投无路的情况下我干脆重建了工程把代码原样复制了进去,结果仿真就正常了„„
有趣的是重建工程前还可以生成bitstream文件,重建后就不行了。明明是一样的代码啊„„再花半天终于生成了bitstream文件,我也不知道怎么弄好的,然后烧录上去果然不能用,即使仿真波形和老师给的标准波形一模一样。干脆全部推倒重写吧。
这样的玄学在之后的实验中会一而再再而三地发生。同样的代码,重建工程复制进去就是截然不同的结果。同一个工程没有任何改动,重启下电脑就不能用了。同样的bitstream文件每次烧录显示都不同。一模一样的操作步骤在别人的电脑上行得通在自己电脑上就报错。不仅是我,其他同学也都发现了,人人都知道了重建大法好,出bug第一反应不再是去找原因而是先重建试试。想想以后我用的电子产品可能就是这样一群人用这样的方式做出来的,简直慌得要死。
除了玄学,很多时候一点小问题也会耽误我们一整天的时间。或者是数百行代码里的一句话,或者是软件的一个设置。在此不得不吐槽一下vivado和SDK都实在是太复杂太用户不友好了,如果老师不多教教软件的使用,告诉我们软件各个部分各种功能都是做什么的,只靠我们自己摸索实在是太难了。其实除了玄学问题我们真的没办法以外,大部分问题我们最终发现都是很简单的小问题,如果经验丰富的话很快就能解决,可让我们这些新手来自己解决的话往往无从下手,像无头苍蝇一样浪费非常多的时间。
整个小学期,我们可能只有5%的时间真正在写代码,70%以上的时间双眼空洞地盯着电脑屏幕,仰天长叹乞求上苍告诉自己究竟错在了哪里。当然上天不会回应,助教也不会。当我发现无论我问什么助教都会回答:“讲义上有自己好好看看吧”而我确定一定以及肯定我把讲义上的每一个字都看过了而且确实没有答案的时候,助教在我心中就已经不存在了。
虽然我可以理解老师和助教希望我们自己解决问题以提升能力积累经验的苦心,但是我质疑这样是否有效率。让高中生提前接触微积分他或许会感受到数学的美和神奇进而爱上数学,而换成个小学生只会感到枯燥厌烦。适当拔高确实可以考验打磨学生,拔得太高拔苗助长只是种折磨。如果在好几个关键时刻有过来人抬我们一手,稍微指点一下,我们的进度起码可以快一周,Phase5可能就做出来了,攀登到高峰看到最美的风景,创新实验也能做得更好。可实际上我们在很多没有意义的细节上浪费时间,向着看不见的敌人挥拳,收不到任何正反馈,仿佛身体被掏空一般难受。
我并不怕苦怕累,毕竟能考进浙江大学,吃不得苦高考就被淘汰掉了。可大多数时候我知道自己吃苦能换来什么,知道自己忙得有意义能忙出成果,但在这门课里大多数时候是“穷忙”,结果每天在电脑前忙个不停,却可能一整天都找不出bug原地踏步,没有任何充实的感觉,反而觉得异常空虚。
或许是作学生太久了变得娇惯了吧,觉得世间万事都该让着自己。幸好在我最烦躁最愤怒的时候被老师浇了一盆冷水,现在还记得特别深刻:“以后工作的时候,没人会问你遇到了什么问题,只会问你做出来了没有。”
这么一想大概也就释怀了吧。这个世界就是这么残酷啊,我确实可以找一万个理由来解释我为什么做得这么差,可还是掩盖不掉一个现实就是别人做出来了可我没有。没做出来就是没做出来,还是老实承认自己太菜吧。其实世间所有的不如意,都是自己不给力。
毕竟学渣是原罪。
以下是具体的实验过程。
Phase1、基于 Xilinx Vivado 的嵌入式系统设计入门实验。
Phase1是整个实验的入门,与其他实验相比,实验很简单,不过因为没有指导,需要自己摸索,所以,也是花了我们半天的时间。这次实验是对vivado软件的初步认识,如建立project,IP,sdk等等。
Phase2、设计 HDMI 控制器。
Phase2首先进行的是HDMI控制器的硬件设计,根据时序图得到hsync,vsync等信号和clk信号的关系,实验需要进行720p和1080p的设计,程序编写并不困难,但是由于对verilog语言的陌生,我和队友在testbench的编写上花费了较多的时间,后来经过上网找例子教程才明白,弄懂之后发现并不难,主要包括复位信号,时钟信号和输入信号,这些语句在不同的程序里大同小异,一次编写成功后,基本就掌握了testbench的编写。
下一节进行的是I2C总线控制器设计,以前曾经学习过I2C,所以我先是找了以前的I2C协议的程序,然后参考程序写出I2C协议,先是将频率转化为CLK_100K_A和CLK_100K_B,再利用二者的 | 或者&得到CLK_100K_SDA和CLK_100K_SCL,在这两个时钟下进行i2c_scl和i2c_sda的计算,最后经过仿真观察波形确定程序的正确性。
第三节是在前两节的基础上进行HDMI 显示测试图硬件电路设计。首先接触到的是yuv422编码方式,在理解这种编码方式上花费了一些时间,尽管如此,在之后还是出现了反色的问题。反色问题的原因是因为技术行数据写入了偶数行,使得yuyv的排列变成了yvyu,解决方案是地址整体加1或者减1。实验还是分为720p和1080p两部分,但是其实两部分差不多,所以我们为了节省时间,只做了和后面实验有关系的1080p部分。显示彩条和彩色砖块都是对地址进行划分。之后的显示小飞机需要从rom中读取数据,这一部分的步骤按照实验讲义进行,在rom的读取语句中有些困惑,经过询问同学,知道输入输出对应rom里用到的引脚便可。
在显示小飞机的实验中,图片出现了左右偏移的情况,最左侧一列为绿色,按照我们的想法,将loc_x地址加2进行调整,如果不够,再加2,然而加到8后最右侧一列已经出现明显偏移,而最左侧一列仍然是绿色,这让我们意识到,最左侧一列可能根本没有显示信号。进过检查代码,enable信号响应需要时间,由于在读取像素点信息时引入了enable信号,当扫到第一列的时候enable仍为0,导致第一列没有获得像素点信息。进行相应的更改,显示器上得以在每一处均有显示。最后经过合适的调整,使得显示不偏不倚。
Phase3、AXI-Lite 接口的设计。
Phase3 是从软件给出的AXI-Lite协议修改得到自己要用的AXI-Lite协议,封装成IP核添加到Block design中,利用cpu提供的150Mclk执行。这是我第一次接触到AXI协议,为了弄懂AXI-Lite协议,我阅读了讲义上提供的英文参考资料,因为对AXI协议没有基础,所以在阅读过程中比较吃力。在通读一遍后,对AXI协议有了简单的了解。从phase4.1中得到了zju_ip的AXI_Lite协议,尝试着去理解这个协议。AXI_Lite协议包括端口定义,各种信号和对register或者rom的调用。我们主要做的内容就是讲zju_ip中的register调用改为rom调用。在调用之前的I2C程序时,需要注意输入输出的匹配。
IP封装时,选择package current resource,完成封装后,就可以在Block design中直接调用创建的IP,选择自动连接,然后将输入输出引脚引出。Block design完成后,有时会发现IP核中的错误,需要对IP进行修改,可以直接找到IP的程序文件用记事本或其他阅读软件打开修改保存,然后在upgrade IP,然后generate outputs得到更新后的IP。直接在已创建好的IP上进行修改更新,比重新封装一个新的IP要简单快捷。
搭建好block design后,生成比特流文件并打开sdk,在sdk中编写软件,用cpu通过axi协议访问rom,对rom进行读写的操作。
Phase4、AXI-Full 接口的设计。
Phase3中用到的是axi slave,在phase4中用到的是axi master,master的程序代码与slave相比更加繁杂。在4.1提供了一份波形图供参考,我们通过波形图分析各个信号之间的关系。在信号的关系中,txn_request信号和axi总线的关系最为复杂,也最为重要。txn_request信号
sdk写完后进行烧录,出现了绿屏的现象,这是因为没有在sdk中写入elf文件,写入elf文件后在显示器上显示花屏,这是因为airbus.h文件没有正确的放入sdk中。在修改了一些错误后,终于在显示器上有了显示。
示器上显示出的大飞机图片出现了左右偏移的情况,且偏移的幅度很大。我们又开始进行漫长的debug过程。先是修改了地址位,结果大飞机却出现了雪花,急忙将地址为修改回来。后来,听从同学的意见,我们将fpga板子重启,重新烧录,在显示器上得到了正确的显示。
全高清数码相框的实验中,短学期已经将要结束,我们直接应用了老师提供的bmp.c和main.c代码,不过直接用这写代码在编译时不通过,问题出现在“f_mount(0,&fs);”一句,报错的原因是因为参数不够,打开“ff.h”文件查看f_mount的用法,并进行修改,编译得以通过。向sd卡里复制bmp图片,然后查到板子上,烧录后在显示器上没有显示图片,而在sdk中显示“airbus1 open success”和“It is not a bmp file”,出现这个问题的原因是因为main.c中的“sprintf(filename,“0:/bmp1080p/airbus%d.bmp”,j);”语句与sd卡中的bmp文件名airbus_1不匹配所导致,修改语句为
“sprintf(filename,“0:/bmp1080p/airbus_%d.bmp”,j);”bmp文件能够在显示屏上正常显示。这是出现的又一个问题只能显示前airbus_1.bmp至airbus_9.bmp这9张图片,这是因为文件名不能超过8个字符,我的解决办法是直接删掉airbus_9之后的图片并修改main.c中的for循环语句的循环次数,使得能够在显示器上循环显示9张图片。
Phase5 全高清摄像头视频采集
在完成phase4之后,已经到了短学期的末尾,所以整个phase5我们只是进行了GPIO口的实验部分。GPIO口在block design中添加,与scl和sda总线进行连接。GPIO引出的引脚可以自己设定如FPGA板子上的开关按钮,只要在xdc中进行标注,在sdk中说明即可。这样就可以实现硬件和软件的综合。
第四篇:嵌入式Linux实时操作系统习题总结
第1章
1.嵌入式系统是指操作系统和功能软件集成于计算机硬件系统之中。嵌入式系统一般有3个主要的组成部分:硬件、实时操作系统以及应用软件。
2.嵌入式系统的三要素是嵌入、专用、计算机;即以应用为中心、以计算机技术为基础、软件硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。
3.目前国际较为知名的有:VxWorks、NeutrinoRTOS、Nucleus Plus、OS/
9、VRTX、LynuxOS,RTLinux、BlueCat RT等。
4.嵌入式系统一般由硬件层、中间层、软件层和功能层组成。其作用分别如下:
(1)硬件层 :由嵌入式微处理器、外围电路和外设组成。操作系统和应用程序都可以固化在ROM或者Flash中。为方便使用,有的模块在此基础上增加了LCD、键盘、USB接口,以及其他一些功能的扩展电路。
(2)中间层 :硬件层与软件层之间为中间层,其作用将系统软件与底层硬件部分隔离,使得系统的底层设备驱动程序与硬件无关;
(3)软件层 :主要是操作系统,有的还包括文件系统、图形用户接口和网络系统等。操作系统是一个标准的内核,将中断、I/O、定时器等资源都封装起来,以方便用户使用。(4)功能层 :由基于操作系统开发的应用程序组成,用来完成对被控对象的控制功能。5.非占先式调度法也称作合作型多任务(cooperative multitasking),各个任务彼此合作共享一个CPU。中断服务可以使一个高优先级的任务由挂起状态变为就绪状态。但中断服务以后控制权还是回到原来被中断了的那个任务,直到该任务主动放弃CPU的使用权时,那个高优先级的任务才能获得CPU的使用权。当系统响应时间很重要时,要使用占先式(preemptive)内核。最高优先级的任务一旦就绪,总能得到CPU的控制权。当一个运行着的任务使一个比它优先级高的任务进入了就绪态,当前任务的CPU使用权就被剥夺了。6.在实时系统中,如果系统在指定的时间内未能实现某个确定的任务,会导致系统的全面失败,这样的系统被称硬实时系统。在弱实时系统中,超时却不会发生致命的错误。其实时性的要求比硬实时系统要差一些。
7.嵌入式系统的设计步骤及各部分的主要工作如下。(1)需求分析阶段,罗列出用户的需求;
(2)体系结构设计阶段,描述系统的功能如何实现;
(3)详细设计阶段,进行硬件系统与软件系统的分类划分,以决定哪些功能用硬件实现,哪些用软件实现;
(4)系统集成,把系统的软件、硬件和执行装置集成在一起,进行调试,发现并改进在设计过程中的错误;
(5)系统测试,对设计好的系统进行测试,看其是否满足给定的要求。8.Linux作为嵌入式操作系统的优势主要有以下几点:
(1)可应用于多种硬件平台。
(2)Linux的高度模块化使添加部件非常容易。
(3)Linux是一个和Unix相似、以内核为基础的、具有完全的内存访问控制,支持大量硬件的一种通用操作系统。
(4)Linux可以随意地配置,不需要任何的许可证或商家的合作关系。
(5)Linux带有Unix用户熟悉的完善的开发工具。其强大的语言编译器GCC,C++等也可以很容易得到,不但成熟完善,而且使用方便。9. Linux执行进程调度一般是在以下情况发生的:(1)正在执行的进程运行完毕;
(2)正在执行的进程调用阻塞原语将自己阻塞起来进入等待状态;(3)正在执行的进程调用了P原语操作,从而因资源不足而被阻塞;(4)执行中的进程提出I/O请求后被阻塞;(5)系统分配的时间片已经用完;
(6)就绪队列中的某个进程的优先级变得高于当前运行进程的优先级。
第4章
1、Linux 内核的编译菜单有好几个版本,运行:
(1)make config:进入命令行,可以一行一行的配置,但使用不十分方便。
(2)make menuconfig:大多数开发人员使用的Linux 内核编译菜单,使用方便。
(3)make xconfig:在2.4.X 以及以前版本中xconfig 菜单是基于TCL/TK 的图形库的。
2、在完成内核的裁减之后,内核的编译就只要执行以下几条命令: make clean
编译内核之前先把环境给清理干净。make dep
编译相关依赖文件 make zImage
创建内核镜像文件 make modules 创建内核模块。
make install
把相关文件拷贝到默认的目录。
3、此命令是装载压缩映像文件zImage到flash存储器中,地址是kernel分区,并采用xmodem传输协议。
4、此命令是设置网卡1的地址192.168.1.1,掩码为255.255.255.0,不写netmask参数则默认为255.255.255.0。
5、此命令将nfs服务的共享目录sharedir加载到/mnt/nfs。
6、此命令是装载根文件系统root.cramfs到flash存储器中,地址是根文件系统分区,并采用xmodem传输协议。
7、这个命令的操作同时进行了分区和格式化,0~128K存放vivi,128K~192K存放VIVI控制台指令,192K~1216K存放kernel,1216K~4288K存放root,其余部分存放应用程序。
第6章
1.使用虚拟地址寻址整个系统的主存和辅存的方式在现代操作系统中被称为虚拟内存。虚拟内存的管理方法使系统既可以运行体积比物理内存还要大的应用程序,也可以实现“按需调页”策略,既满足了程序的运行速度,又节约了物理内存空间。2.进程内存区域涉及到5种数据段,即:
①代码段:代码段是用来存放可执行文件的操作指令。
②数据段:数据段用来存放可执行文件中已初始化全局变量。③BSS段:BSS段包含了程序中未初始化的全局变量。④堆(heap):用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。
⑤栈:栈是用户存放程序临时创建的局部变量。3.在Linux系统中,内核在最高级执行,也称为“系统态”,在这一级任何操作都可以执行。而应用程序则执行在最低级,即所谓的“用户态”。在这一级处理器禁止对硬件的直接访问和对内存的未授权访问。模块是在所谓的“内核空间”中运行的,而应用程序则是在“用户空间”中运行的。它们分别引用不同的内存映射,也就是程序代码使用不同的“地址空间”。4.共享内存区域是被多个进程共享的一部分物理内存。如果多个进程都把该内存区域映射到自己的虚拟地址空间,则这些进程就都可以直接访问该共享内存区域,从而可以通过该区域进行通信。共享内存是进程间共享数据的一种最快的方法,一个进程向共享内存区域写入了数据,共享这个内存区域的所有进程就可以立刻看到其中的内容。5.内存管理利用虚拟文件系统支持交换,交换进程(swapd)定期由调度程序调度,这也是内存管理依赖于进程调度的唯一原因。当一个进程存取的内存映射被换出时,内存管理向文件系统发出请求,同时,挂起当前正在运行的进程。
第9章
1.参考答案:
Mutex互斥量,用于操作某个临界资源时对该资源上锁,以实现互斥地对独占资源的使用。Semophore信号灯,信号灯内有一计数器,可以用于对多个同类资源的分配。
Condition条件变量,条件变量用于等待信号。当一个线程需要等待某个信号时,就可到条件变量上等待,当信号具备时,系统会唤醒该线程继续运行。2.参考答案:
本地:共享内存+信号量,适合于大量数据传输。Linux支持系统V和POSIX的共享内存和信号量。(5分)
远程:Socket+应用协议。适合于跨网络的(大量)数据传输。Linux支持BSD的socket。应用层协议需要自行设计。(5分)
3.答案要点:程序是编译后形成的可执行代码,是静止的。进程是程序的一次执行,是活动的。线程是进程的可执行单元,同一进程的不同线程共享进程的资源和地址空间。4.两种实现方法,一种是继承Thread,另外一种是实现接口Runnable。
同步的实现方法有两种,分别是synchronized, wait与notify。用synchronized可以对一段代码、一个对象及一个方法进行加锁。用wait与notify可以使对象处于等待及唤醒方式导致同步,因为每个对象都直接或间接的继承了Object类。
5、什么是BootLoader?主要有几种工作模式及主要功能是什么? 答:
Bootloader就是操作系统内核运行的一段小程序,完成进行初始化系统硬件设置的任务,(2分)
分为启动加载模式和下载模式。(1启动加载模式
启动加载(Boot laoding)模式是指 Bootloader 从目标机上的某个固态存储设备上将操作系统加载到 RAM 中运行,整个过程并没有用户的介入。(2分)(2)下载模式
在下载模式下,目标机上的 Bootloader 将先通过串口连接或网络连接等通信手段从宿主机下载文件。(2分)
6、简述Bootloader有何作用?
答案要点:(1)首先,bootloader是在特定硬件平台运行的程序,严重依赖于硬件平台,需要移植;(2)是系统上电之后,第一个运行的程序,系统在上电或复位时通常都从地址 0x0 处开始执行,而在这个地址处安排的通常就是系统的 Boot Loader 程序;(3)bootloader程序的设计目标是启动嵌入式操作系统,嵌入式操作系统的启动需要一定的条件,这些条件由bootloader来满足;(4)Bootloader一般具有对存储器和网络接口操作的功能;如擦除、读写Flash,通过USB、串口下载文件等
第五篇:嵌入式实时操作系统 项目开发总结报告
项目开发总结报告
分 类:软件项目计划 使用者:E-fanciers
Version: 1.0
项 目 承 担 队伍:烟台大学
计算机学院 E-fanciers小组撰 写 人(签名): 许超 于歌
完 成 日 期: 2009-7-16 本文档使用小组: E-fanciers小组
评审负责人(签名): 孝瑞
评 审 日 期: 2009-7-19
目 录
一、引言.............................................3
1.1编写目的.......................................3 1.2项目背景.......................................3 1.3定义...........................................3 1.4参考资料:.....................................3
二、开发结果........................错误!未定义书签。
2.1产品..........................错误!未定义书签。2.2主要功能......................错误!未定义书签。2.3所用工时.......................................4 2.3所用机时.......................................4 2.3进度...........................................4
三、评价............................................4
3.1生产率评价.....................................4 3.2技术方案评价...................................4 3.3产品质量评价...................................4
四、经验与教训.......................................4
一.引言
1.编写目的(阐明编写总结报告的目的,指明读者对象。)
详细陈述项目开发过程,对项目开发做最后的总结完善,说明项目开发过程中遇到的难题及解决方案。
2.项目背景(说明项目的来源、委托单位、开发单位及主管部门。)
随着微电子技术、计算机技术和网络通信技术的发展,嵌入式系统已广泛应用在各个领域,包括消费电子、汽车电子、网络通信、工业设备、航空航天和国防军事等。随着嵌入式技术的发展,工业领域也一改过去传统的单片机应用模式,逐渐将一些新嵌入式技术引入到系统中。特别是作为软件基础的嵌入式操作系统已广泛为业界所接受,借以提高系统的开发效率和运行效率。是否采用嵌入式操作系统,已成为工业设备品质优劣的标志之一。
当今的嵌入式操作系统领域呈现百家争鸣的状态。据最近的调查数据显示,嵌入式操作系统有数十种之多的。这种多样性存在是必然的,是由嵌入式系统的定制性所决定的,是针对各个领域和行业的不同需求的应对。也就是说,各个嵌入式操作系统都有自己的应用领域,针对不同的应用没有绝对的优劣之分,不会出现一种操作系统垄断的局面。自主开发嵌入式操作系统绝对不是多余的,也是是对这种多样性的自然顺应,应该可拥有自己的用武之地。有些国内嵌入式厂商将希望寄托在Linux之上,以为它可以帮助解决所面临的版税和安全等问题。但事实并非完全如此,至少在嵌入式系统领域。首先,Linux还是泊来货,国人并未掌握其核心技术和进程,也并未解决对外依赖的问题。其次,Linux是为桌面系统而设计的,并不能很好地满足嵌入式系统高效性和灵活性的要求;再次,Linux的一统也违背了嵌入式系统应用灵活定制的本质特性。
3.定义(列出报告中用到的专门术语定义和缩写词的原意。)
int taskInit(void);
/*创建一个任务, 返回: 返回任务编号tid, >0: 成功, 其他: 失败.*/ /*name: 任务名称, entryPtr : 任务函数入口, stack_size: 任务栈大小, priority: 任务优先级*/ int taskCreate(char *name, void *entryPtr, int stack_size, int priority);/*启动一个任务, 让taskCreat创建的任务参加调度*/ int taskStart(unsigned char tid);/*tid: 任务编号, 由taskCreate返回*/ int taskPriorityGet(unsigned char tid);int taskPrioritySet(unsigned char tid, int newPriority);/*获取和设置任务优先级, 用于动态调整*/ int taskSuspend(unsigned char tid);/*将任务挂起, 该任务退出调度*/ int taskDelete(unsigned char tid);/*将任务删除 该任务退出调度且回收任务分配的资源*/ int semCreate(void);/*互斥信号量创建, 返回信号量标识sid, <0: 失败*/ int semTake(int sid);int semGive(int sid);/*互斥信号量获取和释放*/ int taskSleep(int ticks);/*任务睡眠(非忙等), 由任务自己调用, 主动阻塞一段时间.时间单位为tick, 即10ms*/ 4.参考资料(列出这些资料的作者、标题、编号、发表日期、出版单位或资料来源,可包括:(1)项目开发计划;(2)需求规格说明书;(3)概要设计说明书;(4)详细设计说明书;(5)用户操作手册;(6)测试计划;(7)测试分析报告(8)本报告引用的其他资料、采用的开发标准或开发规范。)(1)软件项目计划(2)需求规格说明(3)软件编写向导
(4)国家软件开发文档标准模板
二.开发结果
1.产品(可包括:(1)列出各部分的程序名称、源程序行数(包括注释行)或目标程序字节数及程序总计数量、存储形式;产品文档名称等。)
2.主要功能及性能 基本功能
1.基于参考硬件平台,建立硬件抽象层,完成基本硬件初始化,建立时钟中断; 2.在硬件抽象层基础上,建立多任务操作系统环境; 3.任务调度采用同级时间片轮询机制;
4.实现任务间基本通讯机制:互斥信号量(共享内存); 5.实现基本的时钟管理机制:任务睡眠阻塞;
6.实现一个RS232串口驱动。基于串口驱动实现一个命令行Shell(用一个独立的任务实现),可在超级终端显示信息和执行命令。
扩展功能
7.任务区分优先级,在同级轮询调度基础上添加优先级调度机制; 8.不同优先级任务之间实现抢占调度;
9.在抢占调度的基础上实现优先级逆转保护,避免逻辑死锁问题; 10.将代码移植到另一个硬件平台上运行,验证代码移植性。3.所用工时(按人员的不同层次分别计时。)
编码成员工时:60小时/周,共约400小时;
编写文档成员:共约60小时。
4.所用机时
5小时/天,共约300小时的机时。
5.进度(给出计划进度与实际进度的对比。)
根据敏捷开发方法的指导,每天查漏补缺,实际进度基本和计划进度一致。三.评价
1.生产率评价(如平均每人每周源程序行数、文档的字数等。)
源程序:200行/周
文档:1500字/周
2.技术方案评价
严格遵循开发流程,运用科学开发方法。
3.产品质量评价
按照大赛要求完成了应有功能的基础上有所添加自己小组的特色,譬如,设置相应的出错处理机制,为加强该系统的安全性与稳定性也做了相应的措施,总体来说,我们小组开发的嵌入式实时操作系统功能良好,稳定性强。
四.经验与教训
经过近两个月的对嵌入式实时操作系统的开发,经验学到了不少,当然也得到了很多教训,因为小组的不注意,导致2138开发板没法继续工作,有的时候会很耽误时间,有的时候进度报告拖后一点才写,也因此导致过进度不明了,不过,大多数时候,我们小组成员都认真对待大赛,努力想把自己小组的作品做的更完美,最后终于成功交付任务,完成大赛。