STM32 новичку в ARM что к чему

Кто любит RISC в жизни, заходим, не стесняемся.
Ответить
Друг Кота
Аватара пользователя
Сообщения: 7059
Зарегистрирован: Сб янв 28, 2006 22:47:24

Сообщение Asmodey »

Понятно.
Астролябия-сама меряет, было бы что мерять!!!
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18793
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

a5021 писал(а):Другое дело volatile
расскажите нам, как контроллер DMA изменит своё поведение от того, что получит указатель с volatile или без оного.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Реклама
Друг Кота
Сообщения: 6457
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

[uquote="ARV",url="/forum/viewtopic.php?p=3894860#p3894860"]расскажите нам, как контроллер DMA изменит своё поведение от того, что получит указатель с volatile или без оного.[/uquote]
Пусть вам об этом расскажет тот, у кого вы про "контроллер DMA" прочитали.
Друг Кота
Аватара пользователя
Сообщения: 4906
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

a5021 писал(а):Все ровно так, как вы любите. Но если захочется погорячее и придет в голову сделать все-таки правильно, то жгучий перчик не замедлит обнаружиться:

Изображение

Итого имеем: передача правильного буфера вызывает возражения компиля, в то время, как передача горбухи проходит на ура
То есть, Вы специально зачем-то передаёте в функцию volatile буфер (хотя она принимает обычный указатель), и считаете это правильным? Ну, приведите явно к обычному указателю при вызове, и будет вам счастье без варнингов.
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Сообщения: 6457
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

[uquote="WiseLord",url="/forum/viewtopic.php?p=3894890#p3894890"]То есть, Вы специально зачем-то передаёте в функцию volatile буфер (хотя она принимает обычный указатель), и считаете это правильным?[/uquote]
То, что изменяемые извне переменные должны объявляться с модификатором volatile -- это не я считаю. Это единственный способ избежать множества дивных эффектов в случайные моменты времени.
Ну, приведите явно к обычному указателю при вызове, и будет вам счастье без варнингов.
Пока что я испытываю крайнее разочарование от столь бестолковых советов.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 3386
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

a5021 писал(а):Вы про бузину в огороде?
У вас растет бузина в огороде? :)))
WiseLord писал(а):То есть, Вы специально зачем-то передаёте в функцию volatile буфер (хотя она принимает обычный указатель), и считаете это правильным?
И я про тоже что volatile в данном случае не нужен.
a5021 писал(а):Конечная запись этого адреса в регистр будет все равно, как 32-бита без знака. Другое дело volatile.
Хотите сказать что приведя тип исключив volatile, функция работает не так как должна?
Повторюсь, для этой функции не нужен volatile.
Если не нравятся предупреждения, приводите тип. Если все равно несогласны - пишите в ST и доказывайте им что в HAL_SPI_Receive_DMA буфер должен быть с модификатором volatile.
a5021 писал(а):То, что изменяемые извне переменные должны объявляться с модификатором volatile
Вы изменяете содержимое буфера после его передачи функции и до завершения DMA транзации? :shock:
Но даже в этом случае как модуль DMA узнает что данные изменены и что он по вашему с этим должен делать?
Такое впечатление что вы не знаете в каких случаях нужен volatile и используете его везде.
a5021 писал(а):ока что я испытываю крайнее разочарование от столь бестолковых советов.
Не хотите тут получать советы - обращайтесь в техподдержку ST и требуйте чтобы у функции был модификатор volatile, аргументировано объясняя им зачем он нужен в данном случае.

И вообще, зачем вы используйте HAL? Пишите на регистрах и не будет проблем.
Реклама
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="a5021",url="/forum/viewtopic.php?p=3894898#p3894898"]То, что изменяемые извне переменные должны объявляться с модификатором volatile -- это не я считаю. Это единственный способ избежать множества дивных эффектов в случайные моменты времени.[/uquote]Далеко не единственный. Странно, что вы этого не знаете.
Друг Кота
Сообщения: 6457
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

Просветите?


[uquote="Мурик",url="/forum/viewtopic.php?p=3894905#p3894905"]Хотите сказать что приведя тип исключив volatile, функция работает не так как должна?[/uquote]
Я в самом начале уже сказал все, что хотел. Словами и иллюстрациями. Теперь помогаю тем, кто ни прочесть, ни в картинках разглядеть никак не способен.
Друг Кота
Аватара пользователя
Сообщения: 3386
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

a5021 писал(а):Я в самом начале уже сказал все, что хотел. Словами и иллюстрациями.
Вы так и не ответили. Приведение типа volatile массива к не volatile при передаче в функцию HAL_SPI_Receive_DMA приводит к сбою в работе программы?
a5021 писал(а):Теперь помогаю тем, кто ни прочесть, ни в картинках разглядеть никак не способен.
Пишите так как будто это нужно нам, а не вам.
Научитесь пользоваться volatile чтобы понимать в каких случаях он действительно нужен. Не дело везде объявлять переменные с модификатором volatile и паниковать когда это не получается.
Друг Кота
Сообщения: 6457
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

Мурик, ложитесь лучше спать. Я не нанимался вызывать у вас просветления.
Друг Кота
Аватара пользователя
Сообщения: 3386
Зарегистрирован: Пн окт 11, 2010 19:00:08

Сообщение Мурик »

Изучайте.
volatile для чайников.pdf
(176.63 КБ) 341 скачивание
Несогласны с декларацией функции, идите в ST и доказывайте что volatile нужен. То что вы пишете здесь никак не изменит декларацию функций HAL.
Друг Кота
Аватара пользователя
Сообщения: 4906
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

a5021 писал(а):Это единственный способ избежать множества дивных эффектов в случайные моменты времени
Не единственный. Например, если никто не мешает Вам заблокировать работу с буфером, пока DMA в него пишет.

А надеятся, что добавление volatile к аргументу чудесным образом всё решает - это неправильно.

Например, возьмём буфер из 10 volatile элементов. Допустим, DMA читает из этого буфера их последовательно, и процесс чтения в данный момент времени - на 5-м элементе. В это время параллельно (по прерыванию, например), изменяются элементы 2 и 7. Какие могут быть варианты:

1. volatile. Из индекса 2 мы уже прочитали - тут ничего не попишешь, ну а из индекса 7 будет прочитано новое число. Есть повод задуматься, хорошо ли это, что данные пришли из разных по сути выборок.
2. не volatile. Есть очень малый шанс, что из индекса 7 будет прочитано прежнее число, а не свежезаписанное (малый потому, что вряд ли весь массив будет предварительно скопирован в рабочие регистры и тем самым "закэшируется" локально). Но если и так - то плохого в этом ничего нет.

Оба варианта имеют свои недостатки. А делать принудительно весь аргумент функции как volatile - это лишь лишить себя (и компилятор) дополнительной возможной оптимизации.

Вместо этого, если Вам действительно нужна атомарность работы со всем буфером, Вы, как программист, должны обеспечить её другим способом - каким-нибудь аналогом mutex-а. В случае микроконтроллера без ОС - это может быть какой-нибудь банальный флаг типа (volatile bool isBusy). Напишите свою HAL_SPI_Receive_DMA_Locked() функцию, в которой будет вызов уже стандартной HAL-овской, обёрнутый этим флагом, и обеспечьте другую часть своего кода на проверку этих флагов, чтобы они и не думали лезть в этот буфер, пока он залочен.
Последний раз редактировалось WiseLord Вс сен 20, 2020 01:17:58, всего редактировалось 1 раз.
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

WiseLord, volatile это не про атомарность, тут вы неправы.
Друг Кота
Аватара пользователя
Сообщения: 4906
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

Собственно, я и пытаюсь сказать, что volatile с атомарностью никак не связан. А a5021, видимо, их ассоциирует именно так.

Volatile по большому счёту лишь предотвращает помещение переменной в какой-нибудь из регистров, который затем используется на протяжении всей функции в качестве кэша этой переменной.

Но в случае массивов - я сильно сомневаюсь, что будет кэшироваться сразу несколько его элементов.

P.S. В случае упомянутой выше HAL_SPI_Receive_DMA функции каждый элемент буфера затрагивается только один раз - когда он из периферийного регистра попадает в элемент массива. Каких-то множественных обращений (которые могли бы вызвать разные странные эффекты) к нему там нет. Поэтому volatile тут и не нужен.
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

И ещё раз нет. Компилятор не видит как в буфер пишутся данные, поэтому считает, что в нём всегда что-то известное на этапе компиляции лежит. И может "почикать" обращения к буферу вовсе. volatile это про оптимизацию.

Натыкать volatile ума много не надо. Куда интереснее заставить компилятор просчитать оптимальный код или его отсутствие на этапе компиляции.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18793
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

так никто и не ответил, каким образом может измениться поведение этой функции с/без volatile, если данные по указателю эта функция не использует?
как всегда спор теоретегоф...
VladislavS писал(а):И может "почикать" обращения к буферу вовсе
меня всегда интересовало: а вообще бывают случаи, когда в выражении a = b + b + b; необходимо учитывать, что это самое бэ может каждый из трех раз иметь другое значение? вот чисто алгоритмически - бывают?

Добавлено after 3 minutes 44 seconds:
VladislavS писал(а):что в нём всегда что-то известное на этапе компиляции лежит
по-моему, вы ошибаетесь: не известное на этапе компиляции, а неизменное между точками исполнения (или как там эти участки генерации кода компилятором называются правильно).
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="ARV",url="/forum/viewtopic.php?p=3895001#p3895001"]меня всегда интересовало: а вообще бывают случаи, когда в выражении a = b + b + b; необходимо учитывать, что это самое бэ может каждый из трех раз иметь другое значение? вот чисто алгоритмически - бывают?[/uquote]Не зная что такое а и b предположить можно что угодно. Про перегрузку операторов слышали?
[uquote="ARV",url="/forum/viewtopic.php?p=3895001#p3895001"]по-моему, вы ошибаетесь: не известное на этапе компиляции, а неизменное между точками исполнения (или как там эти участки генерации кода компилятором называются правильно).[/uquote]Я имел в виду именно известное на этапе компиляции. Вот в этом коде компилятор сгенерирует запись константы 2 в порт. То что buf может измениться из прерывария или с помощью DMA он не ожидает.

Код: Выделить всё

uint8_t buf[2] = { 1, 2 };
GPIOA->ODR = buf[1];
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18793
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

VladislavS писал(а):Про перегрузку операторов слышали?
слышать слышал, но при чем тут перегрузка, если переменная "бэ" одна и та же, значит, как бы операторы не перегружались, а обрабатывать они будут одно и то же.
VladislavS писал(а):То что buf может измениться из прерывария или с помощью DMA он не ожидает
а если ожидает - разве он сможет это как-то учесть?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2567
Зарегистрирован: Вт май 01, 2018 19:44:47

Сообщение VladislavS »

[uquote="ARV",url="/forum/viewtopic.php?p=3895106#p3895106"]как бы операторы не перегружались, а обрабатывать они будут одно и то же.[/uquote]Давайте сделаем вид, что вы этого не писали, а я не видел :)

[uquote="ARV",url="/forum/viewtopic.php?p=3895106#p3895106"]а если ожидает - разве он сможет это как-то учесть?[/uquote]Конечно, выделит область памяти и каждый раз оттуда будет читать. Собственно volatile к этому и приведёт.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18793
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

VladislavS писал(а):выделит область памяти и каждый раз оттуда будет читать
да, но тот момент, что пока он пишет 5-й элемент, первый уже не равен тому, что он написал ранее, он учесть не сможет все равно. так ведь?
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Ответить

Вернуться в «ARM»