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

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

Сообщение VladislavS »

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

Сообщение a5021 »

Просветите?


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

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

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

Сообщение a5021 »

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

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

Изучайте.
volatile для чайников.pdf
(176.63 КБ) 290 скачиваний
Несогласны с декларацией функции, идите в ST и доказывайте что volatile нужен. То что вы пишете здесь никак не изменит декларацию функций HAL.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 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 это не про атомарность, тут вы неправы.
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 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
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 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
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 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
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18783
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

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

Сообщение VladislavS »

И вы про атомарность. Это другой вопрос. Мухи отдельно, котлеты отдельно.
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

[uquote="ARV",url="/forum/viewtopic.php?p=3895001#p3895001"]так никто и не ответил, каким образом может измениться поведение этой функции с/без volatile, если данные по указателю эта функция не использует?[/uquote]
А зачем отвечать на странные вопросы, которые к теме в данном случае отношения не имеют? С тем же успехом вы бы могли требовать ответа на вопрос, как влияет частое употребление модификатора volatile на состав кишечных газов.
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

Напомню, что:
[uquote="a5021",url="/forum/viewtopic.php?p=3894133#p3894133"]Объясните, кто знает, плс, почему в неблокирующую функцию

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

HAL_StatusTypeDef HAL_SPI_Receive_DMA(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size)
указатель на буфер pData передается без модификатора volatile ? Чет это на какой-то зашквар смахивает.[/uquote]
Вы сами начали задавать странные вопросы. Априори полагая, что volatile - правильно, а без него - какие-то выдуманные глюки и страдания будут.
Контактная информация:
Собутыльник Кота
Аватара пользователя
Сообщения: 2516
Зарегистрирован: Пт июл 12, 2019 22:52:01

Сообщение Eddy_Em »

[uquote="WiseLord",url="/forum/viewtopic.php?p=3895275#p3895275"]Априори полагая, что volatile - правильно, а без него - какие-то выдуманные глюки и страдания будут.[/uquote]
Чтобы не было глюков и страданий, нужно просто перестать всякими "халами" пользоваться!
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Контактная информация:
Друг Кота
Сообщения: 6452
Зарегистрирован: Пт сен 13, 2013 13:11:31

Сообщение a5021 »

[uquote="WiseLord",url="/forum/viewtopic.php?p=3895275#p3895275"]Вы сами начали задавать странные вопросы. Априори полагая, что volatile - правильно, а без него - какие-то выдуманные глюки и страдания будут.[/uquote]
Когда функция молча принимает неверные параметры, но ругается на верные, это выдуманные страдания? Ну поздравьте себя.

[uquote="Eddy_Em",url="/forum/viewtopic.php?p=3895318#p3895318"]Чтобы не было глюков и страданий, нужно просто перестать всякими "халами" пользоваться![/uquote]
Судя по тому, какое количество фанатов хала понабежало, говорить такие вещи здесь -- пустое дело.
Друг Кота
Аватара пользователя
Сообщения: 4905
Зарегистрирован: Чт апр 11, 2013 11:19:59
Откуда: Минск

Сообщение WiseLord »

a5021 писал(а):Когда функция молча принимает неверные параметры, но ругается на верные, это выдуманные страдания?
Нет, это просто Вы передаёте ей неверные параметры.

Добавлено after 1 minute 32 seconds:
Eddy_Em писал(а):Чтобы не было глюков и страданий, нужно просто перестать всякими "халами" пользоваться!
А вот это - двумя руками поддерживаю. И автоматически причин к недовольству не будет.
Контактная информация:
Ответить

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