IAR中如何定义字符串可以不占用RAM。
在keil中的如下定义,const定义的字符串能存到ROM中,不占用RAMconst 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"
};
注:每单个字符串长度不定 把const放到uchar*后面。别问为什么,我也是刚学会,因为我发现gcc编译出来的数组后面全是空指针,而且在data里放着。找了半个钟头资料改完之后就进rodata了。 wye11083 发表于 2020-6-30 20:44
把const放到uchar*后面。别问为什么,我也是刚学会,因为我发现gcc编译出来的数组后面全是空指针,而且在d ...
keil中的定义uchar *的后面有const,复制到IAR不行啊。 wye11083 发表于 2020-6-30 20:44
把const放到uchar*后面。别问为什么,我也是刚学会,因为我发现gcc编译出来的数组后面全是空指针,而且在d ...
__flash uchar* const Text[]=
{
"12345",
"asd",
"asfghfg"
}; 也不行,和不加const一样的 lxjiiing 发表于 2020-6-30 20:59
__flash uchar* const Text[]=
{
"12345",
你去掉flash看看,还不行的话可能编译器识别const的问题了。 const unsigned char const char * const Text[]=
{
"12345",
"asd",
"asfghfg"
};
const char * const(* UseText) = &Text; __flash char __flash *messages=
{
"Message 1",
"Message 2",
"Message 3",
"Message 4"
};
__flash char __farflash *messages=
{
"Message 1",
"Message 2",
"Message 3",
"Message 4"
}; flamma 发表于 2020-7-1 09:57
__flash char __flash *messages=
{
"Message 1",
还是不行,编译不通过。 AVR的架构可以直接寻址FLASH?我记得不行的吧 首先要说明用的是啥MCU,别人才能帮你 __root const char table[] ={...}; zhugean 发表于 2020-7-1 16:36
首先要说明用的是啥MCU,别人才能帮你
用的ATMGAL1280单片机,不过我感觉这个和MCU没有关系,应该是IAR软件使用的问题。 按照IAR帮助中的方法,可以每个字符串定义一个地址,然后再定义指针数组,把字符串地址再存到指针数组里面。但是我有很多字符串,这样得定义很多。试过可以定义二维数组,但是我的字符串长短不一,二维数组要按照最大的长度定义,得浪费不少空间。实在没有找到更好的方法,也只能分几组二维数组先用着了。 就7楼的声明就可以啊,引用的时候直接Text就行。 lostid 发表于 2020-7-1 22:39
就7楼的声明就可以啊,引用的时候直接Text就行。
7楼和我在楼主位的一样啊,定义后要占用RAM。 lxjiiing 发表于 2020-7-2 08:15
7楼和我在楼主位的一样啊,定义后要占用RAM。
Text整个是放在flash区的,只有UseText是放在RAM的。不信的话,可以debug看看地址。 w282529350 发表于 2020-7-2 09:02
Text整个是放在flash区的,只有UseText是放在RAM的。不信的话,可以debug看看地址。 ...
这是仅定义const char * const Text[]的结果(修改错别字) lxjiiing 发表于 2020-7-2 10:00
这是仅定义const char * const Text[]的结果(修改错别字)
没用过这种code和data的单片机,用m0核单片机测试的没有问题,Text确实是放在flash区的,也就是code区
你可以打印输出一下Text的地址,看看是不是落在你的code地址范围内 本帖最后由 Ajkx007 于 2020-7-22 00:21 编辑
--string_literals_in_flash
__flash char __farflash *messages_flash=
{
"1234567890",
"11223344556677889900"
};
以上方法就可以
char * const Text[]=
{
"12345",
"asd",
"asfghfg"
};
这样定义就可以啊 放在 readonlydata memory
最好的解决方法是使用 二维数组的方式
char __flash Text =
{
{"12345"},
{"asd"},
{"asfghfg"}
};
不定长时,按照最长的一个定义即可
程序引用 &Text
&Text
&Text
本帖最后由 ycheng2004 于 2021-9-16 15:36 编辑
unsigned char code LedChar[] 加了 code 之后,这个表格的数据保存到 FLASH里,实际上 code 这个关键字是 51 单片机特有的,
如果是其它类型的单片机我们只需要写成 const unsigned charLedChar[]={}就可以了,自动保存到 FLASH里,
页:
[1]