搜索
bottom↓
回复: 22

IAR中如何定义字符串可以不占用RAM。

[复制链接]

出0入0汤圆

发表于 2020-6-30 20:41:14 | 显示全部楼层 |阅读模式
在keil中的如下定义,const定义的字符串能存到ROM中,不占用RAM
const uchar * const Text[]=
{
"12345",
"asd",
"asfghfg"
}

const unchar * * UseText = Text;
使用的时候可以用UseText[i]来调用需要的字符串。i是需要调用字符串的地址。
现在我需要把程序移植到IAR上,但是IAR好像不认这种方式。如果直接复制到IAR,编译后ROM,RAM都增大了。
如果按照如下方式定义,RAM也增加来。
求助各位怎么定义可以不占用RAM。
__flash uchar  *  Text[]=
{
"12345",
"asd",
"asfghfg"
};
注:每单个字符串长度不定

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

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入442汤圆

发表于 2020-6-30 20:44:29 来自手机 | 显示全部楼层
把const放到uchar*后面。别问为什么,我也是刚学会,因为我发现gcc编译出来的数组后面全是空指针,而且在data里放着。找了半个钟头资料改完之后就进rodata了。

出0入0汤圆

 楼主| 发表于 2020-6-30 20:50:43 | 显示全部楼层
wye11083 发表于 2020-6-30 20:44
把const放到uchar*后面。别问为什么,我也是刚学会,因为我发现gcc编译出来的数组后面全是空指针,而且在d ...

keil中的定义uchar *的后面有const,复制到IAR不行啊。

出0入0汤圆

 楼主| 发表于 2020-6-30 20:59:08 | 显示全部楼层
wye11083 发表于 2020-6-30 20:44
把const放到uchar*后面。别问为什么,我也是刚学会,因为我发现gcc编译出来的数组后面全是空指针,而且在d ...

__flash uchar  * const Text[]=
{
"12345",
"asd",
"asfghfg"
}; 也不行,和不加const一样的

出0入442汤圆

发表于 2020-6-30 21:18:37 来自手机 | 显示全部楼层
lxjiiing 发表于 2020-6-30 20:59
__flash uchar  * const Text[]=
{
"12345",

你去掉flash看看,还不行的话可能编译器识别const的问题了。

出0入0汤圆

发表于 2020-6-30 22:44:01 | 显示全部楼层
const unsigned char

出0入0汤圆

发表于 2020-7-1 08:52:20 | 显示全部楼层
const char * const Text[]=
{
"12345",
"asd",
"asfghfg"
};

const char * const(* UseText)[3] = &Text;

出0入0汤圆

发表于 2020-7-1 09:57:33 | 显示全部楼层
__flash char __flash *messages[5]=
{
"Message 1",
"Message 2",
"Message 3",
"Message 4"
};

__flash char __farflash *messages[5]=
{
"Message 1",
"Message 2",
"Message 3",
"Message 4"
};

出0入0汤圆

 楼主| 发表于 2020-7-1 13:49:24 | 显示全部楼层
flamma 发表于 2020-7-1 09:57
__flash char __flash *messages[5]=
{
"Message 1",

还是不行,编译不通过。

本帖子中包含更多资源

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

x

出0入4汤圆

发表于 2020-7-1 16:10:59 | 显示全部楼层
AVR的架构可以直接寻址FLASH?我记得不行的吧

出0入0汤圆

发表于 2020-7-1 16:36:04 | 显示全部楼层
首先要说明用的是啥MCU,别人才能帮你

出0入0汤圆

发表于 2020-7-1 16:55:48 | 显示全部楼层
__root const char table[] ={...};

出0入0汤圆

 楼主| 发表于 2020-7-1 19:29:11 | 显示全部楼层
zhugean 发表于 2020-7-1 16:36
首先要说明用的是啥MCU,别人才能帮你

用的ATMGAL1280单片机,不过我感觉这个和MCU没有关系,应该是IAR软件使用的问题。

出0入0汤圆

 楼主| 发表于 2020-7-1 19:50:15 | 显示全部楼层
按照IAR帮助中的方法,可以每个字符串定义一个地址,然后再定义指针数组,把字符串地址再存到指针数组里面。但是我有很多字符串,这样得定义很多。试过可以定义二维数组,但是我的字符串长短不一,二维数组要按照最大的长度定义,得浪费不少空间。实在没有找到更好的方法,也只能分几组二维数组先用着了。

本帖子中包含更多资源

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

x

出0入0汤圆

发表于 2020-7-1 22:39:45 | 显示全部楼层
就7楼的声明就可以啊,引用的时候直接Text[i]就行。

出0入0汤圆

 楼主| 发表于 2020-7-2 08:15:48 | 显示全部楼层
lostid 发表于 2020-7-1 22:39
就7楼的声明就可以啊,引用的时候直接Text就行。

7楼和我在楼主位的一样啊,定义后要占用RAM。

出0入0汤圆

发表于 2020-7-2 09:02:16 | 显示全部楼层
lxjiiing 发表于 2020-7-2 08:15
7楼和我在楼主位的一样啊,定义后要占用RAM。

Text整个是放在flash区的,只有UseText是放在RAM的。不信的话,可以debug看看地址。

出0入0汤圆

 楼主| 发表于 2020-7-2 10:00:30 | 显示全部楼层
w282529350 发表于 2020-7-2 09:02
Text整个是放在flash区的,只有UseText是放在RAM的。不信的话,可以debug看看地址。 ...


这是仅定义const char * const Text[]的结果(修改错别字)

本帖子中包含更多资源

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

x

出0入0汤圆

发表于 2020-7-2 10:32:23 | 显示全部楼层
lxjiiing 发表于 2020-7-2 10:00
这是仅定义const char * const Text[]的结果(修改错别字)

没用过这种code和data的单片机,用m0核单片机测试的没有问题,Text确实是放在flash区的,也就是code区

你可以打印输出一下Text的地址,看看是不是落在你的code地址范围内

出0入0汤圆

发表于 2020-7-22 00:16:55 | 显示全部楼层
本帖最后由 Ajkx007 于 2020-7-22 00:21 编辑

--string_literals_in_flash

__flash char __farflash *messages_flash[2]=
{
"1234567890",
"11223344556677889900"
};

以上方法就可以

本帖子中包含更多资源

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

x

出0入0汤圆

发表于 2020-8-26 14:18:17 | 显示全部楼层
char * const Text[]=
{
"12345",
"asd",
"asfghfg"
};

这样定义就可以啊 放在 readonly  data memory  

出0入0汤圆

发表于 2021-9-16 12:16:01 | 显示全部楼层

最好的解决方法是使用 二维数组的方式

char __flash    Text[3][8] =
{
{"12345"},
{"asd"},
{"asfghfg"}
};


不定长时,按照最长的一个定义即可


程序引用   &Text[0][0]

                &Text[1][0]

                &Text[2][0]

出0入30汤圆

发表于 2021-9-16 15:31:44 | 显示全部楼层
本帖最后由 ycheng2004 于 2021-9-16 15:36 编辑

unsigned char code LedChar[] 加了 code 之后,这个表格的数据保存到 FLASH里,实际上 code 这个关键字是 51 单片机特有的,
如果是其它类型的单片机我们只需要写成 const unsigned char  LedChar[]={}就可以了,自动保存到 FLASH里,
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-3-29 23:35

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

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