使用IRQ欺骗avr-gcc优化选项-ffunction-sections

时间:2015-10-13 11:00:57

标签: gcc optimization avr

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

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

但是现在我知道这种优化会杀死所需的代码! 我会尝试解释条件。

  1. 我有一个定时器中断,每800μs做一次。 在8次之后,它将增加变量“Ticks”以生成时钟。

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

    void WaitTicks(uint8_t TickCount) {
            Ticks = 0;
    
            while (Ticks < TickCount) {
    //                Ticks ++;
    //                 Ticks --;
            }
    }
    
  3. 此例程未链接,因为优化会丢弃它。

    编译器“认为”这个例程无法工作,因为他忽略了中断例程中Ticks的增量。

    如果我取消注释“Ticks ++;”,它将仅被链接。 但当然它不会等待中断增量。

    因此,我的代码无法正常工作,并且在此时会崩溃。例程“WaitTicks”被调用。 但是在每种情况下都会编译和链接而没有错误。

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

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

1 个答案:

答案 0 :(得分:2)

Ticks需要是易失性的(或者编译器会假设它在WaitTicks执行期间不会改变,因为它永远不会写入该函数。因此你的while循环不会执行任何操作,并且可以被删除。因为整个函数什么都不做,它也被删除了。如果它不是一个单字节变量(但我想它是,因为TickCount是一个uint8_t)你甚至需要原子地读/写它。