IAR 8051的一点分享(__code关键字)
经过两天的摸索,终于搞清了如何用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: Unable to open file 'D:\IAR Systems\Embedded Workbench 5.0 Evaluation version\8051\LIB\CLIB\cl-pli-nsic-2h16inc.r51'
上网搜,http://supp.iar.com/Support/?note=60517&from=search+result,介绍了解决办法,自建一个库.
按照上面的方法,自已建了一个,打开IAR,project->Add existing project.....,添加\安装目录\8051\config\template\project\clib\templproj.ewp,(DLIB在DLIB文件里)然后属性,按自己的要求设置一遍,比如:把Location for constants and strings设为CODE memory,然后保存编译,会生成一个新的.r51库文件,并自动保存在\8051\LIB\CLIB文件夹里面,如果找不到的话,你看下编译后生成的OUTPUT文件夹下的文件名,或者直接在CLIB里面右键-排列图标-修改时间,最后一个就是了......
最后,在属性里general options->Library configuration里选择Custom CLIB,然后在下面指定刚刚生成的.r51文件,就行了;
编译,通过;并且屏也有显示了;
用自建的库,定义程序区变量或数组的时候,__code关键定就不用写了,只需加上CONST,他就会自动存放在程序区了;
但是在写函数的时候,形参的__code关键字好像还需要加上,不然编译的时候有错误;
两天的成果,希望对大家有些许帮助;
用IAR 8051的人实在太少了,希望再用IAR的互相帮助一下......
一个人走的感觉真的很无助哇.
再次感谢miraclelife,不是他,我说不定都已经放弃IAR转向KEIL了.....
http://cache.amobbs.com/bbs_upload782111/files_14/ourdev_437764.jpg
可以定义为把常量放在RAM,或ROM,或CODE区 (原文件名:CODE设置.jpg)
http://cache.amobbs.com/bbs_upload782111/files_14/ourdev_437765.jpg
库设置,库之间的区别旁边有提示 (原文件名:库设置.jpg)
http://cache.amobbs.com/bbs_upload782111/files_14/ourdev_437767.jpg
输出BIN文件,不知道为啥BIN文件可以用,HEX文件下进去却没反应 (原文件名:输出文件设置.jpg) const unsigned char __code array[] = {0x00,0x00,0x00,0x00,0x00};
__no_init unsigned char __code array;
就会放到code区了。
试了下,楼主所说,Location for constants and strings选择code,编译会出错。
楼主用哪个版本IAR?
另外,楼主是怎么搜索到这里的?
http://supp.iar.com/Support/?note=41305&from=search+result 我现在用的7.50A,IAR网站上有7.50C,不过据说有问题,所以只是下下来了没升
昨天搜到__no_init,网上说是禁止启动时初始化变量,所以就以为不是我想要的,就没有用这种方式
http://supp.iar.com/Support/?note=41305&from=search+result
是在IAR网站里用__CODE搜到的 楼主再接再励,呵呵。
不过我一直都是这样用的
uint8 const __code Init_string[]="Initializing..."; 记号。。。。。 楼主的代码中 LDE,RST是怎样定义的? 期待总!!! 谢谢。我也正在找这个。原来也是前面加——。看来KEILC 与IAR差不多了。 位定义也基本可以兼容,用无名结构体基本可以实现KEILC下置1清0的操作,不必一定用&=和|=这些操作。 mark.... 回复【7楼】zzjsql
谢谢。我也正在找这个。原来也是前面加——。看来keilc 与iar差不多了。 位定义也基本可以兼容,用无名结构体基本可以实现keilc下置1清0的操作,不必一定用&=和|=这些操作。
-----------------------------------------------------------------------
据说,用&=和|=这些操作,才是标准C的方式。。 用&=和|=这些操作,虽然麻烦 但是以后移植是方便的 我找了半天,关于code的用法 标记 等会儿试试,先去吃饭。 mark 又学习了,多谢分享! mark mark mark mark 吃饭去了 学习一下........ mark{:smile:} {:lol:}{:lol:} void_c 发表于 2009-4-18 18:06
const unsigned char __code array[] = {0x00,0x00,0x00,0x00,0x00};
__no_init unsigned char __code arr ...
IAR 8051的教程吗? mark
{:biggrin:} 给力,终于知道iar怎么操作code了 谢谢分享,支持一下 楼主分析尝试的比较全面,标记
页:
[1]