Přeci nejde o to, kdo bude vítěz a kdo poražený. O to mi nejde a není to předmětem diskuze. Není to zápas Sparta - Slávie.
Od okamžiku, kdy jsem napsal, že C je pro 8b MCU spíše na hraní, popudil jsem tím Martina a on vykopal válečnou sekeru. Od toho okamžiku reaguje emotivně jak býk na červený hadr na vše co napíšu aniž by si to pořádně přečetl.
Vraťme se k původní otázce tazatele:
“Jak těžký je přechod z ASM na C - je to jen další stupeň ASM, nebo je třeba úplně změnit uvažování při konstrukci programu?”
Odpověď: Je těžký a je nutné změnit uvažování při konstruci programu. Tedy pokud si s tím nechce jenom hrát. Zatímco v ASM se člověk těch 118 instrukcí naučí za chvíli, v C je toho mnohem víc a má to své záludnosti a o některých jsem už psal. Programátor ASM se musí ještě naučit elementární věci jako je aritmetika jedno i více byteová, vytvážení polí, buffferu atd. čehož je uživatel C do značné míry ušetřen. Díky tomu se o to nezajímá.
Programátor vždy řeší jen to, co vidí na obrazovce, nezajímá ho to, co je zatím jak se to přeloží. Takže když deklaruje dvourozmerné pole
int Data[10][20]
asi netuší, že je to totéž co
int Data[200]
Rozdíl je pouze ve výpočtu adresy, kdy pro n-rozmerné pole je potřeba n násobení. Programátor v ASM si toto musí odpracovat na vlastní kůži, ale za to dobře na to vidí a nekonstruuje zbytečné složitosti. Jinými slovy přemýšlení nad “ASM” je jiné než nad “C”.
Vyjádřil jsem se s určitou nadsázkou, že C je trochu jako svěrací kazajka. Je to stejné, jako když se staví dům. Lze ho postavit jen z toho, co seženu ve stavebninách. Nemohu zdít příčku 12cm tlustou, když cihla má 15cm. Pokud se rozhodnu stavět z betonu (analogie k ASM), odleju si příčku třeba 11,5cm. Když bude programátor stát před problémem, jak udělat např. pole stringů s proměnlivou délkou, céčkař je v koncích, protože pole Ansistring není v C, ale jen v C++ a mám pocit, že je to pouze výsada borlandského C++. Asmblerista má možnost se pokusit to naprogramovat v rámci vybraného MCU. Pakliže neuspěje, není ani šance pro céčkaře.
Podobné to je u dynamického přidělovaní paměti (malloc, free). To je přeci geniální řešení alokovat si paměť, když ji potřebuju a pak ji uvolnit zvláště u MCU, kde mi paměť schází. Bohužel je to tak složitý algorytmus, že si nedokážu představit, jak to na nějakém MCU s 2KB RAM bude efektivně fungovat, když nemá MMU ani DMA. Možná tak na Xmega, ale na ty si budeme muset ještě chvíli počkat. To je lepší podívat se na celý program, jestli některé proměnné nebo pole nemohou být překryvné. A tak bych mohl pokračovat do nekonačna.
Koukl jsem se na odkaz, který uvedl Martin:
mikrocontroller.net/articles … C-Tutorial
To, co se zde uvádí v příkladech, je opravdu jen na hraní. Přeci žádný rozumný programátor nemůže ani na vteřinu uvažovat o tom, že by program měl někde uvíznout v nekonečné čekací smyčce na přijetí znaku z UARTu. Takže, když nic nepříjde, tak to celý zamrzne. Takto se programy opavdu kostruovat nedají.
A nakonec ještě jednu perličku z onoho serveru.
PORTA &= ~(1 << MEINBIT); /* loescht Bit 2 an PortA */
Každý, kdo se tím profesionálně zabývá ví, že toto nemůže vždy napsat. Asmblerista by použil instrukci CBI PORTA,MEINBIT a tím je z obliga.
Pokud existuje přerušení v němž se manipuluje s PORTA, vzniká konflikt, pokud překladač to přeloží takto:
IN R16,PORTA
CBR R16,(1 << MEINBIT)
OUT PORTA,R16
Pokud příjde přerušení po 1. nebo 2. instrukce, je to stejné,jako by se nekonalo.