conter 发表于 2009-4-18 16:54:55

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)

void_c 发表于 2009-4-18 18:06:45

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

conter 发表于 2009-4-18 19:33:33

我现在用的7.50A,IAR网站上有7.50C,不过据说有问题,所以只是下下来了没升
昨天搜到__no_init,网上说是禁止启动时初始化变量,所以就以为不是我想要的,就没有用这种方式
http://supp.iar.com/Support/?note=41305&from=search+result
是在IAR网站里用__CODE搜到的

miraclelife 发表于 2009-4-18 23:44:47

楼主再接再励,呵呵。

不过我一直都是这样用的
uint8 const __code Init_string[]="Initializing...";

pcwinner 发表于 2009-5-10 17:36:27

记号。。。。。

hais 发表于 2009-7-23 08:25:32

楼主的代码中 LDE,RST是怎样定义的?

hpdell 发表于 2010-7-2 11:58:04

期待总!!!

zzjsql 发表于 2010-7-15 21:53:25

谢谢。我也正在找这个。原来也是前面加——。看来KEILC 与IAR差不多了。 位定义也基本可以兼容,用无名结构体基本可以实现KEILC下置1清0的操作,不必一定用&=和|=这些操作。

wxx116zh 发表于 2010-7-16 08:39:51

mark....

wkman 发表于 2010-7-16 09:15:29

回复【7楼】zzjsql
谢谢。我也正在找这个。原来也是前面加——。看来keilc 与iar差不多了。 位定义也基本可以兼容,用无名结构体基本可以实现keilc下置1清0的操作,不必一定用&=和|=这些操作。
-----------------------------------------------------------------------

据说,用&=和|=这些操作,才是标准C的方式。。

leesuo 发表于 2010-8-18 00:17:23

用&=和|=这些操作,虽然麻烦 但是以后移植是方便的

guolun 发表于 2010-10-6 08:42:38

我找了半天,关于code的用法

10086 发表于 2010-10-27 20:25:41

标记

LCRPN 发表于 2012-1-11 18:44:05

等会儿试试,先去吃饭。

lwbjun 发表于 2012-2-16 15:08:22

mark

lechoate 发表于 2012-2-16 15:37:36

又学习了,多谢分享!

getdown 发表于 2012-2-16 17:59:38

mark

Helloeveryon 发表于 2012-2-17 00:00:17

mark

Helloeveryon 发表于 2012-2-17 00:00:30

mark

ggyyll8683 发表于 2012-2-22 23:02:45

mark

ice_fire_love 发表于 2013-9-9 11:55:16

吃饭去了

jz701209李 发表于 2013-9-9 22:32:13

学习一下........

lff1802 发表于 2013-11-4 17:04:25

mark{:smile:}

智波景严 发表于 2014-3-1 21:31:45

{:lol:}{:lol:}

xunke 发表于 2014-6-15 09:10:06

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的教程吗?

lxren 发表于 2014-8-11 16:18:31

mark

{:biggrin:}

zxchzy 发表于 2014-8-11 18:03:55

给力,终于知道iar怎么操作code了

fengshu426316 发表于 2014-8-17 16:06:10

谢谢分享,支持一下

pxq8410 发表于 2014-11-30 16:20:31

楼主分析尝试的比较全面,标记
页: [1]
查看完整版本: IAR 8051的一点分享(__code关键字)