搜索
bottom↓
回复: 28

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

[复制链接]

出0入0汤圆

发表于 2009-4-18 16:54:55 | 显示全部楼层 |阅读模式
经过两天的摸索,终于搞清了如何用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 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了.....


可以定义为把常量放在RAM,或ROM,或CODE区 (原文件名:CODE设置.jpg)


库设置,库之间的区别旁边有提示 (原文件名:库设置.jpg)


输出BIN文件,不知道为啥BIN文件可以用,HEX文件下进去却没反应 (原文件名:输出文件设置.jpg)

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

知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)

出0入0汤圆

发表于 2009-4-18 18:06:45 | 显示全部楼层
const unsigned char __code array[] = {0x00,0x00,0x00,0x00,0x00};
__no_init unsigned char __code array[10];
就会放到code区了。

试了下,楼主所说,Location for constants and strings选择code,编译会出错。

楼主用哪个版本IAR?

另外,楼主是怎么搜索到这里的?
http://supp.iar.com/Support/?note=41305&from=search+result

出0入0汤圆

 楼主| 发表于 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搜到的

出0入0汤圆

发表于 2009-4-18 23:44:47 | 显示全部楼层
楼主再接再励,呵呵。

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

出0入0汤圆

发表于 2009-5-10 17:36:27 | 显示全部楼层
记号。。。。。

出0入0汤圆

发表于 2009-7-23 08:25:32 | 显示全部楼层
楼主的代码中 LDE,RST是怎样定义的?

出0入0汤圆

发表于 2010-7-2 11:58:04 | 显示全部楼层
期待总!!!

出0入0汤圆

发表于 2010-7-15 21:53:25 | 显示全部楼层
谢谢。我也正在找这个。原来也是前面加——。看来KEILC 与IAR差不多了。 位定义也基本可以兼容,用无名结构体基本可以实现KEILC下置1清0的操作,不必一定用&=和|=这些操作。

出0入0汤圆

发表于 2010-7-16 08:39:51 | 显示全部楼层
mark....

出0入0汤圆

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

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

出0入0汤圆

发表于 2010-8-18 00:17:23 | 显示全部楼层
用&=和|=这些操作,虽然麻烦 但是以后移植是方便的

出425入0汤圆

发表于 2010-10-6 08:42:38 | 显示全部楼层
我找了半天,关于code的用法

出0入0汤圆

发表于 2010-10-27 20:25:41 | 显示全部楼层
标记

出0入0汤圆

发表于 2012-1-11 18:44:05 | 显示全部楼层
等会儿试试,先去吃饭。

出0入0汤圆

发表于 2012-2-16 15:08:22 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-2-16 15:37:36 | 显示全部楼层
又学习了,多谢分享!

出0入0汤圆

发表于 2012-2-16 17:59:38 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-2-17 00:00:17 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-2-17 00:00:30 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-2-22 23:02:45 | 显示全部楼层
mark

出0入0汤圆

发表于 2013-9-9 11:55:16 | 显示全部楼层
吃饭去了

出0入0汤圆

发表于 2013-9-9 22:32:13 来自手机 | 显示全部楼层
学习一下........

出0入0汤圆

发表于 2013-11-4 17:04:25 | 显示全部楼层
mark

出0入0汤圆

发表于 2014-3-1 21:31:45 | 显示全部楼层

出0入112汤圆

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

出0入0汤圆

发表于 2014-8-11 16:18:31 | 显示全部楼层
mark

出0入0汤圆

发表于 2014-8-11 18:03:55 | 显示全部楼层
给力,终于知道iar怎么操作code了

出0入0汤圆

发表于 2014-8-17 16:06:10 | 显示全部楼层
谢谢分享,支持一下

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-7-23 10:32

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

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