hpdell 发表于 2021-5-14 12:20:10

请教下使用iar avr 编译器定义字符在__flash区域里面会出现错误 ?


请教下,使用 iar avr 编译器定义字符在 flash区域里面会出现错误 ?

// 这样定义在 arm 里面是完全没有问题的
//const char *Xingqi={"星期日","星期一","星期二","星期三","星期四","星期五","星期六"};

// 现在在 iar avr 的编译器里面这样定义就会出错 ? ? ?
char__flash*Xingqi={"星期日","星期一","星期二","星期三","星期四","星期五","星期六"};



cctv02 发表于 2021-5-14 14:11:46

刚好看到
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

hpdell 发表于 2021-5-14 15:18:20

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 10:42:52

本帖最后由 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:29:44

本帖最后由 saccapanna 于 2021-5-15 13:32 编辑

__root 试试,这个要看文档。IAR ARM 是使用 __root


修改:你看看变量的地址,确定是在 Flash 中? 好吧,搞定了就好,以为是关键字用错了。在 IAR ARM 中 使用 __flash 记得是有问题的。

hpdell 发表于 2021-5-15 20:49:03

saccapanna 发表于 2021-5-15 13:29
__root 试试,这个要看文档。IAR ARM 是使用 __root




我不是在 iar arm 里面使用的啊,我是在 iar avr 的编译器里面使用的,静态 字符数据放在 rom 里面的话,必须使用 __flash 或者 __farflash 关键字才行,另外

使用 __flash 是占用 2字节
       __farflash 是占用 3字节
页: [1]
查看完整版本: 请教下使用iar avr 编译器定义字符在__flash区域里面会出现错误 ?