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

 
 
5 страниц V  « < 2 3 4 5 >  
Reply to this topicStart new topic
> ARM, забегая вперёд...
sergeeff
сообщение Nov 25 2010, 09:55
Сообщение #46


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Цитата(DpInRock @ Nov 24 2010, 21:27) *
Все функции __ramfunc перекачиваются в SRAM в процессе инициализации main (это делает за вас компилятор).


В процессе инициализации... Этот момент не поясните ли? До main еще какая-то функция вызывается, или это какая-то функция, первая в main?
Go to the top of the page
 
+Quote Post
ZED
сообщение Nov 30 2010, 07:36
Сообщение #47


Местный
***

Группа: Свой
Сообщений: 264
Регистрация: 17-04-07
Из: Москва
Пользователь №: 27 102



Прошу прощения, может вы мне ответите на вопрос, который я задал в теме: Мигание светодиодом на AT91SAM7S256?
Может нужно как-то настроить IAR, может прога не правильная. Мой микропроцессор AT91SAM9260 расположен на плате MMNET1001.
P.S.Если можно в той теме, за ранее спасибо.
Go to the top of the page
 
+Quote Post
toweroff
сообщение Nov 30 2010, 10:34
Сообщение #48


Гуру
******

Группа: Свой
Сообщений: 2 957
Регистрация: 19-09-06
Из: Москва
Пользователь №: 20 514



Цитата(sergeeff @ Nov 25 2010, 12:55) *
В процессе инициализации... Этот момент не поясните ли? До main еще какая-то функция вызывается, или это какая-то функция, первая в main?

поищите __main
Go to the top of the page
 
+Quote Post
radistka
сообщение Dec 1 2010, 06:24
Сообщение #49


Участник
*

Группа: Участник
Сообщений: 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 их инициализирует и цепляет?
Go to the top of the page
 
+Quote Post
_4afc_
сообщение Dec 6 2010, 16:05
Сообщение #50


Профессионал
*****

Группа: Свой
Сообщений: 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 - это уже вопрос к Гуру.

Go to the top of the page
 
+Quote Post
sergeeff
сообщение Dec 6 2010, 16:25
Сообщение #51


Профессионал
*****

Группа: Свой
Сообщений: 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?

Вы бы почетче рассказывали, что там у вас. На расстоянии, знаете ли, сложновато. Особенно,когда вы выпадаете из разговора на недели.
Go to the top of the page
 
+Quote Post
diglook
сообщение Dec 6 2010, 17:12
Сообщение #52


Частый гость
**

Группа: Участник
Сообщений: 99
Регистрация: 29-06-09
Пользователь №: 50 730



Извините может не в тему

В моем проекте IAR раньше все функции были во Флеш, поставил на все "__ramfunc", и ничего больше не менял.
Теперь графика стала рисоватся в 2 раза быстрее(перерисовка всего экрана с использованием двойной буферизации) . LPC2478 72Mhz 640x480x16. И память ОЗУ осталось чуток свободной. Так-что чаще использовать рамфунк
Go to the top of the page
 
+Quote Post
radistka
сообщение Dec 7 2010, 08:25
Сообщение #53


Участник
*

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



Цитата(sergeeff @ Dec 6 2010, 19:25) *
Вы мне так и не ответили, а главное и себе тоже, с 0х00000000 адреса у вас сидит таблица прерываний, как положено? Проект вообще не работает или работает до вызова какой-либо функции из sram?


да, с 0 адреса лежит таблица прерываний. Прошу прощения, опечаталась, проект работает именно до вызова функции, лежащей в SRAM, которая вызывается из прерываний

Сообщение отредактировал radistka - Dec 7 2010, 11:19
Go to the top of the page
 
+Quote Post
DpInRock
сообщение Dec 7 2010, 08:49
Сообщение #54


Гуру
******

Группа: Участник
Сообщений: 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)
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Dec 7 2010, 09:21
Сообщение #55


Профессионал
*****

Группа: Свой
Сообщений: 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.
Go to the top of the page
 
+Quote Post
DpInRock
сообщение Dec 7 2010, 10:18
Сообщение #56


Гуру
******

Группа: Участник
Сообщений: 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)
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Dec 7 2010, 10:36
Сообщение #57


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Чтобы это было совсем рабочим, не мешало бы:

1. Задать стеки для всех остальных режимов.
2. Обнулить данные в bss - сегменте.
3. До main вызвать что-нибудь типа low_level_init, где инициализировать "железо" и программные дела типа кучи.
4. Если используется/планируется С++ - до main вызвать конструкторы глобальных объектов.
Go to the top of the page
 
+Quote Post
adc
сообщение Dec 7 2010, 11:06
Сообщение #58


Местный
***

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



Подскажите пожалуйста где найти(его надо писать или он есть в IAR-e) этот файл стартапа?
Куда его надо прикошачить чтоб подправить?
Еще вопрос.. непонимаю что происходит при отладке... Программа останавливается(см. приложения fi1 и архив с проектом).

Почитал ветку и непонял программа прошивается во флеш при отладке?
Где находится заводской булодер? Можно его случайно стереть или испортить?

Пользуюсь IAR + mt-link+LPC-H2103.

Эскизы прикрепленных изображений
Прикрепленное изображение
 

Прикрепленные файлы
Прикрепленный файл  v02_lsp2103_blink.zip ( 37.73 килобайт ) Кол-во скачиваний: 9
 
Go to the top of the page
 
+Quote Post
radistka
сообщение Dec 7 2010, 12:12
Сообщение #59


Участник
*

Группа: Участник
Сообщений: 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 и все даже работает!

спасибо всем большое!
Go to the top of the page
 
+Quote Post
DpInRock
сообщение Dec 7 2010, 12:51
Сообщение #60


Гуру
******

Группа: Участник
Сообщений: 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)
Go to the top of the page
 
+Quote Post

5 страниц V  « < 2 3 4 5 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


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


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