exc_return在ARM Cortex-M3上不起作用
我想在pendsv中使用exc_return,但我总是会使用invpc(无效的PC加载usageFault,由exc_return造成的无效PC负载引起)。如果我将汇编代码移至systick_handler(),这有效。
我想念什么?
我使用 nxp lpc1769 带有最新的mcuxpressoide。
void Systick_Handler(void){
SCB->ICSR |= SCB_ICSR_PENDSVSET_Msk;
}
__attribute__ ((naked)) void Pendsv_Handler(void) {
__ASM volatile (
"NOP \n"
"ldr r0, =0xFFFFFFFD \n"
"bx r0"
);
}
int main(void) {
SysTick_Config(100);
__enable_irq();
__set_PSP(0x10007800);
__set_CONTROL(0x3); // Thread mode with PSP
while(1) {
__NOP();
}
return 0 ;
}
pendsv_handler()编译为:
Pendsv_Handler:
000003b4: nop
000003b6: mvn.w r0, #2
000003ba: bx r0
27 }
000003bc: nop
更新:根据Tom V评论。但仍然不起作用。
解决方案
我错过了设定Systick和Pendsv的优先级,就像:
NVIC_SetPriority(PendSV_IRQn, 0xFF);
NVIC_SetPriority(SysTick_IRQn, 0x00);
I want to use EXC_RETURN in PendSV but I always get HardFault with INVPC (Invalid PC load UsageFault, caused by an invalid PC load by EXC_RETURN). This works, if I move the assembly code to Systick_Handler().
What do I miss?
I use NXP LPC1769 with the latest MCUXpressoIDE.
void Systick_Handler(void){
SCB->ICSR |= SCB_ICSR_PENDSVSET_Msk;
}
__attribute__ ((naked)) void Pendsv_Handler(void) {
__ASM volatile (
"NOP \n"
"ldr r0, =0xFFFFFFFD \n"
"bx r0"
);
}
int main(void) {
SysTick_Config(100);
__enable_irq();
__set_PSP(0x10007800);
__set_CONTROL(0x3); // Thread mode with PSP
while(1) {
__NOP();
}
return 0 ;
}
The Pendsv_Handler() compiled to:
Pendsv_Handler:
000003b4: nop
000003b6: mvn.w r0, #2
000003ba: bx r0
27 }
000003bc: nop
Update: Based on Tom V comments. But still not working.
Solution
I missed to set the priority of SysTick and PendSV, like:
NVIC_SetPriority(PendSV_IRQn, 0xFF);
NVIC_SetPriority(SysTick_IRQn, 0x00);
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论