IAR 8051的一点分享(__code关键字)

2020-01-21 21:38发布

经过两天的摸索,终于搞清了如何用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)
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
28条回答
void_c
1楼-- · 2020-01-21 22:42
 精彩回答 2  元偷偷看……
conter
2楼-- · 2020-01-22 01:08
我现在用的7.50A,IAR网站上有7.50C,不过据说有问题,所以只是下下来了没升
昨天搜到__no_init,网上说是禁止启动时初始化变量,所以就以为不是我想要的,就没有用这种方式
http://supp.iar.com/Support/?note=41305&from=search+result
是在IAR网站里用__CODE搜到的
miraclelife
3楼-- · 2020-01-22 04:04
楼主再接再励,呵呵。

不过我一直都是这样用的
uint8 const __code Init_string[]="Initializing...";
pcwinner
4楼-- · 2020-01-22 08:44
记号。。。。。
hais
5楼-- · 2020-01-22 11:51
楼主的代码中 LDE,RST是怎样定义的?
hpdell
6楼-- · 2020-01-22 16:33
 精彩回答 2  元偷偷看……

一周热门 更多>