KEIL C51中如何在FLASH中保存参数?
本帖最后由 洞洞幺 于 2021-10-2 12:56 编辑今天碰到个问题,就是在KEIL平台上使用C语言编写C8051的控制程序,现在想把2个数组用来保存参数,并且这2个数组要定位到FLASH的不同指定位置,
因为一直用汇编来写,用ORG就可以简单搞定,但用C写还不太清楚,请教大神解惑,谢谢!
最好是在程序里直接指定,不要去设置编译器什么的,参数不需要改变,直接放到FLASH就好,以后只会读取。
还有一个就是如何把一个函数也定位到FLASH的指定位置,方法越简单越好,找了一圈,没什么好的办法,头疼。。。
可以去搜一下 _at_ 关键字。论坛里应该也不少资源。 _at_ :
1.在给变量xx定位绝对地址空间时,不能对其赋初值。
2.xx _at_ 0x8000;这条语句不能放在主函数中。编译会出现错误274,就是将这条语句放在主函数中的原因。
3.keil中地址是自动分配的,所以除非特殊情况否则不提倡使用绝对地址定位。不要把c当作汇编使用。 不需要指定地址,只要定义一个const的全局变量就行。 vtte 发表于 2021-10-2 13:49
不需要指定地址,只要定义一个const的全局变量就行。
要放在指定地址,比如版本号啥的
洞洞幺 发表于 2021-10-2 14:19
要放在指定地址,比如版本号啥的
为什么非要放指定地址啊,版本号要取的时候直接通过常量名称引用不就好了? vtte 发表于 2021-10-2 14:29
为什么非要放指定地址啊,版本号要取的时候直接通过常量名称引用不就好了? ...
你说的没错,但我需要的不是这个答案。 编译好后把源码打开编辑源码加入数组到指定位置。要你不c嵌入汇编吧。 本帖最后由 wye11083 于 2021-10-2 19:24 编辑
。。ls们没用过指针?。。
volatile u8 * ptr = (u8*)0xXXXX;
然后用ptr直接访问。地址建议用#define写死。
注意了,写flash原则上是要遵守mcu内部的program工作模式的。直接往地址里写数据一般不能改写flash内容(即flash为ro类型)。 本帖最后由 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:40 编辑
amigenius 发表于 2021-10-2 19:59
洞洞兄是要让BootLoader知道版本号吧?哈哈
Keil写法:
const u8 CODE_FLAG __at(CODE_FLAG_ADDR) ={XX, ...
感谢各位,我现在是在c8051的单片机上做,不是在arm上搞。我找了类似你这样的例子,但编译有问题。
我的目的就是把指定的数组或函数放到flash的指定地址,在烧程序时一次性搞完,以后只需要读取就行,越简单越好。 用汇编定义,在c里面声明 https://blog.csdn.net/qlexcel/article/details/85038176 vtte 发表于 2021-10-3 07:45
https://blog.csdn.net/qlexcel/article/details/85038176
这个办法不错,感谢! 我也试试看看
页:
[1]