【问题标题】:gcc optimization ignores program linegcc 优化忽略程序行
【发布时间】:2020-12-27 21:39:42
【问题描述】:

对 Attiny1634 进行编程,我尝试重用 ram 空间。这样做我重用my_array[0] 第一个元素向my_function 发送一个u8 值,需要一个指向uint8_t 的指针,但无论我做什么,该函数都得到了错误的值。奇怪的是,当我在调用 my_function 之前打印了值时,一切都按预期工作。我的怀疑是,当我不使用它并且使用它的指针不算使用它时,编译器会忽略设置数组值。

uint8_t my_array[2];
...
my_array[0] = some_value;

// Serial0_print_U8(my_array[0]);    // when I uncomment this line everything works

my_function(my_array);

// my_function gets a wrong val if I comment out the debug print
void my_function(const uint8_t* val){
    Serial0_print_U8(val[0]);              // only prints some_value if I uncomment the print above
}  

询问什么是防止编译器忽略我的行的正确方法。 volatile 会起作用吗?

【问题讨论】:

  • 将数组 my_array[] 标记为 volatile 会产生编译器警告并被忽略。除了在虚拟行中使用数组之外的其他解决方案?
  • 通过将编译器优化级别设置为 None (-O0) 可以解决部分问题,但不能解决我的问题。
  • 您能否创建一个minimal reproducible example,并说明您正在使用的编译器/版本?通常这种事情是由于代码中其他地方的未定义行为造成的。
  • 重用是什么意思?
  • 我尝试将其最小化,但无法重现该问题。现在我怀疑我在一个时间关键部分存在时间问题,即调用 UART 函数引入的小延迟被隐藏了。在别处搜索,谢谢你。

标签: c optimization volatile


【解决方案1】:

在尝试了“volatile”关键字后,我放弃并将赋值移到 my_function() 中,然后将优化级别设置为 o0,仅针对特定函数,在函数声明中添加 __attribute__((optimize("O0"))),如建议this link。它有效。

【讨论】:

  • 你的程序肯定有未定义的行为。这是奇怪行为的唯一解释(除了极不可能的编译器错误)。 -O0 似乎可以解决问题,但它只是隐藏了它......现在。它可能会咬你一些变化。程序另一部分看似无关的更改将再次触发奇怪的行为。或者只是编译更新或另一组编译器标志。我强烈建议您找到并修复代码中的错误。
  • 可能是 UB 的罪魁祸首(没有看到其余代码):严格的别名违规或越界访问。 stackoverflow.com/questions/98650/… , stackoverflow.com/questions/98340/…
  • 很可能是 SPI 时序问题,所以在某种程度上你是对的。谢谢你
猜你喜欢
  • 2021-07-05
  • 1970-01-01
  • 2011-02-17
  • 1970-01-01
  • 1970-01-01
  • 2012-07-13
  • 2012-10-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多