lxjiiing 发表于 2020-6-30 20:41:14

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

在keil中的如下定义,const定义的字符串能存到ROM中,不占用RAM
const uchar * const Text[]=
{
"12345",
"asd",
"asfghfg"
}

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

wye11083 发表于 2020-6-30 20:44:29

把const放到uchar*后面。别问为什么,我也是刚学会,因为我发现gcc编译出来的数组后面全是空指针,而且在data里放着。找了半个钟头资料改完之后就进rodata了。

lxjiiing 发表于 2020-6-30 20:50:43

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

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

lxjiiing 发表于 2020-6-30 20:59:08

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

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

wye11083 发表于 2020-6-30 21:18:37

lxjiiing 发表于 2020-6-30 20:59
__flash uchar* const Text[]=
{
"12345",


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

michrome 发表于 2020-6-30 22:44:01

const unsigned char

w282529350 发表于 2020-7-1 08:52:20

const char * const Text[]=
{
"12345",
"asd",
"asfghfg"
};

const char * const(* UseText) = &Text;

flamma 发表于 2020-7-1 09:57:33

__flash char __flash *messages=
{
"Message 1",
"Message 2",
"Message 3",
"Message 4"
};

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

lxjiiing 发表于 2020-7-1 13:49:24

flamma 发表于 2020-7-1 09:57
__flash char __flash *messages=
{
"Message 1",


还是不行,编译不通过。

chendaon 发表于 2020-7-1 16:10:59

AVR的架构可以直接寻址FLASH?我记得不行的吧

zhugean 发表于 2020-7-1 16:36:04

首先要说明用的是啥MCU,别人才能帮你

startwar0418 发表于 2020-7-1 16:55:48

__root const char table[] ={...};

lxjiiing 发表于 2020-7-1 19:29:11

zhugean 发表于 2020-7-1 16:36
首先要说明用的是啥MCU,别人才能帮你

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

lxjiiing 发表于 2020-7-1 19:50:15

按照IAR帮助中的方法,可以每个字符串定义一个地址,然后再定义指针数组,把字符串地址再存到指针数组里面。但是我有很多字符串,这样得定义很多。试过可以定义二维数组,但是我的字符串长短不一,二维数组要按照最大的长度定义,得浪费不少空间。实在没有找到更好的方法,也只能分几组二维数组先用着了。

lostid 发表于 2020-7-1 22:39:45

就7楼的声明就可以啊,引用的时候直接Text就行。

lxjiiing 发表于 2020-7-2 08:15:48

lostid 发表于 2020-7-1 22:39
就7楼的声明就可以啊,引用的时候直接Text就行。

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

w282529350 发表于 2020-7-2 09:02:16

lxjiiing 发表于 2020-7-2 08:15
7楼和我在楼主位的一样啊,定义后要占用RAM。

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

lxjiiing 发表于 2020-7-2 10:00:30

w282529350 发表于 2020-7-2 09:02
Text整个是放在flash区的,只有UseText是放在RAM的。不信的话,可以debug看看地址。 ...

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

w282529350 发表于 2020-7-2 10:32:23

lxjiiing 发表于 2020-7-2 10:00
这是仅定义const char * const Text[]的结果(修改错别字)

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

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

Ajkx007 发表于 2020-7-22 00:16:55

本帖最后由 Ajkx007 于 2020-7-22 00:21 编辑

--string_literals_in_flash

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

以上方法就可以

一夕nandy 发表于 2020-8-26 14:18:17

char * const Text[]=
{
"12345",
"asd",
"asfghfg"
};

这样定义就可以啊 放在 readonlydata memory

hpdell 发表于 2021-9-16 12:16:01


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

char __flash    Text =
{
{"12345"},
{"asd"},
{"asfghfg"}
};


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


程序引用   &Text

                &Text

                &Text

ycheng2004 发表于 2021-9-16 15:31:44

本帖最后由 ycheng2004 于 2021-9-16 15:36 编辑

unsigned char code LedChar[] 加了 code 之后,这个表格的数据保存到 FLASH里,实际上 code 这个关键字是 51 单片机特有的,
如果是其它类型的单片机我们只需要写成 const unsigned charLedChar[]={}就可以了,自动保存到 FLASH里,
页: [1]
查看完整版本: IAR中如何定义字符串可以不占用RAM。