搜索
bottom↓
回复: 11

请教大家GCC如何把中文字符串定义到FLASH区?

[复制链接]

出0入0汤圆

发表于 2007-8-16 10:30:34 | 显示全部楼层 |阅读模式
请教GCC如何把中文字符串定义到FLASH区, 比如

const unsigned char  *show_zk1[] PROGMEM={

"液晶显示一",

"液晶显示二",

"液晶显示三",

"液晶显示四",

"液晶显示五",

"液晶显示六"};

编译后怎么被定义在RAM中了.

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2007-8-16 11:34:16 | 显示全部楼层
const unsigned char str0[] PROGMEM="液晶显示一";

const unsigned char str1[] PROGMEM="液晶显示2";

const unsigned char str2[] PROGMEM="液晶显示3";

const unsigned char str3[] PROGMEM="液晶显示4";







const unsigned char  * show_zk1[] PROGMEM={  str0,str1,str2,str3};

出0入0汤圆

 楼主| 发表于 2007-8-16 11:56:25 | 显示全部楼层
谢谢ATmega32的回复,可是按照你的方式编译后报错:



myLCD-5.c:342: warning: initialization makes integer from pointer without a cast

myLCD-5.c:342: error: initializer element is not computable at load time

myLCD-5.c:344: error: initializer element is not constant

myLCD-5.c:344: error: (near initialization for `show_zk1[0]')

myLCD-5.c:344: error: initializer element is not constant

myLCD-5.c:344: error: (near initialization for `show_zk1[1]')



如何解决呢

出0入0汤圆

发表于 2007-8-16 12:31:17 | 显示全部楼层
试了下WinAVR2007+ATmega16,没问题。







#include <avr/pgmspace.h>



#define pgm8(A) (typeof((A)))pgm_read_byte(&(A))

#define pgm16(A) (typeof((A)))pgm_read_word(&(A))

#define pgm32(A) (typeof((A)))pgm_read_dword(&(A))





const unsigned char str0[] PROGMEM="液晶显示一";

const unsigned char str1[] PROGMEM="液晶显示2";

const unsigned char str2[] PROGMEM="液晶显示3";

const unsigned char str3[] PROGMEM="液晶显示4";

const unsigned char  * show_zk1[] PROGMEM={  str0,str1,str2,str3};





int main()

{

const unsigned char *p_str;

p_str=pgm16(show_zk1[0]);



while(1);

}

出0入0汤圆

 楼主| 发表于 2007-8-16 14:11:07 | 显示全部楼层
ATmega32, 我用的是WINAVR 20050214,请问在该版本中要如何定义?

出0入0汤圆

 楼主| 发表于 2007-8-16 17:27:22 | 显示全部楼层
谢谢ATmega32的指点,已经编译通过, 但现在我想用一个函数实现显示,又出现警告,除非把show_zk1定义到RAM,告警消失.麻烦你帮我

看看:

#include <avr/pgmspace.h>



#define pgm8(A) (typeof((A)))pgm_read_byte(&(A))

#define pgm16(A) (typeof((A)))pgm_read_word(&(A))

#define pgm32(A) (typeof((A)))pgm_read_dword(&(A))



const  char  *show_Buf[6];



const  char str0[] PROGMEM="液晶显示一";  

const  char str1[] PROGMEM="液晶显示2";  

const  char str2[] PROGMEM="液晶显示3";  

const  char str3[] PROGMEM="液晶显示4";  

const  char  *show_zk1[4] PROGMEM={str0,str1,str2,str3};  



void LCM_show(const char *sstr[])

{

        unsigned char i;

        for(i=0;i<4;i++)

                show_Buf=pgm16(sstr);

}



int main(void)

{

        LCM_show(show_zk1);

        while(1);

}



编译后有:



myLCD-5.c:26: warning: passing arg 1 of `LCM_show' discards qualifiers from pointer target type



在FLASH中定义的指针数组, 用函数的行参如何调用呢!

出0入0汤圆

发表于 2007-8-16 18:11:37 | 显示全部楼层
楼上的程序,在winavr2007上试,没问题。



手上没WINAVR2005。

估计是typeof()的问题。

对于一个变量A,类型是const char *

typeof(A),winavr2007得到的是const char *

而winavr2005得到是char *,少了const属性。



show_Buf=pgm16(sstr);

在WINAVR2007上没问题。

在winavr2005,应该改成

show_Buf=(const char *)pgm16(sstr);



楼上可以试下。

出0入0汤圆

 楼主| 发表于 2007-8-17 09:05:12 | 显示全部楼层
ATmega32, 按照您的方法改为show_Buf=(const char *)pgm16(sstr);



编译还是出现:



myLCD-5.c:26: warning: passing arg 1 of `LCM_show' discards qualifiers from pointer target type

出0入0汤圆

发表于 2007-8-18 10:23:57 | 显示全部楼层
void LCM_show(const char *sstr[])

改为

void LCM_show(PGM_P sstr[])

出0入0汤圆

发表于 2008-6-7 15:56:02 | 显示全部楼层
留下记号!

出0入0汤圆

发表于 2009-9-10 10:40:36 | 显示全部楼层
mark

出0入0汤圆

发表于 2013-11-18 16:20:46 | 显示全部楼层
请问,编译器GCC怎么编译 中文字符串的, 按照什么解码规则?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-8-26 18:15

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

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