ucosII移植笔记

这篇博客详细介绍了μC/OS-II操作系统在不同CPU上的临界区管理机制,包括OS_ENTER_CRITICAL()和OS_EXIT_CRITICAL()的三种实现方式。同时,讲解了μC/OS-II的文件结构,特别是OS_CPU.H的编写,包括数据类型的定义和任务切换宏的配置,以及进入和退出临界区的方法。内容适合嵌入式开发者参考。
摘要由CSDN通过智能技术生成

μC/OS-II临界区管理机制

OS_ENTER_CRITICAL()OS_EXIT_CRITICAL()

同样是通过关中断来保护临界区,OS_ENTER_CRITICAL/OS_EXIT_CRITICAL一共实现了三种实现方式,如下所示:

 

#if OS_CRITICAL_METHOD == 1  

#define OS_ENTER_CRITICAL() __asm__("cli")  

#define OS_EXIT_CRITICAL() __asm__("sti")  

#endif  

 

#if OS_CRITICAL_METHOD == 2  

#define OS_ENTER_CRITICAL() __asm__("pushf \n\t cli")  

#define OS_EXIT_CRITICAL() __asm__("popf")  

#endif  

 

#if OS_CRITICAL_METHOD == 3  

#define OS_ENTER_CRITICAL() (cpu_sr = OSCPUSaveSR())  

#define OS_EXIT_CRITICAL() (OSCPURestoreSR(cpu_sr))  

#endif  

 

移植

一、 μC/OS-II的文件结构

    第一种方式,OS_ENTER_CRITICAL()简单地关中断,OS_EXIT_CRITICAL()简单地开中断。这种方式虽然简单高效,但无法满足嵌套的情况。如果有两层临界区保护,在退出内层临界区时就会开中断,使外层的临界区也失去保护。虽然ucos的内核写的足够好,没有明显嵌套临界区的情况,但谁也无法保证一定没有,无法保证今后没有,无法保证在附加的驱动或什么位置没有,所以基本上第一种方法是没有人用的。ucos的系统函数中通常含会有一段代码进入临界状态,故使用这种方式非常不可靠。

    第二种方式,先将中断状态保存到堆栈,再关中断;执行OS_EXIT_CRITICAL时,从堆栈中恢复原来的中断状态。缺点,当用户使用的处理器有堆栈指针相对寻址模式时,可能出现严重错误。

    第三种方式,些编译器提供了扩展功能,用户可以得到当前处理器状态字的值,并将其保存在C函数局部变量之中。

相关临界代码如下

    OS_CPU_SR  cpu_sr

    cpu_sr  =  get_processor_psw();//获取状态字

    disable_interrupts();//关中断

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值