ARM Cortex-M0+ a rozdil LDM a LDR

Josef Štengl ok1ced na nagano.cz
Středa Červenec 8 13:50:37 CEST 2015


Někdy nejde použít LDM instrukce pro některé typy pamětí – většinou je to HW bug, nebo nastavení MPU.
Zkuste změnit nastavení MPU pro danou preriférii na na strongly ordered nebo device, pokud to tak už nemáte.
Možná budou přístupy k periférii o něco pomalejší, ale mohlo by to dávat očekávané výsledky.
Pokud je nastaveno normal, tak se nemusí čekat na konec operace a číst něco jiného. S MPU si člověk užije spoustu zábavy :-)

A podívat se do erraty, jestli se tam o tom něco nepíše. Pokud používáte kompilátor, který podporuje výrobce čipu, tak se 
podívat do dokumentace, jestli na to není nějaká volba pro kompilátor.

LDM se používá převážně při práci se zásobníkem a poli/strukturami. Dá se ušetřit několik CPU cyklů při čtení/zápisu více 
registrů (záleží ovšem na okolnostech).

ced

Dne 8.7.2015 v 13:16 Hynek Sladky napsal(a):
> Ano, presne takto se to chova.
>
> r5 = 0x50000000
> LDR r0,[r5,#0]
> r0 = 0x685555A5 (spravna hodnota z GPIOA->MODER)
>
> r5 = 0x50000000
> r0 = 0x00000001
> LDM r5!,{r0}
> r5 = 0x50000004
> r0 = 0x00000000
>
> Prijde mi, ze LDM pouziva jiny pristup ke sbernici, takze nejde nacist hodnoty z HW registru...
>
> Hynek
>
>
> Dne 8.7.2015 12:05, Jan Waclawek napsal(a):
>>> Na procesoru STM32L05x potrebuju neprimo pristupovat k nekterym HW
>>> registrum. Cast kodu pro pristup je zapsana takto:
>>>    unsigned long *ptr;
>>>    test_send (*ptr++, 4);
>>>
>>> Tento pristup vygeneruje instrukci
>>>    LDM r5!,{r0}
>>> Vysledkem operace je vzdy hodnota 0.
>> To ste krokovali? V r5 pred instrukciou bola spravna a spravne zarovnana
>> adresa, a v pamati na tej adrese bola nenulova hodnota, a v r0 bola
>> nenulova hodnota; a po kroku bolo v r0 nula?
>>
>> wek
>
>
> _______________________________________________
> HW-list mailing list  -  sponsored by www.HW.cz
> Hw-list na list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
>


Další informace o konferenci Hw-list