Jak zmniejszyć przestrzeń kodu dla szesnastkowej konwersji znaków ASCII przy użyciu przestrzeni kodu _small_?
Jak zmniejszyć przestrzeń kodu na szesnastkową konwersję znaków ASCII za pomocą amała przestrzeń kodu?
W aplikacji osadzonej mam nadzwyczajnie ograniczoną przestrzeń (uwaga 1). Muszę przekonwertować bajty, z seryjnych we / wy, z wartościami ASCII „0” na „9” i „A” na „F” na zwykłe wartości szesnastkowe od 0 do 15. Ponadto wszystkie pozostałe 240 kombinacji, w tym „ a 'do' f ', muszą być wykryte (jako błąd).
Funkcje biblioteczne, takie jakscanf(), atoi(), strtol()
sądaleko za duży, aby go użyć.
Prędkość nie jest problemem. Rozmiar kodu jest czynnikiem ograniczającym.
Moja obecna metoda odwzorowuje 256-bajtowe kody na 256 kodów, tak że od „0” do „9” i od „A” do „Z” mają wartości 0 - 35.Doceniane są wszelkie pomysły dotyczące zmniejszenia lub różnych podejść.
unsigned char ch = GetData(); // Fetch 1 byte of incoming data;
if (!(--ch & 64)) { // decrement, then if in the '0' to '9' area ...
ch = (ch + 7) & (~64); // move 0-9 next to A-Z codes
}
ch -= 54; // -= 'A' - 10 - 1
if (ch > 15) {
; // handle error
}
Uwaga 1: Istnieje 256 instrukcji dla kodu i stałych danych (instrukcja 1 bajt danych kosztów) w pamięci chronionej PIC dla bootloadera. Ten kod kosztuje ~ 10 instrukcji. Bieżący ap wymaga ponownego zapisu i tylko z 1 dodatkową instrukcją,zmniejszenie nawet 1 instrukcji jest cenny. Przechodzę przez to kawałek po kawałku. Przyjrzałem się także ogólnej rekonstrukcji.
Uwagi: PIC16. Wolę kodować „C”, ale muszę robić to, co trzeba. Następuje kod zespołu. Szybka odpowiedź nie jest wymagana.
if (!(--ch & 64)) {
002D:DECF 44,F 002E:BTFSC 44.6 002F:GOTO 034
ch = (ch + 7) & (~64);
0030:MOVLW 07 0031:ADDWF 44,W 0032:ANDLW BF 0033:MOVWF 44
}// endif
ch -= 54;
0034:MOVLW 36 0035:SUBWF 44,F
[edytowaćnajlepsze rozwiązanie]
Optymalizacja istniejącego rozwiązania zgodnie z sugestią @GJ. W C, wykonaniech += 7; ch &= (~64);
zamiastch = (ch + 7) & (~64);
zapisano 1 instrukcję. Przechodzenie do zgromadzenia uratowało inny, bez konieczności ponownego ładowaniach
w obrębieif()
.