Сегодня я хотел бы обсудить тему, с которой так или иначе сталкивался почти каждый программист встраиваемых устройств без использования настоящих операционных систем, а именно прямое управление периферийными узлами микроконтроллера. A конкретнее, я хотел бы обсудить повышение безопасностиЧитать полностью »
Рубрика «cortex-m»
Переключение контекста и простой вытесняющий планировщик для CortexM
2020-06-11 в 21:48, admin, рубрики: c++, cortex-m, quantum lips, rtos, rtos осрв микроконтроллеры, sst, statemachine, stm32, микроконтроллеры, программирование микроконтроллеров, с++17, системное программирование, студенты
С каждым годом курсовые для моих студентов становятся все объемнее. Например, в этом году одним из заданий была разработка метеостанции, ведь только ленивый не делает метеостанции, а студенты они по определению не ленивые, поэтому должны её сделать. Её можно быстро накидать в Cube или собрать на Ардуино, но задача курсового не в этом. Основная задача — самостоятельно, с нуля разобраться с модулями микроконтроллера, продумать архитектуру ПО и, собственно, закодировать все на С++, начиная от регистров и заканчивая задачами РТОС. Кому интересно, здесь пример отчета по такому курсовому
Так вот появилась небольшая проблема, а именно, бесплатный IAR позволяет делать ПО размером не более 30 кБайт. А это уже впритык к размеру курсового в неоптимизированном виде. Анализ кода студентов выявил, что примерно 1/4 часть их приложения занимает FreeRtos — около 6 кБайт, хотя для того, чтобы сделать вытесняющую переключалку и управлялку задачами хватило бы, наверное… да байт 500 причем вместе с 3 задачами (светодиодными моргунчиками).
Эта статья будет посвящена тому как можно реализовать Очень Простой Планировщик(он же SST), описанный в статье аж 2006 года и сейчас поддерживаемый Quantum Leaps в продукте Qp framework.
С помощью этого ядра очень просто реализовать конечный автомат, и оно очень хорошо может использоваться в небольших проектах студентами (и не только), которые могут получить дополнительно 5 кБайт в свое распоряжение.
Я попробую показать как можно реализовать такой планировщик самому. Чтобы не сильно перегружать статью, рассмотрю переключение контекста на CortexM0 у которого нет аппаратного модуля с плавающей точкой.
Все кто заинтересовался и хочет понять как можно переключать контекст, добро пожаловать под кат.
Отладка микроконтроллеров ARM Cortex-M по UART Часть 2
2020-02-22 в 18:48, admin, рубрики: cortex-m, gdbserver, программирование микроконтроллеровВ прошлой статье я рассказывал про прерывание DebugMon и регистры с ним связанные.
В этой статье будем писать реализацию отладчика по UART.
Читать полностью »
Отладка микроконтроллеров ARM Cortex-M по UART
2020-02-17 в 9:48, admin, рубрики: cortex-m, stm32, программирование микроконтроллеровВ данной статье я расскажу вам как можно использовать регистры отладки и breakpoint'ов в микроконтроллерах, построенных на ядрах ARM Cortex-M
Читать полностью »
10++ способов работать с аппаратными регистрами на С++ (на примере IAR и Cortex M)
2019-07-08 в 13:55, admin, рубрики: c++, cortex-m, cortex-m4, templates, микроконтроллеры, микроконтроллеры stm, Программирование, программирование микроконтроллеров, С++
Рис. И. Кийко
Всем доброго здравия!
Помните наверное бородатый анекдот, а может быть и правдивую историю про то, как студента спрашивали о способе измерить высоту здания с помощью барометра. Студент привел, по-моему около 20 или 30 способов, при этом не назвав прямого(через разницу давления), которого ожидал преподаватель.
Примерно в том же ключе я хочу продолжить обсуждение использования С++ для микроконтроллеров и рассмотреть способы как можно работать с регистрами используя С++. И хочу заметить, что для достижения безопасного обращения к регистрам простого пути не будет. Попытаюсь показать все плюсы и минусы способов. Если вы знаете еще способы, кидайте их в комментарии. Итак начнем:
Читать полностью »
Синглтон размещающий объекты в ROM и статические переменные(С++ на примере микроконтроллера Cortex M4)
2019-07-05 в 11:59, admin, рубрики: c++, cortex-m, cortex-m4, IAR, singleton, микроконтроллеры stm, Программирование, программирование микроконтроллеров, шаблоны c++
В предыдущей статье Где хранятся ваши константы на микроконтроллере CortexM (на примере С++ IAR компилятора), был разобран вопрос о том, как расположить константные объекты в ROM. Теперь же я хочу рассказать, как можно использовать порождающий шаблон одиночка для создания объектов в ROM.
Читать полностью »
Как поморгать 4 светодиодами на CortexM используя С++17, tuple и извращенное воображение
2019-06-23 в 17:53, admin, рубрики: c++, c++17, cortex-m, tuple, ненормальное программирование, Программирование, программирование микроконтроллеров, С++14Всем доброго здравия!
При обучении студентов разработке встроенного программного обеспечения для микроконтроллеров в университете я использую С++ и иногда даю особо интересующимся студентам всякие задачки на определения особо больных на голову одаренных учеников.
В очередной раз таким студентам была дана задача поморгать 4 светодиодами, используя язык С++ 17 и стандартную библиотеку С++, без подключения дополнительных библиотек, типа CMSIS и их заголовочных файлов с описанием структур регистров и так далее… Побеждает тот, у кого код в ROM будет занимать наименьший размер и меньше всего затрачено ОЗУ. Оптимизация компилятора при этом не должна быть выше Medium. Компилятор IAR 8.40.1.
Победитель едет на Канары получает 5 за экзамен.
Сам я до этого тоже эту задачу не решал, поэтому расскажу как её решили студенты и что получилось у меня. Предупреждаю сразу, навряд ли такой код можно будет использовать в реальных приложениях, потому и разместил публикацию в раздел «Ненормальное программирование», хотя кто знает.
Читать полностью »
Где хранятся ваши константы на микроконтроллере CortexM (на примере С++ IAR компилятора)
2019-06-03 в 10:05, admin, рубрики: c++, const, constexpr, cortex-m, cortex-m4, микроконтроллеры, Программирование, программирование микроконтроллеров, С++Я работаю со студентами на микроконтроллере STM32F411RE, имеющего целых 512 кБайт ROM и 128 кБайт ОЗУ.
Обычно в этом микроконтроллере в ROM память записывается программа, а в RAM изменяемые данные и очень часто нужно сделать так, чтобы константы лежали в ROM.
В микроконтроллере STM32F411RE, ROM память расположена по адресам с 0x08000000...0x0807FFFF, а RAM с 0x20000000...0x2001FFFF.
И если все настройки линкера правильные, студент рассчитывает, что вот в таком незамысловатом коде его константа лежит в ROM:
class WhantToBeInROM
{
private:
int i;
public:
WhantToBeInROM(int value): i(value) {}
int Get() const
{
return i;
}
};
const WhantToBeInROM myConstInROM(10);
int main()
{
std::cout << &myConstInROM << std::endl ;
}
Вы тоже можете пробовать ответить на вопрос: где лежит константа myConstInROM в ROM или в RAM?
Если вы ответили на этот вопрос, что в ROM, поздравляю вас, на самом деле скорее всего вы не правы, константа в общем случае будет лежать в RAM и чтобы разобраться, как правильно и законно расположить ваши константы в ROM — добро пожаловать под кат.
Читать полностью »
Post-mortem отладка на Cortex-M
2019-05-21 в 9:33, admin, рубрики: C, c++, Cortex, cortex-m, cortex-m0, cortex-m4, KEIL, minidump, stacktrace, stm32, минидамп, отладка, программирование микроконтроллеров, стектрейс, стэктрейсPost-mortem отладка на Cortex-M
Предыстория:
Участвовал я недавно в разработке нетипичного для меня девайса из класса потребительской электроники. Вроде ничего сложного, коробка, которая должна иногда выходить из спящего режима, отчитываться серверу и засыпать обратно.
Практика быстро показала, что отладчик не слишком помогает при работе с микроконтроллером, который постоянно уходит в режим глубокого сна или вырубает себе питание. В основном, потому что коробка в тестовом режиме стояла без отладчика и без меня рядом и иногда глючила. Примерно раз в несколько суток.
На соплях был прикручен отладочный UART, в который я стал выводить логи. Стало легче, часть проблем решилась. Но потом случился assert и все завертелось.