|
日前,用IAR在stm32上写了一个串口程序。实现的功能是:把要发送的数据入队列。在串口的发送中断里再出队列。下面我描述问题所在。
/************************** 程序 *****************************************/
#define QueSize 500
static volatile unsigned char QueBuf[QueSize];
static volatile unsigned int head=0;
static volatile unsigned int tail=0;
/**************************************
入队函数
*************************************/
unsigned char EnQueue(void)
{
if(((head+1)%QueSize)==tail) //-------(1)
{
return 0;
}
else
{
head++;
head%=QueSize;
QueBuf[head]=x;
return 1;
}
}
/*************************************
在串口发送空中断里出栈,中断函数这么写的。
*************************************/
void USART2_IRQHandler(void)
{
if(USART_GetITStatus(USART2, USART_IT_TXE) != RESET) //发送数据寄存器空
{
if(tail!=head) //-----(2)
{
tail++;
tail%=QueSize;
USART_SendData(USART2,QueBuf[tail] );
}
else
{
USART_ITConfig(USART2, USART_IT_TXE, DISABLE);
}
}
}
/*********************************************************************
过程,编译的时候会出警告,分别对应1行和2行
Warning[Pa082]: undefined behavior: the order of volatile accesses is undefined in this statement
Warning[Pa082]: undefined behavior: the order of volatile accesses is undefined in this statement
忽略
下载,运行,出错,截图如图1
*********************************************************************/
/*********************************************************************
解决方法1,改写入队函数,编译的时候还是提示行2处有警告,忽略,下载程序,问题解决,结果如图2
*********************************************************************/
/**************************************
入队函数
*************************************/
unsigned char EnQueue(void)
{
u32 temp=head;
if(((temp+1)%QueSize)==tail)
{
return 0;
}
else
{
temp++;
temp%=QueSize;
QueBuf[temp]=x;
head=temp;
return 1;
}
}
/********************************************************************
解决方法2:不动原来的入队函数,而改写发送中断里的出队语句,编译,行1提示警告,忽略,运行,结果正常,如图2
********************************************************************/
void USART2_IRQHandler(void)
{
if(USART_GetITStatus(USART2, USART_IT_TXE) != RESET) //发送数据寄存器空
{
u32 temp=tail;
if(temp!=head)
{
temp++;
temp%=QueSize;
USART_SendData(USART2,QueBuf[temp] );
tail=temp;
}
else
{
USART_ITConfig(USART2, USART_IT_TXE, DISABLE);
}
}
}
/*************************************************************
解决方法3,同时改写入队和出队语句,编译没有警告,运行结果正常如图2
**************************************************************//
/**************************************************************
谁能解释这是为啥?
***************************************************************/
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|