搜索
bottom↓
回复: 5

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

[复制链接]

出0入0汤圆

发表于 2021-5-14 12:20:10 | 显示全部楼层 |阅读模式

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

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

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



出0入0汤圆

发表于 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变量,但实际上一般只能作为[url=]常量[/url]使用了.

出0入0汤圆

 楼主| 发表于 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[7]={"星期日","星期一","星期二","星期三","星期四","星期五","星期六"};

但是如果改成
char  __flash *Xingqi_b[7]={"星期日","星期一","星期二","星期三","星期四","星期五","星期六"};   这样则不行,在引用时会出错

-------------------------------
char __buf[4];

        strcpy(__buf, Xingqi_a[18%24]);  // 引用时貌似是可以 OK 的,只是 data 及 code 区域都会增加空间

strcpy(__buf, Xingqi_b[18%24]);  // 引用时会出错, ????

-------------------------------------------------------------
如果使用 方法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[]={"星期六"};

只是这样的话,程序就貌似显得有点复杂啊,

大神还有没有什么其他的好方法啊 ???













出0入0汤圆

 楼主| 发表于 2021-5-15 10:42:52 | 显示全部楼层
本帖最后由 hpdell 于 2021-5-15 11:02 编辑

终于搞定了
// a ok
__flash char *Xingqi_a[7]={"星期日","星期一","星期二","星期三","星期四","星期五","星期六"};  这样定义,使用

strcpy(Buf, Xingqi_a[2]); 这个函数


// b ok  需要包含  #include <pgmspace.h>
static __flash char hove_buff[]={"hove\0"};
strcpy_P(Buf, hove_buff);

出100入113汤圆

发表于 2021-5-15 13:29:44 | 显示全部楼层
本帖最后由 saccapanna 于 2021-5-15 13:32 编辑

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


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

出0入0汤圆

 楼主| 发表于 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字节
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-19 05:58

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

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