• Система автоматизации с открытым исходным кодом на базе esp8266/esp32 микроконтроллеров и приложения IoT Manager. Наша группа в Telegram

RTL8711AM работа с SDRAM

Ксения

New member
Доброго времени суток!

Был ли у кого-нибудь опыт размещения кода в SDRAM (RTL8711AM)? Поделитесь, пожалуйста. Памяти катастрофически не хватает...
Отдельную небольшую функцию разместить в секции .sdram.text удалось, выполняется корректно, но попытка отправить туда целую задачу (tcpip_thread, например) или полностью секцию *(.text*) (правился *.ld файл) провалилась. Сейчас плата вообще отказывается прошиваться

Заранее спасибо!
 

pvvx

Активный участник сообщества
Был ли у кого-нибудь опыт размещения кода в SDRAM (RTL8711AM)? Поделитесь, пожалуйста. Памяти катастрофически не хватает...
Для GCC или ?
Если для GCC, тогда:
Берите изначальный SDK (sdk-ameba-v4.0b_without_NDA_GCC_V1.0.0.zip + оф.патчи). В нем есть файл для линкера - rlx8195A-symbol-v02-img2.ld. В нем указаны секции размещения кода.
Ставите необходимый атрибут у функции и она разместиться куда выберете по указаниям в rlx8195A-symbol-v02-img2.ld.
Другой вариант в данном SDK, предполагает в application.mk добавить исходный файл СИ в список не SRC_C += ваш.с, а в DRAM_C += ваш.с.
Возможно и отдельно обработать уже объектник (ваш.о который надо в SDRAM), путем переименования (дополнения имени) секций (включая и .text) на .sdram (выйдет .sdram.text):
arm-none-eabi-objcopy --prefix-alloc-sections .sdram ваш.о
И последующей линковки.

Проблемы с загрузкой проекта сразу в SDRAM для отладки, минуя запись в Flash - это отдельная тема, как и редакция *.ld файлов.
 
Последнее редактирование:

pvvx

Активный участник сообщества
попытка отправить туда целую задачу (tcpip_thread, например) или полностью секцию *(.text*) (правился *.ld файл) провалилась.
Переносить полностью .text нельзя - при старте RTL серии "A" SDRAM не включена и контроллер SDRAM требует инициализации...
Сейчас плата вообще отказывается прошиваться
Тип программатора?
STLink->JLink (?) -> Используйте пин RESET + SWD. Его необходимо вывести отдельно с платы на внешние пины, заместив ненужный сигнал ST-Link...
JTAG включается програмно, при старте CPU в ROM-BIOS. Загружаемая программа может отключить JTAG и в ручную, дергая RESET, сложно ловить момент активности JTAG.
Тяжелый случай будет, если прописать в eFuse отключение JTAG, но у RTL8711AM внешняя Flash.

Так-же учтите, что SDRAM достаточно медленная (16 битная шина всего и пачка лишних тактов при выборке каждого слова). Туда желательно размещать процедуры не требующие, не критичные к времени исполнения. Так-же есть зависимости у некоторых встроенных контроллеров с DMA в SDRAM.
 
Последнее редактирование:

Ксения

New member
Спасибо за ответы!

Используем вашу сборку SDK (из проекта RTL00MP3 GitHub - pvvx/RTL00MP3: RTL00(RTL8710AF) Test MP3), чем она отличается от sdk-ameba-v4.0b?

Программатор - китайский JLink.

Удалось зайти в режим отладки при использовании SDRAM (одна небольшая функция с атрибутом SECTION(".sdram.text")), подключившись JLink-ом "на лету"
 

pvvx

Активный участник сообщества
Удалось зайти в режим отладки при использовании SDRAM (одна небольшая функция с атрибутом SECTION(".sdram.text")), подключившись JLink-ом "на лету"
Вам повезло, что контроллер SDRAM был инициализирован правильно, прервав предыдущую программу без физического или программного пересброса SoC...
Другим так не везет :)
Отладка с загрузкой в SDRAM не доделана, т.к. основной запрос был на модуль RTL00, а модули с SDRAM появились в доступе только к концу этого лета (но я пока занят и мало времени для выработки нормальной концепции по данному поводу, а ранее просто переписывал *.ld и файлы скриптов для Jlink под конкретную задачу). Тема, почему есть проблемы с SDRAM и какой путь выбрать где-то подробно описана в форуме, но решение не выработано... Я один, без сторонних рекомендаций с примерами, это делать не буду (мои задачи с RTL8...AM слишком специфичны и там стандартных путей нет и даже если выложить какой пример, то он будет решением только для данной задачи и не нужен никому тут...).
 
Последнее редактирование:

Ксения

New member
Для GCC или ?
Если для GCC, тогда:
Берите изначальный SDK (sdk-ameba-v4.0b_without_NDA_GCC_V1.0.0.zip + оф.патчи). В нем есть файл для линкера - rlx8195A-symbol-v02-img2.ld. В нем указаны секции размещения кода.
Ставите необходимый атрибут у функции и она разместиться куда выберете по указаниям в rlx8195A-symbol-v02-img2.ld.
Пробуем разместить отдельные функции в SDRAM. Вот такой вариант работает на ура:
Код:
SECTION(".sdram.text") int testfunk(int a, int b);

int testfunk(int a, int b) {

    int x = a;
    int y = b;
   
    return (x + y);
}
Функция размещается по адресу 0x30000000 и работает правильно.
Но если добавить вызов какой-либо функции из BDRAM (хотя бы printf), то при вызове testfunk программа полностью зависает.
Код:
SECTION(".sdram.text") int testfunk(int a, int b);

int testfunk(int a, int b) {

    int x =a;
    int y =b;
    printf("This is from testfunk" );
    return (x + y);
}
К данным из BDRAM обращение происходит без проблем.

Получается, что в SDRAM можно размещать код, в котором нет обращений к коду из других областей?
 

pvvx

Активный участник сообщества
Получается, что в SDRAM можно размещать код, в котором нет обращений к коду из других областей?
У вас какие-то ошибки, не связанные с SDRAM.
Там выйдет только long jmp/call (__attribute__ ((long_call))) для вызова из SRAM (основной или TCM RAM) процедур в SDRAM (и наоборот).
Работает и такое:
Код:
/* Добавлено в section_config.h
#if defined(CONFIG_SDR_EN)
#define SDRAM_CODE_SECTION SECTION(".sdram.text")
#else
#define SDRAM_CODE_SECTION
#endif
*/
/* main */
SDRAM_CODE_SECTION int main(void)
{
....
}
Скорее всего у вас проблемы где-то в описании *.ld и при старте затирается область размещения процедур в SDRAM...
Полный пример описывать долго... пока не стер вариант тестов с USB-UVC на RTL8195A https://esp8266.ru/forum/threads/rtl8195a-usbh-dwc-otg-uvc.2784/#post-41110 - там много чего в SDRAM.
 
Сверху Снизу