Я так понял, человек не про это спрашивает. Интересует что-то, где хорошо описывалось бы программирование для STM со всеми его библиотеками и периферией.
Тогда ему нужно качать сниппеты с сайта ST. Пользоваться калокубами, SPLами и прочей дерьмотой (даже opencm3) ни в коем случае нельзя! Это как гланды через задницу выдирать... Читаем даташит, читаем RM, смотрим сниппеты и собираем свои сниппеты и даже готовые блоки. Я себе подобным образом постепенно базу набиваю. Тоже по дурости неопытной сначала SPL пробовал, потом какое-то время сидел на opencm3, и лишь по прошествию определенного времени (тут толчок нужен был и им было то, что разрабы opencm3 поломали API, и мое терпение лопнуло) постиг дзен!
_________________ Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда. Я на гитхабе, в ЖЖ
Фух... вроде мигает. Да, от знания асма толку никакого вообще. Ну да ладно. мне вот интересен еще момент. Почему если подпрограмму пишу где нить внизу листинга, а вызываю ее где нибудь вверху, например:
то транслятор ругается. Транслирует, но в итоге задержка не работает. А в асме это не разу не проблема.
Хорошие вопросы задаете, товарищ! Не, кроме шуток. Главный минус С - необходимость одно и то же по сто раз объявлять. Но вам придется с этим смириться. Такова идеология С. Все, что вы используете, вы должны заранее объявить. Мое мнение, что оно прилетела со стародавніх времен, когда работает компилятор и хоть что-то хоть как-то компилит хотя бы за ночь ( не смейтесь. Я еще застал времена, когда С программу на компиляцию на ночь ставили) - уже праздник. Соответственно, в С вообще много фишек для облегчения жизни компилятору. Это - одна из них. Мне кажется, оно совершенно не современно. Но спорить - не возьмусь. Идеология - она вещь такая. Можно и в нос получить, ну ее нафиг
Так. Стоп. Поторопился, кинулся отвечать, до конца не дочитав. Вы хотите сказать, что ваш код откомпилирован, но при этом не происходит задержки? Так не должно быть. Полагаю, что у вас где-то есть заголовочный файл (например, какой-нибудь стандартной библиотеки), в котором уже описана функция delay, которая делает задержку. Поэтому компилятор не ругается. Но при этом вы реализовываете функцию delay сами. А что будет, если вы уберете текст
[cc] D:\Disk_D\PRG\coconut\main.c:18:5: warning: implicit declaration of function 'Delay' [-Wimplicit-function-declaration] [cc] Delay(8000000); [cc] ^~~~~ [cc] D:\Disk_D\PRG\coconut\main.c: At top level: [cc] D:\Disk_D\PRG\coconut\main.c:22:6: warning: conflicting types for 'Delay'
А вот моя писанина (вложение): МК - плата с STM32F103RBT6 и программатор St-link V2, купил это добро на али в 2013 году.
Фух... вроде мигает. Да, от знания асма толку никакого вообще. Ну да ладно. мне вот интересен еще момент. Почему если подпрограмму пишу где нить внизу листинга, а вызываю ее где нибудь вверху, например:
Код:
while (1) { ... delay(8000000); ... }
void delay(uint16_t time) {}
то транслятор ругается. Транслирует, но в итоге задержка не работает. А в асме это не разу не проблема.
И никто до сих пор не заметил что-ли? Что 8000000 никак не влезет в uint16_t, где максимальное значение 65535. Делайте uint32_t.
И это ругается, потому что до вызова функцию нужно объявить. Сверху где-нибудь просто "void delay(uint32_t time);" всё, без кода функции. И ругаться не будет.
Но правильно сказали - писать на C учиться можно и на ПК. На МК оно не завязано. Ничем C для ПК не отличается от C для МК. Объявление регистров - это всего-лишь объявления регистрой. Ничего от EQU в асме не отличается.
Немного поэкспериментировал с твоим примером. Процессор STM32F303 (CM4F), выполнение кода из SRAM. Скорее всего, из FLASH будут другие цифры по тактам. Сделал тестовый код (надеюсь я правильно понял твои макросы). Тщательно проверил, чтобы считывание CYCCNT было строго одинаково везде.
Народ, а коль уж тут речь зашла. НА AVR GCC плюсы для серьезных задач использовать практически не возможно, так как TVM они держат не во FLASH, что было бы логично, а в ОЗУ. Ни разу не эффективно, а главное, ОЗУ кончается очень быстро. А для STM как это решено? Кстати, вот и еще один пример, зачем может быть нужен ассемблер: в сложных случаях понять, а что же такое намудрил компилятор.
Немного поэкспериментировал с твоим примером. Процессор STM32F303 (CM4F), выполнение кода из SRAM. Скорее всего, из FLASH будут другие цифры по тактам. Сделал тестовый код (надеюсь я правильно понял твои макросы).
Да, именно в такое мои макросы и должны были развернуться. Единственный момент - IAR ругается warning-ом на выражения, в которых встречаются сразу несколько чтений volatile переменных. Поэтому эта строка у меня разбита на 2: сперва "3 - ((GPIOA->IDR>>10)&1)", а потом - остальное. Ну собственно IAR-овский результат такой же как у меня - 5 команд.
Только разницы по тактам, как я и предполагал, никакой. Результаты под IAR и GCC
IAR-овский результат - 5 команд. Должен быть на 1 такт длиннее. Ну а то что "нет разницы" - так там в результаты попали множество LDR, которые в сумме длиннее. И IAR их поставил меньше. Таким способом с точностью до такта не измерить. Вобщем - GCC здесь оказался лучше. Но даже он не додумался до самого оптимального варианта, который я приводил 3-м по счёту. Вобщем - компиляторы ещё пока что тупее человека.
Так приведите весь код, который нужно компилировать... Что из себя представляет Pval, PIN_PRND_B и PIN_PRND_F?
Посмотрите соседний пост VladislavS - он правильно угадал содержимое макросов. У него как раз и получилось от GCC то, что я ожидал. Правда не самый лучший вариант.
Компилятор у Вас зачем то перегружал повторно указатель, потратив на это лишние команды LDR.
Потому что данные в __IO регистре, т. е. valatile.
Данные, но не указатель на них (адрес этого регистра). А у Вас GCC дважды зачем-то перегрузил этот адрес. Посмотрите на результат IAR (что я приводил) - там указатель на IO-регистры грузится один раз, и потом по нему дважды читаются оба порта (со смещением, так как они находятся по близким адресам).
Кстати, вот и еще один пример, зачем может быть нужен ассемблер: в сложных случаях понять, а что же такое намудрил компилятор.
Совершенно правы! Или "намудрил автор исходника". Я бывает когда ищу баг, гляну на результат компиляции и по нему сразу вижу баг (особенно - если что-то не так с приведением типов, расширением типов, знаками и т.п.).
НА AVR GCC плюсы для серьезных задач использовать практически не возможно, так как TVM они держат не во FLASH, что было бы логично, а в ОЗУ.
С++ настолько многогранен. Можно же не применять виртуальные методы и эллоцируюшие динамическую память объекты. И без них в языке столько "серьёзности"!
Добавлено after 2 hours 23 minutes 58 seconds: Кстати, между нами эмбеддерами. Вот такой код делает то же самое, но выполняется на 2 такта быстрее.
>> С++ настолько многогранен. Можно же не применять виртуальные методы и эллоцируюшие динамическую память объекты. И без них в языке столько "серьёзности"!
Можно. Но уже совсем не так интересно. Многое недоступно. Включая стандартную библиотеку классов. Это уже не С++, а в лучшем случае С+ какой-то
Ну да. Кроме каких-то совсем уж экзотических ситуаций. В принципе, на вскидку даже и в голову для примера ни чего не приходит.
В одном из проектов стала у меня гавкать собака по имени IWDG. Редко, непредсказуемо и проморгал на каком этапе редактирования проекта возникла такая беда, т.е. и не знал куда копать. Завел тогда собаку WWDG и обработчик прерывания от нее. В обработчиках прерывания WWDG и исключения HardFault вставил ассемблерную вставку, которая выдергивала контент со стека, а именно указатель стека и, самое главное, программный счетчик . Затем эти данные и еще кое-какие тестовые, я записывал во флеш. С помощью этого нашел где нарукожопил.
Как вставлять ассемблерную вставку в Си (компилятор GCC) читал тут.
_________________ Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Заголовок сообщения: Re: Ассемблер для STM32. Сложно ли, стоит ли пытаться?
Добавлено: Чт ноя 28, 2019 04:44:27
Опытный кот
Карма: 13
Рейтинг сообщений: 163
Зарегистрирован: Сб дек 22, 2012 08:17:42 Сообщений: 744 Откуда: Караганда, Казахстан
Рейтинг сообщения:0
Кстати, возвращаясь к теме. Никто не сказал главного - того, что для нормальных ассемблеров (про Гнусный я ничего не знаю) нет заголовочных файлов от производителя. Все упражнения на тему ассемблера STM32, ходящие в Сети, либо оперируют "магическими числами", либо используют самодельные наборы описания периферии, в лучшем случае - полученные самодельными конвертерами из сишных файлов .h, а то и просто переделанными из этих .h вручную.
_________________ Кто мешает тебе выдумать порох непромокаемый? (К. Прутков, мысль № 133)
Никто не сказал главного - того, что для нормальных ассемблеров (про Гнусный я ничего не знаю) нет заголовочных файлов от производителя
И что ж здесь главного? При необходимости все эти описания вручную делаются по документации даже, а не по сишным заголовкам. Да, потребует некоторого времени -- но ничего принципиально сложного в этом нет.
Никто не сказал главного - того, что для нормальных ассемблеров (про Гнусный я ничего не знаю) нет заголовочных файлов от производителя.
И что? Я описания периферии всегда сам пишу, по мануалу на МК. Даже если работа с периферией идёт только из си. и никакие "заголовочные файлы от производителя" не пользую.
Я описания периферии всегда сам пишу, по мануалу на МК.
А зачем? Ведь это имеет смысл, если ты это делаешь лучше производителя. Чем твоё описание лучше? Стоит оно того, учитывая что это ещё и источник ошибок?
У меня есть хотелки по улучшению файлов описания периферии, но оценивая весь этот зоопарк, понимаю что неподъёмно.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 18
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения