我正在使用IAR C编译器为嵌入式微型计算机(特别是瑞萨电子的uPD78F0537)构建应用程序。在此应用程序中,我使用两个嵌套的for循环初始化一些数据,如以下MCVE所示:
#include <stdio.h>
#define NUM_OF_OBJS 254
#define MAX_OBJ_SIZE 4
unsigned char objs[NUM_OF_OBJS][MAX_OBJ_SIZE];
unsigned char srcData[NUM_OF_OBJS][MAX_OBJ_SIZE];
void main(void)
{
srcData[161][2] = 10;
int x, y;
for (x = 0; x < NUM_OF_OBJS; x++)
{
for (y = 0; y < MAX_OBJ_SIZE; y++)
{
objs[x][y] = srcData[x][y];
}
}
printf("%d\n", (int) objs[161][2]);
}
输出值为0,而不是10。
编译器为for循环生成以下代码:
13 int x, y;
14 for (x = 0; x < NUM_OF_OBJS; x++)
\ 0006 14.... MOVW DE,#objs
\ 0009 16.... MOVW HL,#srcData
15 {
16 for (y = 0; y < MAX_OBJ_SIZE; y++)
\ 000C A0F8 MOV X,#248
17 {
18 objs[x][y] = srcData[x][y];
\ ??main_0:
\ 000E 87 MOV A,[HL]
\ 000F 95 MOV [DE],A
19 }
\ 0010 86 INCW HL
\ 0011 84 INCW DE
\ 0012 50 DEC X
\ 0013 BDF9 BNZ ??main_0
20 }
上面的方法不起作用:编译器显然正在预先计算NUM_OF_OBJS x MAX_OBJ_SIZE = 1016(0x3f8)。该值用作计数器,但是它将被截断为8位(0xf8 == 248),并存储在8位寄存器'X'中。结果,仅初始化了前248个字节的数据,而不是完整的1016个字节。
我可以解决此问题,但是我的问题是:这是编译器错误吗?还是我忽略了什么?
更新
while (len-- > 0) *dst++ = *src++;
)复制数据可以正常工作。我非常确信这是基于以下原因的编译器错误:
使用指针(例如,沿着的线while (len-- > 0) *dst++ = *src++;
)复制数据可以正常工作。因此,这看起来不像是RAM大小,指针大小等问题。
也许更相关:如果我只是用静态变量替换两个常量(NUM_OF_OBJS
或MAX_OBJ_SIZE
)之一(从而防止编译器预先计算总计数),则可以正常工作。
不幸的是,我联系了IAR(提供了此SO问题的链接),这是他们的答案:
抱歉,您没有许可证/支持协议(SUA)。进行这种情况所需的检查可能会花费一些时间,我们(售后支持)会优先考虑为使用有效SUA的用户投入时间和精力。
以及一些不是特别有用的通用注释。
因此,我想我只是假设这是一个错误并在我的代码中解决它(有很多可能的解决方法,包括上述两个方法)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句