1、142系统应用心得体会 c/os嵌入式实时操作系统的应用和学习心得 c/os-ii是一种基于优先级的抢占式多任务实时操作系统,包含了实时内核、任务管理、时间管理、任务间通信同步(信号量,邮箱,消息队列)和内存管理等功能。它可以使各个任务独立工作,互不干预,很容易实现准时而且无误执行,使实时应用程序的设计和扩展变得容易,使应用程序的设计过程大为减化。它是一个完整的、可移植、可固化、可裁剪的抢占式实时多任务内核。c/os-ii绝大局部的代码是用ansii的c语言编写的,包含一小局部汇编代码,使之可供不同架构的微处理器使用。至今,从8位到64位,c/os-ii已在超过40种不同架构上的微处理器上运行
2、。c/os-ii已经在世界范围内得到广泛应用,包括很多领域,如 、路由器、集线器、不间断电源、飞行器、医疗设备及工业控制上。实际上,c/os-ii已经通过了非常严格的测试,并且得到了美国航空管理局的认证,可以用在飞行器上。这说明c/os-ii是稳定可靠的,可用于与人性命攸关的平安紧要系统。除此以外,c/os-ii的鲜明特点就是源码公开,便于移植和维护。 我们在学习c/os嵌入式实时操作系统时用的教科书是任哲编著的嵌入式实时操作系统c/os-原理及应用,这本书介绍了嵌入式实时操作系统c/os-内核的任务管理和调度、系统时钟和节拍效劳、时间管理、中断、任务的通信和同步、内存的简单管理原理,同时给出
3、了实例。最后,还介绍了c/os-的移植方法。 在多任务系统中,内核负责管理各个任务,或者说为每个任务分配cpu时间,并且负责任务之间的通讯。内核提供的根本效劳是任务切换。之所以使用实时内核可以大大简化应用系统的设计,是因为实时内核允许将应用分成假设干个任务,由实时内核来管理它们。内核本身也增加了应用程序的额外负荷,代码空间增加rom的用量,内核本身的数据结构增加了ram的用量。但更主要的是,每个任务要有自己的栈空间,这一块吃起内存来是相当厉害的。内核本身对cpu的占用时间一般在2到5个百分点之间。c/os-有一个精巧的内核调度算法,实时内核精小,执行效率高,算法巧妙,代码空间很少,具有如下特点
4、:只支持基于优先级的抢占式调度算法,不支持时间片轮循;64个优先级,只能创立64个任务,用户只能创立56个任务;每个任务优先级都不相同;不支持优先级逆转;ready队列通过内存映射表实现快速查询;效率非常高;支持时钟节拍;支持信号量,消息队列,事件控制块,事件标志组,消息邮箱任务通讯机制;支持中断嵌套,中断嵌套层数可达255层,中断使用当前任务的堆栈保存上下文;每个任务有自己的堆栈,堆栈大小用户自己设定;支持动态修改任务优先级;任务tcb为静态数组,建立任务只是从中获得一个tcb,不用动态分配,释放内存;任务堆栈为用户静态或者动态创立,在任务创立外完成,任务创立本身不进行动态内存分配;任务的总
5、个数(os_max_tasks)由用户决定;0优先级最高,63优先级最低;有一个优先级最低的空闲任务,在没有用户任务运行的时候运行。 任务的调度核心主要是在任务就绪表中查找具有最高优先级别的就绪任务及实现任务切换,即将找到的的最高优先级别的任务的“任务号-“当前任务的任务号ospriocur;从ostcbpriotbl取出最高优先级别任务的任务控制块首地址-“当前任务的任务控制块指针ostcbcur,最后调用os_task_sw完成现场切换(即将cpu的存放器信息保存到当前正运行任务的私栈中,然后从待运行的高优先级别的任务私栈中弹出原先保存存放器信息到cpu)。 时钟节拍效劳放到一个时钟节拍任
6、务中完成,通过采用啥希散列表机制来管理延时任务,每次时钟节拍效劳只需要处理极少数的延时任务,从而大大减少了时钟节拍效劳花费的时间,提高了系统的实时性。 另外,在cos系列rtos中,时钟节拍效劳除了会跟踪延时的任务,还会跟踪那些指定了超时时限的等待任务。也就是说,当指定的超时时限结束时,即使任务等待的事件没有发生,时钟节拍效劳也会使该任务恢复运行。 uc/os-ii的时间管理是通过定时中断来实现的,该定时中断一般为2023毫秒或20230毫秒发生一次,时间频率取决于用户对硬件系统的定时器编程来实现。中断发生的时间间隔是固定不变的,该中断也成为一个时钟节拍。 uc/os-ii要求用户在定时中断的
7、效劳程序中,调用系统提供的与时钟节拍相关的系统函数,例如中断级的任务切换函数,系统时间函数。 uc/os-ii中最多可以支持64个任务,分别对应优先级063,其中0为最高优先级。63为最低级,系统保存了4个最高优先级的任务和4个最低优先级的任务,所有用户可以使用的任务数有56个。还提供了任务管理的各种函数调用,包括创立任务,删除任务,改变任务的优先级,任务挂起和恢复等。 系统初始化时会自动产生两个任务。一个是空闲任务,它的优先级最低,该任务仅给一个整形变量做累加运算;另一个是系统任务,它的优先级为次低,该任务负责统计当前cpu的利用率。 想使用在mcu上使用c/os-ii那么必须满足以下几个条
8、件:处理器c编译器支持可重入代码的生成;用c语言可以翻开和关闭中断;处理器支持中断,并能产生定时中断(中断频率通常设置在202320230hz之间);处理器支持足够的ram空间,以满足多任务环境下设置任务堆栈的要求;处理器有相应的指令,能将堆栈指针和其它cpu存放器读出和存储到堆栈或内存中。c/os-ii代码中大局部是用c语言写的,但涉及到数据类型的重定义、堆栈结构的设计、任务切换时状态的保存和恢复等问题的大局部代码由于与处理器有关,是用汇编语言实现的。移植所要做的工作,就是在不同的处理器上用汇编语言来改写与处理器有关的代码及其他与处理器特性相关的局部。 在c/os-ii移植过程中涉及以上问题
9、的代码都包含在文件os_cpu.h、os_cpu_c.c、os_cpu_a.asm中。因此移植的主要工作也在源代码的根底上围绕着这三个文件的改写展开。 总之,学习c/os嵌入式实时操作系统首先得先了解整个系统的结构,工作时的流程,比方任务1运行时如果有外部中断会发生什么(调用中断效劳程序,把相应的任务加如就绪列,内核进行调度,就绪队列中的最高优先级的任务.)等,再对代码进行具体的研究会比较容易。 我们需熟知c/os嵌入式实时操作系统中的函数及其应用,例如引起任务调度的系统函数有osstartucos/ii启动;ostasksuspend挂起任务;ostaskresume恢复任务;ostimed
10、ly/ostimedlyhmsm等待一个事件的发生等。只有在熟识系统运行的方式及可以引发其运行的函数的情况下我们才能较好的去运用它,用它来实现移植,从而到达我们的目的。 学习实时操作系统,任哲编著的嵌入式实时操作系统c/os-原理及应用这本书相对来说比较适合初学者,它篇幅适中,通俗易懂,假设能结合北京航空航天大学ucosii操作系统讲义就更加好了。 正所谓读书百遍,其义自现,通过对北航和任哲的资料不断反复地学习和阅读,我心中总算有些眉目了,我是先用别人的程序进行移植调试后才参加自己的代码,虽然开始都是实验-下载-失败,但随着我的不断努力,最终也是能够成功的,所以说学习这种技术,需要的是耐心,因为它需要我们一步一步慢慢加深理解,调试程序,有时一个符号打错了都会造成实验的失败,我们就要耐心仔细的在代码的海洋里寻找着这一根小针并把它去除改正。 第6页 共6页