搜索
bottom↓
回复: 15

为什么数组指针不能保存在flash,数值数组却可以

[复制链接]

出0入0汤圆

发表于 2022-3-15 19:33:53 | 显示全部楼层 |阅读模式
本帖最后由 cnxh 于 2022-3-15 19:47 编辑

const uint16  xx10[]={
6,'字','库',   
};

const uint16  xx11[]={
6,'无','内','容',   
};

const uint16  *flashxx[] = {
&xx10[0],&xx11[0],
};

arm stm32 iar环境 如果flashxx里面存储的是数组指针,用const 关键字,仿真flashxx地址会在ram里,如果定义的是存储数值的数值数组,仿真flashxx地址在flash里,因为指针数组大了以后,ram就不够了
所以怎么样操作指针数组才可以保存到flash中,而不是存储在ram里,如果编译器是avriar,定义为__flash可以,但是armiar,这个关键字不能用

指针数组,地址是200开始的内存地址



数值数组,地址是800开始的flash地址




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入4汤圆

发表于 2022-3-15 19:53:07 | 显示全部楼层
uint16  * const flashxx[]
试试

出0入0汤圆

 楼主| 发表于 2022-3-15 19:59:13 | 显示全部楼层
自己修改一下,先把数组地址转换成地址数字,保存为数值数组,这样可以保存在false中,用的时候再取出数字转换成地址

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2022-3-15 19:59:58 | 显示全部楼层
zchong 发表于 2022-3-15 19:53
uint16  * const flashxx[]
试试
(引用自2楼)


好的我试试,谢谢

出0入0汤圆

发表于 2022-3-15 20:03:54 | 显示全部楼层
const uint16  *flashxx

flashxx是个指向const uint16类型数据的指针数组,就是个变量,当然放ram

出0入0汤圆

 楼主| 发表于 2022-3-15 20:05:00 | 显示全部楼层
本帖最后由 cnxh 于 2022-3-15 20:15 编辑

不行,编译通不过


已解决

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2022-3-15 20:07:06 来自手机 | 显示全部楼层
const  unsigned short int* const flashxx

出200入2365汤圆

发表于 2022-3-16 00:05:19 | 显示全部楼层
标准 C 里边有三种和常量相关的指针,建议 LZ 仔细研究下:

  1. const TYPE *
  2. TYPE * const
  3. const TYPE * const
复制代码


后两种指针自身是 const 的,才有可能被定位在 ROM 区;
实际这只是必要条件,需要编译器设定 const 可以被放在 ROM 只读区域

出0入83汤圆

发表于 2022-3-16 00:07:13 | 显示全部楼层
t3486784401 发表于 2022-3-16 00:05
标准 C 里边有三种和常量相关的指针,建议 LZ 仔细研究下:


(引用自8楼)

  我感觉你对 C语言的熟悉程度 超过了 论坛 80%的人了

出0入83汤圆

发表于 2022-3-16 00:09:59 | 显示全部楼层
t3486784401 发表于 2022-3-16 00:05
标准 C 里边有三种和常量相关的指针,建议 LZ 仔细研究下:


(引用自8楼)

  我感觉你对 C语言的熟悉程度 超过了 论坛 80%的人了

出0入0汤圆

发表于 2022-3-16 07:17:23 来自手机 | 显示全部楼层
t3486784401 发表于 2022-3-16 00:05
标准 C 里边有三种和常量相关的指针,建议 LZ 仔细研究下:



(引用自8楼)

我感觉你对 C语言的熟悉程度 超过了 论坛 90%的人了

出5入0汤圆

发表于 2022-3-16 08:12:36 来自手机 | 显示全部楼层
t3486784401 发表于 2022-3-16 00:05
标准 C 里边有三种和常量相关的指针,建议 LZ 仔细研究下:



(引用自8楼)

厉害厉害👍

出0入110汤圆

发表于 2022-3-18 17:22:13 | 显示全部楼层
const uint16  xx10[]={
6,'字','库',   
};

const uint16  xx11[]={
6,'无','内','容',   
};

const uint16  * const flashxx[] = {
&xx10[0],&xx11[0],
}

前面一个const表明指针指向的内容是常量
后面一个const表明指针本身是常量
你没加后面那个,所以这个数组就不在FLASH里了

最后推荐一个写法:
const uint16  * const flashxx[] = {
xx10, xx11,
}

出0入4汤圆

发表于 2022-3-18 17:26:14 | 显示全部楼层
ehengio 发表于 2022-3-18 17:22
const uint16  xx10[]={
6,'字','库',   
};
(引用自13楼)

这个解释清楚明了

出0入0汤圆

 楼主| 发表于 2022-3-18 20:25:36 | 显示全部楼层
谢谢各位

出0入8汤圆

发表于 2022-3-18 22:56:46 来自手机 | 显示全部楼层
ehengio 发表于 2022-3-18 17:22
const uint16  xx10[]={
6,'字','库',   
};

(引用自13楼)

感谢分享,一下解释明白了
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子论坛 ( 公安交互式论坛备案:44190002001997 粤ICP备09047143号 )

GMT+8, 2022-7-1 06:48

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

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