欺骗avr gcc优化选项-使用IRQ的ffunction部分

欺骗avr gcc优化选项-使用IRQ的ffunction部分,gcc,optimization,avr,Gcc,Optimization,Avr,我有一个特殊的avr gcc问题,到目前为止还没有解决方案 我使用gcc选项“-ffunction sections”和链接选项“-Wl,--gc sections”。 这将避免链接代码中未使用的函数。 它与只有一些千字节闪存的微控制器完美配合 但现在我有了这样一个案例:这种优化将杀死所需的代码! 我会尽力解释这些情况 我有一个计时器中断,它每800µs执行一次操作。 8次之后,它将增加一个变量“Ticks”以生成时钟 ISR(TIMER1_COMPA_vect) { count

我有一个特殊的avr gcc问题,到目前为止还没有解决方案

我使用gcc选项“-ffunction sections”和链接选项“-Wl,--gc sections”。 这将避免链接代码中未使用的函数。 它与只有一些千字节闪存的微控制器完美配合

但现在我有了这样一个案例:这种优化将杀死所需的代码! 我会尽力解释这些情况

  • 我有一个计时器中断,它每800µs执行一次操作。 8次之后,它将增加一个变量“Ticks”以生成时钟

    ISR(TIMER1_COMPA_vect)
    {
            counter ++;
            if (counter > 7) {
                    counter = 0;
                    Ticks ++;          // generating my time
            }
    }
    
  • 现在,我想使用一个函数,在主程序中使用“Ticks”进行同步等待

    void WaitTicks(uint8_t TickCount) {
            Ticks = 0;
    
            while (Ticks < TickCount) {
    //                Ticks ++;
    //                 Ticks --;
            }
    }
    
    void waiticks(uint8\u t TickCount){
    滴答声=0;
    while(滴答声<滴答声){
    //Ticks++;
    //蜱——;
    }
    }
    
  • 此例程未链接,因为优化将删除它

    编译器“认为”此例程无法工作,因为他忽略了中断例程中的刻度增量

    只有当我取消注释“Ticks++;”时,它才会被链接。 但是,它当然不会等待中断增量

    因此,我的代码无法工作,并在这2点崩溃。例行程序“waiticks”被称为。 但它是编译和链接的,在任何情况下都没有错误

    我的问题是,在这种特殊情况下,如何使用此选项欺骗编译器


    我想进行优化,但它也应该能处理这个特殊的中断问题。

    滴答声
    需要不稳定(或者编译器会假设它在WaitTicks执行期间无法更改,因为它从未写入该函数中。因此,您的while循环不会执行任何操作,并且可以被删除。由于整个函数不执行任何操作,因此它也会被删除)。如果它不是单字节变量(但我认为是,因为TickCount是一个uint8_t)你甚至需要原子地读/写它。

    是的-这就是解决方案!谢谢!将记号定义为volatile是可行的。当然这是第一个正确的答案。但我只是忘记了使用volatile。所以你们都给出了正确的“解决方案提示”。-)