osiii中OS_CRITICAL_ENTER和CPU_CRITICAL_ENTER关系

来源:互联网 发布:淘宝怎么修改宝贝图片 编辑:程序博客网 时间:2024/05/22 00:14

osiii的系统函数中的临界代码有的用CPU_CRITICAL_ENTER();

有的用OS_CRITICAL_ENTER();


CPU_CRITICAL_ENTER是真的关掉中断而OS_CRITICAL_ENTER()

要看#define 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_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                                                            /* Direct ISR Posts -------------------------------- */




#define  OS_CRITICAL_ENTER()                    CPU_CRITICAL_ENTER()


#define  OS_CRITICAL_ENTER_CPU_EXIT()


#define  OS_CRITICAL_EXIT()                     CPU_CRITICAL_EXIT()


#define  OS_CRITICAL_EXIT_NO_SCHED()            CPU_CRITICAL_EXIT()


#endif

-------------------------------------------------------------------

void OS_CPU_SysTickHandler (void)
{
    CPU_SR_ALLOC();
   CPU_CRITICAL_ENTER(); 
    OSIntNestingCtr++; /* Tell uC/OS-III that we are starting an ISR */
    CPU_CRITICAL_EXIT();
    OSTimeTick(); /* Call uC/OS-III's OSTimeTick() */
    OSIntExit(); /* Tell uC/OS-III that we are leaving the ISR */
} 这里用的是CPU_CRITICAL_ENTER()真的关掉中断了

-----------------------------------------------------------------------------------------------------------------------


在直接提交方式中,uC/OS-III 访问临界段时关中断。然而,在延
迟提交方式中,uC/OS-III 访问临界段时锁调度器。
在延迟提交方式中, 访问中断队列时 uC/OS-III 还是需要关中断。 然而 ,
这段关中断时间是非常短的且是相当固定的。

0 0
原创粉丝点击