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

STM32F407 CCM RAM STACK HEAP

Попытался разместить стек и кучу в ССМ памяти. Делал все через скаттер файл.

В отладке вижу, что стек лег по нужному адресу.

А вот с heap проблемы. Первый же вызов malloc() и программа сваливается в HardFault_Handler().

Попробовал heap вернуть по адресу внутренней RAM 0х20000000 - все ОК.

Кто нибудь сталкивался с этим...?

 

Скаттер файл:

 

LR_IROM1 0x08000000 0x00080000  {   ; load region size_region
  
  ER_IROM1 0x08000000 0x00080000  { ; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
  }
  RW_IRAM1 0x20000000 0x00020000  { ; RW data
   .ANY (+RW +ZI)
  }
  ARM_LIB_STACK 0x10003000 EMPTY -0x800{
  }
  ARM_LIB_HEAP 0x1000000 EMPTY 0x0800 {; Heap region growing up
  }
}

 

Программа:

 

int main(void)
{

uint8_t    *ptr;
HAL_Init();
SystemClock_Config();
MX_GPIO_Init();

[size=3]ptr=malloc(10);[/size]

*(ptr++)=125;
.....
while(1);
}

Изменено пользователем IgorKossak
[codebox] для длинного кода, [code] - для короткого!

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


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

Чудес уже давно не бывает.

Что возвращает malloc() ?

Когда узнаете значение, замените

*(ptr++) = 125;

на

*((uint32_t *)address_from_malloc) = 0xDEADBEEF;

*((uint8_t *)address_from_malloc) = 0xDE;

и посмотрите где падает в HF

 

 

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


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

Программа:

Расположение объектов в памяти смотрят не по main(), а по .map-файлу.

 

ЗЫ: В хорошо написанной embedded-программе не должно быть кучи (чего угодно ;)

Имха!

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


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

Расположение объектов в памяти смотрят не по main(), а по .map-файлу.

 

ЗЫ: В хорошо написанной embedded-программе не должно быть кучи (чего угодно ;)

Имха!

в map вроде все нормально

 

Image$$ARM_LIB_HEAP$$ZI$$Base 0x01000000 Number 0 anon$$obj.o(ARM_LIB_HEAP.bss)

Image$$ARM_LIB_HEAP$$ZI$$Limit 0x01000800 Number 0 anon$$obj.o(ARM_LIB_HEAP.bss)

...

 

Memory Map of the image

 

Image Entry point : 0x08000189

 

Load Region LR_IROM1 (Base: 0x08000000, Size: 0x00000d5c, Max: 0x00080000, ABSOLUTE)

 

Execution Region ARM_LIB_HEAP (Base: 0x01000000, Size: 0x00000800, Max: 0x00000800, ABSOLUTE, UNINIT)

 

Base Addr Size Type Attr Idx E Section Name Object

 

0x01000000 0x00000800 Zero RW 2 ARM_LIB_HEAP.bss anon$$obj.o

 

а в main() я смотрел через debugger, который доходит до malloc() и сваливается в hardfault...

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


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

Простите, а тактирование CCM (бит CCMDATARAMEN) вы не забыли включить?

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


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

а в main() я смотрел через debugger, который доходит до malloc() и сваливается в hardfault...

Кстати, можно и поотлаживать Hard Fault, хоть и в дизассемблере. Сдаётся мне, что причина быстро обнаружится.

 

Простите, а тактирование CCM (бит CCMDATARAMEN) вы не забыли включить?

Он уже включен после сброса, ЕМНИП.

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


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

Чудес уже давно не бывает.

Что возвращает malloc() ?

Когда узнаете значение, замените

*(ptr++) = 125;

на

*((uint32_t *)address_from_malloc) = 0xDEADBEEF;

*((uint8_t *)address_from_malloc) = 0xDE;

и посмотрите где падает в HF

malloc ничего не возвращает, в "режиме отладки" доходит до выделения памяти и в самом malloc() при выполнении

0x08000CBE E9C02400 STRD r2,r4,[r0,#0] следующим шагом в HardFault_Handler(void)

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


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

malloc ничего не возвращает, в "режиме отладки" доходит до выделения памяти и в самом malloc() при выполнении

0x08000CBE E9C02400 STRD r2,r4,[r0,#0] следующим шагом в HardFault_Handler(void)

Очевидно что в этом месте в R0 - недопустимое значение. Приведите его.

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


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

Простите, а тактирование CCM (бит CCMDATARAMEN) вы не забыли включить?

 

__HAL_RCC_CCMDATARAMEN_IS_CLK_ENABLED();

 

результат тот же

 

Очевидно что в этом месте в R0 - недопустимое значение. Приведите его.

r0=0x 0100 0004

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


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

r0=0x 0100 0004

Ну вот и ответ. Сравните с тем, что Вы писали в первом сообщении. Для стека и для кучи.

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


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

СПАСИБО за ответы, я сам отчудил. Извините ....

 

адрес для HEAP указал 0х0100 0000 вместо 0x1000 0000

 

Все работает!

"РАЗГРЕБ КУЧУ" :)

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


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

СПАСИБО за ответы, я сам отчудил. Извините ....

вот для чего полезно иметь в проге обработчик HF...

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


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

А еще полезнее уметь находить решение таких простых проблем

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


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

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

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

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

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

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

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

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

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

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