Иногда сложно добиться отсутствия зависимостей. Да и надо ли?
Мы у себя похожий подход как у автора используем, удобно особенно если количество библиотек за сотню
Это заблуждение или как говорят, ваши коллеги скорее всего не умеют готовить embedded проекты на С++.
Стандартная либа в таких проектах обычно не используется, а вот все плюшки языка доступны
Возможно автор хотел сказать что if (strcmp(s, r) == 0) наиболее часто использующийся случай для проверки равны ли строки. Я бы наверное оформил это таким образом
if (strcmp(s, r) ==0 ) — проверить равны ли строки
if (strcmp(s, r) !=0 ) — проверть не равны ли строки
А так да, говорить что if(strcmp(s,r)==0) неверно, неверно :)
Мы делаем следующим образом (и вроде Keil RTX так же умеет)
При аллокации стека к размеру добавляем footer в котором содержится некий magic number. При переключении контекста начало и размер стека известны, соответственно можно проверить значение в футере и таким образом предположить было ли переполнение.
До сих пор удивляюсь, почему в CPU для embedded без MMU нету например вот такого решения stack limit.
Аппаратная проверка на каждом push/pop (STM/LDR для Cortex-M) вместо программных костылей imho намного эффективнее.
Кстати решение с переносом стека в начало RAM работает только если стек один. Когда на борту RTOS данный подход не поможет. -finstrument-functions к сожалению также не совсем панацея (разве что вместе с проверкой границ стека во время context switch) так как позволяет проверять стек только на границах функции и если переполнение произошло по середине с последующим pop то содержимое памяти уже повреждено, а мы об этом не знаем :(
А в целом статья поднимает интересную тему, спасибо.
UPD: ARMv8-M поддерживает stack limit. Ждем STM32 на новой архитектуре
Мы у себя похожий подход как у автора используем, удобно особенно если количество библиотек за сотню
Стандартная либа в таких проектах обычно не используется, а вот все плюшки языка доступны
if (strcmp(s, r) ==0 ) — проверить равны ли строки
if (strcmp(s, r) !=0 ) — проверть не равны ли строки
А так да, говорить что if(strcmp(s,r)==0) неверно, неверно :)
При аллокации стека к размеру добавляем footer в котором содержится некий magic number. При переключении контекста начало и размер стека известны, соответственно можно проверить значение в футере и таким образом предположить было ли переполнение.
До сих пор удивляюсь, почему в CPU для embedded без MMU нету например вот такого решения stack limit.
Аппаратная проверка на каждом push/pop (STM/LDR для Cortex-M) вместо программных костылей imho намного эффективнее.
Кстати решение с переносом стека в начало RAM работает только если стек один. Когда на борту RTOS данный подход не поможет.
-finstrument-functions к сожалению также не совсем панацея (разве что вместе с проверкой границ стека во время context switch) так как позволяет проверять стек только на границах функции и если переполнение произошло по середине с последующим pop то содержимое памяти уже повреждено, а мы об этом не знаем :(
А в целом статья поднимает интересную тему, спасибо.
UPD: ARMv8-M поддерживает stack limit. Ждем STM32 на новой архитектуре
№ заказа: 7941569672