搜索
bottom↓
回复: 14

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

[复制链接]

出30入16汤圆

发表于 2021-10-2 12:54:22 | 显示全部楼层 |阅读模式
本帖最后由 洞洞幺 于 2021-10-2 12:56 编辑

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

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

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

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入8汤圆

发表于 2021-10-2 13:13:56 来自手机 | 显示全部楼层
可以去搜一下 _at_ 关键字。论坛里应该也不少资源。

出1315入193汤圆

发表于 2021-10-2 13:19:55 | 显示全部楼层
_at_ :

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

出0入33汤圆

发表于 2021-10-2 13:49:05 来自手机 | 显示全部楼层
不需要指定地址,只要定义一个const的全局变量就行。

出30入16汤圆

 楼主| 发表于 2021-10-2 14:19:22 来自手机 | 显示全部楼层
vtte 发表于 2021-10-2 13:49
不需要指定地址,只要定义一个const的全局变量就行。


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

出0入33汤圆

发表于 2021-10-2 14:29:53 来自手机 | 显示全部楼层
洞洞幺 发表于 2021-10-2 14:19
要放在指定地址,比如版本号啥的

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

出30入16汤圆

 楼主| 发表于 2021-10-2 15:36:41 来自手机 | 显示全部楼层
vtte 发表于 2021-10-2 14:29
为什么非要放指定地址啊,版本号要取的时候直接通过常量名称引用不就好了? ...

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

出145入215汤圆

发表于 2021-10-2 15:42:36 来自手机 | 显示全部楼层
编译好后把源码打开编辑源码加入数组到指定位置。要你不c嵌入汇编吧。

出0入442汤圆

发表于 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类型)。

出140入158汤圆

发表于 2021-10-2 19:59:54 | 显示全部楼层
本帖最后由 amigenius 于 2021-10-2 20:01 编辑

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

出30入16汤圆

 楼主| 发表于 2021-10-3 07:39:33 来自手机 | 显示全部楼层
本帖最后由 洞洞幺 于 2021-10-3 07:40 编辑
amigenius 发表于 2021-10-2 19:59
洞洞兄是要让BootLoader知道版本号吧?哈哈
Keil写法:
const u8 CODE_FLAG[4] __at(CODE_FLAG_ADDR) ={XX, ...


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

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

出0入0汤圆

发表于 2021-10-3 07:43:10 来自手机 | 显示全部楼层
用汇编定义,在c里面声明

出0入33汤圆

发表于 2021-10-3 07:45:46 来自手机 | 显示全部楼层
https://blog.csdn.net/qlexcel/article/details/85038176

出30入16汤圆

 楼主| 发表于 2021-10-3 08:20:09 来自手机 | 显示全部楼层
vtte 发表于 2021-10-3 07:45
https://blog.csdn.net/qlexcel/article/details/85038176

这个办法不错,感谢!

出675入8汤圆

发表于 2022-5-6 00:06:43 来自手机 | 显示全部楼层
我也试试看看
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-10 07:05

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表