а что за РТОС у тебя? вроде есть во freeRTOS инструменты для контроля таких вещей встроенные и есть мануал , как отловить такие глюки. По всем симптомам похоже на переполнение стека. Может ещё переполнение буферов быть - например ты объявил буфер на 32 байта а по инкременту указателя залил 33 и блольше. Случается редко, но случается и вообще printf оооочень жрущая стек штука попробуй заметь на неформатированный тупой вывод и посмотри чтл будет
Комментарии: 7
Serg
а сколько жрет? альтернативы удобной нет, везде использую snprintf для формирования строк
Anonim
с использованием строковых функций Build: 263 22113 line(s) compiled No errors 1 warning(s) Bit variables area: 0x2 to 0x2 Bit variables size: 1 byte(s) Data Stack area: 0x100 to 0x2FF Data Stack size: 512 byte(s) Estimated Data Stack usage: 81 byte(s) RAM Global variables area: 0x300 to 0x36D RAM Global variables size: 110 byte(s) Hardware Stack area: 0x36E to 0x8FF Hardware Stack size: 1426 byte(s) Heap size: 0 byte(s) EEPROM usage: 0 byte(s), 0,0% of EEPROM Program size: 2989 words (5978 bytes), 18,2% of FLASH с использованием sprintf Build: 264 22113 line(s) compiled No errors 2 warning(s) Bit variables area: 0x2 to 0x2 Bit variables size: 1 byte(s) Data Stack area: 0x100 to 0x2FF Data Stack size: 512 byte(s) Estimated Data Stack usage: 81 byte(s) RAM Global variables area: 0x300 to 0x369 RAM Global variables size: 106 byte(s) Hardware Stack area: 0x36A to 0x8FF Hardware Stack size: 1430 byte(s) Heap size: 0 byte(s) EEPROM usage: 0 byte(s), 0,0% of EEPROM Program size: 2948 words (5896 bytes), 18,0% of FLASH 4 байта разницы, если я правильно понял вот это sprintf(str, "%d,%d,%d", temp_ds18b20, temp_dht22, hum_dht22); против этого itoa(temp_ds18b20, uart_str); // преобразуем температуру ds18b20 в строку strcat(uart_str, ","); // ставим запятую itoa(temp_dht22, str); // преобразуем температуру dht22 в строку strcat(uart_str, str); // дописываем в конец строки strcat(uart_str, ","); // ставим запятую itoa(hum_dht22, str); // преобразуем влажность dht22 в строку strcat(uart_str, str); // дописываем в конец строки был еще xprintf, реализация специально для мк, но я лично не проверял как оно, на гихабе вроде есть
Anonim
в avr оказалось, что sprintf жрет меньше флэша, чем эта же обработка строки стандартными строковыми функциями
Serg
речь же не про флеш, а про RAM
Anonim
извиняюсь, не скину, он там бинарником
Danil
я не против printf и sprintf - это проверено временем, удобно и стандартно. Но в условиях МК могут быть проблемы с ресурсами - такты и память
Dmitry
да, фриртос мне кажется, что это не переполнение. ведь при оном стек переполнился бы во время первого прогона программы. А тут «рандомно». На третий-четвёртый раз исполнения одной и той же ветки вызовов. есть ли мануалы по отлову такого? скорее тут какая-то порча стека. strcat'ом, например. а как быстро настигает «расплата» за порчу стека? уже на следующем переключении задач?