Чтобы определить, почему код настолько велик в вашей конкретной цепочке инструментов, вам нужно взглянуть на сгенерированный код сборки и посмотреть, что вызывает поддержка FP, а затем посмотреть на файл карты, чтобы определить размер каждого из эти функции.
В качестве примера на Godbolt для AVR с использованием G CC 5.4.0 с -Os
(Godbolt не поддерживает STM8 или SD CC, так что это для сравнения как 8-битная архитектура) ваш код генерирует 6364 байта по сравнению с 4081 байтом для пустой функции. Таким образом, дополнительный код, необходимый для тела кода, составляет 2283 байта. Теперь, учитывая тот факт, что вы используете другой компилятор и архитектуру, они ничем не отличаются от ваших результатов. Посмотрите в сгенерированном коде (ниже) подпрограммы rcall
s, такие как __divsf3
- это то место, где будет большая часть кода, и я подозреваю, что деление FP намного больше.
roundNo(unsigned int):
push r12
push r13
push r14
push r15
mov r22,r24
mov r23,r25
ldi r24,0
ldi r25,0
rcall __floatunsisf
ldi r18,0
ldi r19,0
ldi r20,0
ldi r21,lo8(69)
rcall __subsf3
ldi r18,0
ldi r19,0
ldi r20,lo8(-8)
ldi r21,lo8(66)
rcall __divsf3
mov r12,r22
mov r13,r23
mov r14,r24
mov r15,r25
ldi r18,0
ldi r19,0
ldi r20,0
ldi r21,0
rcall __ltsf2
ldi r18,0
ldi r19,0
ldi r20,0
ldi r21,lo8(63)
sbrs r24,7
rjmp .L6
mov r25,r15
mov r24,r14
mov r23,r13
mov r22,r12
rcall __subsf3
rjmp .L7
.L6:
mov r25,r15
mov r24,r14
mov r23,r13
mov r22,r12
rcall __addsf3
.L7:
rcall __fixsfsi
mov r24,r22
mov r25,r23
pop r15
pop r14
pop r13
pop r12
ret
Вам необходимо выполнить тот же анализ кода, сгенерированного цепочкой инструментов, чтобы ответить на ваш вопрос. Без сомнения, SD CC способен генерировать список сборок и файл карты, который позволит вам точно определить, какой код и поддержка FP генерируются и связываются.
В конечном счете, хотя вы используете FP в этом случае совершенно не нужно:
int roundNo(uint16_t bit_input)
{
int s = (bit_input - ADC_MIN) ;
s += s < 0 ? -62 : 62 ;
return s / 124 ;
}
При Годболт 2283 байта по сравнению с пустой функцией. Все еще несколько большой, но проблема там, скорее всего, заключается в том, что в AVR отсутствует инструкция DIV
, поэтому она вызывает __divmodhi4
. STM8 имеет DIV
для 16-битного делителя и 8-битного делителя, поэтому он, вероятно, будет значительно меньше (и быстрее) для вашей цели.