Ebben az a legszomorúbb, hogy ez nem is tizenéves processzor.
Az első probléma: Relatív ugrásnál bekövetkező IT esetén megsérülhet a stack.
A megoldás további lehetőségei:
A BRA/GOTO esetén itt a GOTO nem hosszabb tehát mindegy. Az ugrótábla előtt tiltani kell az IT-t, majd minden ágon engedélyezni. Ronda, de működik.
A BRW helyett computed jump-ot kell használni. Hosszabb, de még hordozható is.
A másodig probléma: Ping-Pong mód beállítasakor megsérülhet az USB RAM.
A megoldás oda van írva: Csak inicializálás után írjál az USB RAM-ba.
A Ping-Pong módnak egyébként sincs sok értelme. Ha egy buffer nem elég, akkor miért pont kettő igen? ;)
A megoldás egyszerű.
Az adatokat rögtön az USB RAM-ban levő bufferekbe kell írni. Ekkor elmarad az (adat buffer) -> (user buffer) -> (USB buffer) adatmozgatás. Az aktuális buffer címét a TxReport hívása előtt be kell írni a BDnADR(L,H) regiszterekbe. Ezzel kész a sokszoros Ping-Pong mód. A rossz hír: a 64kB/s sebességet ezzel sem lehet túllépni. (HID, interrupt mód, maximális 64B buffer) Persze ekkor at kell írni a fantasztikusan megkomponált drivert. ;)
A C compiler biztosan figyelembe veszi. Inkább az a baj, hogy az inicializálás sokszor a programozó feladata és nem minden eset kompatibilis a lib-ekkel. No, meg néha nem működő ostobaságokat is szokott fordítani. Éppen ezért komolyabb feladatok megoldására nem merném használni.
Jótanács: Vásárlás előtt előszor az errata-t olvasd el, ne az adatlapot! :D