c - 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
.
解决方案
这是我在黑暗中拍摄的。您在任何地方都有内存覆盖,这会杀死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 关键字以避免编译器进行优化。它不应该掩盖观察到的错误输出。
推荐阅读
- javascript - ExtJS - 当用户点击行时显示新标签
- c# - 如何对等待异步任务进行单元测试?
- sqlite - 如何在.import之后获取插入Sqlite3的记录数
- google-data-studio - 数据洞察社区连接器错误:数据中的列数与架构中的数字不匹配。
- laravel - 无法使用 Laradock 为 SSR 安装 v8js 扩展
- jquery - 如何在 MVC 中单击按钮时选中复选框?
- java - 如何通过 servlet 在新窗口/选项卡中打开响应?
- excel - 在工作表上输入日期数组将转换为美国格式
- python - Pandas csv 读取:dtype int 太大而无法转换为 C long
- javascript - 在 React 中返回 array.map() 的最佳方式?