MengZeATY 2023-07-17 12:11 采纳率: 0%
浏览 39

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声明了一个指针。
  • 写回答

1条回答 默认 最新

  • 憧憬blog 2023-07-17 14:15
    关注

    在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段中。建议您在编译器手册中查找更多关于内存布局和优化的相关信息。
    如有帮助,请给个采纳!

    评论

报告相同问题?

问题事件

  • 创建了问题 7月17日

悬赏问题

  • ¥15 有没有整苹果智能分拣线上图像数据
  • ¥20 有没有人会这个东西的
  • ¥15 cfx考虑调整“enforce system memory limit”参数的设置
  • ¥30 航迹分离,航迹增强,误差分析
  • ¥15 Chrome Manifest扩展引用Ajax-hook库拦截请求失败
  • ¥15 用Ros中的Topic通讯方式控制小乌龟的速度,走矩形;编写订阅器代码
  • ¥15 LLM accuracy检测
  • ¥15 pycharm添加远程解释器报错
  • ¥15 如何让子窗口鼠标滚动独立,不要传递消息给主窗口
  • ¥15 如何能达到用ping0.cc检测成这样?如图