初次接触GCC因此花费了我不少时间搞了半天加一个晚上终于能编译Word下载.docx
《初次接触GCC因此花费了我不少时间搞了半天加一个晚上终于能编译Word下载.docx》由会员分享,可在线阅读,更多相关《初次接触GCC因此花费了我不少时间搞了半天加一个晚上终于能编译Word下载.docx(16页珍藏版)》请在冰豆网上搜索。
记住一定要保“.c”的格式,否则没有语法显示。
之后整个界面如下所示:
我所加的代码是我随便找的,代码是马老师的SPI主机的发送和接收一个字节的程序。
(做了一点修改)
代码如下:
#include<
avr/io.h>
stdio.h>
avr/signal.h>
avr/interrupt.h>
//#defineunsignedcharuchar
#defineSIZE100
unsignedcharSPI_rx_buff[SIZE];
unsignedcharSPI_tx_buff[SIZE];
unsignedcharrx_wr_index,rx_rd_index,rx_counter,rx_buffer_overflow;
unsignedchartx_wr_index,tx_rd_index,tx_counter,SPI_ok;
unsignedchart10mscnt;
unsignedchart500mscnt;
unsignedcharsenddata;
voidmcu_ini(void)
{
unsignedchartemp;
cli();
MCUCR=0x00;
//disableallinterrupts
DDRA=0xff;
PORTA=0x00;
DDRC=0xff;
PORTC=0x00;
DDRD=0xff;
PORTD=0x00;
TCCR0=0x00;
//stop
TCNT0=0x06;
//setcount250us
OCR0=0x64;
//setcompare
TCCR0=0x02;
//starttimer
DDRB|=0xBF;
//MISO=inputandMOSI,SCK,SS=output
PORTB|=0x40;
//MISO上拉电阻有效
SPCR=0xD5;
//SPI允许,主机模式,MSB,允许SPI中断,极性方式01,1/16系统时钟速率
SPSR=0x00;
temp=SPSR;
temp=SPDR;
//清空SPI,和中断标志,使SPI空闲
SPI_ok=1;
MCUCR=0x00;
GICR=0x00;
TIMSK=0x01;
//timerinterruptsources
sei();
//re-enableinterrupts
}
//#pragmainterrupt_handlertimer0_ovf_isr:
10
SIGNAL(SIG_OVERFLOW0)
//250us
//reloadcountervalue
if(++t10mscnt>
=40)
{
t10mscnt=0;
if(++t500mscnt>
=50)
{
senddata++;
if(senddata>
=16)
senddata=0;
t500mscnt=0;
}
}
//===========================
//#pragmainterrupt_handlermaster_spi_isr:
11
SIGNAL(SIG_SPI)
{
SPI_rx_buff[rx_wr_index]=SPDR;
//从ISP口读出收到的字节
//SPI空闲
if(++rx_wr_index==SIZE)rx_wr_index=0;
//放入接收缓冲区,并调整队列指针
if(++rx_counter==SIZE)
{
rx_counter=0;
rx_buffer_overflow=1;
//接收缓冲区溢出
}
if(tx_counter)//如果发送缓冲区中有待发的数据tx_counter==0表示没有数据要发送
--tx_counter;
SPDR=SPI_tx_buff[tx_rd_index];
//发送一个字节数据,并调整指针
if(++tx_rd_index==SIZE)
tx_rd_index=0;
SPI_ok=0;
}
//----------------------------------------
unsignedchargetSPIchar(void)
unsignedchardata;
while(rx_counter==0);
//无接收数据,等待
data=SPI_rx_buff[rx_rd_index];
//从接收缓冲区取出一个SPI收到的数据
if(++rx_rd_index==SIZE)
rx_rd_index=0;
//调整指针
cli();
--rx_counter;
returndata;
//------------------------------------------
voidputSPIchar(charc)
while(tx_counter==SIZE);
//发送缓冲区满,等待
if(tx_counter||SPI_ok==0)//发送缓冲区已中有待发数据
{//或SPI正在发送数据时
SPI_tx_buff[tx_wr_index]=c;
//将数据放入发送缓冲区排队
if(++tx_wr_index==SIZE)
tx_wr_index=0;
++tx_counter;
else
SPDR=c;
//发送缓冲区中空且SPI口空闲,直接放入SPDR由SIP口发送
SPI_ok=0;
//
}
//--------------------------------------------
/*voidspi_init(void)
unsignedchartemp;
DDRB|=0xB0;
PORTB|=0xB0;
SPSR=0x80;
}*/
//---------------------------------------------------
intmain(void)
unsignedchari;
i=0;
mcu_ini();
//CLI();
//关中断
//spi_init();
//初始化SPI接口
//SEI();
//开中断
while
(1)
putSPIchar(i);
//发送一个字节
//i++;
putSPIchar(i++);
getSPIchar();
//接收一个字节(第一个字节为空字节)
//………
6、至此代码别写完成,(呵呵,抄来的,别抽我)接下来就要做编译了。
右键点击工程管理窗口的刚才新建的test工程项目,会出现一右键菜单,在点击AddFiles,添加刚才编写的test.c文件。
如果现在就心急就按F5(makeall的快捷方式)去编译的话,恐怕还不行。
否则会出现下面的提示:
出现这样的情况说明还没有完成,还需要下面的操作。
7、要顺利完成编译,还要配置一下makefile,按快捷键F6,或点击桌面(或程序里)Mfile[WinAVR],会弹出makefile文件配置对话框。
如图:
8、接下来就是要配置这个文件了。
1)点击菜单栏的Makefile的按钮,再点击“Mainfilename…”,在出现的对话框里填写test,单击OK.
2)点击Makefile->
MCUtype选择芯片类型,我这里选择了M16。
3)点击Makefile->
Outputfomat输出格式,我选择了默认。
4)点击Makefile->
Optimizationlevel优化级别,选择了默认。
5)点击Makefile->
Debugfomat调试格式,我选择了AVR-ext-COFF(AVRStudio4.07+,VMLAB3.10+)。
因为我要用AVRStudio来进行软件调试和模拟。
6)Makefile菜单下的其它选项我都选择了默认。
特别说明的是Makefile下的C/C++sourcefile(s)….这一项,对只有一个程序文件可以不用管,多个的小弟还没有试。
(^_^)
7)完成这些后就可以保存改makefile文件了,要和test.c保存到同一目录下。
配置makefile至关重要,一般情况下的编译不成功都会与他有关。
9、完成了以上这些,你就可以按F5键了,看看编译的效果吧。
>
"
make.exe"
all
--------begin--------
avr-gcc(GCC)3.4.1
Copyright(C)2004FreeSoftwareFoundation,Inc.
Thisisfreesoftware;
seethesourceforcopyingconditions.ThereisNO
warranty;
notevenforMERCHANTABILITYorFITNESSFORAPARTICULARPURPOSE.
Sizebefore:
test.elf:
sectionsizeaddr
.text6120
.data08388704
.bss2118388704
.noinit08388915
.eeprom08454144
.stab17880
.stabstr18700
Total4481
Compiling:
test.c
avr-gcc-c-mmcu=atmega16-I.-gstabs-Os-funsigned-char-funsigned-bitfields-fpack-struct-fshort-enums-Wall-Wstrict-prototypes-Wa,-adhlns=test.lst-std=gnu99-Wp,-M,-MP,-MT,test.o,-MF,.dep/test.o.dtest.c-otest.o
Linking:
test.elf
avr-gcc-mmcu=atmega16-I.-gstabs-Os-funsigned-char-funsigned-bitfields-fpack-struct-fshort-enums-Wall-Wstrict-prototypes-Wa,-adhlns=test.o-std=gnu99-Wp,-M,-MP,-MT,test.o,-MF,.dep/test.elf.dtest.o--outputtest.elf-Wl,-Map=test.map,--cref-lm
CreatingloadfileforFlash:
test.hex
avr-objcopy-Oihex-R.eepromtest.elftest.hex
CreatingloadfileforEEPROM:
test.eep
avr-objcopy-j.eeprom--set-section-flags=.eeprom="
alloc,load"
\
--change-section-lma.eeprom=0-Oihextest.elftest.eep
CreatingExtendedListing:
test.lss
avr-objdump-h-Stest.elf>
CreatingSymbolTable:
test.sym
avr-nm-ntest.elf>
ConvertingtoAVRExtendedCOFF:
test.cof
avr-objcopy--debugging--change-section-address.data-0x800000--change-section-address.bss-0x800000--change-section-address.noinit-0x800000--change-section-address.eeprom-0x810000-Ocoff-ext-avrtest.elftest.cof
Discardinglocalsymboloutsideanycompilationunit:
.do_copy_data_start
.do_copy_data_loop
.do_clear_bss_start
.do_clear_bss_loop
Sizeafter:
.text6140
Total4483
Errors:
none
--------end--------
ProcessExitCode:
0
10、至此我们已成功的编译完成了我们的项目了,Congratulations!
!