Elég szoftveres az észjárásod. ;) Ez nem baj, viszont a szoftveresek már 40 éve sem értették a hardvert.
Itt egy egyszerű "vegyes" awk függvény, amely eg 64 karakter hosszú (128 hex) stringbe (ami 0000ff... kezdetű), felülírja az ff-ek első 4 karakterét a little endian sorrendű crc32-vel.
function getcrc(hexstr)
{
mkcrc=("echo -n" hexstr "|xxd -r -ps -l 128 | rhash -p %c -")
mkcrc | getline crc
close(mkcrc)
crcle=( substr(crc,7) substr(crc,5,2) substr(crc,3,2) substr(crc,1,2) )
sub(/ffffffff/,crcle,hexstr)
return hexstr
}
A script az Intel HEX formátumú firmware-t látja el egyedi azonosítókkal és kulcsokkal gyártás közben.
No, akkor portoljunk egy kis assemblert is! A legutóbbi munkám egy 7 éve, két cég által gyártott termék portolása volt: Az MCU ára >2,5x lett, csak nem lehet kapni. Az analóg nyomásmérő (termékenként 4db) ára 6x lett (2€ ->12€).
A program a PIC18 család egyik tagjára készült. A kiválasztás szempontjai: SSOP28 tokozás (kisebb nem létezik és csak ez fér el), USB, >=2k RAM és lehet kapni. A kód könnyedén átírható 16 bitesre, de a PIC24 sem kapható és drágább is. Marad a beszerezhető 8 bites. A portolás alapfeltétele a legalább 1 éves gyártáshoz szükségees mcu készlet beszerzése!
A drága analóg nyomásmérők helyére egy 2€ árú integrált került, így az ADC helyett SPI+DMA használatával lehet kiolvasni.
Az USB driverbe kellett néhány utasításnyit belenyúlni, mert másik lapra kerültek a descriptorok hw pointerei. A vezérlő interfész és AES256 változatlan. Nem lévén EEPROM, a mérést engedélyező és a host azonosító kulcsok kezelése teljesen új lett és a flash-be került, az adatblokkokra meg crc. A nyomásmérők kiolvasása eldobva és újraírva az analóg -> spi miatt. A 10->24 bites adat miatt az adat interfész is megváltozott.
Az elkészült kód <8kB, amihez jön még 6kB adat/táblázat + 1,5k tesztelésre használt adat. Az utóbbi arra való, hogy a szoftver elkészülte előtt is lehessen tesztelni, mert a szoftveres kolléga építkezik. :-D
A kód mérete megfelel annak, hogy a 16, 32 és 64kB flash esetén még a legkisebb családtagba is belefér. Ti. olyan eszközzel folyik a gyártás, amit éppen sikerül beszerezni.
Felülről nézve a kód újrahasznosított része hordozható volt. A megváltozott feladat részt és a HAL-t (nevezzük így) meg kellett írni illetve módosítani. Ez C-ben sem működik másképp.
Az assembler nem arra szolgál, hogy "szétoptimalizáld" a kódot. Mindössze pontosan azt írom le, amit szeretnék csinálni. Ehhez nem kell kitekerni a C nyelv adta lehetőségeket. (Használd mindig a legfrissebb libet! - Mivan? Az USB drivert megírtam egyszer, azóta működik.) A hardvernél nem az optimalizálástól lesz gyors a kód, hiszen az idő 90%-ában nem történik semmi. Viszont nem kell rojtosra debuggolnom a szememet, hogy más mit rontott el. ;)
Ami a legfontosabb: Hardvert programozok, amit egy >500 oldalas adatlap ír le. Az assembler kódban az adatlapban szereplő a neveket használhatom és nem kell kitalálnom, hogy mire gondolt a költő vagy hogyan fogalmazta meg a C-ben leírhatatlan dolgokat., amit az adatlap ír le.
Eccerű kis makró (itt alkalmazása): Ugrótábla. A kód olvashatóbb, a tábla egy mozdulattal átírható near->far értékre, tehát az írást is megkönnyíti. Belül pedig a cjump vagy cjump2 (computed jump) hívását és a bra vagy goto használatát variálja.
JumpTbl near
JumpTo Search_First
JumpTo Search_0
JumpTo Search_F
JumpTblEnd
Másik: Gyakori 16 bites műveletek 8 bites processzorra. Ebből persze van egy csokor. Olvashatóbb, kevesebbet kell írni, kevesebbet lehet téveszteni és nagyon könnyű átírni 16 bitesre a kódot.
ldPtr16 macro Ptr, SFRpair
movlw low Ptr
movwf SFRpair, a
movlw high Ptr
movwf SFRpair+1, a
endm
Ha már van #define: Alatta a C-s förmedvény, csak azt nem értem, hogy miért nem elegendő az RB7=1. Ja, mert a bitfield az absztrakt. ;)
#define TRIGGER LATB, 7, a
...
bsf TRIGGER
LATBbits.RB7= 1
Van amikor nem teljesen lehet leírni a szerkezetet C-be, vagy a C-hez értők nem értik a processzort. Pl. egy 16 bites indexregisztert és az alsó-felső bájtját is meg tudom címezni anélkül, hogy uint16+uint8+struct+union segítségével írnám le. Ha hülyeséget írok, azt egyik compiler sem fogja észrevenni.