Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: STM32F407 CCM RAM STACK HEAP
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
bolmoe
Попытался разместить стек и кучу в ССМ памяти. Делал все через скаттер файл.
В отладке вижу, что стек лег по нужному адресу.
А вот с 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);
}
x893
Чудес уже давно не бывает.
Что возвращает malloc() ?
Когда узнаете значение, замените
*(ptr++) = 125;
на
*((uint32_t *)address_from_malloc) = 0xDEADBEEF;
*((uint8_t *)address_from_malloc) = 0xDE;
и посмотрите где падает в HF

jcxz
Цитата(bolmoe @ May 24 2017, 12:16) *
Программа:

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

ЗЫ: В хорошо написанной embedded-программе не должно быть кучи (чего угодно wink.gif
Имха!
bolmoe
Цитата(jcxz @ May 24 2017, 14:00) *
Расположение объектов в памяти смотрят не по main(), а по .map-файлу.

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

в 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) вы не забыли включить?
scifi
Цитата(bolmoe @ May 24 2017, 14:50) *
а в main() я смотрел через debugger, который доходит до malloc() и сваливается в hardfault...

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

Цитата(Сергей Борщ @ May 24 2017, 15:02) *
Простите, а тактирование CCM (бит CCMDATARAMEN) вы не забыли включить?

Он уже включен после сброса, ЕМНИП.
bolmoe
Цитата(x893 @ May 24 2017, 13:27) *
Чудес уже давно не бывает.
Что возвращает 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)
jcxz
Цитата(bolmoe @ May 24 2017, 14:13) *
malloc ничего не возвращает, в "режиме отладки" доходит до выделения памяти и в самом malloc() при выполнении
0x08000CBE E9C02400 STRD r2,r4,[r0,#0] следующим шагом в HardFault_Handler(void)

Очевидно что в этом месте в R0 - недопустимое значение. Приведите его.
bolmoe
Цитата(Сергей Борщ @ May 24 2017, 15:02) *
Простите, а тактирование CCM (бит CCMDATARAMEN) вы не забыли включить?


__HAL_RCC_CCMDATARAMEN_IS_CLK_ENABLED();

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

Цитата(jcxz @ May 24 2017, 15:25) *
Очевидно что в этом месте в R0 - недопустимое значение. Приведите его.

r0=0x 0100 0004
jcxz
Цитата(bolmoe @ May 24 2017, 14:32) *
r0=0x 0100 0004

Ну вот и ответ. Сравните с тем, что Вы писали в первом сообщении. Для стека и для кучи.
bolmoe
СПАСИБО за ответы, я сам отчудил. Извините ....

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

Все работает!
"РАЗГРЕБ КУЧУ" sm.gif
jcxz
Цитата(bolmoe @ May 24 2017, 14:48) *
СПАСИБО за ответы, я сам отчудил. Извините ....

вот для чего полезно иметь в проге обработчик HF...
x893
А еще полезнее уметь находить решение таких простых проблем
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.