|
Динамическое выделение памяти в SDRAM, STM32F4 |
|
|
|
Nov 19 2014, 13:15
|
Местный
Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102
|
Цитата(Golikov A. @ Nov 19 2014, 16:03) можно если договоритесь с линкером там разместить кучу... можно поподробней, у меня проект в Keil, надо видимо как то опции проекта настроить
|
|
|
|
|
Nov 19 2014, 15:34
|
Местный
Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102
|
то есть startup файл не трогать, а после настройки SDRAM вызвать прямо в программе функцию со своими значениями heap_base и heap_limit? Код __asm void dummy_function(void) { EXPORT __heap_base __heap_base EQU 0x400000; equal to the start of the heap EXPORT __heap_limit __heap_limit EQU 0x800000; equal to the end of the heap } Цитата(Golikov A. @ Nov 19 2014, 18:05) ну и задать heap в область DRAMа что это значит? а в настройках проекта во вкладке Target надо прописывать Memory Areas ?
|
|
|
|
|
Nov 20 2014, 07:31
|
Местный
Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102
|
Если во вкладке Linker снять галочку Use Memory Layout from Target Dialog, то становится доступен Scatter file. У меня там по умолчанию вот что: Код ; ************************************************************* ; *** 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) } RW_IRAM1 0x20000000 0x00030000 { ; RW data .ANY (+RW +ZI) } } и мне нужно отредактировать его вот так? Код ; ************************************************************* ; *** Scatter-Loading Description File generated by uVision *** ; *************************************************************
LR_IROM1 0x08000000 0x00200000 { ; load region size_region
ARM_LIB_HEAP 0xD0000000 EMPTY 0x800000 { };Heap region growing up
ER_IROM1 0x08000000 0x00200000 { ; load address = execution address *.o (RESET, +First) *(InRoot$$Sections) .ANY (+RO) } RW_IRAM1 0x20000000 0x00030000 { ; RW data .ANY (+RW +ZI) } } для SDRAM размером 8 мегабайт с адреса 0xD0000000 а параметры кучи расположенные в стартап файле будут проигнорированы?
|
|
|
|
|
Nov 20 2014, 08:06
|
Местный
Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102
|
в стартапе вот что Код ; <h> Heap Configuration ; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8> ; </h>
Heap_Size EQU 0x00000200
AREA HEAP, NOINIT, READWRITE, ALIGN=3 __heap_base Heap_Mem SPACE Heap_Size __heap_limit
PRESERVE8 THUMB проверил - malloc возвращает значение меньше 0xD0000000 и при попытке выделить больше заданного в стартапе выдает NULL
Сообщение отредактировал Atlantis- - Nov 20 2014, 08:22
|
|
|
|
|
Nov 20 2014, 09:54
|
Местный
Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102
|
Цитата(Golikov A. @ Nov 20 2014, 11:49) ну то есть не победа.
проверьте {} скобочки в скатере
LR_IROM1 0x08000000 0x00200000 { ; load region size_region
у вас этот регион закрывается в конце, а вроде как должен закрыться до
ARM_LIB_HEAP 0xD0000000 EMPTY 0x800000 { };Heap region growing up я расстановку скобок тут смотрел http://www.keil.com/forum/21257/stm32f4-st...g-scatter-file/Цитата(Golikov A. @ Nov 20 2014, 11:49) и определите константы __heap_base и __heap_limit
ARM_LIB_HEAP - может вообще быть для своих кейловских целей, для их бибилотечных маалоков... где определить? в Scatter? еще вопрос, как malloc может вернуть адрес больше 0xD0000000 если 0xD0000000 - это unsigned int, a malloc возвращает int?
|
|
|
|
|
Nov 20 2014, 12:33
|
Гуру
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454
|
в хелпе было написано что в скатере надо определять, попробуйте вместо ARM_LIB_HEAP 0xD0000000 EMPTY 0x800000 { };Heap region growing up ответ на второй вопрос в том что malloc определен как void *malloc(size_t size) а не int вот кстати ваш вопрос и ответ http://www.lpcware.com/zh-hans/node/1108143
|
|
|
|
|
Nov 20 2014, 13:17
|
Местный
Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102
|
Цитата(Golikov A. @ Nov 20 2014, 15:33) в хелпе было написано что в скатере надо определять, попробуйте вместо ARM_LIB_HEAP 0xD0000000 EMPTY 0x800000 { };Heap region growing up если поместить это в скатер, то компилятор ругается Код __heap_base EQU 0xD0000000 ; equal to the start of the heap Цитата(Golikov A. @ Nov 20 2014, 15:33) тут говорят надо функцию прописать Код __asm void dummy_function(void) { EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit
__initial_sp EQU STACK_BASE __heap_base EQU HEAP_BASE __heap_limit EQU (HEAP_BASE + HEAP_SIZE) } только я не понимаю где ее прописать и когда вызвать
|
|
|
|
|
Nov 20 2014, 13:51
|
Гуру
Группа: Свой
Сообщений: 4 256
Регистрация: 17-02-06
Пользователь №: 14 454
|
там написано что можно задать эти переменные в асмовом файле, или через функцию. Думаю стартап как асмовый файл подойдет а в скатере скорее всего надо как то по другому писать, хорошо бы где то синтаксис его найти... попробуйте #define __heap_base 0xD0000000 вот кстати интересно http://www.keil.com/support/man/docs/ARMLI...59122863069.htmкак следствие http://www.keil.com/support/man/docs/armli...62065977713.htmне означает ли это, что надо еще и функцию вызывать чтобы начать пользоваться смещенной кучей?
|
|
|
|
|
Nov 20 2014, 14:12
|
Местный
Группа: Участник
Сообщений: 491
Регистрация: 18-05-11
Пользователь №: 65 102
|
определил в стартапе Код ;******************************************************************************* ; User Stack and Heap initialization ;******************************************************************************* IF :DEF:__MICROLIB EXPORT __initial_sp EXPORT __heap_base EXPORT __heap_limit ;my code __heap_base EQU 0xD0000000 __heap_limit EQU (0xD0000000 + 0x00800000) ;end my code ELSE IMPORT __use_two_region_memory EXPORT __user_initial_stackheap __user_initial_stackheap при попытке выделить 8 000 000 байт возвращает не NULL, но и возвращаемый адрес меньше 0хD0000000 как вообще правильно посмотреть возвращаемый адрес? у меня если точку остановки поставить после маллок и навести курсор на маллок показывает одно число, а в окне Watch1 другое после попытки записать в конец памяти улетает в хардфаулт Код p[5000000] = 10;
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|