c - 为什么我不能从我的主循环中读取中断标志?
问题描述
我正在为 stm32l011 MCU 编写代码,它现在必须完成一项基本任务 - 等待来自 UART 的特定字节(由我预定义)并遵循“\r\n”或“\n\r”序列。如果它接收到,它会设置一个指向预定义字符地址的空指针,该指针在主循环中读取和处理。
volatile uint8_t uart_buff[UART_BUFF_LEN] = {'\0'};
volatile uint8_t *uart_data = NULL;
volatile uint8_t *uart_stack = uart_buff+2;
void USART2_IRQHandler(void){
if(LL_USART_IsActiveFlag_RXNE(USART2)){
*uart_stack = LL_USART_ReceiveData8(USART2);
user_uart_send_byte(*uart_stack);
//same as if(!(strcmp((uart_stack-1), "\r\n") || strcmp((uart_stack-1), "\n\r")))
if((*uart_stack == '\r' || *uart_stack == '\n') && (*(uart_stack-1) == '\r' || *(uart_stack-1) == '\n'))
{
uart_data = uart_stack - 2;
uart_stack = uart_buff+2;
}
uart_stack++;
}
}
主要:
extern volatile uint32_t systick_counter_ms;
extern volatile uint8_t *uart_data;
int main(void){
init();
while(1)
{
LL_GPIO_TogglePin(GPIOB, LL_GPIO_PIN_3);
//delay_ms(1); //without that it doesn't want to work
if(uart_data)
{
adc_transmit_reading(*uart_data);
uart_data = NULL;
}
}
}
我写了上面的C程序,它似乎不起作用。但是当我在主循环中引入延迟时,它就神奇地复活了。这是为什么?需要注意的关键事项:UART 有回声,因此我确信它在两种情况下都能正确处理中断,我还尝试通过使用 volatile 变量来删除编译器的优化(针对 size(Os) 进行优化)。延迟也是由while循环产生的,它等待每毫秒递增变量的中断。
我外行的猜测是,因为我只是围绕那个 uart_data 指针循环,所以中断和主循环之间的同步没有发生。
提前致谢 :)
解决方案
问题是您已经指出您uart_data
指向易失性数据。但是在您的循环中,您正在测试指针而不是数据。
所以你必须指出你的指针也是易变的:
extern volatile uint8_t * volatile uart_data;
您可以在这篇文章中找到更多信息:为什么指向易失性指针(如“volatile int * p”)有用?
推荐阅读
- android - Realm如何判断两个文件是同一个RealmObject?(包装变化)
- c - 意外输出 -scanf 和功能检查
- symfony - getLastAuthenticationError 返回布尔值
- android - 特殊字符编码在 android 的 POST 请求中。如何避免这种情况?
- php - symfony 5,Doctrine Lifecycle Listeners 没有运行
- boolean - 在 Azure 数据工厂中将布尔值转换为 1 和 0
- python - Python为x和y轴上的每个第n个像素更改颜色
- powershell - 在powershell中复制具有匹配文件夹名的文件名
- php - 如何强制 laravel 不从符号链接读取存储文件
- java - 如何使用 AndroidPdfViewer 库从存储中显示 pdf 文件?