作弊avr-gcc优化选项-函数节与IRQ使用



我有一个特殊的avr-gcc问题,到现在还没有解决方案。

我使用gcc选项"- function-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 --;
            }
    }
    

这个例程没有被链接到,因为优化会删除它。

编译器"认为"这个例程不能工作,因为他忽略了中断例程中Ticks的增量。

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

所以我的代码不工作,崩溃在点这2。调用"WaitTicks"例程。但是它的编译和链接在任何情况下都没有错误。

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

我想有优化,但它应该与这个特殊的中断问题也工作。

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

最新更新