如何解决需要帮助 Systick 处理程序没有被调用
我正在尝试使用 MSP432 控制器中的 systick 处理程序进行上下文切换,但从未调用过 systick 处理程序。我不确定我做错了什么我将中断优先级设置为最高并将 PendSV 设置为最低。我确实禁用了中断,但总是重新启用它们,所以我认为这不是问题。
void OS_onStartup(void){
SystemCoreClockUpdate();
SysTick_Config(SystemCoreClock / 10000);
NVIC_SetPriority(SysTick_IRQn,0U);
//*(uint32_t volatile *)0x0000003C |= 0U;
}
void OS_init(void){
// set the penSV interrupt priority to the lowest level
*(uint32_t volatile *)0x00000038 |= (0xFFU << 16);
}
void SysTick_Handler(void) {
++l_tickCtr;
__disable_interrupts(); // @suppress("Function cannot be resolved")
OS_sched();
__enable_interrupts(); // @suppress("Function cannot be resolved")
}
int main() {
MSP_start();
OS_init();
/* fabricate Cortex-M ISR stack frame for blinky1 */
OSThread_start(&blinky1,&main_blinky1,stack_blinky1,sizeof(stack_blinky1));
/* fabricate Cortex-M ISR stack frame for blinky2 */
OSThread_start(&blinky2,&main_blinky2,stack_blinky2,sizeof(stack_blinky2));
OSThread_start(&blinky3,&main_blinky3,stack_blinky3,sizeof(stack_blinky3));
//transfer control to the RTOS to run threads
OS_run();
//return 0;
}
void OS_run(){
OS_sched();
//to start interrupts
__disable_interrupts(); // @suppress("Function cannot be resolved")
OS_onStartup();
__enable_interrupts(); // @suppress("Function cannot be resolved")
//code should not execute
//while(1){}
}
解决方法
这个:
// set the penSV interrupt priority to the lowest level
*(uint32_t volatile *)0x00000038 |= (0xFFU << 16);
没有按照评论说的去做。 0x00000038
是 PendSV 向量的默认地址,在 MSP432 上是 ROM 地址。 PendSV 优先级是使用位于 0xE000ED20
:
您可以直接编写寄存器,但使用 CMSIS NVIC_SetPriority()
要简单得多:
NVIC_SetPriority( PendSV_IRQn,(1 << __NVIC_PRIO_BITS) - 1 ) ;
或
NVIC_SetPriority( PendSV_IRQn,0xff ) ;
第一个是通用的,适用于不同的 Cortex-M 实现。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。