打印
[AVR单片机]

在使用AVR Studio v4.12 + GCC 中的优化时所遇到的一个问题

[复制链接]
1982|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
HWM|  楼主 | 2007-8-19 10:48 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本人在调试一个AVR系统时发现一个百思不得其解的问题,后经仔细分析后才找到答案,原来是GCC在优化时未考虑变量的“非顺序性”改变(如被中断程序修改),造成了优化后程序执行结果的不同。下面给出一个典型的测试程序:

// 以下程序用AVR Studio v4.12 service Pack4 + WINAVR 20060421 编译
// 其用意是将串口输入的八位数据从 PORT A 口输出。

///////////////////////////////////////
// TEST GCC for AVR optimization
///////////////////////////////////////

#include <avr/io.h>
#include <avr/interrupt.h>

unsigned char Buffer;

void Init( void );
void USART_Init ( unsigned int baud );
unsigned char USART_Receive( void );

int main ( void )
{
    Init();

    while ( 1 )
    {
        PORTA = Buffer;
    }
}

void Init( void )
{
    // set PORTA as output port
    DDRA = 0xFF;

    // initialize UART
    USART_Init( 71 ); // set B.R. 9600 for 11.0592 MHz

    // enable interupt
    sei();
}

void USART_Init ( unsigned int baud )
{
    // set BAUD RATE
    UBRRH = (unsigned char) (baud >> 8);
    UBRRL = (unsigned char) baud;

    // enable receiver and transmitter and RXC interrupt
    UCSRB = (1 << RXEN) | (1 << TXEN) | (1 << RXCIE);

    // set frame format: 8 data bit, 1 stop bit
    UCSRC = (1 << URSEL) | (3 << UCSZ0);
}

unsigned char USART_Receive( void )
{
    /* Wait for data to be received */
    while ( !(UCSRA & (1 << RXC)) ) ;

    /* Get and return received data from buffer */
    return UDR;
}

// ISR for UART
ISR ( USART_RXC_vect )
{
    Buffer = USART_Receive();
}

相关帖子

沙发
HWM|  楼主 | 2007-8-19 13:53 | 只看该作者

谢过二楼。确实在Buffer加了volatile后就可以了。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

HWM

1230

主题

20953

帖子

150

粉丝