Witam,
po długim czasie znów wypadło mi "skrobnąć" małą rzecz , jednak z dużą ilością danych z AVR ( często po około 100 uint16_t ) na (uint16_t dla ModBus'a).
Kombinuję już którąś godzinę , a to deklarując zmienne jako strukturę, a to jako tablicę uint8_t , a to jawnie rzutując poszczególne bajty ...
Problem w tym iż (Atmel Studio 7.0.1645 z akt. toolchainem) produkuje kod
delikatnie mówiąc co najmniej 50 % wolniejszy niż potrzeba .
wersja [C] usiłująca na piechotę poinformować kompilator jak to ma zrobić :
produkuje taki ( z wszystkich wyprodukowanych ten jest najkrótszy ):
a oczywistą oczywistością wydaje się że powinien to być banał w rodzaju (kopiowanie uint16_t - LE na BE):
LDI XL ,Low( AdrPobrania)
LDI XH , High(AdrPobrania) ;r26:r27 to rej. wsk X
LDI ZL ,Low( AdrPrzeznaczenia)
LDI ZH , High(AdrPrzeznaczenia) ;r30:r31 to rej. wsk Z
; i lecimy ile by tego nie było
ld r24,X+ ; odwróc pierwszą parę
ld r25,X+
st Z+, r25
st Z+, r24
ld r24,X+ ; odwróc kolejną parę
ld r25,X+
st Z+, r25
st Z+, r24
itd.
Jest ktoś w stanie podpowiedzieć skuteczniejszą konstrukcję ?
Z góry dziękuję za pomoc J.P.
po długim czasie znów wypadło mi "skrobnąć" małą rzecz , jednak z dużą ilością danych z AVR ( często po około 100 uint16_t ) na (uint16_t dla ModBus'a).
Kombinuję już którąś godzinę , a to deklarując zmienne jako strukturę, a to jako tablicę uint8_t , a to jawnie rzutując poszczególne bajty ...
Problem w tym iż (Atmel Studio 7.0.1645 z akt. toolchainem) produkuje kod
delikatnie mówiąc co najmniej 50 % wolniejszy niż potrzeba .
wersja [C] usiłująca na piechotę poinformować kompilator jak to ma zrobić :
Kod: C / C++
produkuje taki ( z wszystkich wyprodukowanych ten jest najkrótszy ):
Kod: AVR assembler
a oczywistą oczywistością wydaje się że powinien to być banał w rodzaju (kopiowanie uint16_t - LE na BE):
LDI XL ,Low( AdrPobrania)
LDI XH , High(AdrPobrania) ;r26:r27 to rej. wsk X
LDI ZL ,Low( AdrPrzeznaczenia)
LDI ZH , High(AdrPrzeznaczenia) ;r30:r31 to rej. wsk Z
; i lecimy ile by tego nie było
ld r24,X+ ; odwróc pierwszą parę
ld r25,X+
st Z+, r25
st Z+, r24
ld r24,X+ ; odwróc kolejną parę
ld r25,X+
st Z+, r25
st Z+, r24
itd.
Jest ktoś w stanie podpowiedzieć skuteczniejszą konstrukcję ?
Z góry dziękuję za pomoc J.P.
