OpenEdv-开源电子网

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

M3使用 CPSID I关闭中断以后是否还能相应PendSV中断

[复制链接]

2

主题

3

帖子

0

精华

新手上路

积分
47
金钱
47
注册时间
2015-4-13
在线时间
6 小时
发表于 2017-3-30 15:16:31 | 显示全部楼层 |阅读模式
1金钱
之前一直使用UCOS但是没有非常详细的研究,最近对其内核做了一下比较深入的研究, 发现一个问题,百思不得其解,希望各位大牛能够给我讲解,或者一起讨论。   ucos中的开关中断使用M3内核的特殊寄存器 PRIMASK。ucos中进入临界区时候关闭中断使用函数OS_ENTER_CRITICAL() 。
   该函数是一个宏定义 #define  OS_ENTER_CRITICAL()  (cpu_sr = CPU_SR_Save(); )  
  函数CPU_SR_Save()在cpu_a.asm中定义,其定义:   CPU_SR_Save
                                                                                     MRS      R0, PRIMASK
                                                                                     CPSID     I
                                                                                     BX         LR
   从《M3权威指南》得知语句  CPSID I关闭了除NMI 和fault 以外的异常。


  在ucos退出中断函数  OSIntExit()函数中先调用函数OS_ENTER_CRITICAL()关闭中断,然后执行函数OSIntCtxSw();
  函数OSIntCtxSw()实际也是一个汇编代码,其作用是开启PendSV中断以实现任务的调度。
  这就有一个矛盾,既然使用函数OS_ENTER_CRITICAL()关闭了中断那么是不能实现PendSV 中断的;但是ucos确实这么用了。

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2017-3-30 19:17:26 | 显示全部楼层
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-8-22 15:38

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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