【发布时间】:2021-02-03 17:09:27
【问题描述】:
我正在尝试使用 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){}
}
【问题讨论】:
-
你定义了
SysTick_Handler()吗?你没有把它包括在你的问题中。检查documentation 以获取SysTick_Config(),它会返回您未检查的状态,并且有一条关于__Vendor_SysTickConfig的注释可能适用。您应该在启用中断之前设置优先级。您是否打算使用 100us 的滴答间隔? -
我在上面添加了 systick_handler。我检查了 Systick_config 的返回状态,它是 0,所以它应该是好的。我弄乱了滴答间隔的值,看看它是否会更快地调用 systick。我相信我最初每 10 微秒就有一次。 PendSV 处理程序没有问题,所以我很困惑。我读到 systick_handler 实际上是一个例外而不是中断,但我认为这没有任何意义。
-
您的
OS_init()看起来很可疑。您正在分配 PendSV 向量,这没有多大意义 - 让我想知道处理程序是如何工作的。为什么不是NVIC_SetPriority(PendSV_IRQn, (1 << __NVIC_PRIO_BITS) - 1)或只是NVIC_SetPriority(PendSV_IRQn, 255)? -
在 Cortex-M 中,术语异常是指具有负 IRQn 数的核心向量,这些术语或多或少可以互换使用。其他向量由实现/供应商定义并称为中断。更一般地说,异常通常是指由错误条件引起的中断,因此谈论 systtick 异常并不是“自然的”。在这种情况下,基本上没有区别。
-
你确定
OS_onStartup()被调用了吗?我们必须相信它,因为你只提供片段。
标签: c arm embedded msp430 rtos