其他
如何判断Cortex-M处理器正在执行中断函数?
关注+星标公众号,不错过精彩内容
作者 | strongerHuang
微信公众号 | 嵌入式专栏
今天分享一点之前在调试代码过程中遇到的知识点:关于__get_CONTROL的用法,及xQueueSend和xQueueSendFromISR的区别;
1
问题来源我之前在FreeRTOS系统上移植了部分别人写的代码,移植前仔细看了下源码,确认没问题后,编译,下载,运行,突然“死机了”······
2
解决问题的过程我解决问题还是按照常规思维,一步一步跟踪,很多问题其实都是类似道理,有规律可循。
1.查看configASSERT断言做了什么事?
跟踪代码:
#define configASSERT( x ) if( ( x ) == 0 ) { taskDISABLE_INTERRUPTS(); for( ;; ); }
2.进一步查找问题
portDISABLE_INTERRUPTS(); uxCriticalNesting++; if( uxCriticalNesting == 1 )
#define portNVIC_INT_CTRL_REG ( * ( ( volatile uint32_t * ) 0xe000ed04 ) )
0xe000ed04? 这个地址,相信之前了解过NVIC的都知道,就是Interrupt control state register.即中断控制状态寄存器。
3.确定问题点
__ASM uint32_t __get_CONTROL(void)
{
mrs r0, control
bx lr
}
4.在线调试,分析结论
a.在非中断情况下的值0x02
b.在中断情况下的值0x00
至此,问题已经查明就是CONTROL。
3
get_CONTROL的应用一般在RTOS实时操作系统中,常常使用队列来处理我们的数据,也就是常说的FIFO(先入先出)。
比如:我们在FreeRTOS系统中,要将UART发送、或者接收的数据加入队列:在中断里加入队列,在非中断里加入队列。这个时候,就需要使用get_CONTROL来判断当前是否处于中断函数里。
当然,类似的情况很多,像CAN、I2C、SPI等一样的道理。
举例,CAN总线发送数据加入队列:
后台回复『Cortex-M』『单片机』阅读更多相关文章。
点击“阅读原文”查看更多分享,欢迎点分享、收藏、点赞、在看。