( bucko | 2023. 05. 14., v – 13:04 )

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.