Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: microlib в бутлоадере -> глючит основная прога
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
zuy
Процессор LPC2361.

При запуске проги через бутлоадер, стали появляться глюки. Выяснилось, что непонятно как портятся некоторые массивы данных.
Дальше обнаружили, что на это влияет бутлоадер. Если его вершину стека поднять вверх примерно на 200 байт т.е. сделать так, чтобы его стек не перекрывал данные основной программы, то основная прога глючить перестает.
А если отключить использование Microlib в бутлоадере, то даже не двигая стек бутлоадера, глюк исчезает.
При этом, если в бутлоадере включен Microlib, то основная прога глючит не зависимо от того используется в ней Microlib или нет.
Без бутлоадера, все работает отлично.

Что это может быть?
Каким образом настройки стека бутлоадера могут влиять на основную программу, если в стартапе все стеки заново инициализируются?
Подкиньте хоть каких-нибудь идей, как вообще то, что я делаю в бутлоадере, может влиять на основную прогу, если без него она отлично работает?
Сергей Борщ
Цитата(zuy @ Sep 2 2010, 01:33) *
Каким образом настройки стека бутлоадера могут влиять на основную программу, если в стартапе все стеки заново инициализируются?
Например он может перед запуском приложения переводить ядро в User mode и стартап-код не сможет настроить стеки для остальных режимов.
zuy
Цитата(Сергей Борщ @ Sep 2 2010, 09:01) *
Например он может перед запуском приложения переводить ядро в User mode и стартап-код не сможет настроить стеки для остальных режимов.


Я настраиваю стеки стандартным Startup от Keil. Там вот такой код:
Код
; Setup Stack for each mode ----------------------------------------------------

                LDR     R0, =Stack_Top

;  Enter Undefined Instruction Mode and set its Stack Pointer
                MSR     CPSR_c, #Mode_UND:OR:I_Bit:OR:F_Bit
                MOV     SP, R0
                SUB     R0, R0, #UND_Stack_Size

;  Enter Abort Mode and set its Stack Pointer
                MSR     CPSR_c, #Mode_ABT:OR:I_Bit:OR:F_Bit
                MOV     SP, R0
                SUB     R0, R0, #ABT_Stack_Size

;  Enter FIQ Mode and set its Stack Pointer
                MSR     CPSR_c, #Mode_FIQ:OR:I_Bit:OR:F_Bit
                MOV     SP, R0
                SUB     R0, R0, #FIQ_Stack_Size

;  Enter IRQ Mode and set its Stack Pointer
                MSR     CPSR_c, #Mode_IRQ:OR:I_Bit:OR:F_Bit
                MOV     SP, R0
                SUB     R0, R0, #IRQ_Stack_Size

;  Enter Supervisor Mode and set its Stack Pointer
                MSR     CPSR_c, #Mode_SVC:OR:I_Bit:OR:F_Bit
                MOV     SP, R0
                SUB     R0, R0, #SVC_Stack_Size

;  Enter User Mode and set its Stack Pointer
                MSR     CPSR_c, #Mode_USR
                IF      :DEF:__MICROLIB

                EXPORT __initial_sp

                ELSE

                MOV     SP, R0
                SUB     SL, SP, #USR_Stack_Size

                ENDIF


Я же правильно понимаю, что этот код настроит все стеки как положенно, независимо в каком режиме в него войдет процессор ?
Nixon
Вам Сергей правильно указал - ваш бутлоадер настраивает все стеки для себя и переходит в конце настройки в USER режим. Приложение уже не сможет перестроить стеки под свои требования, точнее сможет перестроить стек только для USER режима.
Для того чтобы не было подобных проблем в пользовательское приложение нужно уходить из режима супервизора. Обычно это делается путем вызова SWI и перехода в пользовательское приложение из обработчика SWI.
zuy
Сергей и Nixon спасибо огромное. А то уже до красных глаз досиделся вылавливая глюк.

Один только момент остался. Бут уже прошит в большое кол-во девайсов, можно решить проблему не в буте, а в стартапе основной проги.
т.е. там перед настройкой стеков, вернуться назад в режим суперпользователя ?
Сергей Борщ
Цитата(zuy @ Sep 2 2010, 10:20) *
т.е. там перед настройкой стеков, вернуться назад в режим суперпользователя ?
Как идея - сделать swi, процессор перейдет в режим супервизора, и уже из него как-то настроить стеки и вернуться в исходную точку. Сам такое не делал.
defunct
Цитата(Сергей Борщ @ Sep 2 2010, 11:57) *
Как идея - сделать swi,

В обработчике любого исключения (DAbt / Swi / Irq ) можно переключать режимы, - и все стеки перестроить.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.