2016-05-02 3 views
1

Я использую Atmel SAM4E-16e на плате Atmel SAM4E-EK. Я написал загрузчик для этой конфигурации. Загрузочный загрузчик получает .bin-файл через UART и записывает его во Flash. Это работает без проблем, я сделал шестигранного дамп, и это было именно то, что я ожидал:Загрузочный загрузчик для Cortex M4 - Перейти к загруженному приложению

  • Загрузчик в 0x400000 (Flash-Start Адрес АТ SAM4E)
  • My Application на 0x420000
  • 0x800000 является флэш-End Адрес

Это C-код:

int main(void){ 
    // Init and downloading the .bin to Flash 
    binary_exc((void*) 0x420000); 
} 



int binary_exec(void * vStart){ 
    int i; 
    // -- Check parameters 
    // Should be at least 32 words aligned 
    if ((uint32_t)vStart & 0x7F) 
    return 1; 

    Disable_global_interrupt(); 
    // Disable IRQs 
    for (i = 0; i < 8; i ++) NVIC->ICER[i] = 0xFFFFFFFF; 
    // Clear pending IRQs 
    for (i = 0; i < 8; i ++) NVIC->ICPR[i] = 0xFFFFFFFF; 

    // -- Modify vector table location 
    // Barriars 
    __DSB(); 
    __ISB(); 
    // Change the vector table 
    SCB->VTOR = ((uint32_t)vStart & SCB_VTOR_TBLOFF_Msk); 
    // Barriars 
    __DSB(); 
    __ISB(); 

    Enable_global_interrupt(); 

    // -- Load Stack & PC 
    _binExec(vStart); 
    return 0; 
} 

void _binExec (void * l_code_addr){ 
    __asm__ ("mov r1, r0  \n" 
    "ldr r0, [r1, #4] \n" //I also tryed #5 but that doesn't work, too 
    "ldr sp, [r1]  \n" 
    "blx r0" 
    ); 
} 

Но когда я пытаюсь перейти к моему заявлению , приложение не запускается. Код для перехода к программе не является примером Atmel для SAM8X (Cortex M3). Отладчик иногда говорит, что ПК перескакивает на другой адрес (0x004003E2), но не идет дальше.

Я нашел старую тему Bootloader for Cortex M3, где решение было просто добавить одно, но это не работает для меня, даже если я использовал их код. Затем отладчик больше не отвечает.

Я использую Atmel Studio 7 с GCC. Процессор работает в режиме Thumb-Mode.

Надеюсь, вы поможете мне решить эту проблему или дать мне подсказки, что здесь происходит неправильно.

+1

Вам, безусловно, нужно установить lsb регистра '' blx'', или вы попытаетесь выполнить взаимодействие с несуществующим состоянием ARM и жесткой ошибкой. На каком адресе вы пытались добавить его (то есть в какой именно точке этого кода), что еще хуже? – Notlikethat

+0

, если ваш код находится на 0x420000, тогда вы хотите использовать blx для 0x420001, так почему вы читаете инструкцию по адресу 0x420000, а затем пытаетесь перейти на адрес, определенный инструкцией? почему не orr r0, # 1; blx r0? что ваша демонстрация показывает, какой адрес входит в binary_exec? и почему все накладные расходы в binary_exec? вы пытаетесь справиться с любым случаем, был ли запущен код перед тем, как поставить систему в неизвестном состоянии? –

+0

вы можете сделать или из 1 в вызове C на _binExec, тогда bin exec является не более чем blx r0. конечно, если этот код вернет, он вернется после blx, который, вероятно, не тот, который вы хотите. –

ответ

2

Я решил проблему сейчас. Я по-прежнему использую код, который я разместил в своем вопросе. Проблема заключалась в том, что .bin-файл, который я пишу на вспышке моего процессора на 0x420000, был скомпилирован таким образом, что он думал, что он находится на начальном адресе вспышки (0x400000). Когда он загрузил адрес вектора сброса, он был на 0x400xyz вместо 0x420xyz, поэтому приложение переместилось на неправильный адрес.

Решением было изменить начальный адрес Flash на 0x420000 в проекте, который я хочу загрузить через загрузчик.

2

Этот код предполагает, что программа загружена по адресу 0x420000 начинается с векторной таблицы:

  • ИП по смещению 0 (0x420000)
  • адрес Сброс по смещению 4 (0x420004).

Для этого код кажется совершенно правильным.

Но вы уверены, что эта таблица векторов верна? Является ли бит 0 данных на 0x420004 установленным, так как это код Thumb? Когда вы компилируете этот код, известно ли, что он будет работать с этого адреса (для любого абсолютного адреса, который он может использовать). У вас есть возможность использовать отладчик, чтобы понять, когда происходит первая ошибка?

Я думаю, вы должны предоставить disass первых инструкций программы, которую вы пытаетесь загрузить по этому адресу.

Смежные вопросы