[avr] optimize btoh and htob for 8-bit uc

This commit is contained in:
Bart Van Der Meerssche 2011-01-16 12:00:41 +01:00
parent 0af40cf27d
commit b224ffdf23
3 changed files with 18 additions and 29 deletions

View File

@ -128,7 +128,7 @@ uint8_t ctrlReadCharFromRxBuffer(uint8_t* pdata)
uint8_t high_hex, low_hex;
if (ctrlGetFromRxBuffer(&high_hex) && ctrlGetFromRxBuffer(&low_hex)) {
*pdata = htob(((uint16_t)high_hex << 8) + low_hex);
htob(high_hex, low_hex, pdata);
return TRUE;
}
else {
@ -165,10 +165,10 @@ uint8_t ctrlReadLongFromRxBuffer(uint32_t* pdata)
uint8_t ctrlWriteCharToTxBuffer(uint8_t data)
{
uint16_t hex;
uint8_t high_hex, low_hex;
hex = btoh(data);
if (ctrlAddToTxBuffer((uint8_t)(hex >> 8)) && ctrlAddToTxBuffer((uint8_t)hex)) {
btoh(data, &high_hex, &low_hex);
if (ctrlAddToTxBuffer(high_hex) && ctrlAddToTxBuffer(low_hex)) {
return TRUE;
}
else {

View File

@ -1,27 +1,18 @@
#include <stdint.h>
// hex to binary/byte decoding
static inline uint8_t htob(uint16_t hex)
static inline void htob(uint8_t high_hex, uint8_t low_hex, uint8_t *pbyte)
{
uint8_t low_hex = (uint8_t) hex;
uint8_t high_hex = (uint8_t) (hex >> 8);
uint8_t byte;
byte = (high_hex > 0x40) ? (high_hex & 0x0F) + 9 : high_hex & 0x0F;
byte = byte << 4;
byte |= (low_hex > 0x40) ? (low_hex & 0x0F) + 9 : low_hex & 0x0F;
return byte;
*pbyte = (high_hex > 0x40) ? (high_hex & 0x0F) + 9 : high_hex & 0x0F;
*pbyte = *pbyte << 4;
*pbyte |= (low_hex > 0x40) ? (low_hex & 0x0F) + 9 : low_hex & 0x0F;
}
// binary/byte to hex encoding
static inline uint16_t btoh(uint8_t byte)
static inline void btoh(uint8_t byte, uint8_t *phigh_hex, uint8_t *plow_hex)
{
uint8_t low_nibble = (byte & 0x0F);
uint8_t high_nibble = (byte & 0xF0) >> 4;
uint16_t hex;
hex = (high_nibble > 0x09) ? high_nibble - 9 + 0x60 : high_nibble + 0x30;
hex = hex << 8;
hex |= (low_nibble > 0x09) ? low_nibble - 9 + 0x60 : low_nibble + 0x30;
return hex;
*plow_hex = byte & 0x0F;
*plow_hex = (*plow_hex > 0x09) ? *plow_hex - 9 + 0x60 : *plow_hex + 0x30;
*phigh_hex = (byte & 0xF0) >> 4;
*phigh_hex = (*phigh_hex > 0x09) ? *phigh_hex - 9 + 0x60 : *phigh_hex + 0x30;
}

View File

@ -60,8 +60,7 @@ volatile struct time_struct time = {0, 0};
ISR(SPI_STC_vect)
{
uint8_t spi_rx, rx, tx;
uint16_t spi_tx;
uint8_t spi_rx, spi_tx, rx, tx;
DBG_ISR_BEGIN();
@ -82,7 +81,7 @@ ISR(SPI_STC_vect)
// are we in Tx mode?
if (spi_status & SPI_TRANSMIT) {
if (spi_status & SPI_HIGH_HEX) {
received_from_spi(spi_high_hex);
received_from_spi(spi_high_hex); /* actually low hex ! */
spi_status &= ~SPI_HIGH_HEX;
return;
}
@ -107,10 +106,9 @@ ISR(SPI_STC_vect)
}
}
spi_tx = btoh(tx);
spi_high_hex = (uint8_t)spi_tx;
btoh(tx, &spi_tx, (uint8_t *)&spi_high_hex); /* actually low hex ! */
spi_status |= SPI_HIGH_HEX;
received_from_spi((uint8_t)(spi_tx >> 8));
received_from_spi(spi_tx);
return;
}
@ -136,7 +134,7 @@ ISR(SPI_STC_vect)
break;
default:
if (spi_status & SPI_HIGH_HEX) {
rx = htob(((uint16_t)spi_high_hex << 8) + spi_rx);
htob(spi_high_hex, spi_rx, &rx);
uartAddToTxBuffer(rx);
}
else {