ARM汇编中断跳转后如何让中断取消激活状态?
我在学习汇编,在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
EXPORTOSwitchTask ;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.TaskStu==OStuRun && OSTaskLen>1){ //大于1个任务时,切换至下一个任务
OSTaskStr * next;
if(OSi1<(OSTaskLen-1)){ //切换至下一个任务
next=&OSInfo;
}else{ //切换至第一个任务
next=&OSInfo;
}
next->TaskStu=OStuRun; //新任务至运行态
OSInfo.TaskStu=OStuStop; //旧任务暂停
SysTick->CTRL&=~(BIT(16));
NVIC_ClearPendingIRQ(SysTick_IRQn);
//systick_config
//NVIC->ISPR
OSwitchTask(next->TaskPtr,next->RegPtr); //切换至新任务
break;
}
}
}
求汇编高手指点 本帖最后由 AlexYzhov 于 2019-6-6 19:27 编辑
你用BX,就相当于在中断里调用了一个子函数。中断里的子函数在执行的时候,处理器当然仍处于中断状态,因为上下文状态仍然是中断程序的。。 bx r14 返回 本帖最后由 canspider 于 2019-6-6 19:58 编辑
因为中断的进入和返回会自动压栈和出栈
你这里只有压栈,没有正常出栈,所以错了
可以找本关于arm内核的书看看,中断是怎么样一个过程
操作系统切任务是调整栈地址,不是直接bx跳转的 参考简单函数的汇编窗口对比吧
页:
[1]