查看: 103|回复: 1
打印 上一主题 下一主题

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

[复制链接] qrcode

7

主题

31

帖子

75

积分

注册会员

Rank: 2

积分
75
楼主
跳转到指定楼层
发表于 2013-11-30 09:38 AM | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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不支持位操作。还希望了解的朋友指点。
回复

使用道具 举报

133

主题

393

帖子

923

积分

高级会员

Rank: 4

积分
923
沙发
发表于 2013-12-5 10:59 AM | 只看该作者
谢谢!                                                                                                                                                                       
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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