C/C++ встроенное ПО
80 задач. Условие и варианты ответа открыты всем; проверка, подсказка и разбор — в клубе.
Язык C/C++ и работа с памятью
- sizeof массива внутри функции: что напечатает программа
- Функция возвращает указатель на локальный буфер
- Копирование строки: почему портится соседняя память
- Указатель на элемент vector после push_back
- Класс с сырым указателем: двойное освобождение при передаче по значению
- Сравнение int и unsigned int: почему выбирается неожиданная ветка
- Два shared_ptr, созданные из одного сырого указателя
- Удаление через указатель на базовый класс без виртуального деструктора
Микроконтроллеры и аппаратные протоколы
- По UART приходит нечитаемый текст при совпадающем объёме данных
- Записали конфигурацию GPIO, но вывод не переключается
- Отпущенная кнопка читается то нулём, то единицей
- Ожидание флага из прерывания зависает в релизной сборке
- Структура передана по UART, на приёмнике поля разъезжаются
- Второй датчик той же модели не отвечает на шине I2C
- Обработчик прерывания вызывает блокирующие функции FreeRTOS
- Задача уходит в аварийный обработчик после добавления локального буфера
Linux, многопоточность и сеть
- recv вернул меньше байт, чем клиент отправил одним вызовом send
- Два потока увеличивают счётчик, итог меньше ожидаемого
- Что означает recv, вернувший ноль
- Два мьютекса захватываются в разном порядке: как убрать взаимную блокировку
- Программа аварийно завершается при выходе из функции с std::thread
- Поток изредка зависает на ожидании condition_variable
- Асинхронный сервер держит 1000 клиентов, но задержки выросли до секунд
- После перезапуска сервис не может занять свой порт
Сборка, отладка и профилирование
- Код работает в отладочной сборке и ломается в релизной
- Заголовок подключён, а линковщик пишет undefined reference
- Сервис падает раз в несколько часов с разными стеками: чем это ловить
- Ускорили функцию в десять раз, а сервис быстрее не стал
- Отчёт Valgrind: какие потери памяти чинить в первую очередь
- Замер производительности сделан на отладочной сборке
- Core dump с боевого стенда: что нужно для осмысленного стека
- Два варианта одного цикла: почему один втрое медленнее
FreeRTOS: задачи, очереди и синхронизация
- Задача опрашивает флаг в цикле, и светодиод статуса перестал мигать
- vTaskDelay(500) даёт паузу в пять секунд вместо полусекунды
- Задача-получатель вынимает из очереди строки, но все они одинаковые
- Две задачи пишут в отладочный UART, и строки перемешиваются
- Задача управления двигателем пропускает дедлайн, пока работает сетевой стек
- Опрос датчика раз в 100 мс на деле идёт с периодом 115–130 мс
- Реакция на прерывание от датчика запаздывает на случайные 0–10 мс
- pvPortMalloc возвращает NULL, хотя свободной кучи ещё 6 КБ
- После добавления записи настроек во flash UART начал терять байты
- Каждое задание съедает кучу, хотя задачи-исполнители удаляют себя
- Все программные таймеры остановились после правки одного колбэка
- Из трёх быстрых импульсов счётчика обработан только один
Биты, целые типы и арифметика на МК
- Включили светодиод на PA5, и погасли реле на соседних выводах порта
- Проверка флага готовности датчика никогда не срабатывает
- Цикл заполнения буфера из 300 элементов никогда не заканчивается
- Прогресс обновления прошивки показывает 0% до самого конца
- Раз в 49 дней устройство сразу рвёт связь по таймауту
- Код маски прерываний перенесли со STM32 на AVR, и маска стала неверной
- Проверка инвертированного байта контрольной суммы всегда ложна
- Датчик давления отдаёт 300, а прошивка читает 11265
- На ATmega счётчик времени изредка прыгает назад на минуту
- Цифровой фильтр в формате Q15 выдаёт мусор на AVR и работает на STM32
- После «оптимизации» деления сдвигом фильтр смещения ушёл в минус
- Code review завернул разбор float из пакета по указателю
CAN, Modbus и RS-485
- Два CAN-узла на столе не видят друг друга, хотя скорость совпадает
- Два узла начали передачу одновременно: чей кадр пройдёт
- Регистр 40011 из документации счётчика возвращает ошибку адреса
- Новый преобразователь RS-485 принимает от датчика только мусор
- Мастер Modbus регулярно получает ответ с битым последним байтом CRC
- Ведомое устройство молчит, хотя CRC запроса посчитана верно
- При опросе без пауз второе устройство на шине перестаёт отвечать
- Температура из двух регистров Modbus читается как 2,36e-41
- Узел CAN после сбоя замолчал до перезагрузки питания
- Единственный узел на стенде передаёт кадр бесконечно, TEC застыл на 128
- Дозатор иногда выдаёт двойную порцию реагента
- Мастер RS-485 разбирает собственный запрос как ответ устройства
Прошивка: память, загрузчик и надёжность
- Таблица синуса на 4096 точек съела 8 КБ оперативной памяти
- Контроллер завис в поле, но сторожевой таймер его не перезагрузил
- Через неделю работы счётчик моточасов перестал сохраняться
- После добавления вывода float в лог прошивка перестала влезать во flash
- Прошивка раз в сутки падает в HardFault_Handler, отладчик не подключён
- Приложение после загрузчика падает на первом же прерывании
- Обновление по воздуху превратило 12 устройств в кирпичи
- На севшей батарее устройство циклически перезагружается и портит настройки
- Нажатие кнопки навсегда вешает контроллер на HAL_Delay
- Счётчик аварийных перезагрузок всегда показывает ноль
- Раз в несколько дней портится глобальный буфер на границе кучи
- Загрузчик отвергает каждую новую прошивку с ошибкой CRC
