Como reduzir o espaço de código para uma conversão de caracteres ASCII hexadecimais usando um espaço de código _small_?
Como reduzir o espaço de código para uma conversão de caracteres ASCII hexadecimais usando umpequeno espaço de código?
Em um aplicativo incorporado, tenho espaço limitado extraordinário (nota 1). Eu preciso converter bytes, de E / S serial, com os valores ASCII '0' a '9' e 'A' a 'F' para os valores hexadecimais usuais 0 a 15. Além disso, todas as outras 240 combinações, incluindo ' a 'to' f ', precisa ser detectado (como um erro).
Funções de biblioteca comoscanf(), atoi(), strtol()
estálonge muito grande para usar.
A velocidade não é um problema. O tamanho do código é o fator limitante.
Meu método atual mapeia os códigos de 256 bytes em 256 códigos, de tal forma que '0' a '9' e 'A' a 'Z' têm os valores 0 - 35.Quaisquer ideias sobre como reduzir ou abordagens diferentes são apreciadas.
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
}
Nota 1: Existem 256 instruções para código e dados constantes (1 byte data costs 1 instruction) em uma memória PIC protegida para um bootloader. Este código custa ~ 10 instruções. O ap atual precisa de uma reescrita e com apenas 1 instrução de reserva,reduzindo até 1 instrução é valioso. Eu estou passando por isso peça por peça. Também olhei para a reconstrução geral.
Notas: PIC16. Eu prefiro codificar em 'C', mas devo fazer o que for preciso. Código de montagem segue. Uma resposta rápida não é necessária.
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
[editarmelhor solução]
Otimizando a solução existente como sugerido por @GJ. Em C, executando och += 7; ch &= (~64);
ao invés dech = (ch + 7) & (~64);
salvou 1 instrução. Indo para montagem salva outro por não ter que recarregarch
dentro doif()
.