请教下使用iar avr 编译器定义字符在__flash区域里面会出现错误 ?
请教下,使用 iar avr 编译器定义字符在 flash区域里面会出现错误 ?
// 这样定义在 arm 里面是完全没有问题的
//const char *Xingqi={"星期日","星期一","星期二","星期三","星期四","星期五","星期六"};
// 现在在 iar avr 的编译器里面这样定义就会出错 ? ? ?
char__flash*Xingqi={"星期日","星期一","星期二","星期三","星期四","星期五","星期六"};
刚好看到
https://blog.csdn.net/bailyzheng/article/details/7537880
如何把常数字符串定义在flash 空间?
法一:unsigned char __flash temptab[] = {1,2,3,4,5};
法二:__flash unsigned char temptab[] = {1,2,3,4,5};
法三:#pragma type_attribute=__flash
unsigned char temptab[]={1,2,3,4,5};
法四:const unsigned char temptab[]={1,2,3,4,5};
注:第三种方式用#pragma说明后,下面的定义的变量将都在FLASH空间了,用于定义一批FLASH变量,但实际上一般只能作为常量使用了.https://cdn.jsdelivr.net/gh/hishis/forum-master/public/images/patch.gif cctv02 发表于 2021-5-14 14:11
刚好看到
https://blog.csdn.net/bailyzheng/article/details/7537880
如何把常数字符串定义在flash 空间?
你好,
貌似 如下几种定义没有使用指针,
如何把常数字符串定义在flash 空间?
法一:unsigned char __flash temptab[] = {1,2,3,4,5};
法二:__flash unsigned char temptab[] = {1,2,3,4,5};
法三:#pragma type_attribute=__flash
unsigned char temptab[]={1,2,3,4,5};
法四:const unsigned char temptab[]={1,2,3,4,5};
我目前 使用第二个方法 貌似编译时倒是可以的,只不过 data 与 code 区域都会增加空间,
__flash char *Xingqi_a={"星期日","星期一","星期二","星期三","星期四","星期五","星期六"};
但是如果改成
char__flash *Xingqi_b={"星期日","星期一","星期二","星期三","星期四","星期五","星期六"}; 这样则不行,在引用时会出错
-------------------------------
char __buf;
strcpy(__buf, Xingqi_a);// 引用时貌似是可以 OK 的,只是 data 及 code 区域都会增加空间
strcpy(__buf, Xingqi_b);// 引用时会出错, ????
-------------------------------------------------------------
如果使用 方法4,编译可以正常通过,只是 data 与 code 也都增加空间,而且 data 增加的空间比较大,avr 的单片机 data 比较宝贵呀,木有那么多的 空间给他使用,
--------------------------------------------------------------------
另外一种方法是吧 上面的字符分开
__flash char Xingqi_a[]={"星期日"};
__flash char Xingqi_b[]={"星期一"};
__flash char Xingqi_c[]={"星期二"};
__flash char Xingqi_d[]={"星期三"};
__flash char Xingqi_e[]={"星期四"};
__flash char Xingqi_f[]={"星期五"};
__flash char Xingqi_g[]={"星期六"};
只是这样的话,程序就貌似显得有点复杂啊,
大神还有没有什么其他的好方法啊 ???
本帖最后由 hpdell 于 2021-5-15 11:02 编辑
终于搞定了
// a ok
__flash char *Xingqi_a={"星期日","星期一","星期二","星期三","星期四","星期五","星期六"};这样定义,使用
strcpy(Buf, Xingqi_a); 这个函数
// b ok需要包含#include <pgmspace.h>
static __flash char hove_buff[]={"hove\0"};
strcpy_P(Buf, hove_buff);
本帖最后由 saccapanna 于 2021-5-15 13:32 编辑
__root 试试,这个要看文档。IAR ARM 是使用 __root
修改:你看看变量的地址,确定是在 Flash 中? 好吧,搞定了就好,以为是关键字用错了。在 IAR ARM 中 使用 __flash 记得是有问题的。
saccapanna 发表于 2021-5-15 13:29
__root 试试,这个要看文档。IAR ARM 是使用 __root
我不是在 iar arm 里面使用的啊,我是在 iar avr 的编译器里面使用的,静态 字符数据放在 rom 里面的话,必须使用 __flash 或者 __farflash 关键字才行,另外
使用 __flash 是占用 2字节
__farflash 是占用 3字节
页:
[1]