Z klávesnice nového autora s nickem Luke, jsem dostal zajímavý příspěvek o programování ARM mcu v assembleru. Jedná se o klasické blikání LED ale zejména oceňuji nápad a praktickou realizaci. Dosažený výsledek délky 92 bytů ukazuje, jak efektivní z hlediska délky kódu může assembler být. To neznamená, že máte zahodit překladače C - to je jen informace a námět k diskuzi!
Úvod
Hlavním důvodem vzniku tohoto článku je mé černé svědomí. Z mcu.cz sosám moudra již několik let, ale svoji trošku do mlýna jsem ještě nepřinesl. V žádném případě nejsem válečným štváčem, který rozdmýchává kouř digitální války a chce vyvolat flame. Digitální válkou myslím rozbroje mezi „pravověrnými“ Assembleristy a „odpadlíky“ Céčkaři.
Při pročítání MCU jsem narazil na zajímavý článek „O délce programu na ARM“. Jsem staromilec (assembler pro mě není jen nostalgická vzpomínka z dětství) a tak jsem se rozhodl napsat co nejmenší program pro ARM Cortex M3, který bude blikat s LED. Minimalistický program je napsán v čistém assembleru.
Platforma
Jelikož mám k dispozici kit od Keilu s STM32F103R8 včetne Ulink-me, program je napsaný v uVision4 ve volně stažitelné verzi (omezení kódu do 32kB – toto omezení velikosti nám při psaní v assembleru opravdu vadit nemusí ). Pozn Mard: Myslím že autor má tento kit.
Strukturovaný program
Jednou z nesporných výhod Céčka je jeho přirozená elegance podporující psaní strukturovaných programů, a přirozeně "nutí" dělit programy do více zdrojových a hlavičkových souborů. Tato praktická a užitečná vlastnost bohužel často assemblerovským programům chybí. Nezřídka se v nich nevyzná téměř ani autor sám (například pokud se vrátí k programu do delší době). Jelikož bych rád ukázal, že i program v assembleru může být strukturovaný a možná i přehledný, pokusil jsem se vytvořit strukturovaný projekt.
Projekt se skládá z následujících částí:
STM32F10x.s je vlastně modifikovaný (spíše promazaný) originální startup od Keilu, v zásadě to není nic jiného než tabulka návěstí pro Exception Vectors (tabulka adres přerušení).
MAIN.s obsahuje inicializaci System Tick Timer (System Tick je součástí CORE), inicializace GPIO (periferie) a nekonečná smyčka čekající na Exception od SysTicku.
SysTick_exc.s je obsluha Exception od SysTicku. Blikaní se provádí klasickou technikou tooglovaní s pinem pomocí logické funkce XOR.
STM32F103.inc obsahuje definice symbolických jmen registrů periférií
Cortex_M3.inc obsahuje definice CORE registrů mcu
Překlad
Po buildu projektu obdržíme hledaný výsledek délky přeloženého programu Code = 92. Screenshot po buildu projektu (po kliknutí uvidíte větší detail):
Návod jak program otestovat
V případě, že by měl někdo zájem si prográmek odzkoušet (součástí Keilu je i velice dobrý simulátor), doporučoval bych následující postup, který se mi osvědčil. Předpokládám nainstalované Keil uVision4 a stažený (a následně rozbalený) soubor projekt.zip obsahující zdrojový kód.
Postup 1.) Spustit uVision4 2.) „Project“ - „New uVision Project“ 3.) V okně „Create New Project“ vytvořit novou složku na Vámi žádaném umístění 4.) Název souboru je již zároveň názvem projektu, např. „Pure_asm“, a potvrdíme „SAVE“ 5.) V okně Data base vyberete požadovaný chip, „STM32F103R8“ a „OK“ 6.) Při výzvě přidat startup code zadejte „No“ 7.) Mimo uVision např. pomocí Total commanderu nakopírujte „.s“ a „.inc“ files do složky projektu 8.) V okně projektu rozklikněte složku „Target 1“ a na složku „Source group 1“, klikněte pravým tlačítkem myši a z rozbalené nabídky zvolte „Add files to Group 1 ”. Pak přidáte všechny soubory s příponou „s“ (při výběru souborů je nutné změnit filtr z „.c“ na „.s“) 9.) V okně projektu klikněte pravým tlačítkem myši na složku „Target 1“ a zadejte „New Group“ pojmenujte ji např. Include (účelem je vytvořit strukturovaný projekt) 10.) Do složky „Include“ přidáme soubory s příponou „.inc“ stejným způsobem jako jsme přidali „.s“, postupem v bodu 11.) „Projekt“ - „Build target“ (buď ikonkou na liště, nebo volbou z menu) 12.) Výsledek po buildu „Program Size: Code = 92 RO-data=236 RW-data=0 ZI-data= 512“, hurá o to mi šlo . 13.) „Debug“ „Start/Stop Debug session“ (např. ikonkou na liště), simulátor je nastaven implicitně 14.) Pokud chcete použít reálný debug mode, klikněte pravým tlačítkem myši na složku „Target 1“ „Options for target Alt+F7“ v horních záložkách vyberete „Debuger“, v horní části záložky se vybírá typ debugeru. Situaci vidíte na následujícím obrázku.
Závěr
Závěrem bych rád zdůraznil, že se jedná opravdu spíše o zajímavost než konkrétní návod jak programovat. V programu se tiše předpokládá korektní inicializace Stack Pointeru a vůbec se neřeší záloha registrů R0 a R1 při obsluze přerušení - Exception SysTick (oba tyto programátorské prohřešky se v tomto konkrétním případě nemusejí řešit, obecně jsou však naprosto kritické). Je zřejmé, že i takový moderní mikrořadič, jakým nesporně STM32F103R8 je, lze naprogramovat starým dobrým zdlouhavým způsobem za pomoci assembleru.
Odkazy
Zdrojový kód k dispozici projekt.zip. Keil překladač je ke stažení zde (musíte vyplnit údaje o sobě, aby jste získali free verzi).
Tenhle server porad nese stafetu, se kterou obetave prisel Kosta, a velice si vazim jeho prace, kterou vykonali spolu s Mardem (nejen) pro komunitu STM ARMu. Tak snad dokazeme na tuto (dnes uz vzacnou) ideu navazat.
@pako: suhlasim Fulda ma pekne veci aj preto by mali byt v clankoch, aby k nim bol pristup aj o rok, dva. To ale zalezi na nom, ak by to chcel, tak to asi davno urobi. To je asi bezne aj na inych weboch (aspon kam ja chodim). Chapem, ze tento nas redakcny system je strasny, ale skopirovat embeded code z youtube a vlozit do clanku asi nebude vyzadovat vysokoskolke vzdelanie. Na druhej strane dobra sprava, chiptron ma konecne shoubox, blahozelam. ... idem sa zaregistrovat
to joedoe: Prosim vas, zrovna Fulda ma casto zajimave prispevky, a tady uz se 14 dni web ani nehne, tak budme radi za kazdy uzitecny prispevek. Vzdyt stacilo jen pozadat autory, aby clanecek vytvorili a zpravu v chatboxu ponechat. Takhle si jen vytvarime nepratele.
@bobricius: ... asi mame rozdielny nazor na danu vec. FYI: @gripennn s tym problem nema. Fuldov prispevok nebol zmazany ale blokovany ako vas a moja sprava bola pre vas obidchoch.
Sorry ale robit clanok kvoli 3 riadkom, to nemyslite vazne. A to zmazanie Fuldoveho prispevku je uz kus vela ne? Sak jedine co na tej stranke zije je chatbox. Na novinky chodim k chiptronovi
@fulda & @bobricius: ak chcete robit odkazy na svoje aktivity, tak urobte kratky clanok a tam si dajte odkazy kam chcete. Rad vam s tym pomozem, kludne ma kontaktujte. Tento "pristup" sme tu uz riesili niekolkokrat. Dakujem
V rámci mé přirozené skromnosti vás upozorním na můj malý instructables projekt odkaz vánoční stromek s charlieplexingem. A protože jsem hodně skromnej, tak připomenu, že je součástí PCB contestu a že pro něj můžete hlasovat: odkaz
Neměl byste někdo schéma zapojení (domácí) telefonní ústředny ALPHATEL T-LINE. Po výměně akumulátoru v UPS, resp. jejím vypínaní mi asi v ústředně odešel zdroj. Děkuji.