Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C ATmega2560使用UART中断控制全局标志_C_Arduino_Uart_Interrupt Handling_Atmega - Fatal编程技术网

C ATmega2560使用UART中断控制全局标志

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。除非您这样做,否则编译器可以假设它知道该变量将

我最近在玩ATmega2560时遇到了一个问题,我真的不明白它出了什么问题

这是我的密码

主要内容:

#包括“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;

        }
    }
}