Über die AVR-Libraries

Die AVR Li­braries sind be­müht, mög­lichst viel Funk­tio­na­li­tät auf mög­lichst en­gem Raum, wie es im Em­bed­ded-Be­reich häu­fig er­for­der­lich ist, un­ter­zu­brin­gen. Dazu ge­hört lei­der auch die ex­pli­zi­te Ver­wen­dung von RJMP und RCALL, die auf Sprün­ge in­ner­halb 4k be­grenzt sind.

Das be­deu­tet, dass die Bib­lio­theks­ent­wi­ckler hof­fen, al­le be­nut­zen Teile ih­rer Bi­blio­thek pas­sen in 4k (ge­nau­er, es ent­ste­hen kei­ne Sprün­ge wei­ter als 4k) ob­wohl die ge­sam­te Bi­blio­thek deut­lich grö­ßer ist. Das ist, aus mei­ner An­sicht, dumm.

Ich bin re­la­tiv schnell auf die Gren­ze die­ser Phi­lo­so­phie ge­stos­sen und die Tat­sa­che, das ei­ne Bi­blio­thek ver­sagt ist extrem frus­trie­rend. Sie kos­tet je­den Ein­zel­nen den sie be­trifft Ta­ge und Wo­chen an Ar­beits­zeit um fest­zu­stel­len, dass man ei­gent­lich nichts da­ge­gen tun kann. Die Ent­wick­ler der Bi­blio­thek tra­gen da­für die Ver­ant­wor­tung, die sie dank der GPL al­ler­dings nichts kos­tet. Als Soft­ware-Ent­wick­ler ste­hen sie plötz­lich und un­er­war­tet vor der Tat­sa­che dass sich ihr (feh­ler­lo­ses) Pro­jekt nicht mehr lin­ken lässt und Sie kön­nen ge­nau nichts da­ge­gen tun!

Sie ha­ben in die­ser Si­tu­a­tion kei­ne an­de­re Mög­lich­keit als die Bi­blio­thek selbst zu er­stel­len und min­des­tens die frag­li­chen RJMP/RCALL-Be­feh­le durch JMP/CALL zu er­set­zen, al­so so et­was wie ei­nen pri­va­ten Branch der Bi­blio­thek zu er­zeu­gen. Das eli­mi­niert den Sinn ei­ner Bi­blio­thek, näm­lich dass man sich um ele­men­ta­re Funk­tio­nen nicht zu küm­mern braucht. Bug re­ports die dies be­män­geln düm­peln seit 6 Mo­na­ten oder mehr vor sich hin oh­ne dass ei­ner der Ent­wick­ler sich zu ei­ner Ent­schei­dung durch­rin­gen konn­te. In mei­nen Au­gen ha­ben die AVR-Libc-Ent­wick­ler in die­sem Punkt ein­fach kom­plett ver­sagt. Set­zen, 6!

Des­halb ha­be ich WITH_UPDATE in mei­ne Sour­cen ein­ge­fügt, da die Up­date-Funk­tion hof­fent­lich nie be­nö­tigt wird und sich die Sour­cen oh­ne sie (noch und aus pu­rem Zu­fall) mit der AVR-Libc kom­pi­lie­ren las­sen. Ich ha­be kei­ne Mög­lich­keit ge­fun­den die Rei­hen­fol­ge und da­mit die Sprung­wei­te zu den ver­link­ten Funk­tio­nen zu be­ein­flus­sen, ge­schwei­ge denn ein of­fi­zi­el­les State­ment, wie man nach ei­nem "relocation truncated to fit: R_AVR_13_PCREL" sein Pro­jekt wie­der in den Griff kriegt!