• Уважаемые посетители сайта esp8266.ru!
    Мы отказались от размещения рекламы на страницах форума для большего комфорта пользователей.
    Вы можете оказать посильную поддержку администрации форума. Данные средства пойдут на оплату услуг облачных провайдеров для сайта esp8266.ru
  • Система автоматизации с открытым исходным кодом на базе 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.
 
Сверху Снизу