【求助】ucos_III的直接发布和延迟发布

2019-08-14 02:55发布

ucos_III的直接发布和延迟发布,我具体怎么回事我知道了,但是还是有点小问题
QQ图片20170906095215.png
直接发布的这个关闭中断在那里实现的?延迟发布任务调度器上锁在哪里实现的啊?找了很久找不到啊!
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
章鱼哥丶
1楼-- · 2019-08-14 04:39
直接发布的关中断的实现 是通过#define  CPU_CRITICAL_ENTER()  do { CPU_INT_DIS(); } while (0) 这个宏实现的 最终还是通过#define  CPU_INT_DIS()         do { cpu_sr = CPU_SR_Save(); } while (0)   
CPU_SR_Save
        MRS     R0, PRIMASK                     
        CPSID   I
        BX      LR


CPU_SR_Restore                                  ;
        MSR     PRIMASK, R0
        BX      LR
是在cpu.a.asm中实现的
章鱼哥丶
2楼-- · 2019-08-14 09:02
如果在os.cfg.h中允许了OS_CFG_ISR_POST_DEFERRED_EN 就会编译下面的代码
#if OS_CFG_ISR_POST_DEFERRED_EN > 0u                             /* Deferred ISR Posts ------------------------------ */
                                                                 /* Lock the scheduler                                */
#define  OS_CRITICAL_ENTER()                                       
         do {                                                      
             CPU_CRITICAL_ENTER();                                 
             OSSchedLockNestingCtr++;                              
             if (OSSchedLockNestingCtr == 1u) {                    
                 OS_SCHED_LOCK_TIME_MEAS_START();                  
             }                                                     
             CPU_CRITICAL_EXIT();                                 
         } while (0)
                                                                 /* Lock the scheduler but re-enable interrupts       */
#define  OS_CRITICAL_ENTER_CPU_CRITICAL_EXIT()                     
         do {                                                      
             OSSchedLockNestingCtr++;                              
                                                                  
             if (OSSchedLockNestingCtr == 1u) {                    
                 OS_SCHED_LOCK_TIME_MEAS_START();                  
             }                                                     
             CPU_CRITICAL_EXIT();                                 
         } while (0)

                                                                 /* Scheduling occurs only if an interrupt occurs     */
#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)

#define  OS_CRITICAL_EXIT_NO_SCHED()                              
         do {                                                      
             CPU_CRITICAL_ENTER();                                 
             OSSchedLockNestingCtr--;                              
             if (OSSchedLockNestingCtr == (OS_NESTING_CTR)0) {     
                 OS_SCHED_LOCK_TIME_MEAS_STOP();                  
             }                                                     
             CPU_CRITICAL_EXIT();                                 
         } while (0)


#else
来保护临界段代码

一周热门 更多>