ucos学习中关于进出临界的理解

        进入临界和退出临界是在ucos的学习过程中遇到的,第一次接触确实不好和前面所学的单片机知识联系起来。

1.当宏 OS_CFG_ISR_POST_DEFERRED_EN
        定义为 0 的时候,进入临界区的时候 UCOSIII 会使用关中断的方式,退出临界区以后重新打开中断。
2.当 OS_CFG_ISR_POST_DEFERRED_EN
        定义为 1 的时候进入临界区前是给调度器上锁,并在退出临界区的时候给调度器解锁。

UCOSIII中关中断方式进出临界的三件套:

        CPU_SR_ALLOC();                     /* Allocate storage for CPU status register */
                         :
        CPU_CRITICAL_ENTER();         /* cpu_sr = CPU_SR_Save();                  */
                         :
        CPU_CRITICAL_EXIT();              /* CPU_SR_Restore(cpu_sr);                  */
                         :

UCOSIII中调度器上锁方式对后两者CPU_CRITICAL_ENTER();CPU_CRITICAL_EXIT(); 进行了再次的封装,封装中包含对任务调度器的加解锁操作和对任务加锁时间的计时处于解锁状态时OSSchedLockNestingCtr为0。

OSSchedLockNestingCtr = (OS_NESTING_CTR)0;  /* Clear the scheduling lock counter                     */
PRIMASK 这个寄存器只有一个位,当这个位置 1 时 就关掉所有可屏蔽的异常,只剩下 NMI
和硬 fault 可以响应。默认值为 0,表示没有关中断。
CPU_SR_Save
        MRS     R0, PRIMASK                     ; Set prio int mask to mask all (except faults)
        CPSID   I
        BX      LR

CPU_SR_Restore                                  ; See Note #2.
        MSR     PRIMASK, R0
        BX      LR

进入临界有什么作用呢?

        防止重要数据在非中断程序执行过程被中断服务程序意外修改。

全局变量,公共访问的资源,IO,外部硬件等等串口输入函数,printf函数,内存写入等都可能用到。

需要注意的是:1.临界区内不能使用任务挂起函数        2.空闲任务不能挂起        3.中断服务任务不能挂起

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值