-
- Вот же от ST пояснение - Alt@ir(18.09.2020 15:02, ссылка)
- В линкере пропишите: lexxx-lexxx(250 знак., 17.09.2020 15:57)
- Это неправильно, вы предлагаете создать в ram отдельную секцию
вместо того, чтобы понять, почему линкер размещает эти буферы в
DTCM. Собственно, в скрипте линкера проблема и кроется. evgeniy1294(548 знак., 17.09.2020 19:14)
- Вам шашечки или ехать?) Помимо DTCM, есть в этом МК еще несколько
областей ОЗУ, и не со всеми DMA дружит. Линкер об этом не знает, да
и не должен знать. Ему нужно указать. - lexxx-lexxx(17.09.2020 20:24)
- DMA работает с любым регионом SRAM(а также с FMC), значит секции
data и bss нужно располагать в них. В секции DTCM можно разместить
стек, дабы арбитр шины не прерывал к нему доступ. "Вам шашечки или
ехать?)" - мне нужно, чтобы было сделано корректно, а не "лишь бы
работало". - evgeniy1294(17.09.2020 20:36)
- даташит с Вами не согласен) там три домена в ОЗУ и в каждом свой
дма с периферией. И если ЦАП висит условно на домене 1, он не
сможет получать данные по дма с домена 2 - lexxx-lexxx(17.09.2020 20:51)
- Вот таблица под камень Ксении. Может быть мы о разных камнях
говорим? Вот это лежит в линкер-скрипте под IAR: evgeniy1294(1095 знак., 17.09.2020 21:32, картинка)
- Ещё один вариант для IAR: evgeniy1294(561 знак., 17.09.2020 22:09)
- Вот что IAR предлагает для STM32H743. Так что... VladislavS.(5055 знак., 18.09.2020 08:49)
- Почему бы вам не назвать имя файла, откуда вы взяли этот длиннющий
текст? Тем паче, что структура директориев во всех версиях IAR
практически одинаковая. - Kceния(19.09.2020 03:16)
- <папка с IAR>/arm/config/linker/ST/ <ваш камень> - evgeniy1294(19.09.2020 11:48)
- Нормально, добавить соответствующий стартап и будет хорошо. - evgeniy1294(18.09.2020 10:42)
- Почему бы вам не назвать имя файла, откуда вы взяли этот длиннющий
текст? Тем паче, что структура директориев во всех версиях IAR
практически одинаковая. - Kceния(19.09.2020 03:16)
- В самом IAR обычно более адекватные скрипты. Но всё равно под свои нужды их править надо. Особенно в чипах с таким зоопарком типов памяти. - VladislavS.(18.09.2020 06:43)
- Вот что IAR предлагает для STM32H743. Так что... VladislavS.(5055 знак., 18.09.2020 08:49)
- Ещё один вариант для IAR: evgeniy1294(561 знак., 17.09.2020 22:09)
- Вот таблица под камень Ксении. Может быть мы о разных камнях
говорим? Вот это лежит в линкер-скрипте под IAR: evgeniy1294(1095 знак., 17.09.2020 21:32, картинка)
- даташит с Вами не согласен) там три домена в ОЗУ и в каждом свой
дма с периферией. И если ЦАП висит условно на домене 1, он не
сможет получать данные по дма с домена 2 - lexxx-lexxx(17.09.2020 20:51)
- DMA работает с любым регионом SRAM(а также с FMC), значит секции
data и bss нужно располагать в них. В секции DTCM можно разместить
стек, дабы арбитр шины не прерывал к нему доступ. "Вам шашечки или
ехать?)" - мне нужно, чтобы было сделано корректно, а не "лишь бы
работало". - evgeniy1294(17.09.2020 20:36)
- Вам шашечки или ехать?) Помимо DTCM, есть в этом МК еще несколько
областей ОЗУ, и не со всеми DMA дружит. Линкер об этом не знает, да
и не должен знать. Ему нужно указать. - lexxx-lexxx(17.09.2020 20:24)
- Это неправильно, вы предлагаете создать в ram отдельную секцию
вместо того, чтобы понять, почему линкер размещает эти буферы в
DTCM. Собственно, в скрипте линкера проблема и кроется. evgeniy1294(548 знак., 17.09.2020 19:14)
- Приведение к (uint32_t *) доставляет - Vit(17.09.2020 09:17)
- Уже обращала внимание. Кубистам следовало выставить у функции
запуска тип указателя void*, т.к. подставляют туда указатели на
массивы с разной длиной элемента, а длина элемента задается в
параметрах DMA (DAC_ALIGN_8B_R или DAC_ALIGN_12B_R) в зависимости
от выбранной разрядности DAC. А так действительно код выглядит, как
ошибка. - Kceния(17.09.2020 10:41)
- Ставить 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)
- Уже обращала внимание. Кубистам следовало выставить у функции
запуска тип указателя void*, т.к. подставляют туда указатели на
массивы с разной длиной элемента, а длина элемента задается в
параметрах DMA (DAC_ALIGN_8B_R или DAC_ALIGN_12B_R) в зависимости
от выбранной разрядности DAC. А так действительно код выглядит, как
ошибка. - Kceния(17.09.2020 10:41)
- Данные могут быть до сих пор в кеше, а не в оперативке. Поставить барьер данных пробовали? - lloyd(17.09.2020 09:01)
- Дополню, что там с выравниванием данных по секциям? Можно с ним "поиграть". - Дoктyp77(17.09.2020 07:20, )
- На H7, во-первых, могут быть недоступные для DMA области.
Во-вторых, могут быть игры с кешированием. - VladislavS.(17.09.2020 07:18)
- Да, что-то в этом роде, т.к. тот же код работает на STM32F103 и
STM32F407, и только на STM32H743 у DMA пропадает доступ к ОЗУ.
Где-то в нем секьюрити зарыта, которую неясно, как отменить. - Kceния(17.09.2020 07:23)
- Проверила MPU (memory protection unit) - у меня он выключен. - Kceния(17.09.2020 09:11)
- Посмотрите в map-файле в какую SRAM линкер разместил этот массив.
Затем по RM в Table 3. Bus-master-to-bus-slave interconnect
проверьте может ли туда DMA добраться. Я бы с этого начал. - VladislavS.(17.09.2020 08:50)
- У меня одна SRAM - по адресу 0x2000. Да у меня и массивов-то кот
наплакал - 16 байт. - Kceния(17.09.2020 08:52)
- А теперь посмотрите Table 7. Memory map and default device memory
area attributes. 0x2000 это DTCM, до которой у DMA руки коротки
дотянуться. - VladislavS.(17.09.2020 09:26)
- Вот кстати да, в H7 перекроили memory map, классически SRAM идет с
адреса 0x2000'0000, а в H7 c 0x3000'0000. Сразу возникает вопрос,
"как оно туда попало?". Нужно в скрипте линкера смотреть, куда
релоцируется секция data. - evgeniy1294(17.09.2020 11:55)
- Ваша идея была хороша, но к сожалению она не проходит. Загрузчик
(читать память он тоже умеет) показывает наличие RAM лишь в области
0x20000000-0x2001FFFF и нигде больше. Даташит с этим согласен, с
той лишь разницей, что области, обведенные красным контуром,
загрузчик не читает. Кроме того, объем этих областей маловат, чтобы
размещать в них сегмент данных, а тем паче стек. Да и для самого
этого MK даже реклама больше, чем 128К RAM, не обещает. Причем, все
они находятся Kceния(116 знак., 18.09.2020 00:10, картинка)
- С моей идеей все хорошо - они выключены при старте: evgeniy1294(1 знак., 18.09.2020 00:15, картинка)
- Вот и пусть остаются выключенными - мне в этих зонах данные не
разместить. - Kceния(18.09.2020 01:12)
- С чего это вдруг? - evgeniy1294(18.09.2020 01:39)
- А отчего бы вдруг DMA должен там заработать? У него разве тяга к
экзотическим местам? На всех контроллерах люди работают через DMA в
обычной памяти, а не через ухо. Если бы так было, то уже давно бы
стон стоял на весь интернет. Kceния(100 знак., 18.09.2020 02:11)
- То есть, RM на чип вам не указ? Посмотрите архитектуру шин - DTCM
подключена напрямую к ядру Cortex-M7 и никто больше к ней доступ не
имеет. Положите туда стек(стеки), она для этого лучше всего
предназначена. Под сегменты данных используйте 0х3000'0000 и выше,
это и есть "обычная" память в этом чипе. Всё с картинками разжевали
же уже. VladislavS.(180 знак., 18.09.2020 06:39)
- Слепой не может видеть, глухой не может слышать, Ксения не может. - evgeniy1294(18.09.2020 11:16)
- То есть, RM на чип вам не указ? Посмотрите архитектуру шин - DTCM
подключена напрямую к ядру Cortex-M7 и никто больше к ней доступ не
имеет. Положите туда стек(стеки), она для этого лучше всего
предназначена. Под сегменты данных используйте 0х3000'0000 и выше,
это и есть "обычная" память в этом чипе. Всё с картинками разжевали
же уже. VladislavS.(180 знак., 18.09.2020 06:39)
- А отчего бы вдруг DMA должен там заработать? У него разве тяга к
экзотическим местам? На всех контроллерах люди работают через DMA в
обычной памяти, а не через ухо. Если бы так было, то уже давно бы
стон стоял на весь интернет. Kceния(100 знак., 18.09.2020 02:11)
- С чего это вдруг? - evgeniy1294(18.09.2020 01:39)
- Вот и пусть остаются выключенными - мне в этих зонах данные не
разместить. - Kceния(18.09.2020 01:12)
- С моей идеей все хорошо - они выключены при старте: evgeniy1294(1 знак., 18.09.2020 00:15, картинка)
- Ваша идея была хороша, но к сожалению она не проходит. Загрузчик
(читать память он тоже умеет) показывает наличие RAM лишь в области
0x20000000-0x2001FFFF и нигде больше. Даташит с этим согласен, с
той лишь разницей, что области, обведенные красным контуром,
загрузчик не читает. Кроме того, объем этих областей маловат, чтобы
размещать в них сегмент данных, а тем паче стек. Да и для самого
этого MK даже реклама больше, чем 128К RAM, не обещает. Причем, все
они находятся Kceния(116 знак., 18.09.2020 00:10, картинка)
- Вот кстати да, в H7 перекроили memory map, классически SRAM идет с
адреса 0x2000'0000, а в H7 c 0x3000'0000. Сразу возникает вопрос,
"как оно туда попало?". Нужно в скрипте линкера смотреть, куда
релоцируется секция data. - evgeniy1294(17.09.2020 11:55)
- А теперь посмотрите Table 7. Memory map and default device memory
area attributes. 0x2000 это DTCM, до которой у DMA руки коротки
дотянуться. - VladislavS.(17.09.2020 09:26)
- У меня одна SRAM - по адресу 0x2000. Да у меня и массивов-то кот
наплакал - 16 байт. - Kceния(17.09.2020 08:52)
- Да, что-то в этом роде, т.к. тот же код работает на STM32F103 и
STM32F407, и только на STM32H743 у DMA пропадает доступ к ОЗУ.
Где-то в нем секьюрити зарыта, которую неясно, как отменить. - Kceния(17.09.2020 07:23)
- Почитать в reference manual про DMA. Предположу, может выравнивание
нужно? - Dingo(17.09.2020 07:11)
- Но на 4 байта оно выравнено в обоих случаях: Kceния(120 знак., 17.09.2020 07:28)
- Выровнила вручную (дописав перед массивом мусор) аж до кратности на
16 - не помогло. Kceния(49 знак., 17.09.2020 10:35)
- Дык решение же Dingo(5 знак., 17.09.2020 11:18, ссылка)
- Увы! => - Kceния(18.09.2020 00:11, ссылка)
- Да точно надо вот это сделать Alt@ir(34 знак., 18.09.2020 15:01, ссылка)
- Увы! => - Kceния(18.09.2020 00:11, ссылка)
- Дык решение же Dingo(5 знак., 17.09.2020 11:18, ссылка)
- Я бы объявил массив как uint32 половинной длины, и внего скопировал
бы const массив. BlackMorda(161 знак., 17.09.2020 08:10)
- Там количество пересылок, этот момент я уже проверяла. Опять же,
если бы в этом была ошибка, то одинаково не работало бы ни с ОЗУ,
ни с ПЗУ. А тут из ПЗУ нормально качает, а из ОЗУ никак не хочет. - Kceния(17.09.2020 08:50)
- О, вспомнил! Не всё ОЗУ одинаково полезно! Посмотрите карту памяти,
может граница областей или ещё какая-нить ерунда. Например, CCM
(core coupled memory) для DMA недоступна. - Dingo(17.09.2020 09:05)
- ccm в скриптах линкера объявлена как отдельная секция. В неё нужно целенаправленно что-то класть, случайно такое не произойдет. - evgeniy1294(17.09.2020 11:40)
- О, вспомнил! Не всё ОЗУ одинаково полезно! Посмотрите карту памяти,
может граница областей или ещё какая-нить ерунда. Например, CCM
(core coupled memory) для DMA недоступна. - Dingo(17.09.2020 09:05)
- Там количество пересылок, этот момент я уже проверяла. Опять же,
если бы в этом была ошибка, то одинаково не работало бы ни с ОЗУ,
ни с ПЗУ. А тут из ПЗУ нормально качает, а из ОЗУ никак не хочет. - Kceния(17.09.2020 08:50)
- Выровнила вручную (дописав перед массивом мусор) аж до кратности на
16 - не помогло. Kceния(49 знак., 17.09.2020 10:35)
- Но на 4 байта оно выравнено в обоих случаях: Kceния(120 знак., 17.09.2020 07:28)
- Попробуйте volatile для буфера. - Dead_morose(17.09.2020 06:29)