Перейти к содержанию
    

Распределение памяти, H7, Keil.

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-кэша.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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];

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

О блин, слона-то я и не заметил!

Спасибо!

 

Правда, оно так не заработало.  Отрезал кусок для dmasect не от IRAM1 а от IRAM2 - тогда заработало, IRAM1 остался не использованным.

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что-то этот 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)-  все ОК.

Как только включаю стеки и хип в скаттере - работать начинает явно быстрее, но примерно через минуту работы валится в хардфолт.

Может у меня в скаттере что-то не корректно?

(хип вообще про запас, никаких маллоков в программе нет).

 

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Смотрел когда-то, сейчас еще гляну.

Ааа, если Вы про 20-й бит в еррате про DMA+UART - то да, применено было сразу.

Без него я и не пробовал, но они пишут без него там просто останавливается работа DMA, небязательно-же при этом в хардфолт уходить.

И какое оно имеет отношение к тому, где расположены стек и хип?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Не найду. Если Вы про п. 2.7.8, то он вроде тут не причем, хотя может я чего-то и не понимаю -там-же про OCTOSPI, кторого у меня нет..Но кроме него, поиск по файлу слова "AXI" ничего не находит.

Эррата от 16 октября.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

STM32H7A3RIT

 

P.S. Вообще, код переносится (с необходимыми изменениями, конечно) из предыдущего варианта, который был на F722.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Статуса при хардфолте? А где его сомтреть? Мне как-то раньше не приходилось.

В любом случае, это уже на той неделе - железка не у меня сейчас а у напарника.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

С хипом и стеком - отбой, там причина оказалась совсем в другом.

То, о чем изначало спрашивалсь - все работает.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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? Что такое выходная секция? и почему у меня работало а у автора нет?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...