реклама на сайте
подробности

 
 
> Cortex-M3 GCC, копия таблицы векторов в 2 адресах
Cosmojam
сообщение Aug 17 2013, 11:42
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 311
Регистрация: 12-01-11
Из: Калининград (Koenigsberg)
Пользователь №: 62 182



LPC1788, gcc. Есть загрузчик и приложение. Нужно сделать чтобы один и тот же бинарник с приложением можно было прошивать и через загрузчик и напрямую через ISP без оного.
Я не понимаю как это сделать, но говорят что надо разместить копию таблицы векторов приложения по 0 адресу. Т.е. на случай приложения без загрузчика (прошито через ISP, например) мы стартуем с 0 адреса, оттуда попадаем по нужному адресу с приложением (0x4000), там таблица векторов перемещается на начальный адрес приложения (0x4000) и т.к. таблицы одинаковые и на 0 и на 0x4000, то всё должно работать.
Пока пытаюсь запустить такой вариант и не получается. Делаю в скрипте линкера
Код
MEMORY
{
   FLASH (rx) : ORIGIN = 0x4000 LENGTH = 0x7C000
   SRAM (rwx) : ORIGIN = 0x10000000, LENGTH = 0x10000
   PIRAM(rw)  : ORIGIN = 0x20000000, LENGTH = 0x8000
    
   SDRAM (rw) : ORIGIN = 0xA0080000, LENGTH = 0x10000
  
   VECTORS_AT_ZERO (rx) : ORIGIN = 0x0 LENGTH = 0x1FF
  
}
  .text :
  {
    KEEP(*(.isr_vector))
  } > VECTORS_AT_ZERO
  
  .text :
  {
    KEEP(*(.isr_vector))
    *(.text*)
    *(.rodata*)

  } > FLASH

В стартап файле
Код
extern void (* const g_pfnVectors[])(void);
__attribute__ ((section(".isr_vector")))
void (* const g_pfnVectors[])(void) =
{
  // Core Level - CM3
  (void *)&_vStackTop,    // The initial stack pointer
  ResetISR,               // The reset handler

Но работает только 1 раз сразу же после прошивки через ISP, потом после сброса уже не работает до следующей прошивки.

Подскажите как можно решить эту задачу? Если размещением копии таблицы векторов по 0 адресу, то как это сделать?


--------------------
typedef enum { no, yes, maybe } bool; | блог тут
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Cosmojam
сообщение Aug 19 2013, 09:42
Сообщение #2


Местный
***

Группа: Свой
Сообщений: 311
Регистрация: 12-01-11
Из: Калининград (Koenigsberg)
Пользователь №: 62 182



Артём, спасибо большое. То что надо. Вроде получилось.

Для повторения самому себе:
У приложения посредствам линкера зарезервирована область памяти, в которой должен располагаться загрузчик (первые 0x4000 байт в моём случае);
У приложения 2 копии таблицы векторов: одна в 0, и одна в 0x4000;
В случае прошивки бинарника приложения напрямую через ISP используется таблица, которая по 0 адресу. Загрузчика нет в этом случае;
В случае использования загрузчика для прошивки приложения, от бинарника приложения откусываются первые 0x4000 байт (они зарезервированы линкером) и файл прошивается по адресу 0x4000 с таким же смещением внутри файла;
Поскольку у приложения копия таблицы векторов расположена по 0x4000, то переход на этот адрес из загрузчика приведёт к запуску приложения. В самом приложении необходимо указать расположение таблицы векторов на 0x4000.


--------------------
typedef enum { no, yes, maybe } bool; | блог тут
Go to the top of the page
 
+Quote Post



Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 27th June 2025 - 00:10
Рейтинг@Mail.ru


Страница сгенерированна за 0.01472 секунд с 7
ELECTRONIX ©2004-2016