Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: sam9260 отладка в SRAM -> SDRAM
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Goofy
Первый опыт программирования указанного процессора

Пользуюсь платой от стартеркита (http://starterkit.ru/new/index.php?name=Pages&op=page&pid=15, по факту впаян sam9260)
Стер с него линукс. Ставиться задача отлаживать одинокий софт максимально удобно, т.е. загрузкой JTAGом в SDRAM.
Среда Keil, отладчик JetLink5.

Рассуждения сейчас неполные, но изложу что есть:

Чтобы грузить приложение JTAGом в SDRAM требуется его инициализировать, например из датафлэша.
После загружаем образ JTAGом из кейла, при этом процессор все ещё будет бегать в инициализаторе из int.RAM (в финальном устройстве он разумеется будет передавать управление сам, а сейчас ему просто нечего грузить). Сейчас для передачи управления ничего умнее прописывания в PC адреса не вижу. ( лучше из командной строки дебагера при старте? сходу не получилось )

Как поступать с ремапом? Инициализатор запустился с нулевого адреса, всё ок. Основная программа вышеуказанным способом с "нуля" не запустится, придётся линковать при отладке по месту.

Как малой кровью построить отладку описанным халявным образом?
Что в изучении процессора на этом этапе упустил?
Goofy
Все молчат либо когда все плохо изложено, либо когда реально никто не сталкивался.
В последнем сомневаюсь smile.gif


поступим иначе
Отлаживать кейлом через JTAG из SDRAM софт на at91sam9260 возможно ? smile.gif
aaarrr
Цитата(Goofy @ Mar 11 2009, 22:39) *
Отлаживать кейлом через JTAG из SDRAM софт на at91sam9260 возможно ? smile.gif

Возможно. Только инициализировать SDRAM логичнее самим отладчиком, а не дополнительным загрузчиком.
Проблем с ремапом и передачей управления вообще не вижу.
zuy
Цитата(Goofy @ Mar 11 2009, 22:39) *
Отлаживать кейлом через JTAG из SDRAM софт на at91sam9260 возможно ? smile.gif


Сам только собираюсь начать пробовать работать с AT91SAM9260,
но насколько я понимаю этот процесс выглядит примерно так:
1. Собираем проект по адресу в SDRAM. Например начало 0x20000000
2. Пишем скрипт для KEIL, который он исполняет до начала отладки.
в этом скрипте инициализируем все что нужно( PLL, SDRAM ...), загружаем код в контроллер и даем команду на исполнение.

Пример этого, вместе со скриптами, можно найти в наборе софта для отладочной платы атмела с их сайта.
Там очень много примеров для работы с разной переферией и из разных сред.
Goofy
Переделал демо скрипт кейла под свою конфигурацию:

Код
FUNC void Setup (void) {

  _WDWORD(0xFFFFF804, 0xFFFF0000);      // PIOC_PDR: Enable Peripheral Mode  

  _WDWORD(0xFFFFEF1C, 0x00010002);      // EBI_CSA:  CSA1 support for SDRAM

  _WDWORD(0xFFFFEA08, 0x852372F9);      // Init SDRAM
  _sleep_(10);                          // Wait for 10 ms
  _WDWORD(0xFFFFEA00, 0x00000002);
  _WDWORD(0x20000000, 0x00000000);
  _sleep_(10);                          // Wait for 10 ms
  _WDWORD(0xFFFFEA00, 0x00000004);
  _WDWORD(0x20000004, 0x00000001);
  _WDWORD(0xFFFFEA00, 0x00000004);
  _WDWORD(0x20000008, 0x00000002);
  _WDWORD(0xFFFFEA00, 0x00000004);
  _WDWORD(0x2000000C, 0x00000003);
  _WDWORD(0xFFFFEA00, 0x00000004);
  _WDWORD(0x20000010, 0x00000004);
  _WDWORD(0xFFFFEA00, 0x00000004);
  _WDWORD(0x20000014, 0x00000005);
  _WDWORD(0xFFFFEA00, 0x00000004);
  _WDWORD(0x20000018, 0x00000006);
  _WDWORD(0xFFFFEA00, 0x00000004);
  _WDWORD(0x2000001C, 0x00000007);
  _WDWORD(0xFFFFEA00, 0x00000004);
  _WDWORD(0x20000020, 0x00000008);
  _WDWORD(0xFFFFEA00, 0x00000003);
  _WDWORD(0x20000024, 0xCAFEDEDE);

  _WDWORD(0xFFFFEA04, 0x000000BB);      // Refresh for SDRAM (at 18.432 MHz)

  _WDWORD(0xFFFFEA00, 0x00000000);
  _WDWORD(0x20000000, 0x00000000);

  // <o> Program Entry Point
  PC = 0x20000000;
}
    _sleep_(100);

// Switching from Slow Clock to Main Oscillator for faster Download
_WDWORD(0xFFFFFC20, 0x00000601);        // PMC_MOR:  Enable Main Oscillator
_sleep_(10);                            // Wait for stable Main Oscillator
_WDWORD(0xFFFFFC30, 0x00000001);        // PMC_MCKR: Switch to Main Oscillator

_WDWORD(0xFFFFFD44, 0x00008000);        // WDT_MR:   Disable Watchdog

Setup();                                // Init, and setup for Running

LOAD payload_controller.axf INCREMENTAL   // Download


Если компилировать голое while(1); в теле main ( размер образа программы ~1.5k ), то всё выполняется так как и должно.
Когда же компилирую (FreeRTOS, размер образа ~11k)
Код
    xTaskCreate(tskIdle, "Aux", 200, NULL, tskIDLE_PRIORITY + 1, NULL );
    xTaskCreate(tskTask1, "Comm", 200, NULL, tskIDLE_PRIORITY + 2, NULL );
    vTaskStartScheduler();

то выполнение до main() (и этих строчек соответственно ) даже не доходит, а обнаруживается в районе 0x00100000
При этом проходит инициализация переферии (асмовский конфигурационнй файл, что генерит кейл), передаётся управление к __main, далее подготовка кучи и стека (помоему)
и потом (однозначно из кода написанного не мной) , достоверно точку ухода проследить не удалось покапрограмма перескакивает налево в район 0x00100000



Собрано так:

Код
LR_IROM1 0x20000000 0x00010000  {  ; load region size_region
  ER_IROM1 0x20000000 0x00010000  {; load address = execution address
   *.o (RESET, +First)
   *(InRoot$$Sections)
   .ANY (+RO)
  }
  RW_IRAM1 0x20010000 0x00020000  {; RW data
   .ANY (+RW +ZI)
  }
}


На неправильную настройку клока и памяти не грешу (ведь минимальный код то всё - таки в SDRAM работает)

Чем может объясняться подобное поведение процессора ?
Goofy
Собираю с Use Micro-lib, выполнение до main доползает.
Желательно, однако, без micro-lib
Goofy
ситуация изменилась
и поставим вопрос иначе:

что может перед запуском int main (void) вызывать SWI ?
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.