经过两天的摸索,终于搞清了如何用CODE这个关键字;
一个液晶屏的驱动,片子用的STC89C516RD+,在KEIL下可以显示,在IAR下却啥也没;
苦苦摸索了两天,终于发现是数组的问题;
在KEIL下用unsigned char code array[] = {0x00,0x01,0x01};
在IAR下由于code关键字没用,所以没注意,只是声明成了const,但是最后屏上还是没显示;
在网上搜对应KEIL的CODE关键字,结果在IAR的技术笔记里(技术笔记:http://supp.iar.com/Support/Search/?ProdGroup=EW&Target=&TypeTag=TN)找到了,
但是上面说:只需把the option "Location for constants and strings = CODE memory" (在http://supp.iar.com/Support/?note=41305&from=search+result),刚开始没理解过来......糊里糊涂的LINKER里面找了一下无果,又随意翻了几个属性也没找到,只好放弃;
后来GOOGLE了半天,先是找到了__flash关键字,但是7.XX版好像没这个关键字了,编译出错;
后来终于找到了__code关键字(code前面有两个下划线!!),使用如下:
void LcmPutBMP(const unsigned char __code *puts); //形参和实参的const和__code的顺序好像还必须一致
const unsigned char __code array[]; //我开始没声明为const,但编译错误显示__code必须声明为const
void main(void)
{
LED = 0;
RST = 0;
Delay(200);
RST = 1;
Delay(200);
LcmInit();
LcmPutBMP(array);
while (1)
;
}
const unsigned char __code array[] = {0x00,0x00,0x00,0x00,0x00};
最后代码终于通过编译(debug模式下),但是屏上还是啥也没,后来我无意中用release模式,并且在网上搜到了说用mpds-code格式生成BIN(设置见下图),编译了一下,用生成的BIN文件,下进去之后,终于,字出来了,激动万分!!!
再用DEBUG模式,并且用mpds-code模式仍然没显示,郁闷;
然后我仔细对比了一下DEBUG和RELEASE的属性区别,发现他们两引用的库不一样.
这时无意中又看到了Location for constants and strings这个选项,大喜,选为CODE memory,编译,ERROR,当的一声,显示:
Error[e12]: Unable to open file 'D:IAR SystemsEmbedded Workbench 5.0 Evaluation version8051LIBCLIBcl-pli-nsic-2h16inc.r51'
上网搜,http://supp.iar.com/Support/?note=60517&from=search+result,介绍了解决办法,自建一个库.
按照上面的方法,自已建了一个,打开IAR,project->Add existing project.....,添加安装目录8051config emplateprojectclib emplproj.ewp,(DLIB在DLIB文件里)然后属性,按自己的要求设置一遍,比如:把Location for constants and strings设为CODE memory,然后保存编译,会生成一个新的.r51库文件,并自动保存在8051LIBCLIB文件夹里面,如果找不到的话,你看下编译后生成的OUTPUT文件夹下的文件名,或者直接在CLIB里面右键-排列图标-修改时间,最后一个就是了......
最后,在属性里general options->Library configuration里选择Custom CLIB,然后在下面指定刚刚生成的.r51文件,就行了;
编译,通过;并且屏也有显示了;
用自建的库,定义程序区变量或数组的时候,__code关键定就不用写了,只需加上CONST,他就会自动存放在程序区了;
但是在写函数的时候,形参的__code关键字好像还需要加上,不然编译的时候有错误;
两天的成果,希望对大家有些许帮助;
用IAR 8051的人实在太少了,希望再用IAR的互相帮助一下......
一个人走的感觉真的很无助哇.
再次感谢miraclelife,不是他,我说不定都已经放弃IAR转向KEIL了.....
可以定义为把常量放在RAM,或ROM,或CODE区
(原文件名:CODE设置.jpg)
库设置,库之间的区别旁边有提示
(原文件名:库设置.jpg)
输出BIN文件,不知道为啥BIN文件可以用,HEX文件下进去却没反应
(原文件名:输出文件设置.jpg)
昨天搜到__no_init,网上说是禁止启动时初始化变量,所以就以为不是我想要的,就没有用这种方式
http://supp.iar.com/Support/?note=41305&from=search+result
是在IAR网站里用__CODE搜到的
不过我一直都是这样用的
uint8 const __code Init_string[]="Initializing...";
一周热门 更多>