Atmel Studio 7不适用于嵌入式C和I为ATMega328PB创建一个新的GCC可执行项目,该项目只需使用以下代码切换C端口:
#include <avr/io.h>
int init(void)
{
DDRC = 0xff;
return 1;
}
int delayms(uint16_t ms)
{
uint16_t j;
while(ms>0)
{
ms--;
j=490;
while(j>0)
{
j--;
}
}
return 1;
}
int main(void)
{
init();
while (1)
{
PORTC = 0xff;
delayms(500);
PORTC = 0x00;
delayms(500);
}
}
当我构建(F7)并编程芯片时,我的PORTC线路在我的示波器上以约1Mhz切换。我查看了输出文件,.lss文件显示delayms过程不存在。如果我用易变的前缀局部变量j 或使其成为一个全局变量,并再次构建,它就在那里,一切正常。
显然希望这个工作像一个普通的C程序,没有看到任何编译器应该这样做的任何理由,不是什么奇怪的优化的事情,因为我已经关闭它,也卸载并重新安装Atmel Studio现在两次,也使用C ++项目选项无法按预期工作
发布于 2018-05-30 14:28:59
从编译器的角度来看,函数完全没有。所以编译器会优化它。通过添加volatile
关键字,可以通知编译器该函数中的某些内容容易产生副作用,并且必须执行代码。可以使用其他技术来强制执行所需的行为。例如
void delay(uint32_t x)
{
for(uint32_t i = x; i; --i)
__asm__("" : "=r" (x));
}
https://stackoverflow.com/questions/-100004616
复制相似问题