本帖最后由 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() 函数都是这么处理的。
请帮忙看看,哪里陷入误区了。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
IAR7.8的,运行是指示灯不会闪动,应该也是只进一次就不再进中断了,把那个 OSAL_IRQ_EPILOGUE(); 函数屏蔽掉就ok了,
不知道 OSAL_IRQ_EPILOGUE(); 函数中关闭中断后,为什么特意不开启中断,不知道正常情况下,软件是在哪里重新启动中断。
是啊,用的人也不少了,应该不是os的问题,
不知道 OSAL_IRQ_EPILOGUE(); 函数中关闭中断后,为什么特意不开启中断,不知道正常情况下,软件是在哪里重新启动中断。
一周热门 更多>