需要帮助 Systick 处理程序没有被调用

时间:2021-02-03 17:09:27

标签: c arm embedded msp430 rtos

我正在尝试使用 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){}
 }

1 个答案:

答案 0 :(得分:1)

这个:

    // set the penSV interrupt priority to the lowest level
    *(uint32_t volatile *)0x00000038  |= (0xFFU << 16);

没有按照评论说的去做。 0x00000038 是 PendSV 向量的默认地址,在 MSP432 上是 ROM 地址。 PendSV 优先级是使用位于 0xE000ED20:

系统处理程序优先级寄存器 3 寄存器设置的

enter image description here

您可以直接编写寄存器,但使用 CMSIS NVIC_SetPriority() 要简单得多:

NVIC_SetPriority( PendSV_IRQn, (1 << __NVIC_PRIO_BITS) - 1 ) ;

NVIC_SetPriority( PendSV_IRQn, 0xff ) ;

第一个是通用的,适用于不同的 Cortex-M 实现。