Небольшой оффтоп в теме про SPI:
Покопался ещё на предмет флэша.
Пустышка вида
CODE
char sBuffer[256];
int main(void)
{
float temp = 656.89F;
int i = 78;
sprintf ( sBuffer, "%d; %.02fv", i, temp );
while ( 1 )
{
} // while
} // main
При использовании newlib standard даёт размер кода:
Код
Print size information
text data bss dec hex filename
17644 1660 10772 30076 757c STM32H7_ILI9163.elf
Ошибка записи во флэш есть.
Если эту же программу перекомпилить с newlib nano, то получаю:
Код
Print size information
text data bss dec hex filename
5180 112 10720 16012 3e8c STM32H7_ILI9163.elf
Ошибки флэша нет, всё гуд. Но в sBuffer я вижу: "78; v", т.е. видно, что sprintf не поддерживает плавающую точку, что меня лично меня категорически не устраивает.
Чтобы отсечь вопрос о "битости" некоторых участков флэша проца приведу следующий пример:
Прошивка размером
Код
Print size information
text data bss dec hex filename
18480 36 10876 29392 72d0 STM32H7_ILI9163.elf
без sprintf шьётся, отлаживается и работает совершенно нормально.
Стек в обоих случаях одинаковый:
Код
/* 0x2800 == 10K */
_Min_Stack_Size = 0x2800;
Какие соображения, товарищи? И чем можно заменить sprintf? Я нашёл только это -
https://github.com/torvalds/linux/blob/master/lib/vsprintf.c , но пока не пытался затащить её в проц.
Увеличение размера прошивки меня совершенно не волнует. Кто-то делал что-либо подобное?
Штуки типа itoa, ltoa я знаю, они нормально работают, но результирующие строки надо дополнительно склеивать, но самое главное, чего-то родственного для плавающей точки я не знаю.
Писать самому?
Что касается периферии - запустил UART - отправка опросом, приём прерыванием в буфер. Перешёл к USB.