|
Вопросы по реализации бутлоадера, at91sam7s64, IAR5.41 |
|
|
3 страниц
1 2 3 >
|
 |
Ответов
(1 - 14)
|
Jul 29 2010, 08:40
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(mempfis_ @ Jul 29 2010, 12:28)  1. Правильно ли я понимаю что для ARM бутлоадер это обычная программа (в отличии от AVR) которая может начинаться с какого угодно адреса? 3. Если п.1 верный то где во flash лучше располагать бутлоадер (в начале или в конце)? Обычно процессор все-таки стартует с загрузчика, поэтому в начале. Цитата(mempfis_ @ Jul 29 2010, 12:28)  2. Чтобы иметь возможность прошить flash собственно подпрограммы прошивки flash должны находится в оперативной памяти? Да. Цитата(mempfis_ @ Jul 29 2010, 12:28)  4. Как быть со стартапом приложения? Если я в бутлоадере инициализирую стеки, тактовый генератор и т.д. то можно ли исключить стартап из приложения и просто вызвать main? Или лучше произвести сброс переферии и вызвать приложение со стартапом? Ну уж стеки точно стоит инициализировать заново, а с периферией смотрите сами, как удобнее. Цитата(mempfis_ @ Jul 29 2010, 12:28)  5. Достаточно ли будет выделить в flash сегмент и размещать в нём основную программу или в startup и LowLevelInit() нужно будет както дополнительно учитывать что в МК живёт ещё и бутлоадер? Зависит от п.4 Цитата(mempfis_ @ Jul 29 2010, 12:28)  Теперь мои соображения по поводу бутлоадера - поправте если гдето буду не прав: В общем-то все правильно, только почему у загрузчика нет никакой самостоятельности в плане запуска программы? В моем варианте загрузчик действовал по такому алгоритму: 1. Проверка состояния внешнего пина, если имеется нужный уровень - переходим к п.4 2. Проверка наличия сигнатуры по определенному адресу RAM, при совпадении переходим к п.4 3. Проверка CRC имеющейся во флеш программы, если все в порядке - запускаем ее на исполнение 4. Ждем загрузку
|
|
|
|
|
Jul 29 2010, 08:53
|

Профессионал
    
Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409

|
Спасибо за быстрый ответ. В целом начинает проясняться стуктура проекта. Не могли-бы Вы поянить вот эту фразу: Цитата Ну уж стеки точно стоит инициализировать заново Обозначает ли это то что я должен компилировать приложение с подключённым стартапом и вызывать приложение из бутлоадера не с ф-ии main а начиная с начала секции приложения? Цитата В общем-то все правильно, только почему у загрузчика нет никакой самостоятельности в плане запуска программы? Это для отладки запуск приложения по командам с терминала. А вообще предполагается проверка CRC секции приложения и если там всё ОК то автоматический запуск приложения.
|
|
|
|
|
Jul 29 2010, 09:31
|

Профессионал
    
Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409

|
Цитата Помимо стеков есть еще копирование секций, инициализация переменных и ZI, и все это происходит до main. Так что стартап, хоть и в сокращенном виде, но должен присутствовать. С этим понятно - вставлю startup Цитата Кроме того, еще надо отдельно определиться с векторами и ремапом, т.к. тут возможны варианты. Вот тут мне не всё понятно но спрашивать буду когда дойдёт до этого дело. Спасибо за консультации. Займусь общей организацией проекта
|
|
|
|
|
Aug 12 2010, 08:04
|

Профессионал
    
Группа: Свой
Сообщений: 1 001
Регистрация: 27-06-06
Пользователь №: 18 409

|
Дошёл до того момента когда бутлоадер вот-вот уже будет реализован в первом приближении. Встал вопрос о создании файла тестовой прошивки приложения для проверки работоспособности бутлоадера. Появились вот какие вопросы: 1. Как заставить IAR 5.41 разместить код программы с адреса отличного от 0x100000? Для своего процессора (sam7s64) использую приведённый ниже файл flash.icf Павильно ли я понял что поменяв начальный и конечный адреса в выделенных жирным строках я чётко дам понять линкеру что код во flash надо размещать в этом диапазоне адресов? Достаточно ли будет этого чтобы сместить весь код приложения за область бутлоадера? Или нужно будет менять ещё какието параметры в этом файле? CODE /*###ICF### Section handled by ICF editor, don't touch! ****/ /*-Editor annotation file-*/ /* IcfEditorFile="$TOOLKIT_DIR$\config\ide\IcfEditor\a_v1_0.xml" */ /*-Memory Regions-*/ define symbol __ICFEDIT_region_ROM_start__ = 0x100000; define symbol __ICFEDIT_region_ROM_end__ = 0x10FFFF; define symbol __ICFEDIT_region_RAM_start__ = 0x200000; define symbol __ICFEDIT_region_RAM_end__ = 0x203FFF; /*-Sizes-*/ define symbol __ICFEDIT_size_startup__ = 0x100; define symbol __ICFEDIT_size_vectors__ = 0x100; define symbol __ICFEDIT_size_cstack__ = 0x1000; define symbol __ICFEDIT_size_sysstack__ = 0x60; define symbol __ICFEDIT_size_irqstack__ = 0x60; define symbol __ICFEDIT_size_heap__ = 0x0; /*-Exports-*/ export symbol __ICFEDIT_region_ROM_start__; export symbol __ICFEDIT_region_ROM_end__; export symbol __ICFEDIT_region_RAM_start__; export symbol __ICFEDIT_region_RAM_end__; export symbol __ICFEDIT_size_startup__; export symbol __ICFEDIT_size_vectors__; export symbol __ICFEDIT_size_cstack__; export symbol __ICFEDIT_size_sysstack__; export symbol __ICFEDIT_size_irqstack__; export symbol __ICFEDIT_size_heap__; /**** End of ICF editor section. ###ICF###*/
define memory mem with size = 4G; define region STA_region = mem:[from __ICFEDIT_region_ROM_start__ size __ICFEDIT_size_startup__]; define region ROM_region = mem:[from __ICFEDIT_region_ROM_start__+__ICFEDIT_size_startup__ to __ICFEDIT_region_ROM_end__]; define region VEC_region = mem:[from __ICFEDIT_region_RAM_start__ size __ICFEDIT_size_vectors__]; define region RAM_region = mem:[from __ICFEDIT_region_RAM_start__+__ICFEDIT_size_vectors__ to __ICFEDIT_region_RAM_end__];
define block CSTACK with alignment = 8, size = __ICFEDIT_size_cstack__ { }; define block SYS_STACK with alignment = 8, size = __ICFEDIT_size_sysstack__ { }; define block IRQ_STACK with alignment = 8, size = __ICFEDIT_size_irqstack__ { }; define block HEAP with alignment = 8, size = __ICFEDIT_size_heap__ { };
initialize by copy { readwrite }; initialize by copy { section .vectors }; do not initialize { section .noinit };
place in STA_region { section .cstartup }; place in ROM_region { readonly }; place in VEC_region { section .vectors }; place in RAM_region { readwrite, block IRQ_STACK, block SYS_STACK, block CSTACK, block HEAP };
2. Вопрос по стартапу. Привожу стартап который я подключаю к проекту для бутлоадера (точнее для всех моих программ что стартуют с адреса во flash 0x100000). Вопрос к знающим нужно ли в нём чтото менять чтобы использовать его для подключения к проекту который будет стартовать не с адреса 0x100000? Сам я визуально ничего такого в нём не вижу поэтому надеюсь на помощь бывалых  CODE /* IAR startup file for AT91SAM7S microcontrollers. */
MODULE ?cstartup
;; Forward declaration of sections. SECTION IRQ_STACK:DATA:NOROOT(2) SECTION CSTACK:DATA:NOROOT(3)
//------------------------------------------------------------------------------ // Headers //------------------------------------------------------------------------------
#define __ASSEMBLY__ #include "board.h"
//------------------------------------------------------------------------------ // Definitions //------------------------------------------------------------------------------
#define ARM_MODE_ABT 0x17 #define ARM_MODE_FIQ 0x11 #define ARM_MODE_IRQ 0x12 #define ARM_MODE_SVC 0x13 #define ARM_MODE_SYS 0x1F
#define I_BIT 0x80 #define F_BIT 0x40
//------------------------------------------------------------------------------ // Startup routine //------------------------------------------------------------------------------
/* Exception vectors */ SECTION .vectors:CODE:NOROOT(2)
PUBLIC resetVector PUBLIC irqHandler
EXTERN Undefined_Handler EXTERN SWI_Handler EXTERN Prefetch_Handler EXTERN Abort_Handler EXTERN FIQ_Handler
ARM
__iar_init$$done: ; The interrupt vector is not needed ; until after copy initialization is done
resetVector: ; All default exception handlers (except reset) are ; defined as weak symbol definitions. ; If a handler is defined by the application it will take precedence. LDR pc, =resetHandler ; Reset LDR pc, Undefined_Addr ; Undefined instructions LDR pc, SWI_Addr ; Software interrupt (SWI/SYS) LDR pc, Prefetch_Addr ; Prefetch abort LDR pc, Abort_Addr ; Data abort B . ; RESERVED LDR pc, =irqHandler ; IRQ LDR pc, FIQ_Addr ; FIQ
Undefined_Addr: DCD Undefined_Handler SWI_Addr: DCD SWI_Handler Prefetch_Addr: DCD Prefetch_Handler Abort_Addr: DCD Abort_Handler FIQ_Addr: DCD FIQ_Handler /* Handles incoming interrupt requests by branching to the corresponding handler, as defined in the AIC. Supports interrupt nesting. */ irqHandler: /* Save interrupt context on the stack to allow nesting */ SUB lr, lr, #4 STMFD sp!, {lr} MRS lr, SPSR STMFD sp!, {r0, lr}
/* Write in the IVR to support Protect Mode */ LDR lr, =AT91C_BASE_AIC LDR r0, [r14, #AIC_IVR] STR lr, [r14, #AIC_IVR]
/* Branch to interrupt handler in Supervisor mode */ MSR CPSR_c, #ARM_MODE_SYS STMFD sp!, {r1-r3, r4, r12, lr} MOV lr, pc BX r0 LDMIA sp!, {r1-r3, r4, r12, lr} MSR CPSR_c, #ARM_MODE_IRQ | I_BIT
/* Acknowledge interrupt */ LDR lr, =AT91C_BASE_AIC STR lr, [r14, #AIC_EOICR]
/* Restore interrupt context and branch back to calling code */ LDMIA sp!, {r0, lr} MSR SPSR_cxsf, lr LDMIA sp!, {pc}^
/* After a reset, execution starts here, the mode is ARM, supervisor with interrupts disabled. Initializes the chip and branches to the main() function. */ SECTION .cstartup:CODE:NOROOT(2)
PUBLIC resetHandler EXTERN LowLevelInit EXTERN ?main REQUIRE resetVector ARM
resetHandler:
/* Set pc to actual code location (i.e. not in remap zone) */ LDR pc, =label
/* Perform low-level initialization of the chip using LowLevelInit() */ label: LDR r0, =LowLevelInit LDR r4, =SFE(CSTACK) MOV sp, r4 MOV lr, pc BX r0
/* Set up the interrupt stack pointer. */ MSR cpsr_c, #ARM_MODE_IRQ | I_BIT | F_BIT ; Change the mode LDR sp, =SFE(IRQ_STACK)
/* Set up the SYS stack pointer. */ MSR cpsr_c, #ARM_MODE_SYS | F_BIT ; Change the mode LDR sp, =SFE(CSTACK)
/* Branch to main() */ LDR r0, =?main MOV lr, pc BX r0
/* Loop indefinitely when program is finished */ loop4: B loop4
END
Сообщение отредактировал mempfis_ - Aug 12 2010, 08:05
|
|
|
|
|
Aug 12 2010, 12:15
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(mempfis_ @ Aug 12 2010, 12:04)  Достаточно ли будет этого чтобы сместить весь код приложения за область бутлоадера? Или нужно будет менять ещё какието параметры в этом файле? На первый взгляд достаточно. Цитата(mempfis_ @ Aug 12 2010, 12:04)  Вопрос к знающим нужно ли в нём чтото менять чтобы использовать его для подключения к проекту который будет стартовать не с адреса 0x100000? Да в общем-то ничего не надо. Разве что это можно убрать: Код /* Set pc to actual code location (i.e. not in remap zone) */ LDR pc, =label Только проверьте, правильно ли выполняется remap в LowLevelInit (проверяется ли текущее состояние перед переключением).
|
|
|
|
|
Aug 16 2010, 10:18
|
Участник

Группа: Участник
Сообщений: 27
Регистрация: 9-04-09
Из: Чебоксары
Пользователь №: 47 411

|
Я тоже занят написанием загрузчика. А как заставить Keil разместить код программы с N-го адреса Флеш?
|
|
|
|
|
Aug 16 2010, 10:27
|
Участник

Группа: Участник
Сообщений: 27
Регистрация: 9-04-09
Из: Чебоксары
Пользователь №: 47 411

|
Я с линкером не работал. Можете дать кусочек кода с пояснением.
|
|
|
|
|
Aug 16 2010, 11:10
|
Гуру
     
Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448

|
Цитата(Exeland @ Aug 16 2010, 14:27)  Я с линкером не работал. Можете дать кусочек кода с пояснением. Есть два пути: 1. (неправильный, но работать будет) Просто переставьте расположение памяти на вкладке Target, scatter-файл сгенерирует среда 2. Прочитать в мануале про линкер, написать scatter самостоятельно Второй путь можно сократить, если взять готовый файл из п.1 и исправить его, попутно сверяясь с мануалом.
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|