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

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

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

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

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

Цитата

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

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

Цитата

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

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

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


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

02.07.2021 в 09:14, LAS9891 сказал:

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

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

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

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

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


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

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 ?

 

Изменено пользователем LAS9891

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


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

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

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

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


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

 

15 minutes ago, LAS9891 said:

Тактирование  SRAM1 включено в функции SystemInit (void)

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

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


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

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

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


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

1 minute ago, aaarrr said:

Тогда исследуйте место и причину HF.

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

 Allregia что-то знает, но молчит.

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


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

Хорошо, сделайте проще: уберите описание SRAM1 из скрипта линкера, и попробуйте работать с ней из своего кода через указатель.

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


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

 

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

uint32_t* pointer = (uint32_t*)0x30000000;

*pointer = 1;

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

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

 

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

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

Изменено пользователем LAS9891

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


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

6 minutes ago, LAS9891 said:

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

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

 

40 minutes ago, LAS9891 said:

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

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

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


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

6 часов назад, LAS9891 сказал:

Всё летит в Hard Fault

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

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


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

Еще Reset_Handler зачем-то объявлен как WEAK (чистой воды вредительство, КМК). Не переопределяется ли где?

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


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

16 часов назад, LAS9891 сказал:

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

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

Цитата

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

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

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

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

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

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

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


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

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.

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


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

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

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

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

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

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

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

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

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

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