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

 
 
> FreeRTOS, LPC2138 и менеджер памяти, Очень большой расход оперативной паямяти
MiniMax
сообщение Feb 27 2008, 09:29
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 53
Регистрация: 12-09-07
Пользователь №: 30 498



Возникают проблемы с запуском ресурсоемких задач под FreeRTOS.
Поэтому решил проделать несколько простых экспериментов, чтобы поглядеть,
что происходит, когда память (SRAM) используется в больших количествах.
И сколько надо оставить глобального стека ( помимо стеков задач), чтобы планировщик чувствовал себя нормально.
Результаты разочаровывают пока.


Это прочитал http://www.freertos.org/FAQHelp.html

Это мой тестовый пример http://www.bipom.com/support/RtosDemo1.zip
Компилятор GCC.
Там есть две простые задачи вывода в последовательный порт

pt = (ULONG)malloc(1);
int2str(buf,pt, HEX);uart0Puts("\n\rfirst loc = ");uart0Puts(buf);


xReturn = xTaskCreate( vMessage_0, ( const signed portCHAR * const )"Message_0", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL );
int2str(buf,xReturn, HEX);uart0Puts("\n\rMes0=");uart0Puts(buf);

xReturn = xTaskCreate( vMessage_1, ( const signed portCHAR * const )"Message_1", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY, NULL );
int2str(buf,xReturn, HEX);uart0Puts("\n\rMes1=");uart0Puts(buf);

pt = (ULONG)malloc(1);
int2str(buf,pt, HEX);uart0Puts("\n\rlast loc = ");uart0Puts(buf);

Примечание. int2str & uart0Puts использую вместо printf ("%8X", ,,,)
Поскольку стандартный форматтер "жрет" ресурсы памяти очень сильно.

Если декларирую большой массив памяти ( чтобы получить приграничное значение для используемой SRAM)
unsigned char myArray[1024*23+792],
то даже задачи не запускаются. Хотя создаются нормально с кодом завершения 1.

first loc = 0x40006980
Mes0=0x1
Mes1=0x1
last loc = 0x40006E40

7FFF - 6E40 = 11BFh = 4543


Вот теперь вопрос .
Почему имея 4543 байт к верхушке памяти это не работает ?
LPC2138 имеет 32K.

Если меняю к char myArray[1024*23+512]; ( разница в 280 байт),
то все работает.


first loc = 0x40006868
Mes0=0x1
Mes1=0x1
last loc = 0x40006D28
Message_0
Message_1
Message_0

7FFF - 6D28 = 12D7h = 4823


У меня 4.6.0 версия FreeRTOS.
Я кстати пробовал различные модели менеджера памяти.
http://www.freertos.org/a00111.html
В текущей версии heap_3.c
Пробовал heap_1 и heap_2. Там еще более напряженно с памятью

Это мои исследования FreeRTOS. Я не могу объяснить это.
Поэтому и не закладываю серьезные проекты на FreeRTOS пока.

Есть идеи как объяснить это ?
Прикрепленные файлы
Прикрепленный файл  RtosDemo1.zip ( 2.09 килобайт ) Кол-во скачиваний: 27
 
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
zltigo
сообщение Feb 27 2008, 10:37
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



Цитата(MiniMax @ Feb 27 2008, 12:29) *
Есть идеи как объяснить это ?

По выданной информации - никак. Для начала, просто имейте ввиду, что Heap "сишный" и Неаp из которого берет память FreeRTOS это разные хипы и менеджеры. Для начала, по крайней мере я так сделал сразу, отдал под нужды FreeRTOS всю оставшуюся память. Дополнительно мой менеджер памяти хранит владельца выделенного блока, посему всегда можно посмотреть кто и на что память скушал. Из средств небольшой дополнительной экономии в самой системе объединены в один блок TCB и Stack задачи, и подчищен сам TCB. Подчитску TCB Автор FreeRTOS тихонечко (спустя пару лет smile.gif )в последние версии внес, а объединение блоков памяти дважды предложенное проигнорировал...
Вот картинка распределения памяти в текущей поделке:
Код
ARMSL RTKernel(ARM) V0.42.1(472) Feb 27 2008 13:17:31 ......
.....
Это при Heap при старте:
    Check CPU -LPC2138
    RAM use:8704 Heap:40002200 Size:24064
......
Список процессов:
ps
R 2 Console       TCB=40002210:304/800
R 0 IDLE       TCB=40002578:272/320
B 3 LAP       TCB=400032E0:152/1200
B 4 SPItx       TCB=40002F78:144/800
B 1 Checker       TCB=400037D8:88/400
S 2 HDLCtx       TCB=40002860:144/400
......
Использование Heap:
memm
MCB00->40002210 Size=   856 TCB+Stack=800
MCB01->40002578 Size=   376 TCB+Stack=320
MCB02->40002700 Size=   336 QCB <-System
MCB03->40002860 Size=   456 TCB+Stack=400
MCB04->40002A38 Size=   848 QCB <-System
MCB05->40002D98 Size=   464 QCB <-System
MCB06->40002F78 Size=   856 TCB+Stack=800
MCB07->400032E0 Size=  1256 TCB+Stack=1200
MCB08->400037D8 Size=   456 TCB+Stack=400
MCB09->400039B0 Size= 17969 Free

Размеры стеков пока не поджимались, задач пока мало, все в процессе написания, но размеры выделленой и используемой памяти видны отлично.

Цитата
то даже задачи не запускаются. Хотя создаются нормально с кодом завершения 1.

А с этим не просто, а очень просто smile.gif У Вас Для самой ГЛАВНОЙ задачи IDLE памяти не хватило, вот создающей ее шедулер молча не запустился. Эту задачу надо создавать ПЕРВОЙ, я так и делаю в своей ветке FreeRTOS, кстати, это тоже одно из предложений не получившей никакой реакции от Автора FreeRTOS


--------------------
Feci, quod potui, faciant meliora potentes
Go to the top of the page
 
+Quote Post



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

 


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


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