Comments 16
Извините, если обертка вокруг периферии, как вы пишете, непотокобезопасная - это первый и главный ее недостаток. Использовать ее в реальных real-time проектах нельзя! Только в демо и PoC. То, что она обвязывает не всю периферию SoC - это уже вторично, третично итд. Это как коммерческая эксплуатация автобуса, у которого иногда отказывают тормоза.
Добрый день, да, все верно. Проект без потокобезопасности для использования не жизнеспособен. Во время разработки много недочетов выявилось, однако решил опубликовать тот материал, что есть в качестве примера для студентов. Спасибо за отзыв, мне очень важно было услышать оценку по своему проекту, буду работать над ошибками дальше.
Рабочая частота микроконтроллера – 84 МГц.
Вот когда приводят это, то что имеют в виду?
Поясню: на STM32F103 она 72 Мгц. Я делал задержку в микросекундах, получилось, что процессор может вичитать единицк 8 000 000 раз в секунду. То есть, его быстродействие — 8 млн. операций в секунду. Еслм ARM — это RISC, то за один такт процессора должна выполняться одна инструкция.
Получается, ядро процессора работает на частоте 8 МГц. При кварце 8 МГц.На что они дальше умеожают — это уже другое дело. На 9 умножат и говорят — частота работы 72 МГц.
Для сравнения, AVR Atmega 328 из Arduino выполняет команды за один такт, а это — 20 МГц, но 8 бит.
Можете сами поэкспериментировать и определить, сколько и каких команд выполнит ваш процессор в секунду.
Поясню: на STM32F103 она 72 Мгц. Я делал задержку в микросекундах, получилось, что процессор может вичитать единицк 8 000 000 раз в секунду. То есть, его быстродействие — 8 млн. операций в секунду. Еслм ARM — это RISC, то за один такт процессора должна выполняться одна инструкция.Получается, ядро процессора работает на частоте 8 МГц.
Вычитание делалось из определенной переменной? Нужно как-то данные из памяти загрузить в регистр процессора, и уже потом делать вычитание. А еще наверняка это делалось в цикле, поэтому еще одна переменная, ее уменьшение, условный переход. Не все команды делаются за один такт(как и у атмеги). Вот тут и набегает 9 тактов на итерацию.
RISC, то за один такт процессора должна выполняться одна инструкция.
Нет такого требования у RISC процессоров.
Обычно у них фиксированнное и легко предсказуемое число тактов на инструкцию.
Для таких задержек надо DWT использовать, а не переменные мучить
Интересный проект, молодцы! Не проще ли обучать робототехнике на болле высокоуровневых вещах? Как например проект machinekit-hal пытается перенести наработки из экосистемы linuxCNC на ARM платформу для real time управления
Добрый день, спасибо за оценку проекта. Не знаю как остальные коллеги, я лично с таким проектом не сталкивался, его задумка очень интересна. Как говорилось ранее, в нашем центре всё ПО для микроконтроллеров реализовано на С, потому как это просто было "стихийно" и считалось нормальным. Над реализацией на более верхнем уровне задумался, спасибо за совет. За год работы над проектом мне попадались некоторые открытые проеты библиотек, в которых сделано намного большая работа чем у меня. Тут библиотека больше идет как облегчающая для студентов, которые выбрали путь освоения микроконтроллеров. Реализация высокоуровневого управления я планировал реализовать через библиотеки micro-ROS или просто общение с системами верхнего уровня по ModBus. Но для такого шага я буду реализовывать графический генератор конфигураций, чтобы ещё больше облегчить процесс добавления настроек и конфигурации в целом.
Наплодили новых сущностей, зачем он нужны не ясно.
при выполнении некоторых макросов, либо их множества приводит к ошибкам из-за слишком быстрой скорости выполнения
После этой фразы стало интересно глянуть код. На беглый взгляд показалось что там немало мест, где возможны ошибки. Например, в SetPWM:
if(Channel > 4) return false;
__attribute__((unused)) uint32_t *address = ((uint32_t *)TIMx);
address += ((uint32_t)(((uint32_t)(Channel - 1) * 0x4) + 0x34) >> 2);
не обсуждая целесообразность адресной арифметики в этом месте, что будет при Channel равным нулю? address явно улетит за допустимый диапазон.
Или в функции CalcTimPulseLength у вас будет деление на ноль при входном параметре Degree < 3.
По барьерам памяти - насколько я понимаю, есть не так много ситуаций на Cortex-M4 где они нужны, так как нет переопределения порядка операций с памятью или выполнения инструкций и из-за особенностей AHB Lite и APB протоколов. Те примеры что я видел решались скорее dummy read\write, а не dsb https://developer.arm.com/documentation/ka003795/ Поэтому мне кажется, стоит более подробно исследовать причины HardFault и сравнить вашу реализацию с STM32CubeF4. Например, там я видел dummy read после установки APB1ENR, у вас на похожем месте dsb.
Спасибо за отзыв по моему проекту. Насчет некорректной реализации некоторых секторов вынужден принести извинения и согласиться. Некоторые участки были разработаны ещё когда я имел мало опыта в разработке, а когда опыта стало больше не хватило времени, чтобы оперативно все устранить. Поэтому в некоторых местах остаются такие недочеты, которые я по мере возможностей устраняю. Касаемо барьеров, очень познавательно и полезно, обязательно этот момент учту, благодарю.
Прикольно, генератором кода(CubeMX) воспользоваться не получится?
Добрый день. К сожалению, генератор кода CubeMx не сгенерирует проект на основе данной библиотеки. Единственный вариант автоматической генерации, как мне кажется, это создание своего генератора проектов. Над этим неоднократно задумывался, есть небольшие тестовые наработки, надеюсь в скором времени смогу довести это до стадии релиза.
Важное дело делаете! Обязательно продолжайте! На таком уровне, STM32 будет доступен даже школьниками. Тем более милианр выпускает полный аналог этого процессора. Ошибки при разработке всегда будут (сколько лет майкрософт? багов стало меньше?). Есть хороший принцип: ошибайся раньше, исправляй быстрее. Было бы хорошо сделать синтетическую среду типа processing (принцип, чем проще - тем лучше), а может и до скреча доберетесь, тогда ардуино можно будет отпаривать на пенсию! шучу)
Обзор периферийной библиотеки FIL для микроконтроллеров STM32