Hlavní navigace

Názor k článku RISCová architektura PowerPC od Petr M - Dobře. Bylo, nebylo, před sedmi lety jsem v nové...

  • Článek je starý, nové názory již nelze přidávat.
  • 4. 8. 2016 21:40

    Petr M

    Dobře.

    Bylo, nebylo, před sedmi lety jsem v nové práci nastoupil na projekt, který měl předělat jeden produkt z end-of-life mikrokontroléru na ATXMEGA64D3. Na první pohled pohodový projekt, s novým procákem na 32MHz, ale jedno překvapení střídalo druhý. Takže pár úžasných dobrodružství:

    Absolutně bezkonkurenčním králem je u téhle řady A/D převodník, který se nabízel pro sběr dat z čidel, na potvoru nelineárních. Slibovaných 12 bitů vypadalo luxusně, ale jenom do zjištění, že má dva režimy, bipolární a unipolární. V unipolárním nula není na nule, prý schválně, kvůli kapacitním senzorům. Takže šup do bipolárního režimu proti nule, rozlišení 11 bitů. Nepochopíš.

    Reference ještě zábavnější. Čidlo mělo výstup rail-to-rail a přepočítávat kalibrace na 8b procesoru je kravina. Proč taky, když se dá u normálního MCU zapojit napájení čidel jako reference... Ne tak u AtXMEGA, kde bylo napájení 3.3V (a nešlo snížit), ale maximální napájení reference nějaký nedokrvený pyj navrhl na 2.4V. Takže srazit napájení pro čidla, šum na úrovni 3 LSB...

    No a když je tam A/D převodník, proč ho nepoužít pro rezervní analogový vstup? Interní bandgap reference 1V, tolerance... moment, žádná není, v datasheetu jenom typická hodnota bez limitů a tolerance. No schválně, kolik tipuješ, že budce mít toleranci reference u 12b ADC? Podle toho, co napsali tři týdny od dotazu, mám počítat s 10% na obě strany. Takže zase poměrně trapná situace na úrovni sundávání push-upky, že.

    Fajn byla i komunikace po UARTu, teda do okamžiku, kdy měla sestupná hrana na RxD probudit procesor pomocí přerušení. Ono na nožičce přerušení byl, ale synchronní. A jelo, jenom když byl port taktovaný. Ale požadavky na napájení jsme splňovali jenom s vypnutým oscilátorem. Jenomže pak se ten dacan při komunikaci neprobudil. Neberu si práci osobně, tak jsem mluvil o tom vývojáři jako "j" o Laelovi jenom asi tři hodiny.

    Jo, a mají perfektně řešený brownout. Žral jim 128uA, ale deklarovali, že je to "MCU s nejnižší spotřebou na trhu". A co s tím? Brownout měl tři režimy. Vypnuto, zapnuto a vzorkování. V režimu vzorkování si čuchnul k napájení po 1us na 1/128us. Atmeláci mají buďto vytříbený smlysl pro humor, nebo nikdy nečetli o ESD. Každopádně je to na kopanec do jednoho varlete.

    A když jsme u brownoutu, režim se volí pomocí fuses. A rozhodli se, že jde nastavit nezávisle pro spánek a aktivitu. Jenomže zase byli zdechlí testovat a pokud někdo nešťastnou náhodou nastavil systém tak, že spal, probudil se, něco udělal a usnul, jak to Atmeláci popisovali v whitepaperu, chtěl je kopnout i do druhýho varlete. Oni totiž svázali vzorkování brownoutu s časovačem, který připojil hodiny k jádru po startu oscilátoru a nikdo to ani nezkontroloval, ani neotestoval. Časovač expiroval asi po 0.5s a pokud bylo potřeba probouzení víc než 2x za sekundu, už to nějak nešlo...

    NVM, to byl počin, který zařadil Atmel po bok legendárního prznitele technologií, M$. Jedná se o "Non-volatile Memory Controller" a sdružuje to paměť FLASH s programem a FLASH, používanou jako EEPROM, aby ušetřili místo na čipu, fuses atd. Samozřejmě se zabývali i bezpečností, takže před zápisem do NVM je potřeba zapsat klíč do speciálního registru a během pěti instrukcí (nebo několika málo, už se přesně nepamatuju) muselo dojít k zápisu. Další bezpečnostní featura je, že pokud dojde k přístupu do NVMM během zápisu, zápis selže. Ale nějak nepochopili, že instruction fetch je taky přístup do NVM. Takže pokud běží program, nejde zapisovat do NVM. Řešením je uspat jádro a probudit přerušením. Přerušení musí být povoleno instrukci před uspáním, protože flag je v době povolení aktivní. Navíc se musí přesně stihnout odemčení, povolení přerušení a uspání v přesné sekvenci a omezeným počtem instrukcí. Ale pozor, pokud přijde přerušení z jiné periferky, zápis se nepovede, protože jádro začne číst přerušovací rutinu. Záchranou bylo to, že mají tři úrovně přerušení. Tohle jsem dal a nejvyšší a nižší při zápisu zakazoval. Jinak by modul, simulující EEPROM, musel být nejenom v assembleru, ale porušit zapouzdření všech ovladačů periferek a kecat jim do povolování přerušení...

    Jenomže zmršený brouk je jejich standard a měli snahu překonat sami sebe. Jak? Pomocí tajné zbraně, revize čipu. To takhle z výroby jednoho dne začali hlásit, že yield sletěl na 5%. Změnili revizi čipu. Změnu ADC zadali nejmenované stavební firmě, protože převodní charakteristika ADC se vlnila jak D1 u Ostravy, samozřejmě pro každý kus jinak, a vyhodili v rámci úspor jeden kalibrační registr. Tímto mistrovským tahem se z povinně zapisované adresy stala zakázaná adresa a po zápisu na ni se převodník zbláznil. Mimo to tam bylo asi jenom pět stránek nepodstatných změn, jako jsou posuny prahových napětí brownoutu, nějaký úlety v časování,... Dle technické podpory byla možnost objednat starší verze čipu, než to vyřešíme, ale nákupčí byli s objednávkou 10k kousků starší revize posláni tam, kde bych raděj viděl tým Atmelu. Dva měsíce jsme to řešili, než se produkce s novýma mrzáčkama dostala s yieldem nad 85%. Brrr.

    A tak se dá pokračovat třeba o I2C, kde je workaround "nepoužívat", protože SDA zapomněl nějaký ostrostřelec vytáhnout na nožičku a tesťák zrovna asi vyplňoval formuláře, který jsou důležitější než jeho práce. A markeťák nechal v dokumentaci původní počet rozhraní, protože to líp vypadalo. Nebo o všech dalších periferkách, mimo event systém. Na ten jsem neměl odvahu, takže nemůžu soudit.

    Jo, a tenhle znáš? Když XMEGu osolíš na 32MHz, vezme zi cca 0.8mA. Když je v RESETu, papá 1.3mA. Takže boot z měkkýho litiovýho zdroje ani náhodou, ani omylem. Brownout ho udrží v RESETu, dokud neodepíše baterku. Taky dobrej.

    Naštěstí jsem objevil na problémy s Atmelem skvělý workaround. Změnu zaměstnavatele. Teď dělám s STM32 a mám (relativně) klid.