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

 
 
 
Reply to this topicStart new topic
> forced user mode transfer with write-back to base
SantaQAWSED
сообщение Sep 29 2007, 17:42
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 19
Регистрация: 1-04-07
Пользователь №: 26 688



Небольшая программка для выполнения в памяти 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}^)

Собственно понять его (ассемблер) можно, но как собрать проект?
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Sep 29 2007, 17:50
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



А зачем Вы используете "^", можно поинтересоваться? И если это делается осмысленно, зачем R0?
Go to the top of the page
 
+Quote Post
SantaQAWSED
сообщение Sep 29 2007, 17:55
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 19
Регистрация: 1-04-07
Пользователь №: 26 688



Цитата(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.. (ИМХО )) )
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Sep 29 2007, 18:19
Сообщение #4


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Код, мягко говоря, не соответствует комментариям. Замените R0 на PC и выбросьте bx. Зачем им восстанавливать режим (^), честно говоря, не понимаю. Стек переключить, разве что.


Все может, правда, обломаться, если они в thumb'е работают. А компилятор правильно ругается: ldmia sp!, {r0}^ в общем случае не есть гуд. Возможно эта ошибка где-то отключается.
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Sep 29 2007, 20:31
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



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

А людям, пишущим, такой код с такими глубокомысленными комментариями следует выдернуть руки из жопы, да.
Go to the top of the page
 
+Quote Post
SantaQAWSED
сообщение Sep 29 2007, 20:47
Сообщение #6


Участник
*

Группа: Участник
Сообщений: 19
Регистрация: 1-04-07
Пользователь №: 26 688



Цитата(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(); не помогло..

Сообщение отредактировал SantaQAWSED - Sep 29 2007, 20:56
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Sep 29 2007, 21:28
Сообщение #7


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(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.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st July 2025 - 08:45
Рейтинг@Mail.ru


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