Миландр

Ключевым подразделением нашей компании является Центр Проектирования интегральных микросхем
Текущее время: 2018-авг-17 22:15

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 2 ] 
Автор Сообщение
СообщениеДобавлено: 2018-июн-04 15:46 
Не в сети

Зарегистрирован: 2015-июл-16 15:20
Сообщения: 13
Доброго времени суток, коллеги!
Пытаюсь организовать для BE1T работу с malloc в внешней памяти.
С MicroLIB работает, со стандартной библиотекой - нет.
Пробовал c StdLIB размещать кучу в доп ОЗУ IRAM2 BE1T : тоже работает.

xxx.sct:
...
;RW_ERAM 0x60000000 0x400000 { ; 4*1024*1024
RW_RAM2 0x20100400 0x0003C00 { ; 14*1024
.ANY (+RW +ZI)
*(HEAP)
}

startup.s:
...
Heap_Size EQU 14*1024 ; IRAM2 0x20100400 0x0003C00
;Heap_Size EQU (4*1024*1024)
AREA HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem SPACE Heap_Size
__heap_limit


c StdLIB при старте получаю по malloc нач адрес 0x20100418 и далее - нормальная работа.
c MicroLIB ERAM 0x60000000 дает нач адрес 0x60000008 и далее тоже работает.
с StdLIB 0x60000000 дает нач адрес 0x60000004, malloc не срабатывает (см.пример ниже)

-------------------------------
main.c

...
// использование "кучи"
static u8 * _heap_start=0;
static u8 * _heap_begin;

u8 *testalloc2;

void my_heap_start(void){
u8 *testalloc = malloc(8);
_heap_start = testalloc;
free(testalloc);
}

u8 * my_heap_curr(void){
u8 *testalloc = malloc(8);
u8 *curr = testalloc;
free(testalloc);
return(curr);
}

int my_heap_used(void){
int used = (int) my_heap_curr() - (int) _heap_start;
return used;
}


main(){
...
my_heap_start();
_heap_begin = my_heap_curr();

LOG("heap start=0x%x begin=0x%x\n",_heap_start, _heap_begin);
LOG("heap 1: 0x%x\n",my_heap_curr());

LOG("1 mem allocated %d (0x%x)\n",my_heap_used(),my_heap_used());
testalloc2 = malloc(32);
LOG("2 mem allocated [0x%08x]\n",testalloc2);

while(1){...}

}
------------------------------------------

из протокола:
heap start=0x60000004 begin=0x60000008
heap 1: 0x0
1 mem allocated -1610612740 (0x9ffffffc)
2 mem allocated [0x00000000]

Без скаттера пробовал напрямую обьявлять в startup.s : эффект тот же.

На форуме Keil http://www.keil.com/forum/60550/ тоже вопрос без ответа.

Может кто преодолел эту проблему?

14.06.18
Отвечаю сам себе.Что-то не так с начальной работой кучи.
Проблему не решил, но есть доп.результаты. См.проект (Keil 5.13), комментарии в main.c.
Попробую пока так.

22.06.18
Разные результаты MicroLIB/StdLIB, это мб и понятно.
Если и иногда получается подогнать и получить работающий код, но все равно подход с ERAM какой-то неверный.

Насколько я понимаю, схема работы с кучей такая.
Reset->_main библиотеки Keil с ее функциями инициализации кучи-> main()
После этого в памяти уже есть проинициализированная куча.

Если использовать внутреннее ОЗУ проца (0x20100400, 14*10124), в отладчике видно,
20100400 : 00000000 20100414 20100400 00000000 000037EC далее нули (+ZI sct и _main поработал? )
При первом обращении в main() получаем пул с началом как раз после 000037EC.
Так работаем с внутренним ОЗУ. И не зависимо от Micro/StdLIB.

Теперь внешнее ОЗУ. В этом случае в _main Keil'a не произойдет правильной инициализации,
ведь ERAM подключается тактированием EBC только после входа в нашу main() !
Значит, нужно каким-то образом (пере) назначить кучу только после подключения , вызвав функции Keil.
В описании ARM® Compiler . ARM C and C++ Libraries and Floating-Point Support User Guide есть материал , но как-то мутновато.
Решения по-прежнему нет.Буду продолжать искать.


Вложения:
eram_heap.zip [39.04 КБ]
Скачиваний: 20
Вернуться к началу
 Профиль  
 
СообщениеДобавлено: 2018-июн-25 20:33 
Не в сети

Зарегистрирован: 2015-июл-16 15:20
Сообщения: 13
Проблема решена вроде.
1.Готовим карту размещения кучи в scatter-файле
xxx.sct:
...
RW_ERAM 0x60000000 (4*1024*1024)
.ANY (+RW +ZI)
*(HEAP)
}

и startup.s:
...
Heap_Size EQU (4*1024*1024)
AREA HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem SPACE Heap_Size
__heap_limit

2.В проект добавляем файл с кодом инициализации ERAM mySysInit() на Си.

3. startup.s
Вызываем инициализацию ERAM до вызова кейловского _main и из него main()
...
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT mySysInit
LDR R0,=mySysInit
BLX R0
IMPORT __main
LDR R0,=__main
BX R0
ENDP

4. В начале main() имеем проинициализированную в ERAM кучу (можно посмотреть в отладчике).
5. Используем malloc()

Работает с обеими библиотеками Micro- и StdLIB.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 2 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB® Forum Software © phpBB Group
Русская поддержка phpBB