洞洞幺 发表于 2021-10-2 12:54:22

KEIL C51中如何在FLASH中保存参数?

本帖最后由 洞洞幺 于 2021-10-2 12:56 编辑

        今天碰到个问题,就是在KEIL平台上使用C语言编写C8051的控制程序,现在想把2个数组用来保存参数,并且这2个数组要定位到FLASH的不同指定位置,
      因为一直用汇编来写,用ORG就可以简单搞定,但用C写还不太清楚,请教大神解惑,谢谢!

      最好是在程序里直接指定,不要去设置编译器什么的,参数不需要改变,直接放到FLASH就好,以后只会读取。

        还有一个就是如何把一个函数也定位到FLASH的指定位置,方法越简单越好,找了一圈,没什么好的办法,头疼。。。

security 发表于 2021-10-2 13:13:56

可以去搜一下 _at_ 关键字。论坛里应该也不少资源。

lb0857 发表于 2021-10-2 13:19:55

_at_ :

1.在给变量xx定位绝对地址空间时,不能对其赋初值。
2.xx _at_ 0x8000;这条语句不能放在主函数中。编译会出现错误274,就是将这条语句放在主函数中的原因。
3.keil中地址是自动分配的,所以除非特殊情况否则不提倡使用绝对地址定位。不要把c当作汇编使用。

vtte 发表于 2021-10-2 13:49:05

不需要指定地址,只要定义一个const的全局变量就行。

洞洞幺 发表于 2021-10-2 14:19:22

vtte 发表于 2021-10-2 13:49
不需要指定地址,只要定义一个const的全局变量就行。

要放在指定地址,比如版本号啥的

vtte 发表于 2021-10-2 14:29:53

洞洞幺 发表于 2021-10-2 14:19
要放在指定地址,比如版本号啥的

为什么非要放指定地址啊,版本号要取的时候直接通过常量名称引用不就好了?

洞洞幺 发表于 2021-10-2 15:36:41

vtte 发表于 2021-10-2 14:29
为什么非要放指定地址啊,版本号要取的时候直接通过常量名称引用不就好了? ...

你说的没错,但我需要的不是这个答案。

dz20062008 发表于 2021-10-2 15:42:36

编译好后把源码打开编辑源码加入数组到指定位置。要你不c嵌入汇编吧。

wye11083 发表于 2021-10-2 19:23:24

本帖最后由 wye11083 于 2021-10-2 19:24 编辑

。。ls们没用过指针?。。

volatile u8 * ptr = (u8*)0xXXXX;
然后用ptr直接访问。地址建议用#define写死。

注意了,写flash原则上是要遵守mcu内部的program工作模式的。直接往地址里写数据一般不能改写flash内容(即flash为ro类型)。

amigenius 发表于 2021-10-2 19:59:54

本帖最后由 amigenius 于 2021-10-2 20:01 编辑

洞洞兄是要让BootLoader知道版本号吧?哈哈
Keil写法:
const u8 CODE_FLAG __at(CODE_FLAG_ADDR) ={XX,XX,XX,XX};
CLANG写法:
const u8 CODE_FLAG __attribute__((section(".ARM.__at_0xXXXXXXXX"))) ={XX,XX,XX,XX};

洞洞幺 发表于 2021-10-3 07:39:33

本帖最后由 洞洞幺 于 2021-10-3 07:40 编辑

amigenius 发表于 2021-10-2 19:59
洞洞兄是要让BootLoader知道版本号吧?哈哈
Keil写法:
const u8 CODE_FLAG __at(CODE_FLAG_ADDR) ={XX, ...

感谢各位,我现在是在c8051的单片机上做,不是在arm上搞。我找了类似你这样的例子,但编译有问题。

我的目的就是把指定的数组或函数放到flash的指定地址,在烧程序时一次性搞完,以后只需要读取就行,越简单越好。

dz46316740 发表于 2021-10-3 07:43:10

用汇编定义,在c里面声明

vtte 发表于 2021-10-3 07:45:46

https://blog.csdn.net/qlexcel/article/details/85038176

洞洞幺 发表于 2021-10-3 08:20:09

vtte 发表于 2021-10-3 07:45
https://blog.csdn.net/qlexcel/article/details/85038176

这个办法不错,感谢!

xml2028 发表于 2022-5-6 00:06:43

我也试试看看
页: [1]
查看完整版本: KEIL C51中如何在FLASH中保存参数?