C ATmega2560使用UART中断控制全局标志
我最近在玩ATmega2560时遇到了一个问题,我真的不明白它出了什么问题 这是我的密码 主要内容:C ATmega2560使用UART中断控制全局标志,c,arduino,uart,interrupt-handling,atmega,C,Arduino,Uart,Interrupt Handling,Atmega,我最近在玩ATmega2560时遇到了一个问题,我真的不明白它出了什么问题 这是我的密码 主要内容: #包括“Definitions.h” 内部主(空){ 初始化(); 而(1){ //_delay_ms(1);//或printf。。。 //等待RXC标志 if(RxFlag){ //等待输入新字节 //PORTB&=~(1不可能确定,但是我认为这可以解释您的问题,因此很可能是错误 您没有包含RXFlag的声明,但我猜测您没有声明它volatile。除非您这样做,否则编译器可以假设它知道该变量将
#包括“Definitions.h”
内部主(空){
初始化();
而(1){
//_delay_ms(1);//或printf。。。
//等待RXC标志
if(RxFlag){
//等待输入新字节
//PORTB&=~(1不可能确定,但是我认为这可以解释您的问题,因此很可能是错误
您没有包含RXFlag
的声明,但我猜测您没有声明它volatile
。除非您这样做,否则编译器可以假设它知道该变量将发生什么。特别是,它知道,除非main()
调用任何其他函数,RxFlag的值永远不会改变。因此,它可以通过将if
表达式移出循环来优化它。实际上,它是这样改变代码的:
#include "Definitions.h"
int main(void)
{
register bool x;
Initialization();
x = RxFlag;
while (1)
{
//wait for RXC flag
if (x) //wait for new byte in
{
//PORTB &= ~(1 << PB7);
PORTB |= (1 << PB7);
rxcount = 0;
UDR0 = 'R';
RxFlag = false;
TxFlag = false;
}
}
}
#包括“Definitions.h”
内部主(空)
{
寄存器boolx;
初始化();
x=RxFlag;
而(1)
{
//等待RXC标志
if(x)//等待中的新字节
{
//端口B&=~(1)请在此处发布您的代码,而不是通过外部链接发布。暂时进入ISR是最糟糕的想法……曾经……我猜您是从非中断驱动的代码中复制的。看起来关于中断是如何工作的,存在一些重大的错误概念。而且代码缺失。请阅读并遵循建议!@MichaelWalz对此表示抱歉,我是新到这里的,并且感觉良好对于如何解释我遇到的问题,我有点紧张。下次我会做得更好。谢谢。@LPs是的,我确实误解了非中断驱动的示例代码……谢谢你的意见!对于gcc,一半的AVR寄存器被调用方保存。gcc在优化时利用了这一点,甚至可以在函数c中保留寄存器中的值函数调用也可以是内联的,这样对优化器来说,它甚至不会作为调用发生。
#include "Definitions.h"
ISR(USART0_RX_vect) {
while(!(UCSR0A & (1 << RXC0)))
//wait for RXC flag
;
/* Loop-back test */
//PORTB |= (1 << PB7);
//test_data = UDR0;
TxFlag = true;
//enableUDRI0();
//PORTB &= ~(1 << PB7);
//PORTB |= (1 << PB7);
RxBuffer[rxcount++] = UDR0;
if(!(rxcount < RX_BUF_SZ)) {
//rxcount = 0;
PORTB |= (1 << PB7);
RxFlag = true;
}
}
ISR(USART0_UDRE_vect) {
while(!(UCSR0A & (1 << UDRE0)))
//wait for udr to be empty
;
/* Loop-back test */
UDR0 = 0x30 + rxcount;
disableUDRI0();
}
#include "Definitions.h"
int main(void)
{
register bool x;
Initialization();
x = RxFlag;
while (1)
{
//wait for RXC flag
if (x) //wait for new byte in
{
//PORTB &= ~(1 << PB7);
PORTB |= (1 << PB7);
rxcount = 0;
UDR0 = 'R';
RxFlag = false;
TxFlag = false;
}
}
}