Easyelectronics.ru

Электроника для всех
Текущее время: 26 фев 2021, 03:57

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



JLCPCB – Прототипы печатных плат за $2/5шт. два слоя. $5/5шт. четыре слоя
Крупнейший производитель печатных плат и прототипов. Более 600000 клиентов и свыше 10000 заказов в день!
Получите скидку на почтовую отправку при первом заказе в JLCPCB!

Начать новую тему Ответить на тему  [ Сообщений: 16 ] 
Автор Сообщение
 Заголовок сообщения: Как загнать кучу FreeRTOS в SDRAM?
СообщениеДобавлено: 24 май 2016, 14:46 
Старожил
Аватара пользователя

Зарегистрирован: 23 янв 2013, 12:33
Сообщения: 1794
Откуда: Донецк, ДНР
Привет всем.

Есть STM32F439+32MB SDRAM. Крутятся 2 задачи FreeRTOS - фоновая (мышки, мониторинг USB хостов и родственные тому вещи) и задача с STemWin.
Размер кучи задан 90 кил:
Код:
#define configTOTAL_HEAP_SIZE         ( ( size_t ) ( 90 * 1024 ) )   // 90 KB

Сама куча лежит в heap_2.c:
Код:
/* Allocate the memory for the heap. */
static uint8_t ucHeap[ configTOTAL_HEAP_SIZE ];

Т.е. она размещается во внутренней SRAM проца.

Раньше была 100 кил, но при добавлении драйвера очередного железа я вылетел за переполнение RAM. Пришось убавить до 90 кил. Меньше сделать не могу - облочка виснет.

Попробовал разместить кучу в SDRAM:
Код:
#define GUI_NUMBYTES  (2 * 1024 * 1024)   // 2MB
static uint8_t *ucHeap = (uint8_t *)(SDRAM_BANK_ADDR+GUI_NUMBYTES);

GUI_NUMBYTES - буфер STemWin, лежит там очень давно и прекрасно себя чувствует.

Всё мгновенно повисло. Отладчик показал, что проц улетел в DefaultHander из

3 prvPortStartFirstTask() port_Cortex-M4F.c:290 0x08005c50
2 xPortStartScheduler() port_Cortex-M4F.c:382 0x08005d3e

в этот момент выполнялась первичная очистка дисплея. Дисплей SSD1963, висит на FMC вместе с SDRAM.
Очистка выполняется заливкой через DMA. Прерываний там нет, опрос флага DMA.

Посему вопрос - можно ли выносить эту кучу в SDRAM и как правильно это делать?

Спасибо.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как загнать кучу FreeRTOS в SDRAM?
СообщениеДобавлено: 24 май 2016, 16:47 
Старожил

Зарегистрирован: 07 авг 2014, 17:15
Сообщения: 383
Откуда: дальнее надмосковье
https://stackoverflow.com/questions/363 ... ternal-ram


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как загнать кучу FreeRTOS в SDRAM?
СообщениеДобавлено: 24 май 2016, 17:29 
Старожил
Аватара пользователя

Зарегистрирован: 23 янв 2013, 12:33
Сообщения: 1794
Откуда: Донецк, ДНР
Угу. спасибо. Почитаю.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как загнать кучу FreeRTOS в SDRAM?
СообщениеДобавлено: 24 май 2016, 23:35 
Старожил
Аватара пользователя

Зарегистрирован: 23 янв 2013, 12:33
Сообщения: 1794
Откуда: Донецк, ДНР
Ни фига не поменялось :( .
Буфер лежит в SDRAM, но вылетает там же.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как загнать кучу FreeRTOS в SDRAM?
СообщениеДобавлено: 25 май 2016, 11:08 
Старожил
Аватара пользователя

Зарегистрирован: 29 янв 2010, 15:41
Сообщения: 1127
Откуда: Германия
viewtopic.php?p=433606#p433606
Там правда речь про "снег" на экране, но и вылеты в хард фолт тоже были.

_________________
Мои поделки
http://www.fun-electronic.net/


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как загнать кучу FreeRTOS в SDRAM?
СообщениеДобавлено: 25 май 2016, 12:28 
Старожил
Аватара пользователя

Зарегистрирован: 23 янв 2013, 12:33
Сообщения: 1794
Откуда: Донецк, ДНР
Выключил DMA при работе с дисплеем - всё пашет, только тормозит жутко при отрисовке. Осталось только с вылетами DMA разобраться.
Темку ту я примерно помню, надо перечитать, спасибо.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как загнать кучу FreeRTOS в SDRAM?
СообщениеДобавлено: 25 май 2016, 12:47 
Старожил
Аватара пользователя

Зарегистрирован: 23 янв 2013, 12:33
Сообщения: 1794
Откуда: Донецк, ДНР
Та темка про LTDC. А у меня SSD1963. LTDC вообще выключен.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как загнать кучу FreeRTOS в SDRAM?
СообщениеДобавлено: 25 май 2016, 13:01 
Старожил
Аватара пользователя

Зарегистрирован: 29 янв 2010, 15:41
Сообщения: 1127
Откуда: Германия
Без разницы.
У вас же так?
Цитата:
в этот момент выполнялась первичная очистка дисплея. Дисплей SSD1963, висит на FMC вместе с SDRAM.
Очистка выполняется заливкой через DMA

Читайте между строк:
Если идет обращение к SDRAM через DMA (в моем случае это был DMA2D, что тот же DMA, только графический), то любое движение на FMC из вашей программы (читай: второй поток) ломает работу DMA.

_________________
Мои поделки
http://www.fun-electronic.net/


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как загнать кучу FreeRTOS в SDRAM?
СообщениеДобавлено: 25 май 2016, 13:44 
Старожил
Аватара пользователя

Зарегистрирован: 23 янв 2013, 12:33
Сообщения: 1794
Откуда: Донецк, ДНР
А... Кажется врубился я ...
Т.е. если у меня работает DMA с FMC, то я не могу параллельно обращаться к FMC, даже к другому её банку. Я правильно понимаю суть проблемы?

MasterAlexei, Вы это дело всё семафорили?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как загнать кучу FreeRTOS в SDRAM?
СообщениеДобавлено: 25 май 2016, 14:18 
Старожил
Аватара пользователя

Зарегистрирован: 29 янв 2010, 15:41
Сообщения: 1127
Откуда: Германия
hd44780 писал(а):
А... Кажется врубился я ...
Т.е. если у меня работает DMA с FMC, то я не могу параллельно обращаться к FMC, даже к другому её банку. Я правильно понимаю суть проблемы?

MasterAlexei, Вы это дело всё семафорили?


Именно так. По крайней мере, все мои "опыты" да "пробы" привели к такому результату.
Может кто подскажет другое решение - но я пока его не вижу.

_________________
Мои поделки
http://www.fun-electronic.net/


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как загнать кучу FreeRTOS в SDRAM?
СообщениеДобавлено: 25 май 2016, 14:24 
Старожил
Аватара пользователя

Зарегистрирован: 23 янв 2013, 12:33
Сообщения: 1794
Откуда: Донецк, ДНР
Ага. Спасибо. Пошёл думать/переделывать.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как загнать кучу FreeRTOS в SDRAM?
СообщениеДобавлено: 26 май 2016, 17:37 
Старожил
Аватара пользователя

Зарегистрирован: 23 янв 2013, 12:33
Сообщения: 1794
Откуда: Донецк, ДНР
pvPortMalloc/vPortFree/заливку засемафорил - не помогло. Точнее ломает его уже в процессе работы задачи.
Подозреваю, что ломается оно при простой работе таска, его стек же сидит в SDRAM-е и таск работает и дисплеем, то бишь с DMA.

Возвращаюсь пока в обычную память.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как загнать кучу FreeRTOS в SDRAM?
СообщениеДобавлено: 26 май 2016, 18:38 
Старожил
Аватара пользователя

Зарегистрирован: 23 янв 2013, 12:33
Сообщения: 1794
Откуда: Донецк, ДНР
Подумалось, что из-за вызовов SPL, переделал на регистры - пофигу:

Код:
/*
#define DMA_STREAM               DMA2_Stream7
#define DMA_STREAM_STATUS_BIT    DMA_IT_TCIF7
*/
   // ждать конца передачи DMA
//   while ( DMA_GetFlagStatus ( DMA_STREAM, DMA_STREAM_STATUS_BIT ) == RESET );
   while ( (DMA2 -> HISR & DMA_IT_TCIF7) == 0 );
//   DMA_ClearFlag ( DMA_STREAM, DMA_STREAM_STATUS_BIT );
#define RESERVED_MASK           (uint32_t)0x0F7D0F7D
   DMA2 -> HIFCR = (uint32_t)(DMA_IT_TCIF7 & RESERVED_MASK);


Само по себе это рабочее. Если куча FreeRTOS во внутренней SRAM - пашет идеально.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как загнать кучу FreeRTOS в SDRAM?
СообщениеДобавлено: 26 май 2016, 19:56 
Старожил
Аватара пользователя

Зарегистрирован: 23 янв 2013, 12:33
Сообщения: 1794
Откуда: Донецк, ДНР
реально помогает только это:

Код:
   // ждать конца передачи DMA
   taskENTER_CRITICAL ( );
   while ( (DMA2 -> HISR & DMA_STREAM_STATUS_BIT) == 0 );
   DMA2 -> HIFCR = (uint32_t)(DMA_STREAM_STATUS_BIT & (uint32_t)0x0F7D0F7D);
   taskEXIT_CRITICAL ( );


Работает, но жутко медленно. Вся скорость DMA куда-то улетучивается :( .


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как загнать кучу FreeRTOS в SDRAM?
СообщениеДобавлено: 26 май 2016, 21:08 
Старожил

Зарегистрирован: 10 окт 2014, 00:48
Сообщения: 7287
Попробуйте поиграться с вкл/выкл регенерации, может поможет.
http://electronix.ru/forum/lofiversion/ ... 29282.html


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Как загнать кучу FreeRTOS в SDRAM?
СообщениеДобавлено: 07 май 2019, 16:15 
Только пришел

Зарегистрирован: 11 дек 2013, 15:07
Сообщения: 20
У меня куча FREERTOS лежит во внешней SDRAM. Там же находится framebuffer TouchGFX. Проект в IAR.
В линкере добавлена секция SDRAMSection по адресу 0xC0300000 (МК STM32F746) размером 512Кб.

А объявление кучи получилось вот такое:
Код:
_Pragma("location=\"SDRAMSection\"") static uint8_t ucHeap[ configTOTAL_HEAP_SIZE ]  __attribute__ ((section ("SDRAMSection"))) __attribute__ ((aligned(4)));


И всё работает. Пока глюков с этой стороны не замечено. Замечено пока только, что инициализация LWIP стала на один тик OS дольше. Раньше было 4113 тиков, сейчас 4114 https://www.dropbox.com/s/qdype1vkyb5bbc7/Screenshot_13.png?dl=0

А чтобы Ваша конструкция с указателями работала, её надо помещать в main() после инициализации SDRAM, но до старта osKernelStart().


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


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


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

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


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

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB