Jump to content

    
Allregia

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

Recommended Posts

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

 

 

Share this post


Link to post
Share on other sites
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];

Share this post


Link to post
Share on other sites

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

Спасибо!

 

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

 

 

Share this post


Link to post
Share on other sites

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

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

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

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

 

 

 

Share this post


Link to post
Share on other sites

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

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

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

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

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

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

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.