FreeRTOS软件定时器apollo中断状态判断
短信预约 -IT技能 免费直播动态提醒
问题场景
开发中发现FreeRTOS软件定时器不走了,具体表现在软件定时器中断进不去。
分析问题
观察发现只有在某个任务执行期间,FreeRTOS的软件定时器才会不走,其他任务执行时正常,排查后是此任务的优先级比定时器任务高,且占用时间比较长,导致任务切不出去。
解决问题
在FreeRTOSConfig.h中修改定时器任务优先级为最高解决问题
apollo中断状态判断
在看apollo3 代码时发现下面这个函数
void WsfSetOsSpecificEvent(void)
{
if(xRadioTaskEventObject != NULL)
{
BaseType_t xHigherPriorityTaskWoken, xResult;
if(xPortIsInsideInterrupt() == pdTRUE) {
// Send an event to the main radio task
xHigherPriorityTaskWoken = pdFALSE;
xResult = xEventGroupSetBitsFromISR(xRadioTaskEventObject, 1,
&xHigherPriorityTaskWoken);
// If the radio task is higher-priority than the context we're currently
// running from, we should yield now and run the radio task.
//
if ( xResult != pdFAIL )
{
portYIELD_FROM_ISR(xHigherPriorityTaskWoken);
}
}
else {
xResult = xEventGroupSetBits(xRadioTaskEventObject, 1);
//
// If the radio task is higher priority than the context we're currently
// running from, we should yield now and run the radio task.
//
if ( xResult != pdFAIL )
{
portYIELD();
}
}
}
}
这是FreeRTOS发送一个事件标志组,xPortIsInsideInterrupt
这个函数判断是否在中断中,进而调用判断是否调用FromISR结尾的api,下面看下原理
static portFORCE_INLINE BaseType_t xPortIsInsideInterrupt( void )
{
uint32_t ulCurrentInterrupt;
BaseType_t xReturn;
__asm
{
mrs ulCurrentInterrupt, ipsr
}
if( ulCurrentInterrupt == 0 )
{
xReturn = pdFALSE;
}
else
{
xReturn = pdTRUE;
}
return xReturn;
}
读IPSR寄存器,0表示当前没有中断在运行,非0表示正在运行的中断号,即处于中断中,所以要用FromISR结尾的api
以上就是FreeRTOS软件定时器apollo中断状态判断的详细内容,更多关于FreeRTOS定时器apollo中断判断的资料请关注编程网其它相关文章!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341