欺骗avr gcc优化选项-使用IRQ的ffunction部分
我有一个特殊的avr gcc问题,到目前为止还没有解决方案 我使用gcc选项“-ffunction sections”和链接选项“-Wl,--gc sections”。 这将避免链接代码中未使用的函数。 它与只有一些千字节闪存的微控制器完美配合 但现在我有了这样一个案例:这种优化将杀死所需的代码! 我会尽力解释这些情况欺骗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
ISR(TIMER1_COMPA_vect)
{
counter ++;
if (counter > 7) {
counter = 0;
Ticks ++; // generating my time
}
}
void WaitTicks(uint8_t TickCount) {
Ticks = 0;
while (Ticks < TickCount) {
// Ticks ++;
// Ticks --;
}
}
void waiticks(uint8\u t TickCount){
滴答声=0;
while(滴答声<滴答声){
//Ticks++;
//蜱——;
}
}
我想进行优化,但它也应该能处理这个特殊的中断问题。
滴答声
需要不稳定(或者编译器会假设它在WaitTicks执行期间无法更改,因为它从未写入该函数中。因此,您的while循环不会执行任何操作,并且可以被删除。由于整个函数不执行任何操作,因此它也会被删除)。如果它不是单字节变量(但我认为是,因为TickCount是一个uint8_t)你甚至需要原子地读/写它。是的-这就是解决方案!谢谢!将记号定义为volatile是可行的。当然这是第一个正确的答案。但我只是忘记了使用volatile。所以你们都给出了正确的“解决方案提示”。-)