Forger 26 21 апреля, 2017 Опубликовано 21 апреля, 2017 · Жалоба Как раз для проца - совсем несуровый - ... Суровый в смысле отладки и тестирования. Такое, наверно, приходится применять, когда камень заменить нереально, т. к. уже понаделана куча плат. У вас тот случай? ;) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Reflector 0 21 апреля, 2017 Опубликовано 21 апреля, 2017 · Жалоба пусть 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... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
AHTOXA 18 21 апреля, 2017 Опубликовано 21 апреля, 2017 · Жалоба В твоем кода, кстати, то же самое. В MODER и еще двух регистрах режим задается выставлением двух битов, но при использовании bitband они выставляются по отдельности... Да, есть такое. Но это лучше, чем испортить MODER при RMW из нескольких потоков. Прерывания запрещать в настройке пина я не решился. А у тебя как это сделано? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 21 апреля, 2017 Опубликовано 21 апреля, 2017 · Жалоба Суровый в смысле отладки и тестирования. Такое, наверно, приходится применять, когда камень заменить нереально, т. к. уже понаделана куча плат. У вас тот случай? ;) Не совсем. Где Вы возьмёте МК с 6 UART-ами например? При этом чтобы не экзотика какая и остальная периферия нормальная была. Вот и выбрали LPC1778 заранее зная, что надо будет один из UART-ов программно эмулировать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 26 21 апреля, 2017 Опубликовано 21 апреля, 2017 · Жалоба Не совсем. Где Вы возьмёте МК с 6 UART-ами например? Я и задачу-то такую не найду, где нужно стока uart ... если позволяет бюджет изделия, в таком случае я бы поставил плис Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Шаманъ 1 21 апреля, 2017 Опубликовано 21 апреля, 2017 · Жалоба Польза в том, что инвертирование вывода будет за 1 машинный такт, атомарное, вот и всё! Инвертирование за один такт пожалуй единственная реальная польза. Атомарность инвертированию одного пина не особо нужна, или у Вас есть пример, где она реально может понадобиться? Как вариант такого применения (я использовал это на практике): Реализация передачи для soft-UART через таймер+DMA+GPIO ................. На МК где нет инверсии пина, это решается более громоздкой передачей "свЯзным списком" в перемежающие адреса регистров установки или сброса. Либо (если в GPIO МК есть регистр маски пинов) - маскированием (но операция может быть конфликтной с другими подобными). На STM32 это не решается никак из-за отсутствия инверсии пина и отсутствии передачи "свЯзным списком". Что-то я не совсем понимаю, а в чем проблема при наличии BSRR регистра проделать то же самое? Подготовили в памяти массив слов и шлем в BSRR, в конце блока прерывание. Где Вы возьмёте МК с 6 UART-ами например? У того stmа, что сейчас лежит передо мной 8 UARTов, не уверен получится ли все их задействовать одновременно (в смысле распределения по ногам), но у меня не самый многоногий корпус ;) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 21 апреля, 2017 Опубликовано 21 апреля, 2017 · Жалоба Я и задачу-то такую не найду, где нужно стока uart ... если позволяет бюджет изделия, в таком случае я бы поставил плис Бюджет не позволяет однозначно. Во-первых - стоимость самого устройства, во-вторых - стоимость разработки (нужно ещё ПЛИС программировать); в-третьих - стоимость сопровождения (как быть если обнаружится баг в прошивке ПЛИС? необходимо удалённое обновление её прошивки значит). Да и зачем??? ПЛИС для доп. UART-а - это из пушки по воробьям. У того stmа, что сейчас лежит передо мной 8 UARTов, не уверен получится ли все их задействовать одновременно (в смысле распределения по ногам), но у меня не самый многоногий корпус ;) Да, вот именно у STM32 есть проблема с одновременным задействованием всех этих UART. Даже если по ногам хватит, то не хватит по ресурсам - на все не хватит DMA, а работать без DMA и без FIFO в UART-е с кучей портов одновременно, когда есть и ещё более приоритетные прерывания - будет приводить к сбоям и потерям. PS: Да, я имел в виду на тот момент не было подходящих МК (эта разработка была лет 7 назад). В более поздней подобной разработке использовали уже Tiva - там тоже есть 8 UART-ов причём полноценных - каждый с FIFO - можно работать с ними и без DMA. Что-то я не совсем понимаю, а в чем проблема при наличии BSRR регистра проделать то же самое? Подготовили в памяти массив слов и шлем в BSRR, в конце блока прерывание. Я уже написал, что тут ошибся, не посмотрел что у STM это один регистр установки/сброса - см. пост выше. Атомарность инвертированию одного пина не особо нужна, или у Вас есть пример, где она реально может понадобиться? В смысле? Какую атомарность имеете в виду? Атомарность операции внутри процессора или атомарность для внешнего устройства (правильный парафазный сигнал, фронт/спад в один момент)? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 26 21 апреля, 2017 Опубликовано 21 апреля, 2017 · Жалоба Бюджет не позволяет однозначно. Во-первых - стоимость самого устройства, во-вторых - стоимость разработки (нужно ещё ПЛИС программировать); Ну, тут уж все надо считать. Воткнуть в плис готовый аппаратный uart, исзодников которого щас интернетах вагон и маленькая тележка .. не вижу особых трудностей. Нужен лишь тот, кто умеет работать с плис, впрочем, опытный разраб. сумеет научиться самостоятельно, но это время и скорее всего деньги. Короче, я предложил вариант, который сам бы применил в подобном случае. в-третьих - стоимость сопровождения (как быть если обнаружится баг в прошивке ПЛИС? необходимо удалённое обновление её прошивки значит). На кой менять прошивку, где работают только несколько одинаковых uart? Для такой тривиальной задачи имеет смысл сразу ее отладить и оттестировать. Впрочем, если в плис будет еще что-то, кроме uart, то прошивку можно делать прямо от проца - сменили прошивку проца и он сменил прошивку плис. Но это уже совсем другая история. ПЛИС для доп. UART-а - это из пушки по воробьям.Плис бывают разные ))) Как вариант без плис: MAX14830 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 21 апреля, 2017 Опубликовано 21 апреля, 2017 · Жалоба На кой менять прошивку, где работают только несколько одинаковых uart? Для такой тривиальной задачи имеет смысл сразу ее отладить и оттестировать. Ну да... Гладко было на бумаге да забыли про овраги. Как показывает практика, даже в самой отлаженной и тривиальной задаче могут быть баги. Наступали на эти грабли и очень больно. У Вас видно нет заказчиков с несколькими тысячами Ваших изделий раскиданных на тысячи км по глухой тайге. Да ещё когда устройство работает на объекте в режиме 24/7 и отключить его - огромная проблема. Стоимость ошибки в ПО и обновления ПО с приездом на объект тут получается просто фантастической. Я сам когда-то летал на вертолёте по этим объектам и обновлял прошивки. Рассказать про стоимость часа аренды вертолёта? B) С тех пор взяли за правило: если в изделии используются некие компоненты с прошивкой, то должна быть возможность удалённого обновления этой прошивки по протоколу работы устройства без его остановки в обязательном порядке. И это правило нас потом неоднократно выручало. Плис бывают разные ))) Стоимость ПЛИС какой бы она ни была, всё равно выше 0. А это изделие предполагалось сделать бюджетным. И ещё Вы забываете про стоимость изготовления. ПЛИС ещё прошить надо. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 26 21 апреля, 2017 Опубликовано 21 апреля, 2017 · Жалоба И ещё Вы забываете про стоимость изготовления. ПЛИС ещё прошить надо.Наверно, у вас работает очень дорогой настройшик - 2 минуты работы которого © "стоят тысячу фунтов" :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
juvf 17 21 апреля, 2017 Опубликовано 21 апреля, 2017 · Жалоба Атомарность инвертированию одного пина не особо нужна, или у Вас есть пример, где она реально может понадобиться?на вскидку один я уже писал в этой теме. на РА0 у вас CS, на РА5 у вас светодиод внешний вачдог. каждый пин дергается в отдельном потоке. Если использовать неатомарный тогл (GPIO_ToggleBits() ) для вачдога из SPL от STM, без критСекций/запрета прерываний/мьютексов на порта РА, то будет косяк. Да даже без ОС: в главном while вы работаете с РB1, в прерывании PB2 - вот ещё случай. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 241 21 апреля, 2017 Опубликовано 21 апреля, 2017 · Жалоба Наверно, у вас работает очень дорогой настройшик - 2 минуты работы которого © "стоят тысячу фунтов" :) Стоимость работы настройщика + стоимость ПЛИС (или чего там вместо) + стоимость написания ПО обновления прошивки. Это на одной тарелке весов. На другой - стоимость написания soft-UART. Сравните. Разница многократная. Да - и как с этой ПЛИС взаимодействовать? Поди ещё и внешняя шина нужна? Ног в том проекте тоже не хватало. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Forger 26 21 апреля, 2017 Опубликовано 21 апреля, 2017 · Жалоба Да - и как с этой ПЛИС взаимодействовать? Поди ещё и внешняя шина нужна? Ног в том проекте тоже не хватало. Вполне хватит одного SPI, как это сделано в MAX14830 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 21 апреля, 2017 Опубликовано 21 апреля, 2017 · Жалоба Человек не понимает понятие "атомарность". Что поделать. Для одновременной установки и сброса (а это нужно например для формирования парафазных сигналов, но не только - есть другие применения, где очень сложно без такой опции) если нет возможности инверсии пина, то ViKo придётся: 1. запретить прерывания; 2. считать слово из порта текущих значений пинов; 3. установить в нём бит; 4. сбросить в нём бит; 5. записать слово в порт текущих значений пинов; 6. разрешить прерывания. Всего-то 6 операций вместо одной. ViKo, Вы: а) понятия не имеет об атомарности операций и её необходимости? или б) троллите всех тут? Вы хоть смотрели, как работают биты в регистре BSRR? Вся ваша галиматья не к месту. Ага, вижу, посмотрели таки! Гуд! Теперь согласны насчет галиматьи? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Шаманъ 1 21 апреля, 2017 Опубликовано 21 апреля, 2017 (изменено) · Жалоба В смысле? Какую атомарность имеете в виду? Атомарность операции внутри процессора или атомарность для внешнего устройства (правильный парафазный сигнал, фронт/спад в один момент)? Атомарность внутри процессора. Для внешнего устройства по идее достаточно (скажем для битов 0 и 7): GPIOx->BSRR = (~GPIOx->IDR & 0x81) | 0x00810000; Ну и изначально должно быть правильное состояние битов (например, GPIOx->BSRR = 0x00800001). на вскидку один я уже писал в этой теме. на РА0 у вас CS, на РА5 у вас светодиод внешний вачдог. каждый пин дергается в отдельном потоке. Если использовать неатомарный тогл (GPIO_ToggleBits() ) для вачдога из SPL от STM, без критСекций/запрета прерываний/мьютексов на порта РА, то будет косяк. Да даже без ОС: в главном while вы работаете с РB1, в прерывании PB2 - вот ещё случай. Этот пример мимо, ибо в данном случае идет речь о регистре BSRR и операциях с одним пином. Если изменение состояния пинов сделано через BSRR, то все будет прекрасно работать в двух потоках :) Проблема может быть только если оба потока пытаются управлять одним и тем же пином, но это без какой-либо синхронизации не правильно по своей сути. Изменено 21 апреля, 2017 пользователем Шаманъ Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться