Raspberry Pi 3裸机:阵列和switch语句的意外行为

时间:2019-06-16 11:49:45

标签: c raspberry-pi raspberry-pi3

我目前有一个简单的程序,用于设置可以写入的帧缓冲区。

我遇到的行为是,存储在数组中的值一经检索就返回为看似随机的值,与原始值无关。 我还注意到switch语句有一些类似的奇怪和意外行为-我怀疑这与数组和switch语句如何在内存中静态分配有关。

作为示例,这里有一些代码应该绘制一个硬编码的数字,然后是已存储在数组中的其他7个硬编码的数字:

unsigned int cols[7] = { 0xFFFF0000, 0xFFFF7F00, 0xFFFFFF00, 0xFF00FF00, 0xFF0000FF, 0xFF4B0082, 0xFF9400D3 };
drawNum(&display, 0x1234ABCD);
for (int i=0; i<7; i++)
  drawNum(&display, cols[i]);

使用硬编码值进行的第一个drawNum()调用可以正常工作,但是所有具有数组访问权限的调用看起来都是随机的结果。

在运行时分配数组值不存在此问题,就像这样:

unsigned int cols[7];
cols[0] = 0xFFFF0000;
cols[1] = 0xFFFF7F00;
cols[2] = 0xFFFFFF00;
cols[3] = 0xFF00FF00;
cols[4] = 0xFF0000FF;
cols[5] = 0xFF4B0082;
cols[6] = 0xFF9400D3;
drawNum(&display, 0x1234ABCD);
drawNum(&display, (int)cols);
for (int i=0; i<7; i++)
  drawNum(&display, cols[i]);

switch语句返回值时,我也经历过类似的不可预测的行为。

我不能肯定地说,但这使我相信这是使用编译器或链接器的问题-我正在使用arm-none-eabi

2 个答案:

答案 0 :(得分:0)

只是在黑暗中拍摄,但您可能想要在数组中尝试使用其他值,其中最高位是0,而不是硬编码示例中的1。

unsigned int cols[7] = { 0x7FFF0000, 0x7FFF7F00, 0x7FFFFF00, 0x7F00FF00, 0x7F0000FF, 0x7F4B0082, 0x7F9400D3 };

这是假设drawNum采用int而不是unsigned int。您可能只是遇到转换问题。没有看到drawNum做什么,很难说。

答案 1 :(得分:0)

这是我在黑暗中的镜头。您在任何地方都有内存覆盖,这会杀死cols[]。如果将变量从全局范围移到本地范围,结果会有所不同。添加一些“检测器”代码:

volatile unsigned int cols[7] = { 0xFFFF0000, 0xFFFF7F00, 0xFFFFFF00, 0xFF00FF00, 0xFF0000FF, 0xFF4B0082, 0xFF9400D3 };
drawNum(&display, 0x1234ABCD);

//test code
drawNum(&display, cols[0]==0xFFFF0000);    
drawNum(&display, cols[1]==0xFFFF7F00);

for (int i=0; i<7; i++)
  drawNum(&display, cols[i]);      

//test code
drawNum(&display, cols[0]==0xFFFF0000);    
drawNum(&display, cols[1]==0xFFFF7F00);

我添加了volatile关键字,以避免编译器进行优化。它不应掩盖观察到的错误输出。