QQ624353765 发表于 2024-10-21 07:47:25

keilC251定义常量使用code还是const




在中断里使用code定义常量发现程序无法正常运行,但用const就能运行

在C251中使用code和const的区别是啥

小坤 发表于 2024-10-21 09:05:36

const

DebugLab 发表于 2024-10-21 10:11:30

code是FLASH,const是SRAM

QQ624353765 发表于 2024-10-21 11:13:08

DebugLab 发表于 2024-10-21 10:11
code是FLASH,const是SRAM

那用const定义的局部变量退出函数后会被释放吗

远行的鹿 发表于 2024-10-21 11:14:31

1. const修饰:
   表示被修饰对象是一个不可修改的常量。在申明时初始化,并且在程序运行期间不能被修改。
   该常量被keil C51编译器放置在RAM空间。
   用于存储常量数据,比如查找表、常量配置等。在使用时,可以直接读取,但不能进行赋值操作。
2. code修饰:
   表示被修饰对象放置在ROM空间,也就是存放程序指令的区域。
   用于存储不变的、只读的程序指令或数据。由于放置在代码区,可以节省宝贵的RAM存储空间。

他们都有不可修改的特性,但一般存储在RAM区的数据访问会更快一些,对运行速度有要求的可以优先考虑const。

DebugLab 发表于 2024-10-21 12:17:50

QQ624353765 发表于 2024-10-21 11:13
那用const定义的局部变量退出函数后会被释放吗

应该是会的,const只是声明是常量,不可修改,其实flash中也有一份相同的,运行时复制到sram

health 发表于 2024-10-21 12:45:54

c251有bug,用code修饰变量需放在函数外面,做全局变量。
如果局部变量用code修饰,则运行异常,看汇编代码就知,变量地址分配在code区域,上来就是一通写入,自然是运行不下去。
如果局部变量用const,则变量分配在RAM区,进入函数时先从code区域的镜像复制数据到变量来初始化。此种情况运行结果是正确的,但是浪费data空间,浪费code空间,浪费时间。

soma 发表于 2024-10-21 13:11:53

health 发表于 2024-10-21 12:45
c251有bug,用code修饰变量需放在函数外面,做全局变量。
如果局部变量用code修饰,则运行异常,看汇编代码 ...

竟然还有这种问题,看来code做修饰要小心啊,sram够大还是const修饰好点啊

小白爱上51 发表于 2024-10-21 13:50:12

const把,感觉还是8h好用

health 发表于 2024-10-21 13:59:30

最优方案是code数组拖到函数外面。
页: [1] 2
查看完整版本: keilC251定义常量使用code还是const