【发布时间】: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