|
|
  |
Библиотеки для STM32 |
|
|
|
Apr 21 2017, 07:45
|
Участник

Группа: Участник
Сообщений: 48
Регистрация: 15-07-06
Пользователь №: 18 836

|
Цитата(juvf @ Apr 21 2017, 06:04)  пусть b = 0xff; GpioB<4>::write(b & 0x20); b & 0x20 даёт 0x20. что дальше? write() принимает bool. т.е. при передачи аргумента есть неявное преобразование uint8_t(0x20) в bool (0х01)? да и ещё и передача аргумента... т.е. копя data создается внутри write(). Write всегда инлайнится, никакой копии data там не будет. Вот дизассм: Код 0x20000844 ldr r3, [sp, #4] 0x20000846 ldr r2, [pc, #80] 0x20000848 ubfx r3, r3, #5, #1 0x2000084c lsls r3, r3, #8 0x2000084e orr.w r3, r3, #0x1000000 0x20000852 str r3, [r2, #24] А это для для варианта с проверкой: Код // GPIOB->BSRR = (b & 0x20) ? GPIO_BSRR_BS4 : GPIO_BSRR_BR4; 0x20000844 ldr r2, [sp, #4] 0x20000846 ldr r3, [pc, #84] 0x20000848 tst.w r2, #32 0x2000084c ite eq 0x2000084e moveq.w r2, #1048576 0x20000852 movne r2, #16 0x20000854 str r2, [r3, #24] Лишняя команда, лишние 2 байта, абсолютно не критично, но пострадала еще и наглядность, причем такой менее очевидный код еще и приходится для каждого пина писать заново. ps. Только я тут опечатался, не GpioB, он работает с маской группы битов, тогда как минимум нужно 4 заменить на 0x10, а PinB...
|
|
|
|
|
Apr 21 2017, 07:46
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(Reflector @ Apr 21 2017, 12:11)  В твоем кода, кстати, то же самое. В MODER и еще двух регистрах режим задается выставлением двух битов, но при использовании bitband они выставляются по отдельности... Да, есть такое. Но это лучше, чем испортить MODER при RMW из нескольких потоков. Прерывания запрещать в настройке пина я не решился. А у тебя как это сделано?
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Apr 21 2017, 07:51
|
Знающий
   
Группа: Участник
Сообщений: 758
Регистрация: 27-08-08
Пользователь №: 39 839

|
Цитата(juvf @ Apr 21 2017, 09:24)  Польза в том, что инвертирование вывода будет за 1 машинный такт, атомарное, вот и всё! Инвертирование за один такт пожалуй единственная реальная польза. Атомарность инвертированию одного пина не особо нужна, или у Вас есть пример, где она реально может понадобиться? Цитата(jcxz @ Apr 21 2017, 10:16)  Как вариант такого применения (я использовал это на практике): Реализация передачи для soft-UART через таймер+DMA+GPIO ................. На МК где нет инверсии пина, это решается более громоздкой передачей "свЯзным списком" в перемежающие адреса регистров установки или сброса. Либо (если в GPIO МК есть регистр маски пинов) - маскированием (но операция может быть конфликтной с другими подобными). На STM32 это не решается никак из-за отсутствия инверсии пина и отсутствии передачи "свЯзным списком". Что-то я не совсем понимаю, а в чем проблема при наличии BSRR регистра проделать то же самое? Подготовили в памяти массив слов и шлем в BSRR, в конце блока прерывание. Цитата(jcxz @ Apr 21 2017, 10:46)  Где Вы возьмёте МК с 6 UART-ами например? У того stmа, что сейчас лежит передо мной 8 UARTов, не уверен получится ли все их задействовать одновременно (в смысле распределения по ногам), но у меня не самый многоногий корпус
|
|
|
|
|
Apr 21 2017, 08:03
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(Forger @ Apr 21 2017, 09:48)  Я и задачу-то такую не найду, где нужно стока uart ... если позволяет бюджет изделия, в таком случае я бы поставил плис Бюджет не позволяет однозначно. Во-первых - стоимость самого устройства, во-вторых - стоимость разработки (нужно ещё ПЛИС программировать); в-третьих - стоимость сопровождения (как быть если обнаружится баг в прошивке ПЛИС? необходимо удалённое обновление её прошивки значит). Да и зачем??? ПЛИС для доп. UART-а - это из пушки по воробьям. Цитата(Шаманъ @ Apr 21 2017, 09:51)  У того stmа, что сейчас лежит передо мной 8 UARTов, не уверен получится ли все их задействовать одновременно (в смысле распределения по ногам), но у меня не самый многоногий корпус  Да, вот именно у STM32 есть проблема с одновременным задействованием всех этих UART. Даже если по ногам хватит, то не хватит по ресурсам - на все не хватит DMA, а работать без DMA и без FIFO в UART-е с кучей портов одновременно, когда есть и ещё более приоритетные прерывания - будет приводить к сбоям и потерям. PS: Да, я имел в виду на тот момент не было подходящих МК (эта разработка была лет 7 назад). В более поздней подобной разработке использовали уже Tiva - там тоже есть 8 UART-ов причём полноценных - каждый с FIFO - можно работать с ними и без DMA. Цитата(Шаманъ @ Apr 21 2017, 09:51)  Что-то я не совсем понимаю, а в чем проблема при наличии BSRR регистра проделать то же самое? Подготовили в памяти массив слов и шлем в BSRR, в конце блока прерывание. Я уже написал, что тут ошибся, не посмотрел что у STM это один регистр установки/сброса - см. пост выше. Цитата(Шаманъ @ Apr 21 2017, 09:51)  Атомарность инвертированию одного пина не особо нужна, или у Вас есть пример, где она реально может понадобиться? В смысле? Какую атомарность имеете в виду? Атомарность операции внутри процессора или атомарность для внешнего устройства (правильный парафазный сигнал, фронт/спад в один момент)?
|
|
|
|
|
Apr 21 2017, 08:10
|

Профессионал
    
Группа: Свой
Сообщений: 1 215
Регистрация: 22-02-05
Пользователь №: 2 831

|
Цитата(jcxz @ Apr 21 2017, 10:57)  Бюджет не позволяет однозначно. Во-первых - стоимость самого устройства, во-вторых - стоимость разработки (нужно ещё ПЛИС программировать); Ну, тут уж все надо считать. Воткнуть в плис готовый аппаратный uart, исзодников которого щас интернетах вагон и маленькая тележка .. не вижу особых трудностей. Нужен лишь тот, кто умеет работать с плис, впрочем, опытный разраб. сумеет научиться самостоятельно, но это время и скорее всего деньги. Короче, я предложил вариант, который сам бы применил в подобном случае. Цитата в-третьих - стоимость сопровождения (как быть если обнаружится баг в прошивке ПЛИС? необходимо удалённое обновление её прошивки значит). На кой менять прошивку, где работают только несколько одинаковых uart? Для такой тривиальной задачи имеет смысл сразу ее отладить и оттестировать. Впрочем, если в плис будет еще что-то, кроме uart, то прошивку можно делать прямо от проца - сменили прошивку проца и он сменил прошивку плис. Но это уже совсем другая история. Цитата ПЛИС для доп. UART-а - это из пушки по воробьям. Плис бывают разные ))) Как вариант без плис: MAX14830
--------------------
Кругозор некоторых людей - круг с нулевым радиусом. Они называют его "точкой зрения".
|
|
|
|
|
Apr 21 2017, 08:15
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(Forger @ Apr 21 2017, 10:06)  На кой менять прошивку, где работают только несколько одинаковых uart? Для такой тривиальной задачи имеет смысл сразу ее отладить и оттестировать. Ну да... Гладко было на бумаге да забыли про овраги. Как показывает практика, даже в самой отлаженной и тривиальной задаче могут быть баги. Наступали на эти грабли и очень больно. У Вас видно нет заказчиков с несколькими тысячами Ваших изделий раскиданных на тысячи км по глухой тайге. Да ещё когда устройство работает на объекте в режиме 24/7 и отключить его - огромная проблема. Стоимость ошибки в ПО и обновления ПО с приездом на объект тут получается просто фантастической. Я сам когда-то летал на вертолёте по этим объектам и обновлял прошивки. Рассказать про стоимость часа аренды вертолёта? С тех пор взяли за правило: если в изделии используются некие компоненты с прошивкой, то должна быть возможность удалённого обновления этой прошивки по протоколу работы устройства без его остановки в обязательном порядке. И это правило нас потом неоднократно выручало. Цитата(Forger @ Apr 21 2017, 10:06)  Плис бывают разные ))) Стоимость ПЛИС какой бы она ни была, всё равно выше 0. А это изделие предполагалось сделать бюджетным. И ещё Вы забываете про стоимость изготовления. ПЛИС ещё прошить надо.
|
|
|
|
|
Apr 21 2017, 08:22
|
Гуру
     
Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713

|
Цитата(Forger @ Apr 21 2017, 10:18)  Наверно, у вас работает очень дорогой настройшик - 2 минуты работы которого © "стоят тысячу фунтов"  Стоимость работы настройщика + стоимость ПЛИС (или чего там вместо) + стоимость написания ПО обновления прошивки. Это на одной тарелке весов. На другой - стоимость написания soft-UART. Сравните. Разница многократная. Да - и как с этой ПЛИС взаимодействовать? Поди ещё и внешняя шина нужна? Ног в том проекте тоже не хватало.
|
|
|
|
|
Apr 21 2017, 08:42
|
Знающий
   
Группа: Участник
Сообщений: 758
Регистрация: 27-08-08
Пользователь №: 39 839

|
Цитата(jcxz @ Apr 21 2017, 11:03)  В смысле? Какую атомарность имеете в виду? Атомарность операции внутри процессора или атомарность для внешнего устройства (правильный парафазный сигнал, фронт/спад в один момент)? Атомарность внутри процессора. Для внешнего устройства по идее достаточно (скажем для битов 0 и 7): GPIOx->BSRR = (~GPIOx->IDR & 0x81) | 0x00810000; Ну и изначально должно быть правильное состояние битов (например, GPIOx->BSRR = 0x00800001). Цитата(juvf @ Apr 21 2017, 11:21)  на вскидку один я уже писал в этой теме. на РА0 у вас CS, на РА5 у вас светодиод внешний вачдог. каждый пин дергается в отдельном потоке. Если использовать неатомарный тогл (GPIO_ToggleBits() ) для вачдога из SPL от STM, без критСекций/запрета прерываний/мьютексов на порта РА, то будет косяк. Да даже без ОС: в главном while вы работаете с РB1, в прерывании PB2 - вот ещё случай. Этот пример мимо, ибо в данном случае идет речь о регистре BSRR и операциях с одним пином. Если изменение состояния пинов сделано через BSRR, то все будет прекрасно работать в двух потоках  Проблема может быть только если оба потока пытаются управлять одним и тем же пином, но это без какой-либо синхронизации не правильно по своей сути.
Сообщение отредактировал Шаманъ - Apr 21 2017, 08:48
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|