Zarovnani v LPC11U68

Miroslav Mraz mrazik na volny.cz
Neděle Červenec 10 14:56:35 CEST 2016


Na dané architektuře tím nic neušetříte. Cortex-M0+ prostě unaligned 
access neumí, takže ať to budete dělat jak chcete, tak se to bude 
kopírovat byte po byte. Neuvádíte co používáte za překladač, 
předpokládám gcc, který to co chcete před pár léty ještě neuměl, nyní by 
s tím už problém být neměl. Mám testovací funkci

const  uint8_t  pole[] = {1,2,3,4,5,6,7,8};
static uint32_t gi;

void test (void) {
   uint8_t const* ptr = pole;
   ptr += 1; // dáme si tam lichou adresu
   gi = *(uint32_t*) ptr;
   prn << gi << EOL;
}
která pro gcc 4.7.2 skončila tak jak vy uvádíte hard fault, ve verzi 
4.9.3 už správně vypíše 0x05040302. Lze si pohrát s přepínači
-munaligned-access
-mno-unaligned-access
viz. https://gcc.gnu.org/onlinedocs/gcc/ARM-Options.html
ale pro Cortex-M0(+) -munaligned-access skončí (logicky) varováním
x.c:1:0: warning: target CPU does not support unaligned accesses
přičemž překlad proběhne úplně stejně. Nehledě na to, že takové 
přetypování je dost nečistá praktika, stejně probíhá kopírování byte po 
bytu, protože to jinak nejde. Koukněte, co překladač vyplodí za asm kód.
Pokud opravdu chcete šetřit čas při kopírování dostatečně dlouhých bloků 
dat, použijte funkci memcpy(), ta by měla být napsána inteligentně tak, 
aby si s tím poradila. Pro 3 byty je to ovšem zbytečné.

Mrazík

Dne 10.7.2016 v 13:28 Pavel Hudecek napsal(a):
> Pak vzniká problém, kde získat zarovnané fonty. Tenhle má prostě 3 B na
> řádek. Vygeneroval jsem ho v LCD vision.
>
> Cílem je šetřit RAM a čas. Je to tedy nadeklarováno jako const, takže je
> ve flash. A čas chci šetřit tak, že celý řádek se použije jako B, word,
> dword, nebo qword, podle počtu B v řádku. A dost nerad bych je při změně
> fontu kopíroval do RAM, je jí jen 36 kB a font pak může zabrat i přes
> půlku. V nejhorším tedy změním přístup na B a budou 2 fory v sobě.
>
> PH
>


Další informace o konferenci Hw-list