keil51编译的const存储位置

关于keil使用LX51编译出的const=?的展示问题。

  • 有人注意过用keil的LX51编译出的const=?实际上是在ROM里吗?
Program Size: data=9.0 xdata=878 const=3968 code=18189
LX51 RUN COMPLETE.  0 WARNING(S),  0 ERROR(S)
  • 上面这个,单片机用的STC8H1K28,环境为VSCode的EIDE使用keil51构建,如果按这个const大小烧录后代码是没法运行的,而且代码里这些变量都加了code声明,所以这里的const=?应该是类似code的类别吧,不知道有没有人遇到过类似的问题呀?而且不知道这里的code包不包含这个const。

  • 另外还有一个问题是二维数组code放在类型声明前后占用的大小不一样。
uint8_t __CODE* letters[]
Program Size: data=9.0 xdata=878 const=3968 code=18189

__CODE uint8_t* letters[]
Program Size: data=9.0 xdata=878 const=3994 code=18174
WARNING C196 IN LINE OF .\SRC\MAIN.C: mspace probably invalid
  • 不知道是不是优先级的问题导致code声明了一个指针。

在Keil C51编译器中,const关键字用于声明只读的常量数据,通常被存储在程序的ROM(只读存储器)中。在提供的编译输出信息中,可以看到const数据段占用了3968个字节,而代码段(code)占用了18189个字节,这表明const数据段确实存储在ROM中。

对于提到的问题,可以使用Keil C51的内存布局选项来控制const数据段的存储位置。在Keil C51中,可以使用#pragma语句来设置内存段的名称和存储位置。例如,以下代码将const数据段存储在ROM中:

#pragma const
const unsigned char my_const_data[] = {1, 2, 3, 4};

关于二维数组的问题,可能是由于不同的编译器实现的优化方式不同导致的。在第一个例子中,将letters数组声明为指向__CODE uint8_t类型的指针数组,所以它被分配到了const段中。而在第二个例子中,将letters数组声明为指向uint8_t类型的指针数组,所以它被分配到了code段中。建议您在编译器手册中查找更多关于内存布局和优化的相关信息。
如有帮助,请给个采纳!