你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

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

[复制链接]
农夫水0533 提问时间:2017-3-30 15:12 /
   之前一直使用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确实这么用了。




  请教各位大神我是哪里没看明白疏忽了还是由于CPSID  I 不能屏蔽PendSV 中断。
<
收藏 1 评论10 发布时间:2017-3-30 15:12

举报

10个回答
creep 回答时间:2017-3-30 17:40:49
农夫水0533 回答时间:2017-3-31 10:07:06
农夫水0533 回答时间:2017-3-31 10:14:09

请问这是哪份资料,能否分享一下,谢谢了
creep 回答时间:2017-3-31 10:47:14
农夫水0533 发表于 2017-3-31 10:14
请问这是哪份资料,能否分享一下,谢谢了

100-uCOS-III-ST-STM32-003.pdf (18.96 MB, 下载次数: 153)
moyanming2013 回答时间:2017-3-31 11:09:10

此处并没有解答楼主的疑问吧?或者我有疑问如下:
楼主说使用CPU_SR_Save()关闭了“global”中断(CPU Interrupt disabled),那么此时尽管会有中断被中断控制器(Interrupt Controller)暂时pending住,但不会相应。
比如此时PendSV中断打开且置位了,但由于此时还处于“global”中断被关闭的状态,所以,即使PendSV开启且中断置位了,但也还是无法响应,无法响应就无法执行任务调度吧?
直到从OS_EXIT_CRITICAL()(OS_ENTER_CRITICAL()的成对的另一个函数)离开,此时开启了“global”中断,且中断控制器中已经有了PendSV,此时可以执行PendSV了,此时才有真正的任务切换。当然如果此时PendSV的优先级不高,那么切换还将延后。
creep 回答时间:2017-3-31 11:54:05
moyanming2013 发表于 2017-3-31 11:09
此处并没有解答楼主的疑问吧?或者我有疑问如下:
楼主说使用CPU_SR_Save()关闭了“global”中断(CPU In ...

我对UCOSIII的认识也很有限,可能有些地方理解的不到位。
您可以帮楼主好好讲解一下他的疑问,我也能顺便学习下。
农夫水0533 回答时间:2017-3-31 12:49:11
moyanming2013 发表于 2017-3-31 11:09
此处并没有解答楼主的疑问吧?或者我有疑问如下:
楼主说使用CPU_SR_Save()关闭了“global”中断(CPU In ...

是不是可以这么理解,关闭中断以后,pendsv中断置位,但是却没有相应直到打开中断以后,在没有其他中断的前提下PendSV中断执行,实现任务切换?
moyanming2013 回答时间:2017-3-31 18:07:51
本帖最后由 moyanming2013 于 2017-3-31 18:18 编辑

你的问题是:
  1. 这就有一个矛盾,既然使用函数OS_ENTER_CRITICAL()关闭了中断那么是不能实现PendSV 中断的;但是ucos确实这么用了。
复制代码

1.CPSID I确实屏蔽了所有中断(除NMI,复位中断,还有硬件中断),这当然包括PendSV。
2.在OS_ENTER_CRITICAL()后面执行OSIntCtxSw()并不是直接做任务切换,而是置位一个PendSV中断。
3.一旦取消了中断屏蔽,那么内核开始执行最高优先权的中断或者执行用户程序。此时显然至少有个PendSV(且该中断优先级也较高),那么开始执行PendSV。你看代码,实际做任务切换是在PendSV中执行的。
4.OSIntCtxSw()在每个ISR中会被调用来执行一个任务切换的测试,OSIntCtxSw()比OSCtxSw()的优点在于结合了Cortex-M的咬尾中断,咬尾中断不会执行重复压栈的动作,节省了指令周期,从而加速了任务在ISR之间的切换。
5.Cortex-M内核支持中断嵌套,所以需要合理配置中断优先级。
摘录自《uc/os-III The Real-Time Kernel for the STM32 ARM Cortex-M3》:
QQ截图20170331180542.jpg

QQ截图20170331180601.jpg

评分

参与人数 1ST金币 +5 收起 理由
zero99 + 5

查看全部评分

农夫水0533 回答时间:2017-4-1 13:22:44
moyanming2013 发表于 2017-3-31 18:07
你的问题是:

1.CPSID I确实屏蔽了所有中断(除NMI,复位中断,还有硬件中断),这当然包括PendSV。

谢谢你的解释,这么理解我就很明白了

评分

参与人数 1ST金币 +2 收起 理由
zero99 + 2 结贴奖励

查看全部评分

12下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版