Allregia 9 29 декабря, 2020 Опубликовано 29 декабря, 2020 · Жалоба Help! Пытаюсь распределить память в H7, но видимо. что-то "не так" делаю. В проце два региона - IRAM1 IRAM2, по дефолту включены обы на вкладке Target. Я на влкдке линкера снимаю чекбокс "брать распределени с таргета" и даю ему свой скаттер-файл. Дефотный был такой: ; ************************************************************* ; *** Scatter-Loading Description File generated by uVision *** ; ************************************************************* LR_IROM1 0x08000000 0x00200000 { ; load region size_region ER_IROM1 0x08000000 0x00200000 { ; load address = execution address *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO) } RW_IRAM1 0x20000000 0x00020000 { ; RW data .ANY (+RW +ZI) } RW_IRAM2 0x24000000 0x00080000 { .ANY (+RW +ZI) } } Теперь я делаю две вещи, первая - новый скаттер: ; My Scatter: LR_IROM1 0x08000000 0x00200000 { ; load region size_region ER_IROM1 0x08000000 0x00200000 { ; load address = execution address *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO) } RW_IRAM1 0x20000000 0x0001C000 { ; RW data .ANY(+RW +ZI) } RW_IRAM11 0x2001C000 0x00004000 { ; data for DMA .ANY(+RW +ZI) } RW_IRAM2 0x24000000 0x00080000 { .ANY (+RW +ZI) } } Т.е я отрезал от IRAM1 кусочек. и назвал его IRAM11 второе что я делаю, обьявляю переменную: vu16 ADC_Buf[2] __attribute__((section("RW_IRAM11"))); Компилю, смотрю мап-файл - IRAM1 и IRAM11 выкинуты, все запихнуто в IRAM2. Ладно, второй вариант - переношу эту переменную в отлдельный фал adc_buf.c, а в скаттере пишу: RW_IRAM11 0x2001C000 0x00004000 { ; data for DMA adc_buf.o(+RW +ZI) } Все замечательно, теперь эта переменная в IRAM11. Но все остальные переменный проекта - в IRAM2. Т.е. во 1-х, вся область IRAM1 пропадает зря. Во 2-х - полчается что во втором варианте, атрибут с именем секции в определении этой переменной можно убрать, т..е все переменные, определенные в этом файле и так будут в IRAM11, а в первом варианте почему линкер плевать на него хотел, с высокой колокольни? P.S. Если кому интерено, для чего весь этот геморрой - чтобы сделать IRAM11 не кешируемой, через MPU. Т.е чтобы масивы, с которыми идет работа по ПДП была без D-кэша. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Arlleex 178 29 декабря, 2020 Опубликовано 29 декабря, 2020 · Жалоба 16 минут назад, Allregia сказал: а в первом варианте почему линкер плевать на него хотел, с высокой колокольни? Цитата vu16 ADC_Buf[2] __attribute__((section("RW_IRAM11"))); RW_IRAM11 - это имя Execution Region, а не выходной секции. LR_IROM1 0x08000000 0x00200000 { ER_IROM1 0x08000000 0x00200000 { *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO) } RW_IRAM1 0x20000000 0x0001C000 { .ANY (+RW +ZI) } RW_IRAM11 0x2001C000 0x00004000 { *.o (dmasect) } RW_IRAM2 0x24000000 0x00080000 { .ANY (+RW +ZI) } } __attribute__((section("dmasect"))) vu16 ADC_Buf[2]; Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Allregia 9 29 декабря, 2020 Опубликовано 29 декабря, 2020 · Жалоба О блин, слона-то я и не заметил! Спасибо! Правда, оно так не заработало. Отрезал кусок для dmasect не от IRAM1 а от IRAM2 - тогда заработало, IRAM1 остался не использованным. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Allregia 9 7 января, 2021 Опубликовано 7 января, 2021 · Жалоба Что-то этот F7A3 меня до кондрашки доведет. Значитю у него 4 банка ОЗУ: 0-й - 64К DTCM, самый быстрый, с 0х2000..., некешируемый, но нет доступа обычным DMA (а что такое MDMA и BDMA я пока "ниасилил") 1-й - ~1M "большая AXI SRAM" с 0х24..., есть доступ от всего, реально она там внутри еще на 3 банка разбита. 2- и 3-й - AHB SRAM, по 64К, доступ от всего, сидят соотюв с 0х300... и 0х380... Сую я все буфера, где DMA работает во 2-й банк (0х30), и через MPU говорю ему чтобы не кешировал и т.д. Стек и хип, разумнее всего в 0-й, как самый быстрый, ну и все остальное - в большой первый. Делаю такой скаттер: ; ************************************************************* LR_IROM1 0x08000000 0x00200000 { ; load region size_region ER_IROM1 0x08000000 0x00200000 { ; load address = execution address *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO) } ARM_LIB_STACK 0x20010000 -0x2000 ; STACK in IRAM1 (DTCM) { .ANY(STACK) } ARM_LIB_HEAP 0x20000000 0x4000 { .ANY(HEAP) } RW_IRAM2 0x24000000 0x00100000 ; RW data in IRAM2 (AXI SRAM) { .ANY (+RW +ZI) } RW_IRAM3 0x30000000 0x00004000 ; DM buffers in AHB SRAM { *(dmasect) } } В отдельном файле, обявляю буфера для DMA, типа так: __align(32) __attribute__((used)) __attribute__((section("dmasect"))) volatile uint16_t ADCBuf[2000]; В программе закольцованно работает АЦП на 2 канала, складывает в буфер. В прерываниях от заполнения половины и целого буфера, он переписывается в другой буфер и передается через уарт наружу. Если я не определяю в скаттере те секции для стека и хипа (т.е. не использую IRAM1, DTCM)- все ОК. Как только включаю стеки и хип в скаттере - работать начинает явно быстрее, но примерно через минуту работы валится в хардфолт. Может у меня в скаттере что-то не корректно? (хип вообще про запас, никаких маллоков в программе нет). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 7 января, 2021 Опубликовано 7 января, 2021 · Жалоба Магию из ерраты применили? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Allregia 9 7 января, 2021 Опубликовано 7 января, 2021 · Жалоба Смотрел когда-то, сейчас еще гляну. Ааа, если Вы про 20-й бит в еррате про DMA+UART - то да, применено было сразу. Без него я и не пробовал, но они пишут без него там просто останавливается работа DMA, небязательно-же при этом в хардфолт уходить. И какое оно имеет отношение к тому, где расположены стек и хип? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 7 января, 2021 Опубликовано 7 января, 2021 · Жалоба Нет, там еще был баг в коммутаторе AXI, если не ошибаюсь. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Allregia 9 7 января, 2021 Опубликовано 7 января, 2021 · Жалоба Не найду. Если Вы про п. 2.7.8, то он вроде тут не причем, хотя может я чего-то и не понимаю -там-же про OCTOSPI, кторого у меня нет..Но кроме него, поиск по файлу слова "AXI" ничего не находит. Эррата от 16 октября. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 7 января, 2021 Опубликовано 7 января, 2021 · Жалоба Процессор какой? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Allregia 9 7 января, 2021 Опубликовано 7 января, 2021 · Жалоба STM32H7A3RIT P.S. Вообще, код переносится (с необходимыми изменениями, конечно) из предыдущего варианта, который был на F722. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
aaarrr 69 7 января, 2021 Опубликовано 7 января, 2021 · Жалоба Тогда мимо, это у H74x было. А в регистрах статуса что? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Allregia 9 7 января, 2021 Опубликовано 7 января, 2021 · Жалоба Статуса при хардфолте? А где его сомтреть? Мне как-то раньше не приходилось. В любом случае, это уже на той неделе - железка не у меня сейчас а у напарника. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Allregia 9 13 января, 2021 Опубликовано 13 января, 2021 · Жалоба С хипом и стеком - отбой, там причина оказалась совсем в другом. То, о чем изначало спрашивалсь - все работает. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
LAS9891 0 2 июля, 2021 Опубликовано 2 июля, 2021 · Жалоба On 12/29/2020 at 5:13 PM, Arlleex said: RW_IRAM11 - это имя Execution Region, а не выходной секции. __attribute__((section("dmasect"))) vu16 ADC_Buf[2]; Я делал так же как автор вначале: В Scatter так: LR_IROM1 0x08000000 0x00200000 { ; load region size_region ER_IROM1 0x08000000 0x00200000 { ; load address = execution address *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO) .ANY (+XO) } RW_IRAM1 0x20000000 0x00020000 { ; RW data .ANY (+RW +ZI) } RW_IRAM2 0x24000000 0x00080000 { .ANY (+RW +ZI) } } Потом в программе так: uint8_t L8_160x120[57600]__attribute__((section("RW_IRAM2")))={0x00};// uint8_t L82_160x120[57600]__attribute__((section("RW_IRAM2")))={0x00};// и это работало. Что не так делал автор поясните? Что такое Execution Region? Что такое выходная секция? и почему у меня работало а у автора нет? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
LAS9891 0 2 июля, 2021 Опубликовано 2 июля, 2021 · Жалоба On 1/13/2021 at 5:11 PM, Allregia said: С хипом и стеком - отбой, там причина оказалась совсем в другом. То, о чем изначало спрашивалсь - все работает. Не подскажите в чём была причина с проблемой С хипом и стеком? Столкнулся с чем то подобным, не получается корректно подключить область RAM1. Если кратко описать проблему, то я пробовал включать SRAM1 так: RCC->AHB2ENR |= RCC_AHB2ENR_SRAM1EN; // SRAM1 interface clock is enabled. В Scatter так: RW_SRAM1 0x30000000 0x00020000 { .ANY (+RW +ZI) } Собрал, перешил, запустил - проект стартует и рушится (вылетает блок GPIO, который удерживает питание для контроллера (ключ)). Мне кажется я как то не так включаю SRAM1. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться