共2条
1/1 1 跳转至页
GCC,AVR 关于GCC-AVR的问题,高手请赐教!
问
刚刚下了一个GCC-AVR用,写了一个很简单的程序,用GCC-AVR编译时产生了错误,请高手赐教!
源程序:
#include <AVR/io.h>
void delay(void);
void main()
{
unsigned char i;
DDRD=0XF0;
while(1)
{
PORTD=0XEF;
delay();
for(i=0;i<4;i++)
{
PORTD <<=1;
delay();
}
}
}
void delay()
{
unsigned char i,j,k;
for(i=0;i<120;i++)
for(j=0;j<120;j++)
for(k=0;k<50;k++);
}
Makefile只修改了器件为ATMEGA8。
编译时提示错误:
In file included from main.c:1:
D:/WinAVR/bin/../lib/gcc/AVR/3.4.1/../../../../AVR/include/AVR/iom8.h:36:4: #error "Include <AVR/io.h> instead of this file."
main.c:6: warning: function declaration isn't a prototype
main.c:6: warning: return type of 'main' is not `int'
main.c: In function `main':
main.c:8: warning: implicit declaration of function `_SFR_IO8'
main.c:8: error: invalid lvalue in assignment
main.c:11: error: invalid lvalue in assignment
main.c:15: error: invalid lvalue in assignment
make.exe: *** [main.o] Error 1
把原文件包含文件改为#include <AVR/io.h>后可以编译通过,但是有提示:
main.c:6: warning: function declaration isn't a prototype
main.c:6: warning: return type of 'main' is not `int'
请高手指教,小弟感激不尽! 答 1: see:1.main.c:6: warning: function declaration isn't a prototype
void delay(void);<---------->void delay()
2.main.c:6: warning: return type of 'main' is not `int'
void main()---------------->int main(void) {;...;return 0;}
答 2: 非常感谢勇敢的心大侠,还有一些问题不懂,请赐教!刚刚一时着急写错了,原来的源文件中用#include<AVR/iom8.h>时,有错误,后来改为#include<AVR/io.h>时只是警告!
按照勇敢的心大侠的指导把前后两个delay()函数的声明都改为void delay(void)后不再有警告了,多谢!
请问第一个问题怎么解决?非常感谢! 答 3: 不用#include <AVR/iom8.h>,只要#include<AVR/io.h>因为在makefile里你会指定mcu型号,编译器会根据这个自动选择头文件 答 4: 感谢勇敢的心大侠,感谢您的回复! 答 5: 为什么 main() 一定得是 int 型,而且还要返回呢?不解
请指点 答 6: 如果你看了反汇编的话:可以看见初始化完成之后,是以?call ?? 将pc指向main的,这句话的后一句一般是rjmp $(循环),可以这样理解,对启动代码而言,main只是一个函数,如果这个函数返回,就循环,不过一般的main都是个大循环,所以正常时main是不可能返回的 答 7: 勇敢的心你的AVR学的好啊!!!
源程序:
#include <AVR/io.h>
void delay(void);
void main()
{
unsigned char i;
DDRD=0XF0;
while(1)
{
PORTD=0XEF;
delay();
for(i=0;i<4;i++)
{
PORTD <<=1;
delay();
}
}
}
void delay()
{
unsigned char i,j,k;
for(i=0;i<120;i++)
for(j=0;j<120;j++)
for(k=0;k<50;k++);
}
Makefile只修改了器件为ATMEGA8。
编译时提示错误:
In file included from main.c:1:
D:/WinAVR/bin/../lib/gcc/AVR/3.4.1/../../../../AVR/include/AVR/iom8.h:36:4: #error "Include <AVR/io.h> instead of this file."
main.c:6: warning: function declaration isn't a prototype
main.c:6: warning: return type of 'main' is not `int'
main.c: In function `main':
main.c:8: warning: implicit declaration of function `_SFR_IO8'
main.c:8: error: invalid lvalue in assignment
main.c:11: error: invalid lvalue in assignment
main.c:15: error: invalid lvalue in assignment
make.exe: *** [main.o] Error 1
把原文件包含文件改为#include <AVR/io.h>后可以编译通过,但是有提示:
main.c:6: warning: function declaration isn't a prototype
main.c:6: warning: return type of 'main' is not `int'
请高手指教,小弟感激不尽! 答 1: see:1.main.c:6: warning: function declaration isn't a prototype
void delay(void);<---------->void delay()
2.main.c:6: warning: return type of 'main' is not `int'
void main()---------------->int main(void) {;...;return 0;}
答 2: 非常感谢勇敢的心大侠,还有一些问题不懂,请赐教!刚刚一时着急写错了,原来的源文件中用#include<AVR/iom8.h>时,有错误,后来改为#include<AVR/io.h>时只是警告!
按照勇敢的心大侠的指导把前后两个delay()函数的声明都改为void delay(void)后不再有警告了,多谢!
请问第一个问题怎么解决?非常感谢! 答 3: 不用#include <AVR/iom8.h>,只要#include<AVR/io.h>因为在makefile里你会指定mcu型号,编译器会根据这个自动选择头文件 答 4: 感谢勇敢的心大侠,感谢您的回复! 答 5: 为什么 main() 一定得是 int 型,而且还要返回呢?不解
请指点 答 6: 如果你看了反汇编的话:可以看见初始化完成之后,是以?call ?? 将pc指向main的,这句话的后一句一般是rjmp $(循环),可以这样理解,对启动代码而言,main只是一个函数,如果这个函数返回,就循环,不过一般的main都是个大循环,所以正常时main是不可能返回的 答 7: 勇敢的心你的AVR学的好啊!!!
共2条
1/1 1 跳转至页
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
与电子爱好者谈读图四被打赏50分 | |
与电子爱好者谈读图二被打赏50分 | |
【FRDM-MCXN947评测】Core1适配运行FreeRtos被打赏50分 | |
【FRDM-MCXN947评测】双核调试被打赏50分 | |
【CPKCORRA8D1B评测】---移植CoreMark被打赏50分 | |
【CPKCORRA8D1B评测】---打开硬件定时器被打赏50分 | |
【FRDM-MCXA156评测】4、CAN loopback模式测试被打赏50分 | |
【CPKcorRA8D1评测】--搭建初始环境被打赏50分 | |
【FRDM-MCXA156评测】3、使用FlexIO模拟UART被打赏50分 | |
【FRDM-MCXA156评测】2、rt-thread MCXA156 BSP制作被打赏50分 |