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

 
 
> Что делает Си-код до main?
imiron13
сообщение Sep 28 2010, 06:57
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 39
Регистрация: 22-02-09
Из: Минск
Пользователь №: 45 206



Немного почитал про это здесь:
http://infocenter.arm.com/help/index.jsp?t...i/Bce3gfea.html
(использую RVDS4)

Не совсем понятно с настройкой стека. Там пишут, что настройку стека выполняет пользовательский стартап код.
Я так и делаю, но еще до main библиотечная функция (sys_stackheap_outer) меняет указатель стека. Что это означает? Может ли библиотечный код пытаться настроить стеки сам? Я вроде даже не давал ему никакой информации о размещении памяти на МК.
Если из стартапа вызываю сразу main, то программа работает, но не инициализируются глобальные переменные. Но если я вызываю __main, то указатель стека изменяется и программа не доходит до main.

Также библиотечный код генерирует программное прерывание (SWI) с кодом 0x123456. Зачем это нужно?


Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Student Pupkin
сообщение Sep 30 2010, 15:58
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 328
Регистрация: 23-05-08
Пользователь №: 37 760



Цитата(imiron13 @ Sep 30 2010, 11:43) *
Теперь указатели стека имеют верные значения (0007FFF0-FIQ,0007FBF0-IRQ,0007F7F0-SV). Далее работа идет в режиме Supervisor. В конце стартапа:
Код
        ldr     R0, = __main
        BX      R0

А для System/User? Там кто SP настраивает? Можете Вы, а может и билиотечная функция (это как пожелаете):
Код
;  Enter User Mode and set its Stack Pointer
                MSR     CPSR_c, #Mode_SYS
                IF      :DEF:__MICROLIB

                EXPORT __initial_sp

                ELSE

                MOV     SP, R0
                SUB     SL, SP, #USR_Stack_Size
Кстати и вызов __main надо делать из System или User (в зависимости от того, в каком режиме Вы желаете быть при входе в main() smile.gif ... хотя в сказанном не уверен smile.gif).

Цитата(vallav @ Sep 30 2010, 17:20) *
В Keil - в вызове __main ( кода инициализации ) перед вызовом main ( самой программы ) стек инициализируется значением
_initial_sp, которое задается в стартапе при выделении блоков памяти.
Выглядит это так:

Stack_Size EQU 0x00000200

AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size
__initial_sp

Сюдя по всему у топикстартера ARM7/ARM9, а не Cortex (как в LPC17xx)...

Сообщение отредактировал Student Pupkin - Sep 30 2010, 16:05
Go to the top of the page
 
+Quote Post



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

 


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


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