STM32 новичку в ARM что к чему
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
[uquote="a5021",url="/forum/viewtopic.php?p=3894898#p3894898"]То, что изменяемые извне переменные должны объявляться с модификатором volatile -- это не я считаю. Это единственный способ избежать множества дивных эффектов в случайные моменты времени.[/uquote]Далеко не единственный. Странно, что вы этого не знаете.
- Реклама
- Сообщения: 6452
- Зарегистрирован: Пт сен 13, 2013 13:11:31
Просветите?
[uquote="Мурик",url="/forum/viewtopic.php?p=3894905#p3894905"]Хотите сказать что приведя тип исключив volatile, функция работает не так как должна?[/uquote]
Я в самом начале уже сказал все, что хотел. Словами и иллюстрациями. Теперь помогаю тем, кто ни прочесть, ни в картинках разглядеть никак не способен.
[uquote="Мурик",url="/forum/viewtopic.php?p=3894905#p3894905"]Хотите сказать что приведя тип исключив volatile, функция работает не так как должна?[/uquote]
Я в самом начале уже сказал все, что хотел. Словами и иллюстрациями. Теперь помогаю тем, кто ни прочесть, ни в картинках разглядеть никак не способен.
- Сообщения: 3385
- Зарегистрирован: Пн окт 11, 2010 19:00:08
Вы так и не ответили. Приведение типа volatile массива к не volatile при передаче в функцию HAL_SPI_Receive_DMA приводит к сбою в работе программы?a5021 писал(а):Я в самом начале уже сказал все, что хотел. Словами и иллюстрациями.
Пишите так как будто это нужно нам, а не вам.a5021 писал(а):Теперь помогаю тем, кто ни прочесть, ни в картинках разглядеть никак не способен.
Научитесь пользоваться volatile чтобы понимать в каких случаях он действительно нужен. Не дело везде объявлять переменные с модификатором volatile и паниковать когда это не получается.
- Сообщения: 6452
- Зарегистрирован: Пт сен 13, 2013 13:11:31
Мурик, ложитесь лучше спать. Я не нанимался вызывать у вас просветления.
- Сообщения: 3385
- Зарегистрирован: Пн окт 11, 2010 19:00:08
Изучайте.
Несогласны с декларацией функции, идите в ST и доказывайте что volatile нужен. То что вы пишете здесь никак не изменит декларацию функций HAL.
- Реклама
Не единственный. Например, если никто не мешает Вам заблокировать работу с буфером, пока DMA в него пишет.a5021 писал(а):Это единственный способ избежать множества дивных эффектов в случайные моменты времени
А надеятся, что добавление 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
Собственно, я и пытаюсь сказать, что volatile с атомарностью никак не связан. А a5021, видимо, их ассоциирует именно так.
Volatile по большому счёту лишь предотвращает помещение переменной в какой-нибудь из регистров, который затем используется на протяжении всей функции в качестве кэша этой переменной.
Но в случае массивов - я сильно сомневаюсь, что будет кэшироваться сразу несколько его элементов.
P.S. В случае упомянутой выше HAL_SPI_Receive_DMA функции каждый элемент буфера затрагивается только один раз - когда он из периферийного регистра попадает в элемент массива. Каких-то множественных обращений (которые могли бы вызвать разные странные эффекты) к нему там нет. Поэтому volatile тут и не нужен.
Volatile по большому счёту лишь предотвращает помещение переменной в какой-нибудь из регистров, который затем используется на протяжении всей функции в качестве кэша этой переменной.
Но в случае массивов - я сильно сомневаюсь, что будет кэшироваться сразу несколько его элементов.
P.S. В случае упомянутой выше HAL_SPI_Receive_DMA функции каждый элемент буфера затрагивается только один раз - когда он из периферийного регистра попадает в элемент массива. Каких-то множественных обращений (которые могли бы вызвать разные странные эффекты) к нему там нет. Поэтому volatile тут и не нужен.
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
И ещё раз нет. Компилятор не видит как в буфер пишутся данные, поэтому считает, что в нём всегда что-то известное на этапе компиляции лежит. И может "почикать" обращения к буферу вовсе. volatile это про оптимизацию.
Натыкать volatile ума много не надо. Куда интереснее заставить компилятор просчитать оптимальный код или его отсутствие на этапе компиляции.
Натыкать volatile ума много не надо. Куда интереснее заставить компилятор просчитать оптимальный код или его отсутствие на этапе компиляции.
так никто и не ответил, каким образом может измениться поведение этой функции с/без volatile, если данные по указателю эта функция не использует?
как всегда спор теоретегоф...
Добавлено after 3 minutes 44 seconds:
как всегда спор теоретегоф...
меня всегда интересовало: а вообще бывают случаи, когда в выражении a = b + b + b; необходимо учитывать, что это самое бэ может каждый из трех раз иметь другое значение? вот чисто алгоритмически - бывают?VladislavS писал(а):И может "почикать" обращения к буферу вовсе
Добавлено after 3 minutes 44 seconds:
по-моему, вы ошибаетесь: не известное на этапе компиляции, а неизменное между точками исполнения (или как там эти участки генерации кода компилятором называются правильно).VladislavS писал(а):что в нём всегда что-то известное на этапе компиляции лежит
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
[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 он не ожидает.
[uquote="ARV",url="/forum/viewtopic.php?p=3895001#p3895001"]по-моему, вы ошибаетесь: не известное на этапе компиляции, а неизменное между точками исполнения (или как там эти участки генерации кода компилятором называются правильно).[/uquote]Я имел в виду именно известное на этапе компиляции. Вот в этом коде компилятор сгенерирует запись константы 2 в порт. То что buf может измениться из прерывария или с помощью DMA он не ожидает.
Код: Выделить всё
uint8_t buf[2] = { 1, 2 };
GPIOA->ODR = buf[1];
слышать слышал, но при чем тут перегрузка, если переменная "бэ" одна и та же, значит, как бы операторы не перегружались, а обрабатывать они будут одно и то же.VladislavS писал(а):Про перегрузку операторов слышали?
а если ожидает - разве он сможет это как-то учесть?VladislavS писал(а):То что buf может измениться из прерывария или с помощью DMA он не ожидает
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
[uquote="ARV",url="/forum/viewtopic.php?p=3895106#p3895106"]как бы операторы не перегружались, а обрабатывать они будут одно и то же.[/uquote]Давайте сделаем вид, что вы этого не писали, а я не видел 
[uquote="ARV",url="/forum/viewtopic.php?p=3895106#p3895106"]а если ожидает - разве он сможет это как-то учесть?[/uquote]Конечно, выделит область памяти и каждый раз оттуда будет читать. Собственно volatile к этому и приведёт.
[uquote="ARV",url="/forum/viewtopic.php?p=3895106#p3895106"]а если ожидает - разве он сможет это как-то учесть?[/uquote]Конечно, выделит область памяти и каждый раз оттуда будет читать. Собственно volatile к этому и приведёт.
да, но тот момент, что пока он пишет 5-й элемент, первый уже не равен тому, что он написал ранее, он учесть не сможет все равно. так ведь?VladislavS писал(а):выделит область памяти и каждый раз оттуда будет читать
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
при взгляде на многих сверху ничего не меняется...
Мой уютный бложик... заходите!
- Сообщения: 2567
- Зарегистрирован: Вт май 01, 2018 19:44:47
И вы про атомарность. Это другой вопрос. Мухи отдельно, котлеты отдельно.
- Сообщения: 6452
- Зарегистрирован: Пт сен 13, 2013 13:11:31
[uquote="ARV",url="/forum/viewtopic.php?p=3895001#p3895001"]так никто и не ответил, каким образом может измениться поведение этой функции с/без volatile, если данные по указателю эта функция не использует?[/uquote]
А зачем отвечать на странные вопросы, которые к теме в данном случае отношения не имеют? С тем же успехом вы бы могли требовать ответа на вопрос, как влияет частое употребление модификатора volatile на состав кишечных газов.
А зачем отвечать на странные вопросы, которые к теме в данном случае отношения не имеют? С тем же успехом вы бы могли требовать ответа на вопрос, как влияет частое употребление модификатора volatile на состав кишечных газов.
Напомню, что:
[uquote="a5021",url="/forum/viewtopic.php?p=3894133#p3894133"]Объясните, кто знает, плс, почему в неблокирующую функцию
указатель на буфер pData передается без модификатора volatile ? Чет это на какой-то зашквар смахивает.[/uquote]
Вы сами начали задавать странные вопросы. Априори полагая, что volatile - правильно, а без него - какие-то выдуманные глюки и страдания будут.
[uquote="a5021",url="/forum/viewtopic.php?p=3894133#p3894133"]Объясните, кто знает, плс, почему в неблокирующую функцию
Код: Выделить всё
HAL_StatusTypeDef HAL_SPI_Receive_DMA(SPI_HandleTypeDef *hspi, uint8_t *pData, uint16_t Size)Вы сами начали задавать странные вопросы. Априори полагая, что volatile - правильно, а без него - какие-то выдуманные глюки и страдания будут.
- Сообщения: 2516
- Зарегистрирован: Пт июл 12, 2019 22:52:01
[uquote="WiseLord",url="/forum/viewtopic.php?p=3895275#p3895275"]Априори полагая, что volatile - правильно, а без него - какие-то выдуманные глюки и страдания будут.[/uquote]
Чтобы не было глюков и страданий, нужно просто перестать всякими "халами" пользоваться!
Чтобы не было глюков и страданий, нужно просто перестать всякими "халами" пользоваться!
Linux rules! Windows must die. Здравомыслящий человек добровольно будет пользоваться мастдаем лишь в двух случаях: под дулом автомата или под влиянием анального зонда.
Я на гитхабе, в ЖЖ
Я на гитхабе, в ЖЖ
- Сообщения: 6452
- Зарегистрирован: Пт сен 13, 2013 13:11:31
[uquote="WiseLord",url="/forum/viewtopic.php?p=3895275#p3895275"]Вы сами начали задавать странные вопросы. Априори полагая, что volatile - правильно, а без него - какие-то выдуманные глюки и страдания будут.[/uquote]
Когда функция молча принимает неверные параметры, но ругается на верные, это выдуманные страдания? Ну поздравьте себя.
[uquote="Eddy_Em",url="/forum/viewtopic.php?p=3895318#p3895318"]Чтобы не было глюков и страданий, нужно просто перестать всякими "халами" пользоваться![/uquote]
Судя по тому, какое количество фанатов хала понабежало, говорить такие вещи здесь -- пустое дело.
Когда функция молча принимает неверные параметры, но ругается на верные, это выдуманные страдания? Ну поздравьте себя.
[uquote="Eddy_Em",url="/forum/viewtopic.php?p=3895318#p3895318"]Чтобы не было глюков и страданий, нужно просто перестать всякими "халами" пользоваться![/uquote]
Судя по тому, какое количество фанатов хала понабежало, говорить такие вещи здесь -- пустое дело.
Нет, это просто Вы передаёте ей неверные параметры.a5021 писал(а):Когда функция молча принимает неверные параметры, но ругается на верные, это выдуманные страдания?
Добавлено after 1 minute 32 seconds:
А вот это - двумя руками поддерживаю. И автоматически причин к недовольству не будет.Eddy_Em писал(а):Чтобы не было глюков и страданий, нужно просто перестать всякими "халами" пользоваться!


