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

 
 
> 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 17 2013, 18:47
Сообщение #2


Местный
***

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



ТС сам плохо представляет это возможным, но заказчик требует так и предлагает вариант с копией таблицы векторов приложения по 0 адресу. Тогда по идее загрузчик может записывать приложение с нужным смещением из файла игнорируя первые 0x4000 байт из файла. Вот пробуя это не получилось разместить 2 копии таблицы по 0 и 0x4000 адресам.


--------------------
typedef enum { no, yes, maybe } bool; | блог тут
Go to the top of the page
 
+Quote Post
_Артём_
сообщение Aug 17 2013, 20:29
Сообщение #3


Гуру
******

Группа: Свой
Сообщений: 2 128
Регистрация: 21-05-06
Пользователь №: 17 322



Цитата(Cosmojam @ Aug 17 2013, 21:47) *
Вот пробуя это не получилось разместить 2 копии таблицы по 0 и 0x4000 адресам.




Скрипт линкера:


CODE
ENTRY(Reset_Handler)

_Minimum_Stack_Size = 0x100;

MEMORY
{
RAM (xrw) : ORIGIN = 0x20000000, LENGTH = 16K
FLASH (rx) : ORIGIN = 0x00000000, LENGTH = 128K
}

/* higher address of the user mode stack */
PROVIDE ( _estack = ALIGN(ORIGIN(RAM) + LENGTH(RAM) - 8 ,8) );

SECTIONS
{

.text :
{
. = ALIGN(4);
KEEP(*(.isr_vector))
. = ALIGN(4);


. = 0x0B8;// первый байт после таблицы векторов
KEEP(*(.bootloader_code));

. = 0x1000;
KEEP(*(.isr_vector2))
__ctors_start__ = .;
KEEP(SORT(*)(.init_array)) /* eabi uses .init_array for static constructor lists */
__ctors_end__ = .;

__dtors_start__ = .;
__dtors_end__ = .;
*(.text) /* remaining code */
*(.text.*)
*(.rodata) /* read-only data (constants) */
*(.rodata.*)

*(.eh_frame_hdr)
*(.eh_frame)

//----- и так далее





startup.c:

CODE
__attribute__ ((section(".isr_vector")))
void (* const g_pfnVectors[])(void) =
{
/* Core interrupt vectors */
(intfunc)((unsigned long)&_estack),
Reset_Handler,
NMI_Handler,
HardFault_Handler,
MemManage_Handler,
BusFault_Handler,
UsageFault_Handler,
0,
0,
0,
0,
SVC_Handler,
DebugMon_Handler,
0,
PendSVC_ISR,
SysTick_Handler,

/* Device interrupt vectors */
// остальные вектора
};





// та же таблица, но по другому адресу
__attribute__ ((section(".isr_vector2")))
void (* const g_pfnVectorsCopy[])(void) =
{
/* Core interrupt vectors */
(intfunc)((unsigned long)&_estack),
Reset_Handler,
NMI_Handler,
HardFault_Handler,
MemManage_Handler,
BusFault_Handler,
UsageFault_Handler,
0,
0,
0,
0,
SVC_Handler,
DebugMon_Handler,
0,
PendSVC_ISR,
SysTick_Handler,

/* Device interrupt vectors */

// остальные вектора

};


В случае если загрузчик есть, то он должен перед запуском приложения задать VTOR. Если его нет, то и так будет работать.
Go to the top of the page
 
+Quote Post
demiurg_spb
сообщение Aug 19 2013, 06:40
Сообщение #4


неотягощённый злом
******

Группа: Свой
Сообщений: 2 746
Регистрация: 31-01-08
Из: Санкт-Петербург
Пользователь №: 34 643



Цитата(_Артём_ @ Aug 18 2013, 00:29) *
В случае если загрузчик есть, то он должен перед запуском приложения задать VTOR. Если его нет, то и так будет работать.
Я правильно понимаю, что вы предлагаете откусить от бинарника загрузчика таблицу векторов и передать её приложению?
А что будет при неудачном обновлении приложения?



--------------------
“Будьте внимательны к своим мыслям - они начало поступков” (Лао-Цзы)
Go to the top of the page
 
+Quote Post



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

 


RSS Текстовая версия Сейчас: 30th July 2025 - 08:43
Рейтинг@Mail.ru


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