Jump to content

    
Allregia

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

Recommended Posts

2 часа назад, LAS9891 сказал:

...и это работало. Что не так делал автор поясните?

Не знаю. Может, совпало так, что "работало", а на самом деле всего лишь звезды сложились правильно. Синтаксиса указания в качестве имени секции имени региона - не видел. Поэтому возможны любые казусы.

Цитата

Что такое Execution Region? Что такое выходная секция?

TRM на Ваш тулчейн откройте, там в разделе описания линкера увидите всю интересующую Вас информацию.

Цитата

...вылетает блок GPIO, который удерживает питание для контроллера (ключ)...

Желательно, все-таки, чуть конкретизировать, что под этим имеется ввиду.

Share this post


Link to post
Share on other sites
02.07.2021 в 09:14, LAS9891 сказал:

Что такое Execution Region? Что такое выходная секция?

Прочтите об этом в оригинале.

А про аттрибут размещения в секции здесь.

Как видите, имя секции и имя Execution region - разные вещи. Их нельзя смешивать. Вы же именно это и сделали.

Share this post


Link to post
Share on other sites
9 hours ago, Darth Vader said:

Прочтите об этом в оригинале.

А про аттрибут размещения в секции здесь.

Как видите, имя секции и имя Execution region - разные вещи. Их нельзя смешивать. Вы же именно это и сделали.

СПАСИБО!

 

 

On 7/2/2021 at 11:38 AM, Arlleex said:

Желательно, все-таки, чуть конкретизировать, что под этим имеется ввиду.

Пока проверить не на чем, так что пока не важно.

Мне интересно всё ли я сделал чтобы заработала SRAM1. В код добавил строчку:

RCC->AHB2ENR |= RCC_AHB2ENR_SRAM1EN; // SRAM1 interface clock is enabled.

В Scatter добавлю все необходимое благодаря Darth Vader

Что то ещё требуется для подключения SRAM1 в STM32H73 ?

 

Edited by LAS9891

Share this post


Link to post
Share on other sites
On 1/13/2021 at 5:11 PM, Allregia said:

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

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

Похоже это мой случай. Если я использую такой scatter:

; *************************************************************
; *** 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)
   .ANY (+XO)
  }

  RW_DTCM 0x20000000 0x00020000  {  ; RW data
   .ANY (+RW +ZI)
  }
  
  RW_AXI_SRAM 0x24000000 0x00080000  {
   .ANY (+RW +ZI)
  }

 RW_SRAM4 0x38000000 0x00010000  {
  .ANY (+RW +ZI)
 }

}

Всё работает. Стоит мне добавить область SRAM1:

; *************************************************************
; *** 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)
   .ANY (+XO)
  }

  RW_DTCM 0x20000000 0x00020000  {  ; RW data
   .ANY (+RW +ZI)
  }
  
  RW_AXI_SRAM 0x24000000 0x00080000  {
   .ANY (+RW +ZI)
  }

 RW_SRAM1 0x30000000 0x00020000  {
  .ANY (+RW +ZI)
 }

 RW_SRAM4 0x38000000 0x00010000  {
  .ANY (+RW +ZI)
 }

}

 Всё летит в Hard Fault. Тактирование  SRAM1 включено в функции SystemInit (void):

RCC->AHB2ENR |= (RCC_AHB2ENR_D2SRAM1EN | RCC_AHB2ENR_D2SRAM2EN | RCC_AHB2ENR_D2SRAM3EN);

В отладчике проверил - тактирование включено. В чём проблема?

Share this post


Link to post
Share on other sites
1 minute ago, aaarrr said:

 

 А вызывается она где?

; Reset handler
Reset_Handler    PROC
                 EXPORT  Reset_Handler                    [WEAK]
        IMPORT  SystemInit
        IMPORT  __main

                 LDR     R0, =SystemInit
                 BLX     R0
                 LDR     R0, =__main
                 BX      R0
                 ENDP

перед __main

Share this post


Link to post
Share on other sites

 

Убрал. Потом в код добавил:

uint32_t* pointer = (uint32_t*)0x30000000;

*pointer = 1;

Результат в отладке:

1282463258_(05_07.202116-26-09).jpg.7ecd660eae6f1ec99d5961bcaefbf7b2.jpg

 

Ещё наблюдение:

Пробовал зажигать светодиод в прерывании по HF. Диод не горит, подозреваю, что это происходит из-за того, что инициализации порта не была проведена.

Edited by LAS9891

Share this post


Link to post
Share on other sites
6 minutes ago, LAS9891 said:

Результат в отладке

Прекрасно: память на месте и доступна.

 

40 minutes ago, LAS9891 said:

В отладку не зайти. В окошке Command сыплются "Cannot access Memory".

Например, освоить отладочную печать, написать обработчик HF с выводом содержимого стек-фрейма и статусных регистров. Или пройти по шагам от сброса.

Share this post


Link to post
Share on other sites
6 часов назад, LAS9891 сказал:

Всё летит в Hard Fault

Т.е. вы даже не лезете туда своей программой (не пишите туда и не читаете оттуда) и происходит HF? Посмотрите в map-файле, какие объекты программы линкер разместил в этом регионе памяти. Может там лежат какие-то глобальные данные, которые инициализируются в __main(), и как раз при этой записи и происходит HF.

Share this post


Link to post
Share on other sites
16 часов назад, LAS9891 сказал:

Как? В отладку не зайти.

Это еще что значит? Почему? Вы что, не на реальном МК запускаетесь?

Цитата

В окошке Command сыплются "Cannot access Memory"

Вот при симуляции как раз так и будет. При железном отладчике - в некоторых случаях.
 

11 часов назад, Darth Vader сказал:

Может там лежат какие-то глобальные данные, которые инициализируются в __main(), и как раз при этой записи и происходит HF.

Все RW-, ZI-данные инициализируются в __main() и не важно, где они находятся в ОЗУ. Естественно, она должна быть включена (и она у него включена).

Тут сейчас начнется гадание на кофейной гуще и окажется, например, что 'Use FPU' в проекте был включен, __main() закономерно инструкции сопроцессора в своих целях использовала, а в стандартном SystemInit() сам сопроцессор включен не был. Классика:whistle3: А может, сама SystemInit() в своих целях расположила свои переменные в SRAM, которая не была еще включена. Тогда поможет прослойка на ассемблере перед вызовом SystemInit(). Например, как тут.

Share this post


Link to post
Share on other sites
13 hours ago, Darth Vader said:

Т.е. вы даже не лезете туда своей программой (не пишите туда и не читаете оттуда) и происходит HF? Посмотрите в map-файле, какие объекты программы линкер разместил в этом регионе памяти. Может там лежат какие-то глобальные данные, которые инициализируются в __main(), и как раз при этой записи и происходит HF.

В смысле не пишите не читаете? Я в Scatter-файле указываю область памяти SRAM1. При сборке проекта в этой области размещаются данные. Их не я сам принудительно размещаю. Вот например что расположилось в SRAM1 при сборке (.map-файл):

    Execution Region RW_SRAM1 (Exec base: 0x30000000, Load base: 0x08011968, Size: 0x00000910, Max: 0x00020000, ABSOLUTE)

    Exec Addr    Load Addr    Size         Type   Attr      Idx    E Section Name        Object

    0x30000000   0x08011968   0x0000002c   Data   RW           36    .data               functions.o
    0x3000002c   0x08011994   0x00000004   PAD
    0x30000030   0x08011998   0x0000006e   Data   RW          442    .data               calibration.o
    0x3000009e   0x08011a06   0x00000002   PAD
    0x300000a0   0x08011a08   0x00000008   Data   RW          679    .data               font12.o
    0x300000a8   0x08011a10   0x00000008   Data   RW         2489    .data               system_stm32h7xx.o
    0x300000b0        -       0x00000200   Zero   RW           34    .bss                functions.o
    0x300002b0        -       0x00000060   Zero   RW         2631    .bss                c_w.l(libspace.o)
    0x30000310        -       0x00000200   Zero   RW            2    HEAP                startup_stm32h743xx.o
    0x30000510        -       0x00000400   Zero   RW            1    STACK               startup_stm32h743xx.o

 

Кроме SRAM1 в Scatter-файле также указаны области DTCM, AXI SRAM, SRAM4. В них тоже располагаются какие-то данные. Если в Scatter-файле указать только эти области, то все работает без проблем, если добавить SRAM1 - Hard Fault.

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.