C编译器错误或程序错误?

格罗德里格斯

我正在使用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个字节。

我可以解决此问题,但是我的问题是:这是编译器错误吗?还是我忽略了什么?


更新

  • 该微控制器具有7KB的RAM,并且sizeof(int)== 2
  • 使用指针(例如,沿着的线while (len-- > 0) *dst++ = *src++;复制数据可以正常工作。
格罗德里格斯

我非常确信这是基于以下原因的编译器错误:

  • 使用指针(例如,沿着的线while (len-- > 0) *dst++ = *src++;复制数据可以正常工作。因此,这看起来不像是RAM大小,指针大小等问题。

  • 也许更相关:如果我只是用静态变量替换两个常量(NUM_OF_OBJSMAX_OBJ_SIZE)之一(从而防止编译器预先计算总计数),则可以正常工作。

不幸的是,我联系了IAR(提供了此SO问题的链接),这是他们的答案:

抱歉,您没有许可证/支持协议(SUA)。进行这种情况所需的检查可能会花费一些时间,我们(售后支持)会优先考虑为使用有效SUA的用户投入时间和精力。

以及一些不是特别有用的通用注释。

因此,我想我只是假设这是一个错误并在我的代码中解决它(有很多可能的解决方法,包括上述两个方法)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章