到目前为止,我有一个特殊的avr-gcc问题没有解决方案。
我使用gcc选项“-ffunction-sections”和链接选项“-Wl, - gc-sections”。 这将避免链接代码中未使用的函数。 它与仅具有KByte闪存的微控制器完美配合。
但是现在我知道这种优化会杀死所需的代码! 我会尝试解释条件。
我有一个定时器中断,每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 --;
}
}
此例程未链接,因为优化会丢弃它。
编译器“认为”这个例程无法工作,因为他忽略了中断例程中Ticks的增量。
如果我取消注释“Ticks ++;”,它将仅被链接。 但当然它不会等待中断增量。
因此,我的代码无法正常工作,并且在此时会崩溃。例程“WaitTicks”被调用。 但是在每种情况下都会编译和链接而没有错误。
我的问题是如何在这种特殊情况下使用此选项欺骗编译器?
我想进行优化,但它也应该解决这个特殊的中断问题。
答案 0 :(得分:2)
Ticks
需要是易失性的(或者编译器会假设它在WaitTicks执行期间不会改变,因为它永远不会写入该函数。因此你的while循环不会执行任何操作,并且可以被删除。因为整个函数什么都不做,它也被删除了。如果它不是一个单字节变量(但我想它是,因为TickCount是一个uint8_t)你甚至需要原子地读/写它。