Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: ARM
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
Страницы: 1, 2
sergeeff
Цитата(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?

Вы бы почетче рассказывали, что там у вас. На расстоянии, знаете ли, сложновато. Особенно,когда вы выпадаете из разговора на недели.
diglook
Извините может не в тему

В моем проекте IAR раньше все функции были во Флеш, поставил на все "__ramfunc", и ничего больше не менял.
Теперь графика стала рисоватся в 2 раза быстрее(перерисовка всего экрана с использованием двойной буферизации) . LPC2478 72Mhz 640x480x16. И память ОЗУ осталось чуток свободной. Так-что чаще использовать рамфунк
radistka
Цитата(sergeeff @ Dec 6 2010, 19:25) *
Вы мне так и не ответили, а главное и себе тоже, с 0х00000000 адреса у вас сидит таблица прерываний, как положено? Проект вообще не работает или работает до вызова какой-либо функции из sram?


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

Таблица перываний сидит с 0. Это так и должно быть.
Далее.
Программа может стартовать как с 0, так и с 30000. В зависимости от.
Вы должны проверять при старте, где вы находитесь. И в зависимости ОТ, делать ремап или не делать.
Заметка. Ремап так хитро устроен, что переключается как Т-триггер. Т.е., переключается в ПРОТИВОПОЛОЖНУЮ сторону от текущего. Посему ЛИШНИЙ ремап - плохо.

Кроме того.
Первая самая команда в стартапе должна быть не с абсолютной адресацией.
Ибо программа может находится где угодно и адресация должна быть относительной. В примерах в комментариях стартапа это записано.

Ну, а далее, получив опыт запуска программы (как из флэша, так и из самбы) можете приступать к отлдадке простых рам функций. После чего плавно переходим на прерывания.

Постойте! Как еще рам функции в 9260? Там нет флэша исполняемого...

Может имеются ввиду функции в SDRAM (D)?
Я так понял в теме смешались 2478 и 9260 каким-то образом...
sergeeff
Цитата(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.
DpInRock
Код
        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.
sergeeff
Чтобы это было совсем рабочим, не мешало бы:

1. Задать стеки для всех остальных режимов.
2. Обнулить данные в bss - сегменте.
3. До main вызвать что-нибудь типа low_level_init, где инициализировать "железо" и программные дела типа кучи.
4. Если используется/планируется С++ - до main вызвать конструкторы глобальных объектов.
adc
Подскажите пожалуйста где найти(его надо писать или он есть в IAR-e) этот файл стартапа?
Куда его надо прикошачить чтоб подправить?
Еще вопрос.. непонимаю что происходит при отладке... Программа останавливается(см. приложения fi1 и архив с проектом).

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

Пользуюсь IAR + mt-link+LPC-H2103.
radistka
Цитата(DpInRock @ Dec 7 2010, 11:49) *
Программа может стартовать как с 0, так и с 30000. В зависимости от.
Вы должны проверять при старте, где вы находитесь. И в зависимости ОТ, делать ремап или не делать.
Заметка. Ремап так хитро устроен, что переключается как Т-триггер. Т.е., переключается в ПРОТИВОПОЛОЖНУЮ сторону от текущего. Посему ЛИШНИЙ ремап - плохо.

...

Я так понял в теме смешались 2478 и 9260 каким-то образом...


действительно, намешано всего, я имею дело с at91sam9rl64

Сама программа располагается с 0x300000. С ремапом я, видимо, так и не разобралась ((


Вариант копирования SRAM секций (куда унесены некоторые функции) по тем же адресам из работающего SDRAM проекта в flash-проект оказался вообще-то рабочим, просто нужно было быть внимательнее с загрузкой секции во flash (в виде .txt файла). То есть теперь в программе-загрузчике инициализирую sdram, копирую код основной программы, копирую sram-секцию, прыгаю на адрес main и все даже работает!

спасибо всем большое!
DpInRock
Цитата(sergeeff @ Dec 7 2010, 13:36) *
Чтобы это было совсем рабочим, не мешало бы:

1. Задать стеки для всех остальных режимов.
2. Обнулить данные в bss - сегменте.
3. До main вызвать что-нибудь типа low_level_init, где инициализировать "железо" и программные дела типа кучи.
4. Если используется/планируется С++ - до main вызвать конструкторы глобальных объектов.


1. Все остальные режимы не являются работающими.
2. Зачем?
3. Дурной тон. Тем более, еще куч мне не хватает до полного счастья.
4. Зачем.
adc
пост58
Подтолкните пожалуйста.. ну не едут лыжи и все тут... :-(
sergeeff
Цитата(radistka @ Dec 7 2010, 15:12) *
и все даже работает!

спасибо всем большое!


У меня в институте был хороший друг, который взяв в руки листок в клетку и карандаш, говорил:"А теперь поиграем в компьютер". Я ему представлял текст программы, а он ее на бумажке выполнял. Очень полезный прием. Заставляет над многим задуматься и найти кучу ошибок.
Zelepuk
Цитата(sergeeff @ Dec 7 2010, 16:43) *
У меня в институте был хороший друг, который взяв в руки листок в клетку и карандаш, говорил:"А теперь поиграем в компьютер". Я ему представлял текст программы, а он ее на бумажке выполнял. Очень полезный прием. Заставляет над многим задуматься и найти кучу ошибок.


Видать программы были что-то вроде посчитать сумму ряда?
muravei
Цитата(SII @ Nov 17 2010, 21:18) *
2. Сброс-установка разрядов путём записи необходимых значений в порт PIO_ODSR. Именно этот режим эквивалентен изменению ног в AVRках,

А в NXP 21xx можно занести что-нить одной командой ?
Там что-то про это написано "Entire port value can be written in one instruction." , но не въехал как. sad.gif
sergeeff
Цитата(Zelepuk @ Dec 9 2010, 08:35) *
Видать программы были что-то вроде посчитать сумму ряда?


Важно не то, какая программа, а понимание, как ее выполняет компьютер/контроллер. Поняли разницу?
Zelepuk
Цитата(sergeeff @ Dec 9 2010, 15:25) *
Важно не то, какая программа, а понимание, как ее выполняет компьютер/контроллер. Поняли разницу?


Да это понятно конечно.
Интересно на каком уровне расписывал программу ваш товарищь (неужели писал что-то вроде в этот регистр записывается то-то, затем передаётся в АЛУ и т.д.) или просто писал что на каждом этапе считается и что выводится на экран?


P.S.Для обучения таким образом расписывать маленькие программик очень полезно. Не спорю.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.