ucos-ii移植

     最近翻看了下以前那篇《ucos-ii在mcps12xdp512上的移植》笔记,发现记录的都是实际操作性的东西,居然要从头操作到尾之后才能明白这些步骤代表什么含义,看来有必要将思路整理出来了。

     ■ 要使ucos-ii能够正常运行,处理器须满足以下5个条件:

        1. 处理器的C编译器能产生可重入型代码;

        2. 处理器支持中断,并且能产生定时中断(通常为10-100hz);(注: 这个在时钟节拍和时间管理中要用到。)

        3. 用C语言就可以开/关中断;

4. 处理器能支持一定数量的数据存储硬件堆栈(可能是几K字节);

        5. 处理器有将堆栈指针以及其他CPU寄存器的内容读出、并存储到堆栈或内存中去的指令。(注:这个在任务初始化以及任务切换时要用到。)

     ■ ucos-ii的移植:

       1. 根据芯片手册,修改os_cpu.h文件。os_cpu.h文件的修改的内容有:

            a. 设置正确的数据类型;

            b. 设置开/关中断(进入临界区)的方法;并编写OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()宏。OS_CRITICAL_METHOD有 三种方法,法一直接开/关中断,这可能导致在退出临界区后,错误的将原本是关闭着的中断打开了;法2先将处理器标志寄存器压入

堆栈,然后再关中断,退出临界区时并不直接开中断,而是将保存在堆栈中的原始处理器标志寄存器值弹出到处理器标志寄存器中。此 方法可使代码在进入和返回临界区时保持中断状态的一致性,但因为处理器标志寄存器的值是存于堆栈中,若临界区代码改变了堆栈, 则将带来灾难后果;法三则是将处理器标志寄存器存储在局部变量中,只要C编译器能够产生可重入型代码(条件1),则不会出错。

    c. 设置堆栈增长方向;

            d. 设置任务切换方式OS_TASK_SW();

      2. 修改os_cpu_c.c文件。主要有以下需要修改的内容:

            a. 根据中断产生时,CPU的中断执行过程(主要是各种寄存器的压栈顺序),编写任务堆栈初始化函数(模拟中断执行时CPU的压栈过程):

OS_TSK  *OSTaskStkInit()

            b. 编写运行优先级最高的就绪态任务函数(调用任务):void OSStartHighRdy(void)

            c. 编写中断级级任务切换函数void OSIntCtxSw() 

            d. 编写任务级任务切换函数void OSCtxSw() 

            f.  编写时钟节拍中断服务子程序void OSTickISR()

      3. 根据自己的实际需要,修改配置文件OS_CFG.H。主要是选择及配置ucos-ii的模块功能     

 

    后记: 就现在的项目看,任务状态会被中断服务子程序或者其他任务改变,而时钟节拍和时间管理是不需要的。有些独占型资源是多个任务都需要用的,因此需要信号量管理。争取有时间,参照ucos-ii的源码,写个刚好满足需要的简单系统。    

你可能感兴趣的:(c,OS,存储,语言,任务,编译器)