搜索
bottom↓
回复: 4

ARM汇编中断跳转后如何让中断取消激活状态?

[复制链接]

出15入186汤圆

发表于 2019-6-6 17:33:50 | 显示全部楼层 |阅读模式
我在学习汇编,
在systick中断中跳转到我自己的汇编代码中,汇编代码再直接跳转到指定函数A中,直接用的BX指令,但发现进入我指定函数A中后
我在NVIC窗口中发现systick的中断状态中Pending和Active均在激活状态,也就是一直处于中断状态,导致下次进不去中断
我手工取消这两个标志是可以再次进入中断的
Pending有对应的NVIC函数可以清除,但Active只有读取函数,无对应的NVIC清除功能,
我想请问如何清除Active标记?另外CPU是如何知道我退出Systick中断的?
我看了下汇编代码,进入中断时有push {r4,lr}汇编,退出中断时有pop {r4,pc}
其它的汇编都是正常的执行代码,
但道CPU根据弹栈指令来检测是否退出这个中断的?
那我的汇编中也加入了这些指令,咋CPU还认为我在中断里呢?

我的汇编代码:

OSwitchTask     PROC                               
                                EXPORT  OSwitchTask                             ;OS切换任务  将任务函数指针传送到R0,R1=SP,                
                                        MOV SP,R1       
                                        PUSH         {R0}
                                        POP                {PC}
                                        ;BX         R0                                                        ;=mov pc,r0                                               
                                        B         .
                                ENDP



  1. void SysTick_Handler(){                //系统定时器
  2.         if(OSTaskLen>0){
  3.                 OSNext();
  4.         }
  5. }
复制代码

  1. void OSNext(void){                                        //切换至下一个任务运行
  2.         //切换任务
  3.         for(OSi1=0;OSi1<OSTaskLen;OSi1++){
  4.                 if(OSInfo[OSi1].TaskStu==OStuRun && OSTaskLen>1){        //大于1个任务时,切换至下一个任务
  5.                         OSTaskStr * next;
  6.                         if(OSi1<(OSTaskLen-1)){        //切换至下一个任务
  7.                                 next=&OSInfo[OSi1+1];                                       
  8.                         }else{                                        //切换至第一个任务
  9.                                 next=&OSInfo[0];
  10.                         }
  11.                         next->TaskStu=OStuRun;                                        //新任务至运行态
  12.                         OSInfo[OSi1].TaskStu=OStuStop;                                //旧任务暂停
  13.                         SysTick->CTRL&=~(BIT(16));
  14.                         NVIC_ClearPendingIRQ(SysTick_IRQn);
  15.                         //systick_config
  16.                         //NVIC->ISPR
  17.                         OSwitchTask(next->TaskPtr,next->RegPtr);        //切换至新任务
  18.                         break;
  19.                 }
  20.         }       
  21. }
复制代码


求汇编高手指点

阿莫论坛20周年了!感谢大家的支持与爱护!!

如果想吃一顿饺子,就得从冰箱里取出肉,剁馅儿,倒面粉、揉面、醒面,擀成皮儿,下锅……
一整个繁琐流程,就是为了出锅时那一嘴滚烫流油的热饺子。

如果这个过程,禁不住饿,零食下肚了,饺子出锅时也就不香了……《非诚勿扰3》

出0入0汤圆

发表于 2019-6-6 19:26:08 | 显示全部楼层
本帖最后由 AlexYzhov 于 2019-6-6 19:27 编辑

你用BX,就相当于在中断里调用了一个子函数。中断里的子函数在执行的时候,处理器当然仍处于中断状态,因为上下文状态仍然是中断程序的。。

出30入54汤圆

发表于 2019-6-6 19:57:35 | 显示全部楼层
bx r14 返回

出0入8汤圆

发表于 2019-6-6 19:57:45 来自手机 | 显示全部楼层
本帖最后由 canspider 于 2019-6-6 19:58 编辑

因为中断的进入和返回会自动压栈和出栈
你这里只有压栈,没有正常出栈,所以错了
可以找本关于arm内核的书看看,中断是怎么样一个过程

操作系统切任务是调整栈地址,不是直接bx跳转的

出0入0汤圆

发表于 2019-6-10 11:55:27 | 显示全部楼层
参考简单函数的汇编窗口对比吧
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-28 23:43

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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