реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> STM32F407 CCM RAM STACK HEAP
bolmoe
сообщение May 24 2017, 10:16
Сообщение #1


Частый гость
**

Группа: Свой
Сообщений: 121
Регистрация: 5-04-06
Из: Рязань
Пользователь №: 15 830



Попытался разместить стек и кучу в ССМ памяти. Делал все через скаттер файл.
В отладке вижу, что стек лег по нужному адресу.
А вот с 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 - May 24 2017, 18:44
Причина редактирования: [codebox] для длинного кода, [code] - для короткого!
Go to the top of the page
 
+Quote Post
x893
сообщение May 24 2017, 10:27
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 333
Регистрация: 27-10-08
Из: Планета Земля
Пользователь №: 41 226



Чудес уже давно не бывает.
Что возвращает malloc() ?
Когда узнаете значение, замените
*(ptr++) = 125;
на
*((uint32_t *)address_from_malloc) = 0xDEADBEEF;
*((uint8_t *)address_from_malloc) = 0xDE;
и посмотрите где падает в HF

Go to the top of the page
 
+Quote Post
jcxz
сообщение May 24 2017, 11:00
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



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

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

ЗЫ: В хорошо написанной embedded-программе не должно быть кучи (чего угодно wink.gif
Имха!
Go to the top of the page
 
+Quote Post
bolmoe
сообщение May 24 2017, 11:50
Сообщение #4


Частый гость
**

Группа: Свой
Сообщений: 121
Регистрация: 5-04-06
Из: Рязань
Пользователь №: 15 830



Цитата(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...
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение May 24 2017, 12:02
Сообщение #5


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
scifi
сообщение May 24 2017, 12:07
Сообщение #6


Гуру
******

Группа: Свой
Сообщений: 3 020
Регистрация: 7-02-07
Пользователь №: 25 136



Цитата(bolmoe @ May 24 2017, 14:50) *
а в main() я смотрел через debugger, который доходит до malloc() и сваливается в hardfault...

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

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

Он уже включен после сброса, ЕМНИП.
Go to the top of the page
 
+Quote Post
bolmoe
сообщение May 24 2017, 12:13
Сообщение #7


Частый гость
**

Группа: Свой
Сообщений: 121
Регистрация: 5-04-06
Из: Рязань
Пользователь №: 15 830



Цитата(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)
Go to the top of the page
 
+Quote Post
jcxz
сообщение May 24 2017, 12:25
Сообщение #8


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(bolmoe @ May 24 2017, 14:13) *
malloc ничего не возвращает, в "режиме отладки" доходит до выделения памяти и в самом malloc() при выполнении
0x08000CBE E9C02400 STRD r2,r4,[r0,#0] следующим шагом в HardFault_Handler(void)

Очевидно что в этом месте в R0 - недопустимое значение. Приведите его.
Go to the top of the page
 
+Quote Post
bolmoe
сообщение May 24 2017, 12:32
Сообщение #9


Частый гость
**

Группа: Свой
Сообщений: 121
Регистрация: 5-04-06
Из: Рязань
Пользователь №: 15 830



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


__HAL_RCC_CCMDATARAMEN_IS_CLK_ENABLED();

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

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

r0=0x 0100 0004
Go to the top of the page
 
+Quote Post
jcxz
сообщение May 24 2017, 12:46
Сообщение #10


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



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

Ну вот и ответ. Сравните с тем, что Вы писали в первом сообщении. Для стека и для кучи.
Go to the top of the page
 
+Quote Post
bolmoe
сообщение May 24 2017, 12:48
Сообщение #11


Частый гость
**

Группа: Свой
Сообщений: 121
Регистрация: 5-04-06
Из: Рязань
Пользователь №: 15 830



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

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

Все работает!
"РАЗГРЕБ КУЧУ" sm.gif
Go to the top of the page
 
+Quote Post
jcxz
сообщение May 24 2017, 12:50
Сообщение #12


Гуру
******

Группа: Свой
Сообщений: 5 228
Регистрация: 3-07-08
Из: Омск
Пользователь №: 38 713



Цитата(bolmoe @ May 24 2017, 14:48) *
СПАСИБО за ответы, я сам отчудил. Извините ....

вот для чего полезно иметь в проге обработчик HF...
Go to the top of the page
 
+Quote Post
x893
сообщение May 24 2017, 13:14
Сообщение #13


Профессионал
*****

Группа: Свой
Сообщений: 1 333
Регистрация: 27-10-08
Из: Планета Земля
Пользователь №: 41 226



А еще полезнее уметь находить решение таких простых проблем
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 13th August 2025 - 08:50
Рейтинг@Mail.ru


Страница сгенерированна за 0.02223 секунд с 7
ELECTRONIX ©2004-2016