Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: forced user mode transfer with write-back to base
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
SantaQAWSED
Небольшая программка для выполнения в памяти AT91SAM7SE512 (Keil, RealView) заливается с помощью интерфейса SAM-BA и запускается на выполнение (custom прошивальщик навешенной на микроконтроллер NAND Flash).
При использовании стандартного startup.s кода после передачи управления этой програмке возврата к интерфейсу SAM-BЫ естественно не происходит. Использую упрощённый startup.s:

AREA reset, CODE, READONLY
EXPORT __ENTRY
__ENTRY
InitReset
ldr sp, = TOP_OF_MEMORY ; TOP_OF_MEMORY SETA 0x208000
stmfd sp!, {lr}
IMPORT main
bl main
ldmia sp!, {r0}^
bx r0
END


В попытке собрать проект ассемблер выдаёт:
forced user mode transfer with write-back to base (для строки ldmia sp!, {r0}^)

Собственно понять его (ассемблер) можно, но как собрать проект?
aaarrr
А зачем Вы используете "^", можно поинтересоваться? И если это делается осмысленно, зачем R0?
SantaQAWSED
Цитата(aaarrr @ Sep 29 2007, 21:50) *
А зачем Вы используете "^", можно поинтересоваться? И если это делается осмысленно, зачем R0?



C:\Program Files\ATMEL Corporation\AT91-ISP v1.4\SAM-BA v2.0\monitors\SAM-BA-NandFlash\bin_ads\cstartup_arm.s
(использую исходный код NAND монитора SAM-BЫ)

;------------------------------------------------------------------------------
;- Area Definition
;-----------------
;- Must be defined as function to put first in the code as it must be mapped
;- at offset 0 of the flash EBI_CSR0, ie. at address 0 before remap.
;------------------------------------------------------------------------------
AREA reset, CODE, READONLY


;------------------------------------------------------------------------------
;- Define the entry point
;------------------------

EXPORT __ENTRY
__ENTRY

;-------------------
;- The reset handler
;-------------------
InitReset

;-------------------------------------
;- Setup the stack for supervisor mode
;-------------------------------------
ldr sp, = TOP_OF_MEMORY ; Init stack SVC
stmfd sp!, {lr}

;------------------------------------------------------------------------------
;- Branch on C code Main function (with interworking)
;----------------------------------------------------
;- Branch must be performed by an interworking call as either an ARM or Thumb
;- main C function must be supported. This makes the code not position-
;- independant. A Branch with link would generate errors
;------------------------------------------------------------------------------
IMPORT main

bl main

;------------------------------------------------------------------------------
;- Jump back
;------------------------------------------------------------------------------
ldmia sp!, {r0}^
bx r0



END

Собственно в асме не силён. Затрудняюсь ответить. По смыслу либо восстанавливается стек, либо адрес возврата на SAM-BУ в ROM.. (ИМХО )) )
aaarrr
Код, мягко говоря, не соответствует комментариям. Замените R0 на PC и выбросьте bx. Зачем им восстанавливать режим (^), честно говоря, не понимаю. Стек переключить, разве что.


Все может, правда, обломаться, если они в thumb'е работают. А компилятор правильно ругается: ldmia sp!, {r0}^ в общем случае не есть гуд. Возможно эта ошибка где-то отключается.
aaarrr
UPD:
Посмотрел мануал - дурак я, оказывается. В случае ldmia sp!, {r0}^, это самое "^" не значит ничего, т.к. r0 не банкируется, а без PC в списке восстановление CPSR не происходит. Так что "^" можно просто убрать.

А людям, пишущим, такой код с такими глубокомысленными комментариями следует выдернуть руки из жопы, да.
SantaQAWSED
Цитата(aaarrr @ Sep 30 2007, 00:31) *
UPD:
Посмотрел мануал - дурак я, оказывается. В случае ldmia sp!, {r0}^, это самое "^" не значит ничего, т.к. r0 не банкируется, а без PC в списке восстановление CPSR не происходит. Так что "^" можно просто убрать.

А людям, пишущим, такой код с такими глубокомысленными комментариями следует выдернуть руки из жопы, да.



Теперь работает. Кроме удаления "^" ещё:

"PRESERVE8" перед "AREA reset, CODE, READONLY" (выравниваем по 8 байт, иначе вызвать сишную функцию не выйдет)

дописать неопределившийся при линковке символ куда-нибудь в startup.s:
EXPORT __user_initial_stackheap
__user_initial_stackheap
BX LR ; (просто тупой возврат, так как не знаю что тут делать)

И ещё - снята галка Use MicroLIB, и Code Generation в ARM-Mode

От так вот.


Вроде пошло..
Теперь проблема с DBGU.. Не пишет в него.. Читаю хайпер терминалом на писи. В классическом исполнении, с прошивкой во Flash всё нормально, DBGU_printf("Hello, xPloid!\n\r"); отрабатывает )
Так понимаю что-то не проинициализировано при старте с ROM SAM-BA в периферии, что не ндаёт поднимать DBGU..
Из инициализации у меня только:

void DBGU_Init()
{
AT91F_DBGU_CfgPIO();

AT91F_US_Configure(
(AT91PS_USART)AT91C_BASE_DBGU,
AT91B_MASTER_CLOCK,
AT91C_US_ASYNC_MODE,
115200,
0 );

AT91F_US_EnableTx((AT91PS_USART)AT91C_BASE_DBGU);
AT91F_US_EnableRx((AT91PS_USART)AT91C_BASE_DBGU);
}

Может что-то вроде включения клоков на PIO требуется?
Типа AT91F_PMC_EnablePeriphClock(AT91C_BASE_PMC, 1 << AT91D_ID_PIO_LED); для светодиодов EK.

спустя 3 мин..
да, добавил в инициализацию AT91F_DBGU_CfgPMC(); не помогло..
aaarrr
Цитата(SantaQAWSED @ Sep 30 2007, 00:47) *
дописать неопределившийся при линковке символ куда-нибудь в startup.s:
EXPORT __user_initial_stackheap
__user_initial_stackheap
BX LR ; (просто тупой возврат, так как не знаю что тут делать)

Можно и ничего не делать. Только зачем возвращаться по BX? Лучше просто mov pc, lr.

Цитата(SantaQAWSED @ Sep 30 2007, 00:47) *
Теперь проблема с DBGU.. Не пишет в него.. Читаю хайпер терминалом на писи. В классическом исполнении, с прошивкой во Flash всё нормально, DBGU_printf("Hello, xPloid!\n\r"); отрабатывает )
Так понимаю что-то не проинициализировано при старте с ROM SAM-BA в периферии, что не ндаёт поднимать DBGU..

Скорее наоборот - что-то лишнее проинициализировано. Попробуйте запретить прерывания в DBGU.

Цитата(SantaQAWSED @ Sep 30 2007, 00:47) *
Может что-то вроде включения клоков на PIO требуется?
Типа AT91F_PMC_EnablePeriphClock(AT91C_BASE_PMC, 1 << AT91D_ID_PIO_LED); для светодиодов EK.

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