51单片机的程序移植到avr单片机应该怎样移植 注意什么问题 ?
3个回答
展开全部
如果是C语言的,有限关键字会有改变,头文件要重新写,函数的一些写法会有所改变,AVR的编译器很多,每种编译器都有自己的独特写法,要先了解编译器后在做移植,成功率会更高。 另外,先要选择好编译器,C编译器如GCC,ICC,CVAVR,IAR等,看自己选哪种编译器,汇编编译器如AVR Studio。
头文件不需要自己写,每种编译器有自带的头文件,只要#include就可以了,不过要include对。
二、51单片机(包括STC的)程序移植到AVR平台上需要注意事项
1) 头文件, 寄存器名,寄存器设置代码都是要相应修改的。
2) IO端口的位操作要做相应的调整。
3) 中断服务函数的格式也有不同,需做相应调整 。
4) 51单片机的端口寄存器复位值为1,因此作为输出端口时,即使程序中不作设置,也会输出高电平, 而AVR单片机中端口寄存 器PORTX 复位值为0, 因此51单片机的程序移植到avr单片机中时一定要注意端口初始化代码, 假设51程序中没有进行初始化,那么端口默认为高, 到了avr中,如果照搬原来的程序,端口就变成低电平,可能导致系统不能正常运行,而且不好查出来问题.
5) 由于两者对于长字节数据存放的方式不同,从地址到高地址, 51平台上依次存放高字节和低字节, AVR上依次存低字节和高字节, 所以如果程序中涉及到采用联合体或是依次访问内存地址的方法对长字节数据进行分离的话,就要注意低地址里读取的是高字节还是低字节了。比如: union UNI_2BYTE {uint dat; uchar tab[2]; }wdat;
在这个联合体wdat中, 成员dat是个占2个字节长度的整形数, 那么wdat.tab[0]表示dat的低地址的那一个字节,如果是在keil c中, 由于规定低地址存放高字节, 那么wdat.tab[0]就是dat的高字节; 如果是在IARAVR或者ICCAVR中,由于低地址存放低字节, 那么wdat.tab[0]就是dat的低字节。
头文件不需要自己写,每种编译器有自带的头文件,只要#include就可以了,不过要include对。
二、51单片机(包括STC的)程序移植到AVR平台上需要注意事项
1) 头文件, 寄存器名,寄存器设置代码都是要相应修改的。
2) IO端口的位操作要做相应的调整。
3) 中断服务函数的格式也有不同,需做相应调整 。
4) 51单片机的端口寄存器复位值为1,因此作为输出端口时,即使程序中不作设置,也会输出高电平, 而AVR单片机中端口寄存 器PORTX 复位值为0, 因此51单片机的程序移植到avr单片机中时一定要注意端口初始化代码, 假设51程序中没有进行初始化,那么端口默认为高, 到了avr中,如果照搬原来的程序,端口就变成低电平,可能导致系统不能正常运行,而且不好查出来问题.
5) 由于两者对于长字节数据存放的方式不同,从地址到高地址, 51平台上依次存放高字节和低字节, AVR上依次存低字节和高字节, 所以如果程序中涉及到采用联合体或是依次访问内存地址的方法对长字节数据进行分离的话,就要注意低地址里读取的是高字节还是低字节了。比如: union UNI_2BYTE {uint dat; uchar tab[2]; }wdat;
在这个联合体wdat中, 成员dat是个占2个字节长度的整形数, 那么wdat.tab[0]表示dat的低地址的那一个字节,如果是在keil c中, 由于规定低地址存放高字节, 那么wdat.tab[0]就是dat的高字节; 如果是在IARAVR或者ICCAVR中,由于低地址存放低字节, 那么wdat.tab[0]就是dat的低字节。
展开全部
一楼的说法基本没有错。
先要选择好编译器,C编译器如GCC,ICC,CVAVR,IAR等,看你选哪种编译器,汇编编译器如AVR Studio。
头文件不需要自己写,每种编译器有自带的头文件,你只要#include就可以了。不过要include对。
51程序(针对keil编译器)和AVR程序(上述的一些编译器,如GCC)最主要的不同:
1,因为51的io口为准双向io,所以对io口的操作不用设置io的方向,而AVR是双向io,每次对io操作,如输出输入都要对io的方向进行设置。
2,关键字不同,code是keil c51的非标准写法,如果AVR要使用常量,可以用const关键字取代。还有data关键字取消,也就是说什么data, idata,xdata,pdata都不可以使用。相对来说avr的编译器比较接近标准c。
3,51可以位操作,但是avr基本不使用位操作,因为avr可以位操作的区域比较少,所以sbit,bit什么的只有在51出现,avr不可以使用,除非你自己定义一个结构体。
4,中断的写法,这个每个编译器基本都不一样,呵呵,比如iar会使用#pragma关键字,gcc有固定的函数入口ISR(中断向量)。
avr比51强大很多,比如移植spi的程序,你可以自己写个avr的spi程序来取代,而不用像51一样io模拟。以上是我暂时能想到的比较大的区别,移植起来首先要注意的地方,如果还有疑问,你可以追问的。
先要选择好编译器,C编译器如GCC,ICC,CVAVR,IAR等,看你选哪种编译器,汇编编译器如AVR Studio。
头文件不需要自己写,每种编译器有自带的头文件,你只要#include就可以了。不过要include对。
51程序(针对keil编译器)和AVR程序(上述的一些编译器,如GCC)最主要的不同:
1,因为51的io口为准双向io,所以对io口的操作不用设置io的方向,而AVR是双向io,每次对io操作,如输出输入都要对io的方向进行设置。
2,关键字不同,code是keil c51的非标准写法,如果AVR要使用常量,可以用const关键字取代。还有data关键字取消,也就是说什么data, idata,xdata,pdata都不可以使用。相对来说avr的编译器比较接近标准c。
3,51可以位操作,但是avr基本不使用位操作,因为avr可以位操作的区域比较少,所以sbit,bit什么的只有在51出现,avr不可以使用,除非你自己定义一个结构体。
4,中断的写法,这个每个编译器基本都不一样,呵呵,比如iar会使用#pragma关键字,gcc有固定的函数入口ISR(中断向量)。
avr比51强大很多,比如移植spi的程序,你可以自己写个avr的spi程序来取代,而不用像51一样io模拟。以上是我暂时能想到的比较大的区别,移植起来首先要注意的地方,如果还有疑问,你可以追问的。
参考资料: 无
来自:求助得到的回答
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
如果是C语言的话,有限关键字会有改变,头文件要重新写,函数的一些写法会有所改变,AVR的编译器很多,每种编译器都有自己的独特写法,要先了解编译器后在做移植,成功率会更高。
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询