Dobrý, ale dost tomu chybí jedna věc: popis pamětí a adresování.
Ono se to jednak nabízí někde, kde se vychází z x51, ale taky proto, že je to 16b potvora s až 768kB FLASH + RAM + SFR (na to je 16b GPR málo) a u JMPS je zmínka, že dovoluje jako jediná skok na jiný segment. Ale kde se bere číslo segmentu? Jak se odliší RAM od FLASH při natahování čísla do registru? Atd.
Bez toho to prostě nějak není kompletní... :(
Trošku jsem doplnil druhou kapitolu (poslední odstavec):
https://www.root.cz/clanky/mikroradice-a-dsp-spolecnosti-infineon-sestnactibitove-cipy-c166-a-xc166/#k02
A taky kapitolu o adresování:
https://www.root.cz/clanky/mikroradice-a-dsp-spolecnosti-infineon-sestnactibitove-cipy-c166-a-xc166/#k09
Není tam všechno, například chybí EXTxx instrukce + možnost obejít DPP, ale o těch se ještě zmíním. Ale na úvod, jak se to řeší, by to doufám mohlo stačit.
No stejně, řešení přes ty bázové registry je asi fajn, ale neřeší problém s polem, které překročí rozsah 14 bitů že? Řekněme že mám pole a[100000] a budu k prvkům přistupovat normálně přes pointer ve smyčce s ++ toho pointeru. To se asi přeloží na [Rw+], což je sice fajn, ale jak se řeší přetečení na té hranici? Určitě se DPPx nezvýší, to by rozbilo ostatní kód... Nebo si překladač všechny DPPx připraví pěkně za sebe, aby mu to vycházelo? to by bylo prudce elegantní...
No u všech podobných řešení narazíš na podobný problém (pamatuje někdo segmantaci v DOSu? :-). Automaticky na úrovni překladače to moc řešené není pro dynamická pole, pro pole statická se nějaká základní podpora dá řešit. Teď nevím, jak řeší porovnávání ukazatelů, tam taky může být problém (opět viz DOS...)
Ale obecně - je to pořád "jen" šestnáctibitový šváb, sice má adresování báze+offset, ale to z něj nedělá švába s unifikovanou 24bitovou adresou.
V automotive aplikacich neni ani jedno problemem, tedy pokud se koukam do kodu co je v ridicich jednotkach. Dynamicka pole se temer nevyskytuji (nebo jsou hodne mala), staticka resi prekladac, resp. linker. Ono ty C167ky maji u sebe stejne vzdycky tragicky malo pameti (128k-1MB flash, max 64kB RAM, bootrom 32k, apod.). Vykon neni tak oslnivy, aby si tam mohli dovolit delat taskarice typu prepocitavani nejakych pointeru a dynamickou alokaci.
Vlastne cely SW v ECU je jen obrovske mnozstvi primych nebo zpetnovazebnich fci, ktere neustale lookupuji nejake hodnoty v tabulkach.
Zajimave je pouziti DPPx, kdy v ECU jsou lidove receno "mapy" (kalibracni data) a pro ruzne rezimy a nastaveni jsou ve flash u nekolik atypu ECU namapovany tak, aby offset zustal stejny, jen se meni DPP.
Tragicky málo paměti je 128 bajtů RAM. Ale 64 KB on-chip RAM???
Dynamická alokace v embedded?? K tomu se při auditu kódu dávají tři červené vykřičníky do protokolu a autor takového řešení je zván na bešprechung. Týká se to snad jen juniorů a ještě jsem nezažil, že by si to některý dokázal obhájit.
Automatická alokace bývá příliš náročná na prostředky, ruční je zas náchylná k chybám a obtížně testovatelná. Chybí-li MPU, což je v embedded obvyklé, je to brána k obrovským průšvihům.
Je-li součástí systému i nějaká flash s nějakým filesystemem, platí pro ni totéž - čtení je ok, zápis z vůle firmware do existující struktury znamená minimálně poznámku o zanedbatelném dopadu z hlediska tearingu, dynamická změna struktury je červený vykřičník.
No jo, je jina doba ... jsou motorovky i s 8MB flash, co na to dodat. Vsude bezi OSEK, data se duplikuji ruzne po flashce jak je zrovna nekdo potreboval, atd. V nejbeznejsich starych EDC16kach (PowerPC) je bezne 28+32k RAM a je skoro cela plna! K tomu ~ 1,5MB flash (0,5 on chip, 1MB mimo).
Trosku jsem premyslel, ze bych jako takove anti-retro udelal rizeni motoru na nejakem dospelem pocitaci (jako vylozene x86 ;-) ). Pracovne to jinak mam na obycejnem PICu, utoci to do cca 10k rpm (motorka).
S tema C166 (resp. C167) od Siemensu jsem mel tu smulu delat a bylo to v dobe, kdy zrejme RISC dobublal do hajemstvi marketingu jako aktualni buzzword, takze v dokumentaci se to oslavama RISCu jen hemzilo, pravda, moc mi to coby uzivateli RISCovy nepripadalo.
Kurizoni byla situace s kompilatorem. Byl pro to port gcc a binutils od nejaky firmy "Copyright (c) 1991-95 Hightec EDV-Systeme GmbH D-66386 St.Ingbert". Ti to ovsem nedodavali se zdrojakama, jen za prachy klozet a mam dojem, ze je pak nekdo za to pranyroval. Myslim, ze to nakonec dopadlo spatne tj. tak, ze to misto otevreni zrusili a delali mrtvy brouky.
Kdyby mel nekdo zajem aspon o ty binarky, tak je jeste na disku mam.
Pro zajemce o kupu staryho hnoje, diskuse k tematu a nadherny tiskovy prohlaseni k porusovani GPL jsou zde:
https://www.motherboardpoint.com/threads/download-location-for-hightec-c167-compiler.89150/
http://web.archive.org/web/20031028004046/http://www.hitex.co.uk/newsletter0603/gnuc166.html
Ten procesor ma vubec spoustu zajimavosti. Napriklad instrukce ATOMIC, kdy nekolik nasledujich intrukci je vykonano bez preruseni a bez manipulace s povolenim preruseni
Nebo vlastnost, kdy registry vlastne "nejsou" registry, ale je jsou mapovany do casti vnitrni pameti, stejne jako bity boolovskeho procesoru. V pripade prepnuti kontextu tak neni nutne ukladat stav registu, ale pouziji se jine. Je mozne pouzit tolik sad registru jako je pameti, do ktere se daji umistit (neni to cela RAM)
PS: u obou techto vlastnosti si nejsem jis, ze je to soucasti puvdni architektury nebo jde o rozsireni ST10 rady od ST
Mrkněte na https://www.ehitex.de/en/starter-kits/for-xc166/ Myslím, že i Infineon na ně odkazuje jako na svého distributora. Ovšem je to docela raketa za obstarožní XC166.
Já osobně bych šel cestou ECU z nějakého vrakoviště (cca 1500 ~ 2500CZK kus), problém s těmito ECU je, že třeba ty od Bosche (ME7/EDC15) jsou často ASIC s C166 jádrem a externí flash pamětí. U dalších typů motorových ECU s C166 jádrem netuším, jaká je hardwarová konfigurace. Na internetu je spousta návodů jak se do těch ECU dostat ať už přes CAN, KLINE nebo bootstrap, takže jako netradiční vývojový kit je to použitelné.
Tyto MCU stejne jako PPC a TriCore jsou docela blbe sehnatelne, resp. drahe pro nejake bastleni. Opravdu nejlevnejsi je vzit nejakou existujici ECU, k tomu si koupit KKL kabel. SCI0 je napojen na K-Line dane ECU, kdyz zkratujete prislusne pady na vyvolani bootmode, tak normalne po K-Line do toho jde nasypat jednoduchy bootstrap kod, ktery treba nacte do RAMky dalsi ... a to se da normalne pouzivat.
Ty boschacke (EDC15/ME7) jsou podle me standardni C167CS/SR ci jak se to jmenuje, akorat je v ROM boot kod, jinak se to *dle meho nazoru* nelisi. ASIC je vedle procesoru.
Infineon to ma dost drahy, ale teoreticky (ciste teoreticky) by mohl poslat vzorek devkitu. Aspon Motorola to dela. Pokud jsi ciste nahodou student nebo jeste lepe treba odborny asistent, tak to je (u Motoroly) na 100%, ze neco poslou a jeste se za cas ozvou, jestli nepotrebujes dalsi novejsi kousky.