-
- Ставить void* не корректно в данном случае. Дело в том, что у dma в
stm32 есть такой параметр, как "размер транзакции", который может
быть равен 8, 16, 32 бита + есть ещё режим burst. Указатель на
uint32_t в параметрах может быть намеком на реализацию данной
функции. evgeniy1294(177 знак., 17.09.2020 11:30)
- Не поможет. В этом чипе DMA не может работать с этой областью
памяти. - VladislavS.(17.09.2020 13:21)
- Да, я прямо под вашим коментом с вами согласился. Заодно написал, куда Ксении смотреть. - evgeniy1294(17.09.2020 18:40)
- Полагаю, что DMA тут ни при чём. Классический пример - memcpy -
намекает, что должен быть void*. - Vit(17.09.2020 11:43)
- Не нужно путать memcpy с копированием по dma, оно по разному
работает. Насколько мне известно, компиляторы умеют оптимизировать
memcpy, чтобы, например, копировать словами, а не байтами. evgeniy1294(67 знак., 17.09.2020 12:00)
- Не понял логики. Именно поскольку DMA может разный размер
транзакции иметь и разную разрядность входных данных, то лучше
void* , а еще лучше const void* , поскольку DAC и из флеша может
брать данные. - Andreas(17.09.2020 12:35)
- Логика в том, что автор функции подразумевает, что транзакция dma настроена на 32 бита. Указатель на void может, например, использоваться как указатель на контекст в колбэках. Потому что автором колбэка являетесь вы, и вся ответственность за корректное приведение типов лежит на вас, а не на авторе библиотеки. - evgeniy1294(17.09.2020 19:32)
- const void* имеет другой смысл, а именно, функция обязуется не менять объект по этому указателю. И она таки не меняет, так что да, можно добавить const. - SciFi(17.09.2020 12:50)
- Не нужно путать работу DMA с заданием формальных и передачей
фактических параметров в функцию. Сначала должно работать без
всяких оптимизаций. И если дальше кастится по-разному, да ещё и
аппаратное прибитие, то оно по-любому есть место для граблей, но
это не значит, что грабли нужно ещё и на входе расставлять.
HAL-о-строители ещё и, по идее, надеются на годный align, но они ж
смелые - им можно - Vit(17.09.2020 12:21)
- Любой указатель можно неявно скастовать к указателю на void, т.е. вы просто предлагаете отключить проверку типов, это неправильно. Функция заставляет пользователя хранить данные в определенном формате, так задумано. Функция никак не настраивает dma, значит оно настраивается извне, значит длина транзакции подразумевается как 32-бита. - evgeniy1294(17.09.2020 19:34)
- Не понял логики. Именно поскольку DMA может разный размер
транзакции иметь и разную разрядность входных данных, то лучше
void* , а еще лучше const void* , поскольку DAC и из флеша может
брать данные. - Andreas(17.09.2020 12:35)
- Не нужно путать memcpy с копированием по dma, оно по разному
работает. Насколько мне известно, компиляторы умеют оптимизировать
memcpy, чтобы, например, копировать словами, а не байтами. evgeniy1294(67 знак., 17.09.2020 12:00)
- Не поможет. В этом чипе DMA не может работать с этой областью
памяти. - VladislavS.(17.09.2020 13:21)
- Ставить void* не корректно в данном случае. Дело в том, что у dma в
stm32 есть такой параметр, как "размер транзакции", который может
быть равен 8, 16, 32 бита + есть ещё режим burst. Указатель на
uint32_t в параметрах может быть намеком на реализацию данной
функции. evgeniy1294(177 знак., 17.09.2020 11:30)