ucosii在stm32上的移植详解2

来源:互联网 发布:恋母情结 知乎 编辑:程序博客网 时间:2024/06/05 20:48

转载请注明出处:http://blog.csdn.net/lbl1234

    在详解1中主要讲了移植需要用到的CM3内核知识,本文讲一讲ucosii的原理和代码组成。ucosii最经典的学习资料莫过于邵贝贝老师的<<嵌入式实时操作系统uc/os-ii(第2版)>>,我想这本书对学ucosii已经足够了,因为他把ucosii V2.55代码都讲了一遍。移植前应该好好看看此书。
    下面说说我对ucosii的理解。应该说ucosii这个内核还是比较简单的,基本可以分为任务调度,任务同步和内存管理三个部分。

任务调度
    ucosii为保证实时性,给每个任务分配一个不同的优先级。当发生任务切换时,总是切换到就绪的最高优先级任务。有2种情况会发生任务切换。
    1.任务等待资源就绪或自我延时;
    2.退出中断;

    情况1可以理解为任务主动放弃cpu的使用权。
    情况2可以理解为中断后,某种资源可能就绪了,需要任务切换。
    需要注意的是SysTick中断,这个中断是os的“心跳”,必须得有。这样就使得cpu会发生周期性地做任务切换。由于ucosii不支持时间片轮转调度,因此在该中断中必须做的工作仅有os的时间管理。也就是调用OSTimeTick()。

任务同步
    任务同步和大多数操作系统的做法差不多,如果学过操作系统或是有多线程编程经验的话,应该很好理解。无非是任务A因为某个资源未就绪,就放弃cpu使用权,等任务B或是中断使该资源就绪,当再次任务进行切换时如果任务A优先级最高,则任务A继续执行。具体怎么实现就看邵老师的书吧。

内存管理
    ucosii的内存管理比较简单,就不说了。

下面看看ucosii代码组成:
    os_core.c是ucosii的核心,它包含了内核初始化,任务切换,事件块管理等,其中事件块是各个同步量(这里我把互斥量,信号量,邮箱,队列统称为同步量,不是很科学,图个方便。事件标志组不是以事件块为基础的,不过原理也差不多)的基础。

os_task.c
    任务管理代码。

os_flag.c
os_mbox.c
os_mutex.c
os_q.c
os_sem.c
    各个同步量管理代码。

os_mem.c
    内存管理代码。

os_time.c
    时间管理代码,主要做各种延时。

os_tmr.c
    定时器管理代码,这部分代码时从V2.81版才开始有的,邵老师的书讲的是V2.55版的代码,是没有这部分内容的。如果前面的代码都理解的话,这部分代码也是不难理解的。一个定时器大体由3部分组成:定时时间,回调函数和属性。当定时时间到了的话,就进行一次回调函数的处理,定时器属性说明定时器是周期性的定时还是只做一次定时。如果用户使能了OS_TMR_EN,ucosii会在内部创建一个定时器任务,负责处理各个定时器。这个任务一般应该由硬件定时器的中断函数中调用OSTmrSignal()去激活。所以从本质上说os_tmr.c中的定时器是由一个硬件定时器分化出来的。
    默认情况下是由SysTick中断里通过OSTimeTickHook()去激活定时器任务的。

移植相关文件
os_cpu.h: 
    进行数据类型定义,处理器相关代码和几个函数原型。

os_cpu_c.c: 
    定义一些用户hook函数。

os_cpu_a.asm: 
    移植需要用汇编代码完成的函数,主要就是任务切换函数。

os_dbg.c: 
    内核调试相关数据和函数,可以不改。

ucosii内核就介绍到这里。