yuyu87 发表于 2019-6-6 17:33:50

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:26:08

本帖最后由 AlexYzhov 于 2019-6-6 19:27 编辑

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

cloudboy 发表于 2019-6-6 19:57:35

bx r14 返回

canspider 发表于 2019-6-6 19:57:45

本帖最后由 canspider 于 2019-6-6 19:58 编辑

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

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

huangqi412 发表于 2019-6-10 11:55:27

参考简单函数的汇编窗口对比吧
页: [1]
查看完整版本: ARM汇编中断跳转后如何让中断取消激活状态?