Êîìïèëÿòîð ÿçûêà Ñ AVR GCC Íàñòîÿùàÿ ñòàòüÿ ïðåäíàçíà÷åíà äëÿ îçíàêîìëåíèÿ ÷èòàòåëåé ñ áåñïëàòíî ðàñïðîñòðàíÿåìûì êîìïèëÿòîðîì ÿçûêà Ñ AVR GCC äëÿ ðàáîòû ñ 8-ðàçðÿäíûìè ìèêðîêîíòðîëëåðàìè ñåðèè AVR ôèðìû Atmel.
Ý
òè ìèêðîêîíòðîëëåðû ñïåöèàëüíî ñîçäàâàëèñü äëÿ ýôôåêòèâíîé ðàáîòû ñ ÿçûêàìè âûñîêîãî óðîâíÿ (èìååòñÿ 32 ðåãèñòðà, íåïîñðåäñòâåííî ðàáîòàþùèõ ñ ÀËÓ, ñïåöèàëüíûå ðåæèìû àäðåñàöèè, áîëüøîå áûñòðîäåéñòâèå âûïîëíåíèå ïî÷òè âñåõ êîìàíä â òå÷åíèå îäíîãî ïåðèîäà òàêòîâîé ÷àñòîòû è ò. ä. Áëàãîäàðÿ íàëè÷èþ ýëåêòðè÷åñêè ïåðåïðîãðàììèðóåìîé ïàìÿòè ïðîãðàìì, äëÿ âñåõ ìèêðîêîíòðîëëåðîâ ýòîãî ñåìåéñòâà âîçìîæíî âíóòðèñõåìíîå ïðîãðàììèðîâàíèå, ÷òî çíà÷èòåëüíî óñêîðÿåò ðàçðàáîòêó ñèñòåì íà èõ îñíîâå è ñíèæàåò åå ñòîèìîñòü. Òàêèì îáðàçîì, ìèêðîêîíòðîëëåðû ñåìåéñòâà AVR ìîãóò ïðèìåíÿòüñÿ â òåõ ñëó÷àÿõ, êîãäà íåîáõîäèìî ñîçäàòü ñ îäíîé ñòîðîíû, äåøåâóþ, à ñ äðóãîé ñòîðîíû, äîñòàòî÷íî ìîùíóþ ñèñòåìó.
Atmel STK 200/300  Ðîññèè äîñòóïåí ñòàðòîâûé íàáîð STK200, î÷åíü óäîáíûé äëÿ ïåðâîíà÷àëüíîãî çíàêîìñòâà ñ ñåìåéñòâîì ìèêðîêîíòðîëëåðîâ AVR. Åãî ñòîèìîñòü ñîñòàâëÿåò ïîðÿäêà $100. Òàêæå ìîæíî ïðèîáðåñòè ïî÷òè àíàëîãè÷íûé êîìïëåêò äëÿ ìèêðîêîíòðîëëåðîâ AVR-Mega, îí íàçûâàåòñÿ STK300. Îïèñàííûå â ñòàòüå ïðèìåðû îðèåíòèðîâàíû íà ïðèìåíåíèå ïëàòû STK200. Êîíå÷íî, âû ìîæåòå èçãîòîâèòü ñâîþ ñîáñòâåííóþ îòëàäî÷íóþ ïëàòó, ÷òîáû ñýêîíîìèòü äåíüãè, íàéäÿ îïèñàíèå è ñõåìó îòëàäî÷íîé ïëàòû â Èíòåðíåò, íî ìåíÿ âïîëíå óñòðîèëà ïëàòà ïðîìûøëåííîãî èçãîòîâëåíèÿ ïî ñëåäóþùèì ïðè÷èíàì: ãîòîâàÿ ïëàòà èçãîòîâëåíà ñ âûñîêèì êà÷åñòâîì è ãàðàíòèðóåò èñïðàâíóþ ðàáîòó, âêëþ÷àåò â ñåáÿ èñòî÷íèê ïèòàíèÿ, èíòåðôåéñ RS-232, âîñåìü ñâåòîäèîäîâ, 8 êíîïîê, îïåðàòèâíóþ ïàìÿòü è ò. ä.  êîìïëåêòå èìååòñÿ âñòðîåííûé ïðîãðàììàòîð, ÷òî ïîçâîëÿåò óïðîñòèòü è óñêîðèòü ðàáîòó ñ ïëàòîé. Òàêèì îáðàçîì, ïðè ïåðâîíà÷àëüíîì çíàêîìñòâå ñ ìèêðîêîíòðîëëåðàìè íåò íåîáõîäèìîñòè çàäóìûâàòüñÿ î ïðàâèëüíîñòè ìîíòàæà è ðàáîòû ýëåêòðè÷åñêîé ñõåìû, ÷òî ïîçâîëÿåò çíà÷èòåëüíî óñêîðèòü îñâîåíèå àðõèòåêòóðû è ïðîãðàììèðîâàíèÿ ìèêðîêîíòðîëëåðîâ.
ÿçûêà Ñ. Êîìïèëÿòîð ñîâìåñòèì ñî ñòàíäàðòîì ANSI, è ïîçâîëÿåò ïîëó÷èòü ïðè âêëþ÷åííîé îïòèìèçàöèè î÷åíü õîðîøèé ðåçóëüòèðóþùèé êîä. Îí ïîääåðæèâàåò ïî÷òè âñå ìèêðîêîíòðîëëåðû ñåìåéñòâà AVR, âêëþ÷àÿ Mega AVR. Êîìïèëÿòîð ìîæíî ñêà÷àòü â Èíòåðíåò ïî àäðåñó: http://www.mymich.boom.ru.
Èíñòàëëÿöèÿ êîìïèëÿòîðà Ôàéë àðõèâà AVR-GCC.ZIP ñîäåðæèò äëèííûå èìåíà ôàéëîâ, ïîýòîìó äëÿ åãî ðàñïàêîâêè ñëåäóåò èñïîëüçîâàòü ïðîãðàììó WinZip. Áîëåå òîãî, ñòðóêòóðà äèðåêòîðèé ïðè ðàñïàêîâêå äîëæíà ñîõðàíèòüñÿ.  ïðîãðàììå WinZip â äèàëîãå ðàñïàêîâêè ñëåäóåò âûáðàòü «Use folder names». Èìÿ ïàïêè äëÿ ðàñïàêîâêè ìîæíî âûáðàòü ëþáîå, êàêîå ïîíðàâèòñÿ, íàïðèìåð, C:\GCCAVR. Ïðè äàëüíåéøåì èçëîæåíèè ìàòåðèàëà, ÿ áóäó ïðåäïîëàãàòü, ÷òî âûáðàí èìåííî òàêîé ïóòü. Ïîñëå ðàñïàêîâêè àðõèâà íóæíî çàïóñòèòü ôàéë INSTALL.EXE (íàïðèìåð, äâîéíûì íàæàòèåì íà êíîïêó ìûøêè â Ïðîâîäíèêå).  ðåçóëüòàòå íà ðàáî÷èé ñòîë êîìïüþòåðà áóäåò ïîìåùåíà ïèêòîãðàììà AVR GCC. Äàëåå áóäóò ñêîìïèëèðîâàíû áèáëèîòåêè AVR-GCC. Ýòî íåîáõîäèìî äëÿ òîãî, ÷òîáû îòëàä÷èê ñìîã íàéòè èñõîäíûå êîäû áèáëèîòåê. Åñëè â äàëüíåéøåì ïðîãðàììà áóäåò ïåðåìåùàòüñÿ â äðóãóþ äèðåêòîðèþ èëè íà äðóãîé äèñê, íåîáõîäèìî áóäåò ñíîâà çàïóñòèòü INSTALL.EXE.
Êîìïèëÿöèÿ GCCtest ×òîáû ïðîâåðèòü êîìïèëÿòîð, ìîæíî âîñïîëüçîâàòüñÿ ïðèìåðàìè ïðîãðàìì GCCTEST. Îíè íàõîäÿòñÿ â ïàïêå C:\GCCAVR\GCCTEST. Òåïåðü çàïóñòèòå ïðîãðàììó, äâàæäû êëèêíóâ íà ïèêòîãðàììå AVR-GCC íà ðàáî÷åì ñòîëå. Ïåðåéäèòå â äèðåêòîðèþ GCCTEST, íàïðèìåð: CD GCCTEST
Ñíà÷àëà äàâàéòå ïîñìîòðèì íà GCCTEST1:
Êîìïèëÿòîð ÿçûêà C GCC for AVR
CD GCCTEST1
Õîòÿ ñíà÷àëà ÿ íàïèñàë íåêîòîðûå ïðîãðàììû äëÿ òåñòèðîâàíèÿ ìîåãî êîìïëåêòà STK200 íà àññåìáëåðå, ÿ âñå-òàêè õîòåë èñïîëüçîâàòü êàêîé-ëèáî ÿçûê âûñîêîãî óðîâíÿ. Ïîýòîìó ÿ ñòàë èñêàòü åãî â Èíòåðíåò, è íàøåë òàì êîìïèëÿòîð AVR-GCC. AVR-GCC ýòî àäàïòèðîâàííûé äëÿ ðàáîòû íà ïåðñîíàëüíîì êîìïüþòåðå ïîä îïåðàöèîííîé ñèñòåìîé Windows èçâåñòíûé GNU êîìïèëÿòîð
À òåïåðü ñêîìïèëèðóåì åãî: MAKE
Íà ýêðàíå ïîÿâèòñÿ ÷òî-òî ïîõîæåå íà: avr-gcc -c -g -O3 -Wall -Wstrict-prototypes -Wa,-ahlms = gcctest1.lst -mmcu = at90s8515 -I. gcctest1.c -o gcctest1.o avr-gcc gcctest1.o -Wl,-Map= gcctest1.map,—cref -
mmcu = at90s8515 -o gcctest1.elf avr-objcopy -O avrobj gcctest1.elf gcctest1.obj avrobjcopy -O srec gcctest1.elf gcctest1.rom avr-objcopy -j .eeprom —set-section-flags = .eeprom = »alloc,load» -O srec gcctest1.elf gcctest1.eep rm gcctest1.elf
Ïåðâàÿ ñòðîêà âûçîâ êîìïèëÿòîðà: îáúåêòíûé ôàéë GCCTEST1.O áóäåò ñîçäàí èç GCCTEST1.C. «-g» âêëþ÷àåò äîáàâëåíèå èíôîðìàöèè äëÿ îòëàä÷èêà, «-Wall -Wstrict-prototypes» âêëþ÷àåò áîëåå ñòðîãóþ ïðîâåðêó ñèíòàêñèñà, «mmcu = at90s8515» îïðåäåëÿåò öåëåâîé ìèêðîêîíòðîëëåð, «-Wa,-ahlms = gcctest1.lst» ïåðåñûëàåò ïàðàìåòð «ahlms = gcctest1.lst» àññåìáëåðó, êîòîðûé ñîçäàåò ëèñòèíã«-I.» Óêàçûâàåò êîìïèëÿòîðó ðàñïîëîæåíèå include ôàéëîâ. Âòîðàÿ ñòðîêà âûçîâ ëèíêåðà: GCCTEST1.Oí êîìïîíóåòñÿ â èñïîëíÿåìûé ôàéë GCCTEST1.ELF. «-Wl,-Map = gcctest1.map» óêàçûâàåò ëèíêåðó ñîçäàòü map ôàéë.  òðåòüåé ñòðîêå èç ôàéëà GCCTEST1.ELF ñîçäàåòñÿ ôàéë GCCTEST.OBJ, êîòîðûé ìîæíî îòëàæèâàòü ñ ïîìîùüþ îòëàä÷èêà AvrStudio.  ñëåäóþùèõ äâóõ ëèíèÿõ èç elf-ôàéëà ñîçäàþòñÿ ôàéëû äëÿ FLASH ïàìÿòè ïðîãðàìì (GCCTEST1.ROM) è EEPROM (GCCTEST1.EEP). Ôàéë elf ïîñëå ñîçäàíèÿ ýòèõ äâóõ ôàéëîâ óäàëÿåòñÿ. Äëÿ âîçâðàòà èç ÄÎÑ îêíà â Windows ïîñëå çàâåðøåíèÿ êîìïèëÿöèè ñëåäóåò âûïîëíèòü êîìàíäó exit. Îñòàëüíûå ïðèìåðû GCCTest ìîãóò áûòü îòêîìïèëèðîâàíû àíàëîãè÷íî GccTest1.
Îòëàäêà ïðîãðàììû ñ ïîìîùüþ AVR Studio Ñîçäàííûé OBJ-ôàéë ìîæíî îòëàæèâàòü ñ ïîìîùüþ îòëàä÷èêà AVR Studio. ß ïîëüçîâàëñÿ âåðñèåé 1.51, äëÿ áîëåå ïîçäíèõ âåðñèé âîçìîæíî íåñêîëüêî èíîå óïðàâëåíèå, îäíàêî ïðèíöèï îñòàåòñÿ íåèçìåííûì. Çàãðóçèòå îáúåêòíûé ôàéë (OBJ), âûïîëíèâ êîìàíäó ìåíþ File→Open. Åñëè âîçíèêàåò ñîîáùåíèå îá îøèáêå, âîçìîæíî, áûëà íåâåðíî âûïîëíåíà èíñòàëëÿöèÿ êîìïèëÿòîðà.  ñëó÷àå, êîãäà âñå â ïîðÿäêå, âîçíèêàåò äèàëîãîâîå îêíî, â êîòîðîì ñëåäóåò âûáðàòü òèï ìèêðîêîíòðîëëåðà, äëÿ êîòîðîãî áóäåò îñóùåñòâëÿòüñÿ îòëàäêà. Âûáåðèòå ìèêðîêîíòðîëëåð AT90S8515 è ÷àñòîòó 4 ÌÃö, è íàæìèòå ÎÊ. Òåïåðü ìû íàõîäèìñÿ ïî àäðåñó 0õ00 â íà÷àëå òàáëèöû âåêòîðîâ ïðåðûâàíèé. Íàæèìàÿ íà ïèêòîãðàììó «step over», èëè êíîïêó F10, ìû ìîæåì âûïîëíÿòü ïðîãðàììó øàã çà øàãîì ñ íóëåâîãî àäðåñà. Ìîæíî òàêæå íàéòè main() è óñòàíîâèòü òî÷êó îñòàíîâà íà ïåðâîé êîìàíäå ïðîãðàììû ñ ïîìîùüþ êíîïêè F9. Çàòåì íàæàòèåì êíîïêè F5 (Go) çàïóñêàåòñÿ ïðîãðàììà è âûïîëíÿåòñÿ äî ýòîé òî÷êè îñòàíîâà. Äàëåå ñíîâà ñëåäóåò ïîëüçîâàòüñÿ ïîøàãîâûì ðåæèìîì. Ê ñîæàëåíèþ, ïðè îòëàäêå ïîêà íåëüçÿ ïðîñìàòðèâàòü çíà÷åíèÿ ïåðåìåííûõ,
ïîýòîìó ïîëåçíåå áóäåò îòëàæèâàòü ïðîãðàììó íà àññåìáëåðå. Äëÿ ïåðåêëþ÷åíèÿ ðåæèìîâ, ñëåäóåò ïîëüçîâàòüñÿ ïèêòîãðàììîé «toggle mode» ðÿäîì ñ ðàìêîé âûáîðà ôðàãìåíòà, ñîäåðæàùåé èìÿ îòëàæèâàåìîãî ìîäóëÿ.
Çàíåñåíèå ïðîãðàììû â ìèêðîêîíòðîëëåð Äëÿ çàíåñåíèÿ ïðîãðàììû â ìèêðîêîíòðîëëåð ìîæíî èñïîëüçîâàòü ëþáîé äîñòóïíûé ïðîãðàììàòîð, íàïðèìåð, ñàìîäåëüíûé, îïèñàííûé ðàíåå â æóðíàëå «Ñõåìîòåõíèêà» ¹ 2/2002, èëè ïðîìûøëåííûé, êóïëåííûé â ìàãàçèíå, íàïðèìåð, AS-1.
Îïèñàíèå òåñòîâûõ ïðîãðàìì GccTest1: ñâåòîäèîäû íà ïëàòå STK200 (PortB) áóäóò ìèãàòü îäèí çà äðóãèì. GccTest2: òî æå ñàìîå, ÷òî è GgccTest1, íî â ïðîãðàììå èñïîëüçîâàíû ïðåðûâàíèÿ. GccTest3: íàæàòèå/îòïóñêàíèå êíîïîê 3, 4 (Port D2,D3) âêëþ÷àåò/âûêëþ÷àåò ïåðâóþ/âòîðóþ ïîëîâèíó ñâåòîäèîäîâ (PortB). Gcc-Test4: ïåðåñûëàåò «Serial Data from AVR receiced###» íà ïîñëåäîâàòåëüíûé ïîðò (9600 baud, 8 áèò, 1 ñòîï-áèò, áåç ïðîâåðêè ÷åòíîñòè) GccTest5: ïîëó÷àåò ñèìâîëû ÷åðåç ïîñëåäîâàòåëüíûé ïîðò, ñîõðàíÿåò èõ â eeprom è îòñûëàåò ñîäåðæèìîå eeprom ÷åðåç ïîñëåäîâàòåëüíûé ïîðò. GccTest6: âûïîëíåþò âû÷èñëåíèÿ ñ ïëàâàþùåé çàïÿòîé è ðå-
çóëüòàò â âèäå ñèìâîëîâ ïåðåñûëàåòñÿ ÷åðåç ïîñëåäîâàòåëüíûé ïîðò. GccTest7: ïîëó÷àåò ñèìâîëû ÷åðåç ïîñëåäîâàòåëüíûé ïîðò è îòñûëàåò â îòâåò ñòðîêó «You pressed x ...» GccTest8: ïðîñòåéøàÿ ïðîãðàììà äëÿ äåìîíñòðàöèè èñïîëüçîâàíèÿ êîíñòàíò âî flash ïàìÿòè.
Çàäàíèå òèïà ìèêðîêîíòðîëëåðà è ôîðìàòà ðåçóëüòèðóþùåãî ôàéëà Ïðèìåðû ïðîãðàìì äîëæíû ðàáîòàòü ïî÷òè íà âñåõ òèïàõ ìèêðîêîíòðîëëåðîâ ñåìåéñòâà AVR (íà íåêîòîðûõ, ïðàâäà, îòñóòñòâóåò ïîñëåäîâàòåëüíûé ïîðò, ïîýòîìó ñîîòâåòñòâóþùèå ïðîãðàììû íà íèõ íåðàáîòîñïîñîáíû). Êðàòêîå îïèñàíèå èìååòñÿ â íà÷àëå êàæäîé ïðîãðàììû. Äëÿ êîìïèëÿöèè ïðîãðàììû äëÿ äðóãîãî ìèêðîêîíòðîëëåðà, ñëåäóåò ïðîñòî èçìåíèòü ñòðîêó «MCU=» â make-ôàéëå. Íàïðèìåð, MCU = at90s8515. Ïîääåðæèâàþòñÿ óñòðîéñòâà: at90s2313, at90s2323, at90s2333, attiny22, at90s2343, at90s4433, at90s4414, at90s4434, at90s8515, at90s8535, atmega603, atmega103. Íàçâàíèå ìèêðîêîíòðîëëåðà ñëåäóåò ââîäèòü ìàëåíüêèìè áóêâàìè, êàê óêàçàíî âûøå. Ôîðìàò ðåçóëüòèðóþùåãî ôàéëà ïî óìîë÷àíèþ Motorola S. ×òîáû èçìåíèòü åãî íà ôîðìàò Intel, íåîáõîäèìûé äëÿ ðàáîòû ìíîãèõ ïðîãðàììàòîðîâ, ñëåäóåò âñòàâèòü â make ôàéë ñòðîêó: FORMAT = ihex
Cîáñòâåííûå make-ôàéëû Êîíå÷íî, âû ìîæåòå âûçûâàòü êîìïèëÿòîð è ëèíêåð âðó÷íóþ, íî ýòî íå ãîäèòñÿ äëÿ ïðîåêòîâ, èìåþùèõ áîëåå ÷åì îäèí ìîäóëü. Äëÿ ïîëíîöåííîé ðàáîòû èñïîëüçóþòñÿ make-ôàéëû. Ýòè ôàéëû îáðàáàòûâàþòñÿ êîìàíäîé MAKE, êîòîðàÿ íà îñíîâå èíôîðìàöèè â íèõ ñîâåðøàåò íåîáõîäèìûå äåéñòâèÿ. Ïðè ýòîì ïðîãðàììà «çíàåò», ÷òî, íàïðèìåð, ïðè èçìåíåíèè ôàéëà test.h, ôàéë test.c òàêæå äîëæåí áûòü ïåðåêîìïèëèðîâàí. Äëÿ ïðèìåðîâ èìåþòñÿ make-ôàéëû, äîñòàòî÷íî ñëîæíûå äëÿ ïåðâîíà÷àëüíîãî çíàêîìñòâà. Ïîýòîìó ÷àñòü èç íèõ, íå ñâÿçàííàÿ ñ êîíêðåòíûì ïðîåêòîì, ðàñïîëîæåíà îòäåëüíî â äèðåêòîðèè INCLUDE ïîä èìåíàìè make1 è make2.  êàæäîé äèðåêòîðèè ïðîåêòà èìååòñÿ òîëüêî íåáîëüøîé make-ôàéë, êîòîðûé âêëþ÷àåò â ñåáÿ ïóòè ê ýòèì ÷àñòÿì. Òàêèì îáðàçîì, äîëæíî áûòü äîñòàòî÷íî ïðîñòî àäàïòèðîâàòü ýòè make-ôàéëû äëÿ ñâîåãî ïðèìåíåíèÿ.  áîëüøèíñòâå ñëó÷àåâ íóæíî áóäåò òîëüêî ðåäàêòèðîâàòü ïåðåìåííóþ TRG. Ìèõàèë Ãîëóáöîâ e-mail:
[email protected] Ëèòåðàòóðà: http://home.arcor.de/0xdeadbeef/ index_e.htm.