|
|
  |
ARM, забегая вперёд... |
|
|
|
Nov 30 2010, 07:36
|
Местный
  
Группа: Свой
Сообщений: 264
Регистрация: 17-04-07
Из: Москва
Пользователь №: 27 102

|
Прошу прощения, может вы мне ответите на вопрос, который я задал в теме: Мигание светодиодом на AT91SAM7S256? Может нужно как-то настроить IAR, может прога не правильная. Мой микропроцессор AT91SAM9260 расположен на плате MMNET1001. P.S.Если можно в той теме, за ранее спасибо.
|
|
|
|
|
Dec 1 2010, 06:24
|
Участник

Группа: Участник
Сообщений: 46
Регистрация: 4-03-09
Из: Санкт-Петербург
Пользователь №: 45 656

|
sergeeff, попробовала копировать свой нестандартный sram сегмент по нужным адресам при работе из flash - не завелось ((
DpInRock, что с ремапом, что без него...а он работает с 0 адреса? то есть на sram, расположенную с 0x30000 не должен влиять?
я вот посмотрела проекты, сделанные под sam-ba , так там в *.lds файлах указываются _efixed, _sprerelocate, _eprerelocate и _spostrelocate, _epostrelocate, а потом в board_cstartup.c в resetHandler эти сегменты инициализируются, а в IAR'овских проектах этот механизм в каком месте осуществляется? сегменты описываются в *.icf, но в каком месте IAR их инициализирует и цепляет?
|
|
|
|
|
Dec 6 2010, 16:05
|

Профессионал
    
Группа: Свой
Сообщений: 1 262
Регистрация: 13-10-05
Из: Санкт-Петербург
Пользователь №: 9 565

|
Цитата(radistka @ Dec 1 2010, 09:24)  я вот посмотрела проекты, сделанные под sam-ba , так там в *.lds файлах указываются _efixed, _sprerelocate, _eprerelocate и _spostrelocate, _epostrelocate, а потом в board_cstartup.c в resetHandler эти сегменты инициализируются, а в IAR'овских проектах этот механизм в каком месте осуществляется? сегменты описываются в *.icf, но в каком месте IAR их инициализирует и цепляет? Вы хотели сказать, что посмотрели проекты сделанные под gcc (а не под sam-ba)... Сдаётся мне, что в IAR для этого надо поставить "__ramfunc" перед функцией и возможно добавить в .icf "initialize by copy { rw, section MYCODE };" (а возможно и не надо если устроит, что функции лягут в дефолтную секцию.) Правда поймёт ли IAR, что от него требуют чтобы он разместил часть функций (с "__ramfunc") в SRAM, при условии что остальной проект находится в SDRAM - это уже вопрос к Гуру.
|
|
|
|
|
Dec 6 2010, 16:25
|
Профессионал
    
Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007

|
Цитата(radistka @ Dec 1 2010, 09:24)  sergeeff, попробовала копировать свой нестандартный sram сегмент по нужным адресам при работе из flash - не завелось ((
DpInRock, что с ремапом, что без него...а он работает с 0 адреса? то есть на sram, расположенную с 0x30000 не должен влиять?
я вот посмотрела проекты, сделанные под sam-ba , так там в *.lds файлах указываются _efixed, _sprerelocate, _eprerelocate и _spostrelocate, _epostrelocate, а потом в board_cstartup.c в resetHandler эти сегменты инициализируются, а в IAR'овских проектах этот механизм в каком месте осуществляется? сегменты описываются в *.icf, но в каком месте IAR их инициализирует и цепляет? Вы мне так и не ответили, а главное и себе тоже, с 0х00000000 адреса у вас сидит таблица прерываний, как положено? Проект вообще не работает или работает до вызова какой-либо функции из sram? Вы бы почетче рассказывали, что там у вас. На расстоянии, знаете ли, сложновато. Особенно,когда вы выпадаете из разговора на недели.
|
|
|
|
|
Dec 7 2010, 08:25
|
Участник

Группа: Участник
Сообщений: 46
Регистрация: 4-03-09
Из: Санкт-Петербург
Пользователь №: 45 656

|
Цитата(sergeeff @ Dec 6 2010, 19:25)  Вы мне так и не ответили, а главное и себе тоже, с 0х00000000 адреса у вас сидит таблица прерываний, как положено? Проект вообще не работает или работает до вызова какой-либо функции из sram? да, с 0 адреса лежит таблица прерываний. Прошу прощения, опечаталась, проект работает именно до вызова функции, лежащей в SRAM, которая вызывается из прерываний
Сообщение отредактировал radistka - Dec 7 2010, 11:19
|
|
|
|
|
Dec 7 2010, 08:49
|

Гуру
     
Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515

|
Осталось только сформулировать по-русски. "ПРоект не работает до вызова...". Следовательно, "после вызова" - работает.
Таблица перываний сидит с 0. Это так и должно быть. Далее. Программа может стартовать как с 0, так и с 30000. В зависимости от. Вы должны проверять при старте, где вы находитесь. И в зависимости ОТ, делать ремап или не делать. Заметка. Ремап так хитро устроен, что переключается как Т-триггер. Т.е., переключается в ПРОТИВОПОЛОЖНУЮ сторону от текущего. Посему ЛИШНИЙ ремап - плохо.
Кроме того. Первая самая команда в стартапе должна быть не с абсолютной адресацией. Ибо программа может находится где угодно и адресация должна быть относительной. В примерах в комментариях стартапа это записано.
Ну, а далее, получив опыт запуска программы (как из флэша, так и из самбы) можете приступать к отлдадке простых рам функций. После чего плавно переходим на прерывания.
Постойте! Как еще рам функции в 9260? Там нет флэша исполняемого...
Может имеются ввиду функции в SDRAM (D)? Я так понял в теме смешались 2478 и 9260 каким-то образом...
Сообщение отредактировал DpInRock - Dec 7 2010, 08:57
--------------------
On the road again (Canned Heat)
|
|
|
|
|
Dec 7 2010, 09:21
|
Профессионал
    
Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007

|
Цитата(radistka @ Dec 7 2010, 11:25)  да, с 0 адреса лежит таблица прерываний. Проект не работает именно до вызова функции, лежащей в SRAM, которая вызывается из прерываний Потратьте еще немного времени и проверьте: 1. Действительно ли с 0-го адресе sram (куда-нибудь в sram запишите чего-нибудь и прочитайте обратно). 2. Таблица прерываний в sram должна быть типа: Код b InitReset ; 0 - 0x00 SoftReset ldr pc, [pc, #0x18] ; 1 - 0x04 UndefHandler ldr pc, [pc, #0x18] ; 2 - 0x08 SWIHandler ldr pc, [pc, #0x18] ; 3 - 0x0C PrefetchAbortHandler ldr pc, [pc, #0x18] ; 4 - 0x10 DataAbortHandler nop ; 5 - 0x14 Reserved ldr pc, [pc, #0x18] ; 6 - 0x18 IRQ_Handler_Entry ldr pc, [pc, #0x18] ; 7 - 0x1C FIQ_Handler_Entry ;- There are only 5 offsets as the vectoring is used. DCD InitReset ; 0x20 DCD AT91F_Undef ; 0x24 DCD SWIHandler ; 0x28 DCD AT91F_FetchAbort ; 0x2c DCD AT91F_DataAbort ; 0x30 DCD ReservedHandler ; 0x34 DCD IRQHandler ; 0x38 DCD FIQHandler ; 0x3c Такая организация таблицы позволяет размещать ваши обработчики прерываний где угодно. 3. Убедитесь, что ваши sram-функции сидят именно в sram по нужным адресам. 4. Убедитесь в том, что вы правильно компилятору сообщили о своих sram функциях и он их вызывает командами BX/BLX, а не B/BL.
|
|
|
|
|
Dec 7 2010, 10:18
|

Гуру
     
Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515

|
Код MODULE ?cstartup
;; Forward declaration of sections. SECTION PROGRAM_DATA:CODE SECTION IRQ_STACK:DATA:NOROOT(3) SECTION FIQ_STACK:DATA:NOROOT(3) SECTION CSTACK:DATA:NOROOT(3)
SECTION .intvec:CODE:NOROOT(2)
PUBLIC __vector PUBLIC __vector_0x14 PUBLIC __iar_program_start EXTERN Undefined_Handler EXTERN SWI_Handler EXTERN Prefetch_Handler EXTERN Abort_Handler EXTERN IRQ_Handler EXTERN FIQ_Handler
ARM
__vector: ; 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,Reset_Addr ; To allow remap, a relative branch is required ! B __iar_program_start ldr PC,Undefined_Addr ; Undefined instructions ldr PC,SWI_Addr ; Software interrupt (SWI/SVC) ldr PC,Prefetch_Addr ; Prefetch abort ldr PC,Abort_Addr ; Data abort __vector_0x14: DCD SFE(PROGRAM_DATA) ; End address of all const and text sections.
; ldr PC,IRQ_Addr ; IRQ ldr PC, [PC,# -0xF20] ;AIC direct ldr PC,FIQ_Addr ; FIQ
DATA
Reset_Addr: DCD __iar_program_start Undefined_Addr: DCD Undefined_Handler SWI_Addr: DCD SWI_Handler Prefetch_Addr: DCD Prefetch_Handler Abort_Addr: DCD Abort_Handler IRQ_Addr: DCD IRQ_Handler FIQ_Addr: DCD FIQ_Handler
__vector_end:
; -------------------------------------------------- ; ?cstartup -- low-level system initialization code. ; ; After a reser execution starts here, the mode is ARM, supervisor ; with interrupts disabled. ;
SECTION .text:CODE:NOROOT(2)
EXTERN ?main REQUIRE __vector
ARM
__iar_program_start:
/********************************************************************** * ?CSTARTUP * * Execution starts here. * After a reset, the mode is ARM, Supervisor, interrupts disabled. */ ?cstartup: mvn r0, #0xFF ;remap here bic r0,r0, #0x1100 mov r1, #0x03 str r1, [r0, #+0] mrc p15, 0, r0, c1, c0,0 ; read cp15 control register (cp15 r1) r0 ldr r3, =0xC0001085 ; Disable Cache, Disable MMU ldr r4, =0x40005004 ; Round Robin replacement 0x40004000 bic r0, r0, r3 orr r0, r0, r4 mcr p15, 0, r0, c1, c0,0 ; write cp15 control register (cp15 r1) ;--------------------------------------------------------------------------------
;-------------------------------------------------------------------------------- ; Initialize the stack pointers. ;; Set up the interrupt stack pointer.
msr cpsr_c,#0xd2 ; Change mode to IRQ mode, FIQ and IRQ disabled ldr sp, =SFE(IRQ_STACK) ; End of IRQ_STACK bic sp,sp,#0x7 ; Make sure SP is aligned on 8 byte boundary ;; Set up the fast interrupt stack pointer.
msr cpsr_c,#0xd1 ; Change mode to FIQ mode, FIQ and IRQ disabled ldr sp, =SFE(FIQ_STACK) ; End of FIQ_STACK bic sp,sp,#0x7 ; Make sure SP is aligned on 8 byte boundary
;; Set up the normal stack pointer.
msr cpsr_c,#0xdf ; Change mode to SYS mode, FIQ and IRQ disabled ; msr cpsr_c, #0xd3 ldr sp, =SFE(CSTACK) ; End of CSTACK bic sp,sp,#0x7 ; Make sure SP is aligned on 8 byte boundary
;msr cpsr_c,#0xd2
; Jump to startup code in library ldr r0,=?main bx r0
LTORG END
; ***** EOF ********************************************************** Это работающее. Обработчики прерываний IRQ берутся прямо из AIC.
--------------------
On the road again (Canned Heat)
|
|
|
|
|
Dec 7 2010, 11:06
|

Местный
  
Группа: Свой
Сообщений: 409
Регистрация: 29-10-07
Пользователь №: 31 836

|
Подскажите пожалуйста где найти(его надо писать или он есть в IAR-e) этот файл стартапа? Куда его надо прикошачить чтоб подправить? Еще вопрос.. непонимаю что происходит при отладке... Программа останавливается(см. приложения fi1 и архив с проектом). Почитал ветку и непонял программа прошивается во флеш при отладке? Где находится заводской булодер? Можно его случайно стереть или испортить? Пользуюсь IAR + mt-link+LPC-H2103.
Эскизы прикрепленных изображений
|
|
|
|
|
Dec 7 2010, 12:12
|
Участник

Группа: Участник
Сообщений: 46
Регистрация: 4-03-09
Из: Санкт-Петербург
Пользователь №: 45 656

|
Цитата(DpInRock @ Dec 7 2010, 11:49)  Программа может стартовать как с 0, так и с 30000. В зависимости от. Вы должны проверять при старте, где вы находитесь. И в зависимости ОТ, делать ремап или не делать. Заметка. Ремап так хитро устроен, что переключается как Т-триггер. Т.е., переключается в ПРОТИВОПОЛОЖНУЮ сторону от текущего. Посему ЛИШНИЙ ремап - плохо.
...
Я так понял в теме смешались 2478 и 9260 каким-то образом... действительно, намешано всего, я имею дело с at91sam9rl64 Сама программа располагается с 0x300000. С ремапом я, видимо, так и не разобралась (( Вариант копирования SRAM секций (куда унесены некоторые функции) по тем же адресам из работающего SDRAM проекта в flash-проект оказался вообще-то рабочим, просто нужно было быть внимательнее с загрузкой секции во flash (в виде .txt файла). То есть теперь в программе-загрузчике инициализирую sdram, копирую код основной программы, копирую sram-секцию, прыгаю на адрес main и все даже работает! спасибо всем большое!
|
|
|
|
|
Dec 7 2010, 12:51
|

Гуру
     
Группа: Участник
Сообщений: 2 254
Регистрация: 4-05-07
Из: Moscow
Пользователь №: 27 515

|
Цитата(sergeeff @ Dec 7 2010, 13:36)  Чтобы это было совсем рабочим, не мешало бы:
1. Задать стеки для всех остальных режимов. 2. Обнулить данные в bss - сегменте. 3. До main вызвать что-нибудь типа low_level_init, где инициализировать "железо" и программные дела типа кучи. 4. Если используется/планируется С++ - до main вызвать конструкторы глобальных объектов. 1. Все остальные режимы не являются работающими. 2. Зачем? 3. Дурной тон. Тем более, еще куч мне не хватает до полного счастья. 4. Зачем.
--------------------
On the road again (Canned Heat)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|