硬汉嵌入式论坛

 找回密码
 立即注册
查看: 5194|回复: 0
收起左侧

[μCOS-III] uCOS-III中CPU_INT_DIS(),CPU_CRITICAL_ENTER()和OS_CRITICAL_ENTER总结

[复制链接]

1万

主题

6万

回帖

10万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
106856
QQ
发表于 2016-2-23 15:42:23 | 显示全部楼层 |阅读模式
这几天做F429的uCOS-III基础例子,简单的整理了下:
========================================================================
*                1. 临界区解释:
*                     代码的临界短也称为临界区,指处理时不可分割的代码。一旦这部分代码开始执行,则不允许
*                    任何中断打入。为确保临界段代码的执行不被中断,在进入临界段之前必须关中断,而临界段
*                    代码执行完后,要立即开中断。
*                2. uCOS-III中有两种进入临界区方式和一种开关中断方式。下面简单说明:
*                   注意,临界区的处理方式采用的方式3,即CPU_CRITICAL_METHOD_STATUS_LOCAL,在cpu.h文件定义。
*                   下面三组函数都是支持嵌套调用的。
*                   (1)开关中断(通过寄存器PRIMASK实现全局中断的开关):  
*                          CPU_INT_DIS(); 关闭中断
*                            防止被中断打断的代码
*                         CPU_INT_EN();  打开中断
*                                                   ---这两个函数支持嵌套调用
*
*                   (2)进入临界段和退出临界段方式一, 在cpu.h文件定义            
*                         临界区设置里面也有开关中断操作的,并且支持开关中断的嵌套使用
*                         CPU_CRITICAL_ENTER();    进入临界区
*                            临界区代码
*                          CPU_CRITICAL_EXIT() ;    推出临界区
*                        
*                         这两个函数跟上面CPU_INT_DIS和CPU_INT_EN的区别是:
*                         a. 如果没有使能宏定义CPU_CFG_INT_DIS_MEAS_EN。
*                            #define  CPU_CRITICAL_ENTER()  do { CPU_INT_DIS(); } while (0)         
*                            #define  CPU_CRITICAL_EXIT()   do { CPU_INT_EN();  } while (0)
*                            两者一样。
*                         b. 如果使能就开启测量功能。
*                            #define  CPU_CRITICAL_ENTER()  do { CPU_INT_DIS();         \
*                                                               CPU_IntDisMeasStart(); }  while (0)                                                                        
*                            #define  CPU_CRITICAL_EXIT()   do { CPU_IntDisMeasStop();  \
*                                                                CPU_INT_EN();          }  while (0)
*                            多了一个测量功能。
*                         c. 通过寄存器PRIMASK实现全局中断的开关。
*
*                   (3)进入临界段和退出临界段方式二, 在os.h文件定义
*                         OS_CRITICAL_ENTER();    进入临界区
*                            临界区代码
*                          OS_CRITICAL_EXIT() ;    推出临界区
*
*                         这两个函数跟上面CPU_CRITICAL_ENTER和CPU_CRITICAL_EXIT的区别是:
*                         a. 如果没有使能宏定义OS_CFG_ISR_POST_DEFERRED_EN,即中断延迟提交功能。
*                            #define  OS_CRITICAL_ENTER()    CPU_CRITICAL_ENTER()
*                            #define  OS_CRITICAL_EXIT()     CPU_CRITICAL_EXIT()
*                            两者没有区别。
*                         b. 如果使能:                    
*                         #define  OS_CRITICAL_ENTER()                                       \
*                                  do {                                                      \
*                                      CPU_CRITICAL_ENTER();                                 \
*                                      OSSchedLockNestingCtr++;                              \
*                                      if (OSSchedLockNestingCtr == 1u) {                    \
*                                          OS_SCHED_LOCK_TIME_MEAS_START();                  \
*                                      }                                                     \
*                                      CPU_CRITICAL_EXIT();                                  \
*                                  } while (0)
*
*                         #define  OS_CRITICAL_EXIT()                                        \
*                                  do {                                                      \
*                                      CPU_CRITICAL_ENTER();                                 \
*                                      OSSchedLockNestingCtr--;                              \
*                                      if (OSSchedLockNestingCtr == (OS_NESTING_CTR)0) {     \
*                                          OS_SCHED_LOCK_TIME_MEAS_STOP();                   \
*                                          if (OSIntQNbrEntries > (OS_OBJ_QTY)0) {           \
*                                              CPU_CRITICAL_EXIT();                          \
*                                              OS_Sched0();                                  \
*                                          } else {                                          \
*                                              CPU_CRITICAL_EXIT();                          \
*                                          }                                                 \
*                                      } else {                                              \
*                                          CPU_CRITICAL_EXIT();                              \
*                                      }                                                     \
*                                  } while (0)
*                          从这里可以看出,如果开启了中断延迟提交,那么OS_CRITICAL_ENTER仅仅是给
*                          调度器进行了枷锁,而且也是支持嵌套调用的,并没有关闭全局中断。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-8 01:44 , Processed in 0.202841 second(s), 25 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表