Skip to content

Commit

Permalink
Fix uint8_t type conversion bug in 16-bit addressing
Browse files Browse the repository at this point in the history
  • Loading branch information
Ivan Prishchepa authored and tridge committed Jun 4, 2023
1 parent 91e3fb6 commit 33bf5f2
Showing 1 changed file with 21 additions and 0 deletions.
21 changes: 21 additions & 0 deletions canard.c
Original file line number Diff line number Diff line change
Expand Up @@ -1639,11 +1639,23 @@ void copyBitArray(const uint8_t* src, uint32_t src_offset, uint32_t src_len,
const uint8_t max_offset = MAX(src_bit_offset, dst_bit_offset);
const uint32_t copy_bits = (uint32_t)MIN(last_bit - src_offset, 8U - max_offset);

#if WORD_ADRESSING_IS_16BITS
/*
* (uint8_t) same as (uint16_t) in TMS320
* Mask 0xFF must be used
*/
const uint8_t write_mask = (uint8_t)((uint8_t)((0xFF00U >> copy_bits)&0xFF) >> dst_bit_offset)&0xFF;
const uint8_t src_data = (uint8_t)(((uint32_t)src[src_offset / 8U] << src_bit_offset) >> dst_bit_offset)&0xFF;

dst[dst_offset / 8U] =
(uint8_t)(((uint32_t)dst[dst_offset / 8U] & (uint32_t)~write_mask) | (uint32_t)(src_data & write_mask))&0xFF;
#else
const uint8_t write_mask = (uint8_t)((uint8_t)(0xFF00U >> copy_bits) >> dst_bit_offset);
const uint8_t src_data = (uint8_t)(((uint32_t)src[src_offset / 8U] << src_bit_offset) >> dst_bit_offset);

dst[dst_offset / 8U] =
(uint8_t)(((uint32_t)dst[dst_offset / 8U] & (uint32_t)~write_mask) | (uint32_t)(src_data & write_mask));
#endif

src_offset += copy_bits;
dst_offset += copy_bits;
Expand Down Expand Up @@ -1760,8 +1772,17 @@ CANARD_INTERNAL bool isBigEndian(void)
#else
union
{
#if WORD_ADRESSING_IS_16BITS
/*
* TMS320 has 16-bit memory addressing
* u8b[0]=u16a, u8b[1]=NOTHING
*/
uint32_t a;
uint16_t b[2];
#else
uint16_t a;
uint8_t b[2];
#endif
} u;
u.a = 1;
return u.b[1] == 1; // Some don't...
Expand Down

0 comments on commit 33bf5f2

Please sign in to comment.