有玩chibiOS的吗?进一次systick中断后,再也进不去了。

2019-12-20 21:45发布

本帖最后由 wzavr 于 2018-3-13 21:32 编辑

网上找了一份stm32f4xx gcc chibios的例子,自己在他的基础上改到iar工程中,
但是跟踪后发现进一次systick中断后,不能再次进入了。
下面的程序跟踪的流程:

// OSAL_ST_MODE == OSAL_ST_MODE_PERIODIC
OSAL_IRQ_HANDLER(SysTick_Handler)
{
  OSAL_IRQ_PROLOGUE();

  osalSysLockFromISR();
  osalOsTimerHandlerI();        // systick相关操作
  osalSysUnlockFromISR();

  OSAL_IRQ_EPILOGUE();        // isr最后退出前,chibiOS指定需要的函数
}

#define OSAL_IRQ_EPILOGUE() CH_IRQ_EPILOGUE()

#define CH_IRQ_EPILOGUE()    PORT_IRQ_EPILOGUE()

#define PORT_IRQ_EPILOGUE()    _port_irq_epilogue()


void _port_irq_epilogue(void)
{
  port_lock_from_isr();
  if ((SCB->ICSR & SCB_ICSR_RETTOBASE_Msk) != 0U)
  {
    struct port_extctx *ctxp;
        ....
        ....
    /* 注意,没有解锁就返回是故意的,这是为了保持上下文的其余部分原子化.*/
    return;
  }
  port_unlock_from_isr();
}

// ============================
static inline void port_lock_from_isr(void)
{
  port_lock();
}

static inline void port_lock(void)
{
#if CORTEX_SIMPLIFIED_PRIORITY == FALSE
  __set_BASEPRI(CORTEX_BASEPRI_KERNEL);
#else /* CORTEX_SIMPLIFIED_PRIORITY */
  __disable_irq();
#endif /* CORTEX_SIMPLIFIED_PRIORITY */
}

//=====================
static inline void port_unlock_from_isr(void)
{
  port_unlock();
}
static inline void port_unlock(void)
{
#if CORTEX_SIMPLIFIED_PRIORITY == FALSE
  __set_BASEPRI(CORTEX_BASEPRI_DISABLED);
#else /* CORTEX_SIMPLIFIED_PRIORITY */
  __enable_irq();
#endif /* CORTEX_SIMPLIFIED_PRIORITY */
}

发现的问题是 _port_irq_epilogue() 函数中,先 port_lock_from_isr(); 关闭了中断,最后却没有使用 port_unlock_from_isr(); 重新启用中断。
网上也找了类似的例子,这个_port_irq_epilogue() 函数都是这么处理的。

请帮忙看看,哪里陷入误区了。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。