|
我在学习汇编,
在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
- void SysTick_Handler(){ //系统定时器
- if(OSTaskLen>0){
- OSNext();
- }
- }
复制代码
- void OSNext(void){ //切换至下一个任务运行
- //切换任务
- for(OSi1=0;OSi1<OSTaskLen;OSi1++){
- if(OSInfo[OSi1].TaskStu==OStuRun && OSTaskLen>1){ //大于1个任务时,切换至下一个任务
- OSTaskStr * next;
- if(OSi1<(OSTaskLen-1)){ //切换至下一个任务
- next=&OSInfo[OSi1+1];
- }else{ //切换至第一个任务
- next=&OSInfo[0];
- }
- next->TaskStu=OStuRun; //新任务至运行态
- OSInfo[OSi1].TaskStu=OStuStop; //旧任务暂停
- SysTick->CTRL&=~(BIT(16));
- NVIC_ClearPendingIRQ(SysTick_IRQn);
- //systick_config
- //NVIC->ISPR
- OSwitchTask(next->TaskPtr,next->RegPtr); //切换至新任务
- break;
- }
- }
- }
复制代码
求汇编高手指点 |
阿莫论坛20周年了!感谢大家的支持与爱护!!
如果想吃一顿饺子,就得从冰箱里取出肉,剁馅儿,倒面粉、揉面、醒面,擀成皮儿,下锅……
一整个繁琐流程,就是为了出锅时那一嘴滚烫流油的热饺子。
如果这个过程,禁不住饿,零食下肚了,饺子出锅时也就不香了……《非诚勿扰3》
|