首页 > 解决方案 > Raspberry Pi 3 裸机:来自数组和 switch 语句的意外行为

问题描述

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

我遇到的行为是,存储在数组中的值一旦被检索到,就会作为看似随机的值返回,与原始值无关。我还注意到 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.

标签: craspberry-piraspberry-pi3

解决方案


这是我在黑暗中拍摄的。您在任何地方都有内存覆盖,这会杀死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 关键字以避免编译器进行优化。它不应该掩盖观察到的错误输出。


推荐阅读