搜索
bottom↓
回复: 35

C51 从Keil到IAR 我的一点小体会,和大家分享

  [复制链接]

出0入0汤圆

发表于 2013-2-28 21:42:54 | 显示全部楼层 |阅读模式
C51 从Keil到IAR

由于某些原因不能使用Keil编译51代码,所以转到IAR,发现很多地方不一样。

首先是sbit
IAR中不支持未定义,IAR中的位访问是通过位段的形式来实现的。所以在Keil中的sbit LED_POWER = P0^4;需要改为宏的形式:#define LED_POWER  P0_bit.pin5,而这里还需要头文件里做点修改,为了方便自己使用,我对P89V51RD2的头文件做了一点点改动:(看这个IO口的定义)
__sfr __no_init volatile union
{
  unsigned char P0; /* Port 0 */
  union{
    struct /* Port 0 */
    {
      unsigned char AD0 : 1;
      unsigned char AD1 : 1;
      unsigned char AD2 : 1;
      unsigned char AD3 : 1;
      unsigned char AD4 : 1;
      unsigned char AD5 : 1;
      unsigned char AD6 : 1;
      unsigned char AD7 : 1;
    };
    struct /* Port 0 */
    {
      unsigned char pin0 : 1;
      unsigned char pin1 : 1;
      unsigned char pin2 : 1;
      unsigned char pin3 : 1;
      unsigned char pin4 : 1;
      unsigned char pin5 : 1;
      unsigned char pin6 : 1;
      unsigned char pin7 : 1;
    };
  } P0_bit;
} @ 0x80;
增加了pin0到pin1的联合体内容,使得可以直接使用P0_bit.pinX的形式来访问,而不需要使用P0_bit.AD0的形式。

2.code和const
这个是最熟悉的,也很简单,只需要吧code关键字替换为const就行了。但是编译报错,说定义的常量数组太大,这是为什么。打开工程的option选项,首页右下角有个关于常量位置的设置,选择将常量放到代码空间即可。

3.寄存器位的访问
由于IAR中不支持直接的位访问,所以对于CY、TR0之类的寄存器位都要通过位段的形式来访问,好在51的寄存器不多。

4.中断函数的写法
在keil中,中断函数是如下形式
void Timer0_isr(void) interrupt 1
{
        //code
}
而在IAR中是这样
#pragma vector=timer0
__interrupt void Timer0_isr(void)
{
        //code
}
这里 __interrupt 表示Timer0_isr()是一个中断函数,#pragma vector 说明该中断函数的入口地址。


先总结道这里。还有个疑惑,难道IAR不支持位操作吗?第一次接触IAR是使用430,我还以为是因为430不支持位操作。还希望了解的朋友指点。

欢迎访问我的博客 www.elecbench.com

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

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

出0入0汤圆

发表于 2013-2-28 21:47:06 | 显示全部楼层
没用过IAR的飘过,马克一下,以后要的时候看.

出0入0汤圆

发表于 2013-3-1 00:02:33 来自手机 | 显示全部楼层
谢谢楼主的分享!

出0入0汤圆

发表于 2013-3-1 10:21:01 | 显示全部楼层
关注一下,方便以后用,谢了楼主

出0入8汤圆

发表于 2013-3-1 10:24:19 | 显示全部楼层
本帖最后由 kebaojun305 于 2013-3-1 10:25 编辑

SBIT  是keil自己扩充的关键字  不是C的标准支持的    一般操作位时  标准用法都是使用逻辑操作的。 keil的有些习惯真的很不好。  置1  使用|  清零  使用&

出0入0汤圆

发表于 2013-3-1 10:40:08 | 显示全部楼层
谢谢楼主分享.

我觉得就是先看手册. 将一些常用的知识(如:扩展关键字, 中断, 变量/结构体/联合/位域/枚举/指针类型, 堆栈结构, 调用规则, 库, 编译连接选项等等)对照确认了一下才敢使用. 还好IAR比较遵守C标准.

另外就是打开CPU头文件和常用的H文件从头到尾浏览一遍, 然后心里有数.

推荐大家看手册. 都有很详细的说明解释和例程.

同在学习路上. 共勉.

出0入0汤圆

发表于 2013-3-2 17:54:07 | 显示全部楼层

谢谢楼主的分享!

Keil的编码移植到别的都挺麻烦的

出0入0汤圆

发表于 2013-8-8 16:53:10 | 显示全部楼层
我也不能用keil51了,整备移植到IARC51上面来。有好几个版本要移植,真是悲哀啊~~

出0入0汤圆

发表于 2013-8-9 01:15:09 | 显示全部楼层
mark.......................................................

出0入0汤圆

发表于 2013-8-9 02:18:51 | 显示全部楼层
CodeVisionAVR   这个支持位操作

出0入0汤圆

发表于 2013-8-9 06:15:53 | 显示全部楼层
哈哈,樓主終於知道Keil不是規範的C了嗎?

出0入0汤圆

发表于 2013-8-9 07:46:23 | 显示全部楼层
mack  mack

出0入0汤圆

发表于 2013-8-9 08:13:59 | 显示全部楼层
暂时还用不到IAR.....

出25入12汤圆

发表于 2013-8-9 08:38:00 | 显示全部楼层
感谢楼主分享,n年前想把 keil程序移到iar下,结果倒在 第二条下,现在还是用keil

出0入0汤圆

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

出0入0汤圆

发表于 2013-11-4 17:11:34 | 显示全部楼层
移植是个痛苦的过程,,,有时觉得不如换平台,

出0入0汤圆

发表于 2013-11-4 22:34:23 | 显示全部楼层
长知识了

出0入0汤圆

发表于 2013-11-5 09:51:22 | 显示全部楼层
学习了,虽然还在用keil

出0入0汤圆

发表于 2013-11-5 22:20:35 | 显示全部楼层
从来不用C,汇编的干活

出0入0汤圆

 楼主| 发表于 2013-11-6 17:58:16 | 显示全部楼层
ywb888 发表于 2013-11-5 22:20
从来不用C,汇编的干活

呵呵,强人啦

出0入0汤圆

发表于 2013-11-6 19:26:29 | 显示全部楼层
谢谢分享

出0入0汤圆

发表于 2013-11-6 21:40:36 | 显示全部楼层
gdmgb520 发表于 2013-11-6 17:58
呵呵,强人啦

过奖,只是因为日常使用对程序执行时间要求太严格,C不适合,其实还是因为自己懒,不肯努力学习。在学校里面学的就是汇编,工作也只用汇编。

出0入0汤圆

发表于 2013-11-30 00:51:14 来自手机 | 显示全部楼层
一直对换编译器很恐惧,当初从KEIL 换到ICCAVR就痛苦了一个月

出0入0汤圆

发表于 2013-11-30 09:29:12 | 显示全部楼层
哦,原来Keil是有毛病的?我说怎么有很多人都用IAR呢~,不过我也一直用的Keil,在此学习了~

出0入0汤圆

发表于 2014-3-25 10:12:24 | 显示全部楼层
monkerman 发表于 2013-3-1 10:40
谢谢楼主分享.

我觉得就是先看手册. 将一些常用的知识(如:扩展关键字, 中断, 变量/结构体/联合/位域/枚举/ ...

请问是看什么手册?哪里有,谢谢

出0入0汤圆

发表于 2014-3-25 11:11:12 | 显示全部楼层
etjason 发表于 2014-3-25 10:12
请问是看什么手册?哪里有,谢谢

一般都在开发工具的 help 菜单里.
找到 compiler 目录. 里面就有很多编译器相关的内容.

出0入0汤圆

发表于 2014-3-25 11:19:34 | 显示全部楼层
mark。。。

出0入0汤圆

发表于 2014-3-25 16:57:19 来自手机 | 显示全部楼层
留名备用                     

出0入0汤圆

发表于 2014-3-26 14:18:47 | 显示全部楼层
monkerman 发表于 2014-3-25 11:11
一般都在开发工具的 help 菜单里.
找到 compiler 目录. 里面就有很多编译器相关的内容.  ...

哦,谢谢!好像安装目录地下也有文档说明的,用户手册什么的

出0入0汤圆

发表于 2014-3-26 16:48:50 | 显示全部楼层
对. help 其实就是本地文档的快捷方式.  

出0入0汤圆

发表于 2014-3-26 16:49:33 | 显示全部楼层
etjason 发表于 2014-3-26 14:18
哦,谢谢!好像安装目录地下也有文档说明的,用户手册什么的

对. help 其实就是本地文档的快捷方式.  

出0入0汤圆

发表于 2014-3-27 07:55:08 | 显示全部楼层
monkerman 发表于 2014-3-26 16:49
对. help 其实就是本地文档的快捷方式.

哦,明白了

出0入0汤圆

发表于 2014-3-27 09:25:56 | 显示全部楼层
不错,谢谢分享!

出0入0汤圆

发表于 2014-3-28 01:06:23 | 显示全部楼层
8051 不是有 setb p1.0 或是 clr p1.0 方式,但是 IAR 无法产生这种方式吗?

出0入0汤圆

发表于 2014-7-14 15:05:35 | 显示全部楼层
KEIL还不错,就是没有代码自动缩进,没有代码自动补全,没有查找定义(刚输入,未编译)的功能。KEIL的版本也不低了,这几个功能却一直都没有。
IAR给我的印象,代码自动缩进,排版很整齐,有完整的查找定义功能,没有代码自动补全的功能。编译后乱七八糟的文件一大堆。一个项目能达到几十兆,源文件不到一兆。

出0入0汤圆

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

本版积分规则

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

GMT+8, 2024-7-23 12:34

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

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