OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2644|回复: 2

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

[复制链接]

9

主题

25

帖子

0

精华

初级会员

Rank: 2

积分
149
金钱
149
注册时间
2015-10-28
在线时间
13 小时
发表于 2017-9-6 09:56:39 | 显示全部楼层 |阅读模式
1金钱
ucos_III的直接发布和延迟发布,我具体怎么回事我知道了,但是还是有点小问题
QQ图片20170906095215.png
直接发布的这个关闭中断在那里实现的?延迟发布任务调度器上锁在哪里实现的啊?找了很久找不到啊!

最佳答案

查看完整内容[请看2#楼]

直接发布的关中断的实现 是通过#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 ...
编程领域的半吊子http://blog.csdn.net/qq_26039331
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

3

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
127
金钱
127
注册时间
2017-7-31
在线时间
31 小时
发表于 2017-9-6 09:56:40 | 显示全部楼层
直接发布的关中断的实现 是通过#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中实现的
回复

使用道具 举报

3

主题

28

帖子

0

精华

初级会员

Rank: 2

积分
127
金钱
127
注册时间
2017-7-31
在线时间
31 小时
发表于 2017-9-6 13:54:37 | 显示全部楼层
如果在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
来保护临界段代码
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-19 11:47

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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