搜索
bottom↓
回复: 7

请教大家一个关于IAR volatile的问题

[复制链接]

出0入0汤圆

发表于 2006-12-29 10:22:37 | 显示全部楼层 |阅读模式
我用IAR 4.2来编译ATMEL官方的串口中断通信程序(稍微改动,主要是波特率定义等,不影响这个问题),编译后提示Warning[Pa082]: undefined behavior: the order of volatile accesses is undefined in this statement 大体上看,这个警告是说volatile的访问顺序没定义,那应该如果解决呢?

阿莫论坛20周年了!感谢大家的支持与爱护!!

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

 楼主| 发表于 2006-12-29 10:23:12 | 显示全部楼层
附源代码:

// AVR306: Using the AVR USART in C

// Routines for interrupt controlled USART

// Last modified: 02-06-21

// Modified by: AR



/* Includes */

#include <iom16.h>

#include <intrinsics.h>



/* USART Buffer Defines */

#define USART_RX_BUFFER_SIZE 32     /* 2,4,8,16,32,64,128 or 256 bytes */

#define USART_TX_BUFFER_SIZE 32





#define USART_RX_BUFFER_MASK ( USART_RX_BUFFER_SIZE - 1 )

#if ( USART_RX_BUFFER_SIZE & USART_RX_BUFFER_MASK )

        #error RX buffer size is not a power of 2

#endif



#define USART_TX_BUFFER_MASK ( USART_TX_BUFFER_SIZE - 1 )

#if ( USART_TX_BUFFER_SIZE & USART_TX_BUFFER_MASK )

        #error TX buffer size is not a power of 2

#endif





/* Static Variables */

static unsigned char USART_RxBuf[USART_RX_BUFFER_SIZE];

static volatile unsigned char USART_RxHead;

static volatile unsigned char USART_RxTail;

static unsigned char USART_TxBuf[USART_TX_BUFFER_SIZE];

static volatile unsigned char USART_TxHead;

static volatile unsigned char USART_TxTail;



/* Prototypes */

void InitUSART( unsigned char baudrate );

unsigned char ReceiveByte( void );

void TransmitByte( unsigned char data );



/* Main - a simple test program*/

void main( void )

{

        InitUSART( 47 );   /* Set the baudrate to 19,200 bps using a 3.6864MHz crystal */



        __enable_interrupt();           /* Enable interrupts => enable USART interrupts */



        for( ; ; )        /* Forever */

        {

                TransmitByte( ReceiveByte() ); /* Echo the received character */

        }

}



/* Initialize USART */

void InitUSART( unsigned char baudrate )

{

        //unsigned char x;



        UBRRH = (unsigned char)(baudrate>>8);

        UBRRL = (unsigned char)baudrate;  /* Set the baud rate */

        /* Enable USART receiver and transmitter, and receive interrupt */

        //UCR = ( (1<<RXCIE) | (1<<RXEN) | (1<<TXEN) );

        UCSRB = ( (1<<RXEN) | (1<<TXEN) | (1<<RXCIE) );  /* Enable USART receiver and transmitter */

        UCSRC = ((1<<URSEL)|(3<<UCSZ0));



        //x = 0;                             /* Flush receive buffer */



        USART_RxTail = 0;

        USART_RxHead = 0;

        USART_TxTail = 0;

        USART_TxHead = 0;

}



/* Interrupt handlers */

#pragma vector=USART_RXC_vect

__interrupt void USART_RX_interrupt( void )

{

        unsigned char data;

        unsigned char tmphead;



        data = UDR;                 /* Read the received data */

        /* Calculate buffer index */

        tmphead = ( USART_RxHead + 1 ) & USART_RX_BUFFER_MASK;

        USART_RxHead = tmphead;      /* Store new index */



        if ( tmphead == USART_RxTail )

        {

                /* ERROR! Receive buffer overflow */

        }

       

        USART_RxBuf[tmphead] = data; /* Store received data in buffer */

}



#pragma vector=USART_UDRE_vect

__interrupt void USART_TX_interrupt( void )

{

        unsigned char tmptail;



        /* Check if all data is transmitted */

        if ( USART_TxHead != USART_TxTail )

        {

                /* Calculate buffer index */

                tmptail = ( USART_TxTail + 1 ) & USART_TX_BUFFER_MASK;

                USART_TxTail = tmptail;      /* Store new index */

       

                UDR = USART_TxBuf[tmptail];  /* Start transmition */

        }

        else

        {

                UCSRB &= ~(1<<UDRIE);         /* Disable UDRE interrupt */

        }

}



/* Read and write functions */

unsigned char ReceiveByte( void )

{

        unsigned char tmptail;

       

        while ( USART_RxHead == USART_RxTail )  /* Wait for incomming data */

                ;

        tmptail = ( USART_RxTail + 1 ) & USART_RX_BUFFER_MASK;/* Calculate buffer index */

       

        USART_RxTail = tmptail;                /* Store new index */

       

        return USART_RxBuf[tmptail];           /* Return data */

}



void TransmitByte( unsigned char data )

{

        unsigned char tmphead;

        /* Calculate buffer index */

        tmphead = ( USART_TxHead + 1 ) & USART_TX_BUFFER_MASK; /* Wait for free space in buffer */

        while ( tmphead == USART_TxTail );



        USART_TxBuf[tmphead] = data;           /* Store data in buffer */

        USART_TxHead = tmphead;                /* Store new index */



        UCSRB |= (1<<UDRIE);                    /* Enable UDRE interrupt */

}



unsigned char DataInReceiveBuffer( void )

{

        return ( USART_RxHead != USART_RxTail ); /* Return 0 (FALSE) if the receive buffer is empty */

}

出0入0汤圆

 楼主| 发表于 2006-12-29 10:25:20 | 显示全部楼层
if ( USART_TxHead != USART_TxTail )



        while ( USART_RxHead == USART_RxTail )  /* Wait for incomming data */



        return ( USART_RxHead != USART_RxTail ); /* Return 0 (FALSE) if the receive buffer is empty */





这三行提示警告信息

出0入0汤圆

发表于 2010-5-25 23:25:39 | 显示全部楼层
遇到同样的问题 ~~把volatile去掉就好了.....求解ing

出0入0汤圆

发表于 2011-8-15 19:27:15 | 显示全部楼层
volatile类型的变量一般不直接参与运算,因为在运算的过程中该变量就已经改变

出0入0汤圆

发表于 2011-8-20 13:13:46 | 显示全部楼层
使用一个临时变量将volatile修饰的变量读出来参与运算。。。

出0入0汤圆

发表于 2014-9-6 17:44:49 | 显示全部楼层
xuhaikun 发表于 2011-8-20 13:13
使用一个临时变量将volatile修饰的变量读出来参与运算。。。

好办法!

出0入0汤圆

发表于 2014-9-7 01:05:39 | 显示全部楼层
本帖最后由 bli19 于 2014-9-7 01:20 编辑

UB,就是不符合编译器所遵循的C标准,可能会带来不可预知的结果。应该是C99吧。。
你可以忽略,前提是你知道你自己在做什么。
原作者既然说好用,那自然有他的道理。
----
建议看看此贴,很详细:
http://www.amobbs.com/thread-5497299-1-1.html
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-7-23 17:15

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表