Bueno el FreeRTOS no sólo es un ejemplo de sumas y restas, pero aún así esos ejemplos ayudan a entender que está mas relacionado con las librerías.
El problema es usar números flotantes en un sistema que no cuenta con el hardware es que el binario va incrementarse bastante. En un determinado caso podrías optar por enteros y puntos fijos.
Lo que no sé es porque del uso del stdio.h, cuales funciones estas usando. Para manejar cadenas uso string.h y las funciones sprintf y strlen pero sólo me aumenta alrededor de 2K,o un poco menos,el tamaño del binario.
Así por ejemplo, con -Os, agregando, UART, sprintf y strlen
void StartDefaultTask(void const * argument)
{
/* USER CODE BEGIN StartDefaultTask */
/* Infinite loop */
for(;;)
{
HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13);
HAL_UART_Transmit
(&huart3
,(uint8_t *) &data
[0],strlen(data
),100); osDelay(1000);
}
/* USER CODE END StartDefaultTask */
}
Tenemos que el tamaño del binario es de
text 9304 bytes
data 128 bytes
Total 9432 bytes
Nota: Recuerda que estoy usando las HAL y no las LL
Ahora declaro un float con el valor de pi y lo mando a imprimir a la consola
void StartDefaultTask(void const * argument)
{
/* USER CODE BEGIN StartDefaultTask */
/* Infinite loop */
for(;;)
{
HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13);
sprintf(data
,"Hello World float %f %d %s\n",pi
,strlen(data2
),data2
); HAL_UART_Transmit
(&huart3
,(uint8_t *) &data
[0],strlen(data
),100); osDelay(1000);
}
/* USER CODE END StartDefaultTask */
}
text 10224
data 132
Total 10356 bytes
Si ya comienzas a hacer algo más complejo que imprimir esto puede incrementarse dependiendo de las funciones que usemos.
pi2 = 2.0*pi;
sprintf(data
,"Hello World float %f %d %s\n",pi2
,strlen(data2
),data2
);
text 10784
data 132
pi2 = 2.0*pi;
pi2 = pi2 + 3.16;
text 10976
data 132
Y en definitiva la división es lo que ocupa más
pi2 = 2.0*pi;
pi2 = pi2 + 3.16;
pi2 /= 10.45678;
text 12064
data 132
Entonces ahí viene el hecho de que todo se puede optimizar, por ejemplo que pasaría si cambio
HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13);
Por
GPIOC->ODR ^= GPIO_PIN_13;
text 12056
data 132
Así de pronto ya te quitaste 8 bytes de encima.
Otro más
pi2 = 3.16 + 2.0*pi;
pi2 /= 10.45678;
text 11512
data 132
float pi=3.141592;
#define p2 3.16
#define p3 2.0
#define p4 10.45678
pi2 = (p2 + p3*pi)/p4;
text 11512
data 132
#define pi 3.141592
#define p2 3.16
#define p3 2.0
#define p4 10.4567890123456789
text 9352
data 128
#define pi 3.141592
#define p2 3.16
float p3 = 2.0;
float p4= 10.4567890123456789;
float pi2;
text 11528
data 136
p3 += 1.0;
p4 -= 0.001;
pi2 = (p2 + p3*pi)/p4;
text 12120
data 136
p3 += 1.0;
p4 -= 0.001 * pi2;
pi2 = (p2 + p3*pi)/p4;
text 12136
data 136
Probablemente parezca sencillo el ejemplo, pero aún no he pasado de los 16K y existe la posibilidad de usar calcular funciones más complejas.
Me dirás, bueno no has agregado el ADC (ADC1 - IN0, IN1, IN2, Temperature), CRC, DMA para el ADC, Timer 1.
Con tan sólo agregarlos (todavía no usarlos)
text 14960
data 136
Esto usando las HAL no las LL que está disponibles para el M0 y esto me dice que es enteramente posible generar una aplicación relativamente compleja que entre en estos MCUs usando GCC.
Recuerda que se esta usando FreeRTOS, pero no creo que lo estés usando, por lo que podrías remover alrededor de 2 a 3K del binario, quedando la aplicación de arriba en unos 11K, pero si usas las LL en lugar de las HAL, este valor todavía puede caer por debajo de los los 10 o incluso de los 9K. Con lo que todavía se le puede meter bastantes operaciones más.
Así por ejemplo, con las características de tener ADC, CRC, DMA, UART y Timer 1, con las LL el peso del binario inicial sería
text 2736 bytes
data 12 bytes
Total 2748 bytes
si añadimos string.h, probablemente aumente entre 4 a 5K
si añadimos operaciones de punto flotante que incluyan suma, resta, multiplicación y división le agregamos otros 2.5K, por lo cual el binario estaría rondando entre los 6 a 7K e incluso podría estar rozando los 8K, todavía sin hacer uso de las funciones del ADC, CRC, UART, etc., pero aún así calculo que no pasaría de los 10K en estas condiciones.