bolmoe 0 24 мая, 2017 Опубликовано 24 мая, 2017 (изменено) · Жалоба Попытался разместить стек и кучу в ССМ памяти. Делал все через скаттер файл. В отладке вижу, что стек лег по нужному адресу. А вот с 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); } Изменено 24 мая, 2017 пользователем IgorKossak [codebox] для длинного кода, [code] - для короткого! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 35 24 мая, 2017 Опубликовано 24 мая, 2017 · Жалоба Чудес уже давно не бывает. Что возвращает malloc() ? Когда узнаете значение, замените *(ptr++) = 125; на *((uint32_t *)address_from_malloc) = 0xDEADBEEF; *((uint8_t *)address_from_malloc) = 0xDE; и посмотрите где падает в HF Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 24 мая, 2017 Опубликовано 24 мая, 2017 · Жалоба Программа: Расположение объектов в памяти смотрят не по main(), а по .map-файлу. ЗЫ: В хорошо написанной embedded-программе не должно быть кучи (чего угодно ;) Имха! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bolmoe 0 24 мая, 2017 Опубликовано 24 мая, 2017 · Жалоба Расположение объектов в памяти смотрят не по 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... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Сергей Борщ 119 24 мая, 2017 Опубликовано 24 мая, 2017 · Жалоба Простите, а тактирование CCM (бит CCMDATARAMEN) вы не забыли включить? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
scifi 1 24 мая, 2017 Опубликовано 24 мая, 2017 · Жалоба а в main() я смотрел через debugger, который доходит до malloc() и сваливается в hardfault... Кстати, можно и поотлаживать Hard Fault, хоть и в дизассемблере. Сдаётся мне, что причина быстро обнаружится. Простите, а тактирование CCM (бит CCMDATARAMEN) вы не забыли включить? Он уже включен после сброса, ЕМНИП. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bolmoe 0 24 мая, 2017 Опубликовано 24 мая, 2017 · Жалоба Чудес уже давно не бывает. Что возвращает 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 184 24 мая, 2017 Опубликовано 24 мая, 2017 · Жалоба malloc ничего не возвращает, в "режиме отладки" доходит до выделения памяти и в самом malloc() при выполнении 0x08000CBE E9C02400 STRD r2,r4,[r0,#0] следующим шагом в HardFault_Handler(void) Очевидно что в этом месте в R0 - недопустимое значение. Приведите его. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bolmoe 0 24 мая, 2017 Опубликовано 24 мая, 2017 · Жалоба Простите, а тактирование CCM (бит CCMDATARAMEN) вы не забыли включить? __HAL_RCC_CCMDATARAMEN_IS_CLK_ENABLED(); результат тот же Очевидно что в этом месте в R0 - недопустимое значение. Приведите его. r0=0x 0100 0004 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 24 мая, 2017 Опубликовано 24 мая, 2017 · Жалоба r0=0x 0100 0004 Ну вот и ответ. Сравните с тем, что Вы писали в первом сообщении. Для стека и для кучи. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
bolmoe 0 24 мая, 2017 Опубликовано 24 мая, 2017 · Жалоба СПАСИБО за ответы, я сам отчудил. Извините .... адрес для HEAP указал 0х0100 0000 вместо 0x1000 0000 Все работает! "РАЗГРЕБ КУЧУ" :) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
jcxz 184 24 мая, 2017 Опубликовано 24 мая, 2017 · Жалоба СПАСИБО за ответы, я сам отчудил. Извините .... вот для чего полезно иметь в проге обработчик HF... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x893 35 24 мая, 2017 Опубликовано 24 мая, 2017 · Жалоба А еще полезнее уметь находить решение таких простых проблем Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться