您现在的位置: 主页 > 嵌入式操作系统 > UC/OS ii > F429的uCOS-III基础例子
本文所属标签:
为本文创立个标签吧:

F429的uCOS-III基础例子

来源: 网络用户发布,如有版权联系网管删除 2016-06-06 

这几天做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仅仅是给
                         调度器进行了枷锁,而且也是支持嵌套调用的,并没有关闭全局中断。

              查看评论 回复



嵌入式交流网主页 > 嵌入式操作系统 > UC/OS ii > F429的uCOS-III基础例子
 ucosiii

"F429的uCOS-III基础例子"的相关文章

网站地图

围观()