Переделал демо скрипт кейла под свою конфигурацию:
Код
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 работает)
Чем может объясняться подобное поведение процессора ?