Pull to refresh

Comments 31

Наверное стоит спросить у гугла «iar шаблон проекта» и подправить статью. Да и себе жить удобнее становится.
Есть прекрасная обертка для псевдомногопоточности. Называется протопотоки. Используется в частности в uIP. Автор Адам Дункельс
Несомненно, Eclipse и Keil имеют более зрелую IDE, но как-то привык к старому доброму IAR. Если условия работы будут требовать именно Eclipse или Keil, ну… буду на них. Насчёт STDPeripheral: для демонстрации концепции в этой статье подойдёт, лично я из него «вырос» много лет назад. Теперь только чистый CMSIS. У меня давно разработана собственная архитектура драйверов, так что CubeMX с его HAL не подходят. Когда я начинал STM, тогда не было ещё CubeMX. Пять лет вполне достаточно, чтобы научиться ориентироваться в различиях периферии и схемах тактирования без него.
Keil сложно назвать зрелым, у него же табы с исходниками не переставляются.
Сижу на Atollic TrueStudio Lite, бесплатный и на Eclipse. Главное, компилятор у него шустрее, такой прокаченный gcc-arm. Pазница (особенно на параллельной сборке) очень заметна.
Как по мне именно HAL это фу. Лучше уже SPL ещё лучше CMSIS. CubeMx генерирует ужасный код. Насчёт eclipse согласен. В какой то версии был неплохой плагин для эклипса от keil, код компилировался через АРМ компилятор, да и с отладкой было всё неплохо
В какой то версии был неплохой плагин для эклипса от keil, код компилировался через АРМ компилятор, да и с отладкой было всё неплохо

Он и сейчас есть — лежит /Keil/Eclipse/MDKEclipsePlugIn.zip
Когда только начинал использовать STM32, считал что CubeMX это нечто, которое до невозможности облегчает работу. Теперь часть моих проектов содержит вставки на CMSIS. А все потому, что создатели CubeMX не спешат исправлять косяки, на которые им указывают. По факту я так же использую куб, это очень удобно в плане генерации проекта, но когда всплывает какой либо косяк, на его поиск и исправление уходит много времени. И обычно решается написанием вставок на CMSIS.
Прошу не путать IDE IAR и компилятор IAR, точно также GCC фу, в сравнении IAR. Сколько багов странных ловил при оптимизациях… И не надо гуворить, что ее можно отключать, иначе зачем она нужна. Решение всякого рода «фу», совместить компилятор одного продукта и среду для написания кода другого продукта (не обязательно Eclipse).
Зато компилятор IAR С++ и С уж точно надежнее, и написан провренной конторой. Кроме того, на него получен сертификат надежности SIL4.
Китайцы такие китайцы. Как раз работаю с такой платкой. В какой-то момент перестала определяться малиной по USB, причём прошивка не менялась, ничего не менялось. В винде на компе определяется. Потыкался посмотрел, там подтяжка D+ стоит 10 кОм вместо 1.5. Перепаял — заработало. И ведь работало довольно долго, что характерно.
Предлагаю пойти дальше и доработать этот узел еще раз. Выкинуть один из джамперов (BOOT1 повесить на землю навсегда) и на его место повесить этот 1,5К резистор. Можно будет программно переподключать подтяжку.

Я думаю про STDPL сейчас писать уже не актуально, ST ее хоронят и полностью переходят на Cube + HAL. В последнем кубе уже RTOS 9 поддерживается.

Он до сих про очень большой и глючный. Вот допилят до вменяемого состояния и чтобы инициализация не занимала по 10+ Кб, тогда можно попробовать.
Интересно дойдет до SPI/I2C+DMA или LCD/2D?
А зачем ОСРВ для такого мелкого камня? Если нужно запускать какое-нибудь событие асинхронно, проще на таймерах сделать
stm32f103c8 взят для примера статьи. Тем не менее, это мощный 72МГц процессор. У него много периферии, которую можно очень эффективно задействовать и мощное ядро АРМ на 72МГц. ОЗУ и Flash маловат, но на это есть 103rb или 103rc варианты. Статья про организацию программного кода для реализации кооперативной многопоточности. Для тех задач, которые нуждаются в многопоточности без ОСРВ. Если задача перебирать порты GPIO или опрашивать АЦП, достаточно просто вызывать блокирующие функции в цикле main(). Или организовать цепочки использования одного периферийного модуля другим. Для таких задач есть контроллеры попроще, например, stm 30й серии. Или вообще Atmel-овские tinyXXX.

Какой контроллер, какой IDE и какие методы выбирать? Здесь не может быть какого-то истинно правильного метода. Каждый выбирает в меру своих познаний и опыта в данном вопросе, а также на основе параметров проекта, который он выполняет.

unsigned long global_count=0;


Брезгуете для глобальных счетчиков и флагов volatile?
Очень зря! Вы же знаете что с точки зрения компилятора и ядра арм проца оперативная память — медленное внешнее устройство!
И если где-то будет цикл с ожиданием флага типа
while(global_count<18);

тоесть просто должно было бы подождать пока счетчик не дотикает до 18-ти. то с вероятностью в 99.9% попав в этот цикл программа вообще никогда не выйдет из него вне зависимости от того что 100500 других потоков преспокойно инкрементировали этот ваш счетчик и читали его правильно!
А знаете почему так случится? А все просто — компилятор увидит что внутри цикла ваша переменная не изменяется и не сравнивается с другими изменяемыми в цикле переменными и просто не будет перечитывать значение этой переменной из внешней оперативки! Она как была в регистре каком-то свободном на момент входа в цикл так и останется закешированной своим прошлым значением на момент входа в цикл!
И ваша программа порушится!
А потом начинаются вопли — оптимизатор иара злооо, он делает код нерабочииим, убрал оптимизации — все зарабоооталоооо и так далее! Это очень важный момент особенно для начинающего! Особенно для тех кто с аврок пришел где оперативка доступна в один такт одной командой и никто кроме GCC и насколько я слышал ещё какого-то компилятора не пытаются кэшировать переменные в регистрах — в аврках это лишено смысла так как не экономит ничего. а вот в армах экономия просто адовая и потому volatile — обязательный префикс для глобальных счетчиков и флагов!
Совершенно с Вами согласен. Пока готовил статью, пропустил. Уже исправил, спасибо.
Спасибо! Я вот не знал.
volatile это указание компилятору не оптимизировать работу с переменной. Поясните, почему это экономит время армки?
грубо говоря у ядра процессора всего 13 регистров над которыми АЛУ умеет делать всякие вычисления сравнения и прочие действия.
Поэтому перед каждой операцией сравнения умножения деления вычитания сдвига или любой проверки на четность больше меньше нуля и т.д. — ячейку памяти надо прочитать из оперативки в регистр.

Проблема в том что оперативка внешнее устройство и оно может быть занято например DMA и потому проц будет жутко в этом случае тупить если в какой-то циклическом коде эта переменная натыкана в каждый второй оператор и в фоне чтото делает DMA например или ещё чтото. или например внешняя SRAM подключена в контроллер FSMC в данный момент чтото качает в экран и память просто простаивает. чтоб этих простоев небыло — компилятор смотрит на тот факт что если в цикле только сравнения и проверки переменной а изменения её — нет — то её нет смысла перечитывать из памяти каждый раз при обращении к ней внутри этого цикла. этим экономится море времени и сильно ускоряется работа в нагруженной системе. но есть и минус. если вы задумали что эта переменная должна меняться извне прерыфванием или другим потоком или другим ядром — компилятор этот факт во внимание не примет и будет упорно сравнивать и проверять все инструкции с регистром, куда изначально была скопирована эта ячейка памяти. Потому и можно остаться в цикле while(wait==1); навсегда если переменная wait не была инициализирована словом volatile. volatile означает — каждый раз при обращении — перечитывать из памяти.
Получается, что volatile следует использовать, только в случае, если возможно изменение переменной другим потоком, в противном случае оно только вредит, верно?
собственно говоря да! оно для того и придумано чтоб как-то обозначить компилятору как относиться к переменной в памяти? наплевательски или каждый раз перечитывать.
Использование SPL в эпоху HAL и CubeMX это как сидеть под MSDOS когда уже есть Windows 7.
А конкретно — пусть автор попробует без CubeMX запустить в корпусе TQFP 176
FMC(32bit)-DMA2-LTDC(RGB888)-I2C-UART-SDIO-FATFS-FREERTOS-STemWin
А вы можете заставить работать STemWin с сенсором на дисплее? А то я третий день сижу, ничего не работает.
А может стоит не просто сидеть, а для начала запустить дисплет обычным методом? Потом уже можно сделать драйвер для STemWin, попутно читая документацию или просматривая уже существующие примеры.
Сам дисплей шикарно работает, проблема именно в сенсоре.
ну тогда осталось дело за малым, связать нажатие по координктам с калбеками.
какой сенсор?
резистивный, емкостной?
у меня подключен емкостной на I2C FT5226
работает отлично
напишите на почту, могу выслать исходники
Sign up to leave a comment.

Articles