Осторожно, некропост.
Я тут обнаружил, что как минимум Raisonanse C complier для STM8 генерит жуткий говнокод для стандартной конструкции переписывания 16-бит числа в 8-бит регистры. Прошу учесть, что порядок байтов для stm8 - старший, младший, порядок записи регистров имеет значение.
Итак, стандартный код на С из всех учебников
- Код: Выделить всё
unsigned int ch1Sum;
...
TIM5_CCR1H = ch1Sum >> 8;
TIM5_CCR1L = ch1Sum;
генерит вот что:
- Код: Выделить всё
;TIM5_CCR1H = ch1Sum >> 8;
LDW X,ch1Sum
CLR A
RRWA X,A
LD A,XL
LD TIM5_CCR1,A
;TIM5_CCR1L = ch1Sum;
MOV TIM5_CCR1+1,ch1Sum+1
Короче, жуть.
Переписываем так:
- Код: Выделить всё
unsigned int ch1Sum;
...
TIM5_CCR1H = ((u8*)&ch1Sum)[0];
TIM5_CCR1L = ch1Sum;
Получаем адекватные 2 MOVa:
- Код: Выделить всё
;TIM5_CCR1H = ((u8*)&ch1Sum)[0];
MOV TIM5_CCR1,ch1Sum
;TIM5_CCR1L = ch1Sum;
MOV TIM5_CCR1+1,ch1Sum+1
И аналогично в обратную сторону:
- Код: Выделить всё
unsigned int uSonicRange;
...
((unsigned char *)&uSonicRise)[0] = TIM1_CCR2H;
((unsigned char *)&uSonicRise)[1] = TIM1_CCR2L;