以太网LED图文显示系统的设计 第4页


能对资源的分配以及任务调度不当导致系统死锁,从而降低了系统的可靠性,此时就
需要引入TRO[s9,‘01。RTOS是嵌入式系统启动后首先执行的背景程序,他作为主控程序
管理整个系统的资源,对系统中的各个任务进行调度。用户的应用程序是运行于RTOS
上的各个任务,每个任务均有一个优先级,RTOS根据各个任务的优先级和任务所处的
状态,动态的在各任务间进行切换[‘Jl。
林/cos一11是一个公开源代码的实时操作系统内核,它提供了实时系统所需的基本功
能。核心部分代码只有8.3KB,短小精悍。拜C/os一n的特点主要有[81:开源、可裁减和扩
展、可占先、可确定性、多任务。拜C/OS一n内核大部分由C语言实现,有很好的移植性,
在多种不同的CPU上实现只需做很少的工作。开放性、移植的简化以及内核的可裁减使
其在与其它商业化嵌入式软件的竞争中占有了一定的市场。事实表明,该系统能适应通
讯类产品的实时应用。图2.1表示的是拼C/os一n的文件结构以及与硬件的关系。
2.2
2.2.1
pC/05一11的分析
临界段管理
代码的临界段指的是不可分割的代码。一旦这部分代码开始执行,则不允许任何中
断打入。为确保临界段代码的执行,在进入临界段之前要关中断,而临界段代码执行完
以后要立即开中断。
微处理器一般都有关中断/开中断指令,用户使用的C语言编译器必须有某种机制能
够在C中直接实现关中断/开中断的操作。拜CO/S一11定义两个宏m(~)s来关中断和开中
断,以便避开不同C编译器厂商选择不同的方法来处理关中断和开中断。拜Co/S一11中的
这两个宏调用分别是:05--ENTE--RCRITICALO和05_EXI几C班TICALO。因为这两个
宏的定义取决于所用的微处理器,故在文件05夕P.uH中可以找到相应宏定义。每种微
处理器都有自己的05CP.UH文件。
2.2.2任务管理
拜C/OS一n可以管理多达64个任务,但目前版本的拜C/OS一n有两个任务己经被系统占
用了。保留了优先级为0、1、2、3、05LOW王STP班O一3、05LOWESTPRIO一2、
05一OWEST一PRIO一1以及05少OWESTP一RIO这8个任务优先级以被将来使用。
05LOWESTPRIO是作为定义的常数在05CF.GH文件中用定义常数语句#define
ocnstnat定义的。因此用户可以有多达56个应用任务。必须给每个任务赋以不同的优先
级,优先级可以从。到05工oWEST--PRIO一2。优先级号越低,任务的优先级越高。拜/cos一11
总是运行进入就绪态的优先级最高的任务。任务状态如图2.2所示[sJ。
大连理工大学硕士学位论文
一般情况下,每个任务都是一个无限的循环。每个任务都处在图2.2所示的5种状态
,这5种状态是休眠态,就绪态、运行态、挂起态(等待某一事件发生)和被中断态。
态相当于该任务驻留在内存中,但并不被多任务内核所调度。就绪意味着该任务己
图2.2pC/05一H任务的状态
Fig.2.2Satteof环CO/S一11,taks
备好,可以运行了,但由于该任务的优先级比正在运行的任务的优先级低,还暂时
运行。运行态的任务是指该任务掌握了CPU的控制权,正在运行中。挂起状态也
以叫做等待事件态WATI创G,指该任务在等待,等待某一事件的发生。.最后,发生
时,CPU提供相应的中断服务,原来正在运行的任务暂不能运行,就进入了被中断

图2.3中的函数使任务从一种状态变到另一种状态。
2.3时间管理
拜C/OS一H(其它内核也一样)要求用户提供定时中断来实现延时与超时控制等功能。
定时中断叫做时钟节拍,它应该每秒发生10至100次。时钟节拍的实际频率是由用
的应用程序决定的。时钟节拍的频率越高,系统的负荷就越重。
拜C/OS一n提供了这样一个系统服务:申请该服务的任务可以延时一段时间,这段时
的长短是用时钟节拍的数目来确定的。实现这个系统服务的函数叫做OSTimeD1y()。
该函数会使井C/OS肛进行一次任务调度,并且执行下一个优先级最高的就绪态任务。
时钟节拍何时发生,拜C/OS一n都会将一个32位的计数器加1。这个计数器在用户调用
St斌0初始化多任务和,4294,967,295个节拍执行完一遍的时候从o开始计数。
2.4任务之间的通信与同步
基于以太网的ELD图文显示系统的设计
在林C/Os一11中,有多种方法可以保护任务之间的共享数据和提供任务之间的通讯。
除了共享数据以外还可以有信号量、邮箱和消息队列。
一个任务或者中断服务子程序可以通过事件控制块ECB但vnetCnoortlBlokc)s来向
另外的任务发信号。这里,所有的信号都被看成是事件E(veni)。一个任务还可以等待另
一个任务或中断服务子程序给它发送信号。只有任务可以等待事件发生,中断服务子程
序是不能这样做的。对于处于等待状态的任务,还可以给它指定一个最长等待时间,以
此来防止因为等待的事件没有发生而无限期地等下去。
多个任务可以同时等待同一个事件的发生。在这种情况下,当该事件发生后,所有
等待该事件的任务中,优先级最高的任务得到了该事件并进入就绪状态,准备执行。上
面讲到的事件,可以是信号量、邮箱或者消息队列等。当事件控制块是一个信号量时,
任务可以等待它,也可以给它发送消息。
2.2.5内存管理
在ANslc中可以用malloc()和erfeo两个函数动态地分配内存和释放内存。但是,在
嵌入式实时操作系统中,多次这样做会把原来很大的一块连续内存区域,逐渐地分割成
许多非常小而且彼此又不相邻的内存区域,也就是内存碎片。由于这些碎片的大量存在,
使得程序到后来连非常小的内存也分配不到。
︸曰︸日曰日曰︸门目目目目Pa币tion浮1Parttiion浮2lll一}}}lll111}}}}}}}}}}}}}}}lll
}}}!!!
!!!」」
llllll
llllll
}}}lll
图2.3多个内存分区
Fig.2·3MultiPlememoyrPartition
在井/cos一n中,操作系统把连续的大块内存按分区来管理。每个分区中包含有整数
个大小相同的内存块。利用这种机制,拜C/oS一n对malloc()和rfeeo函数进行了改进,使
得它们可以分配和释放固定大小的内存块。这样一来,malloco和rfeeo函数的执行时间
也是固定的了。如图2.3[8],在一个系统中可以有多个内存分区。这样,用户的应用程序
大连理工大学硕士学位论文
以从不同的内存分区中得到不同大小的内存块。但是,特定的内存块在释放时必须
放回它以前所属于的内存分区。显然,采用这样的内存管理算法,上面的内存碎片
就得到了解决。
3移植pC/05一11
3.1概述
目前,针对ARM处理器核的C语言编译器有很多,如SDT、ADS、IAR、TASKE呵G
CC等。目前在国内最流行的是SDT、ADS和GCC。SDT和ADS均为ARM公司自己开
ADS为SDT的升级版,鉴于以后ARM公司不再支持SDT,所以不选择SDT。GCC虽
持广泛,很多开发套件使用它作为编译器,但与ADS比较其编译效率较低,这对充
挥芯片性能很不利,所以,权衡后最终确定使用ADS编译程序和调试〔‘〕。
ARM7处理器核具有用户、系统、管理、中止、未定义、中断和快中断七种模式,
除用户模式外其它均为特权模式。为了尽量减少任务代码错误对整个程序的影响,
的任务模式定为用户模式,可选为系统模式,同时提供接口使任务可以在这两种模
切换。带T变量的ARM7处理器核具有两个指令集,标准犯位ARM指令集和16位
叮b指令集,为了最大限度地支持芯片的特性,任务应当可以使用任意一个指令集并
以自由切换,而且不同的任务应当可以使用不同的指令集,移植代码应该实现这一点。
3.2移植介绍
所谓移植,就是使一个实时内核能够在其他的微处理器或微控制器上运行。环C/OS一n
代码绝大部分是使用移植性很强的ANSIC写的,与微处理器硬件相关的部分是使用
语言写的。汇编语言写的部分己经压缩到最低的限度,以使林C/OS一n便于移植到其
处理器上。
要使拜C/Os一n正常运行,处理器必须满足以下的要求:处理器的c编译器能产生可
型代码;处理器支持中断,并且能产生定时中断;用C语言就可以开关中断;处理
支持一定数量的数据存储硬件堆栈;处理器有将堆栈指针以及其他CPU寄存器的内
出、并存储到堆栈或内存中去的指令。
移植拜C/OS一H只需要更改那些和硬件相关的文件,而大部分源代码可以保持不变。
更改项如表2,1所示。
3.3关于头文件1ne1udes,h和eonf1g.h
拜/cos一n要求所有.C的文件都要包含头文件incutdes.h,这样使得用户项目中的每个
件不用分别去考虑它实际上需要哪些头文件。使用includes.h的缺点是它可能会包含
些实际上不相关的头文件,使每个文件的编译时间增加,但这样做可以增加代码的可
基于以太网的ELD图文显示系统的设计
表2.1pC/OS一工工需要移植的代码[Jl
Tab.2.lCodesubjeettortansPlnat
移植内容类型所属文件描述
数据类型
数据类型
与编译器无关的数据类

堆栈的数据类型
05CPU.h
开关中断的代码
常量
函数
函数
BOOLEAN、I’NTSU、INTSS、INT16U、
INT16SINT32U、NIT32S、FP32、FP64
05STK
OSweENTEReeCRInCALO和
OSeeEXI几CRPTICALO
05STKGROWTH
05TASKSW
OSTaskstklnito
OSnliHtoo妞卿no、OSnliHtookEndO、
0STasCkreatHook()、OSTaskDe1Hook()、
OSTaskSWHookO、0STSakStatHook()、
OSTCBIniHtokoo、OSTimeTickHokoO、
OSTaskidleHooko
定义堆栈的增长方向
任务切换时执行的代码
任务堆栈初始化函数
05CPUC
.
e
函数
拜005一n在执行某些操作
时调用的函数,一般为空
函数0SStartHighRdy()
05CPUA.asm
函数OSIntC饮SwO
中断服务程序05石e妙SRO
进入多任务环境时运行
优先级最高的任务
中断退出时的任务切换
函数
时钟节拍中断服务程序
移植性。在本文的移植中另外增加了一个头文件ocnfig.h,要求所有用户程序必须包含
ocnfi.gh,在ocnfi.gh中包含inchides.h和特定的头文件和配置项。而拜C/OS一n的系统文件
依然只是包含inchide.sh,所有的配置改变包括头文件的增减均在ocnfi.gh中进行。这样,
拜C/OS一n的系统文件需要编译的次数大大减少,编译时间随之减少。
2.3.4编写05多PU.H
在编写05CP.UH时需要做以下工作:
()l为了增强系统的可移植性,拜C/OS一n不使用C语言中的与处理器类型相关short,
int和olng等数据类型的定义。在移植中定义了一些不依赖于编译的整数数据类型,这样
的数据类型即直观可移植性又强。
(2)使用软中断SWI作底层接口
ARM处理器核有2个指令集,用户任务还可以有两种处理器模式:用户模式和系统
模式,组合起来具有4种方式,各种方式对系统资源有不同的访问控制权限。同时,移
植需要兼顾把井C/OS一11内核事先固化在Flash中,事后任务从别的地方调入应用。为了使
底层接口函数与处理器状态无关,同时使任务调用相应的函数不需要知道函数位置。本

上一页  [1] [2] [3] [4] [5] [6] [7] [8] [9] [10]  ... 下一页  >> 

Copyright © 2007-2012 www.chuibin.com 六维论文网 版权所有