Перейти к содержанию
    

startup.s для Cortex M4

Добрый день! Подскажите пожалуйста, в startup.s для Cortex-M4 в обработчике сброса написано следующее:

Reset_Handler   PROC
               EXPORT  Reset_Handler             [WEAK]
               IMPORT  __main
               IMPORT  SystemInit

               LDR     R0, =SystemInit
               BLX     R0
               LDR     R0, =__main
               BX      R0
               ENDP

Почему SystemInit без подчеркивания,а __main с ними...и что вообще значат эти два подчеркивания?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Добрый день! Подскажите пожалуйста, в startup.s для Cortex-M4 в обработчике сброса написано следующее:
Reset_Handler   PROC
               EXPORT  Reset_Handler             [WEAK]
               IMPORT  __main
               IMPORT  SystemInit

               LDR     R0, =SystemInit
               BLX     R0
               LDR     R0, =__main
               BX      R0
               ENDP

Почему SystemInit без подчеркивания,а __main с ними...и что вообще значат эти два подчеркивания?

 

Потому что в IAR так назвали функцию которая вызовет main.

Т.е. __main и main это разные вещи.

Кстати __main может не вызывать main если в настройках IDE вызов main был отменен.

И тогда программа вообще будет без main :(

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Потому что в IAR так назвали функцию которая вызовет main.

Т.е. __main и main это разные вещи.

Кстати __main может не вызывать main если в настройках IDE вызов main был отменен.

И тогда программа вообще будет без main :(

То есть для кейла надо писать просто main?

И тогда зачем с keil идут эти сами файлы startap.s в которых main с подчеркиваниями?

Может они всё-таки имеют какой то сокральный смысл?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для кейла надо:

1) найти меню Install Pack, Select Pack (зелёные кнопки с квадратами). Установить этот самый pack под используемый процессор.

2а) при создании нового проекта нужный стартап подключится автоматически

2б) для готового проекта скопировать стартап отсюда: C:\Keil_v5\ARM\Pack\Keil\STM32F1xx_DFP\1.1.0\Device\Source\ARM\startup_stm32f10x_ld.s (путь поправить в соответствии с используемым контроллером).

Там же рядом лежат полезные файлы - описание регистров, пример инициализации clock'ов.

 

А __main() - штука нужная. Эта библиотечная функция инициализирует глобальные переменные, которые используются в Си-шном коде. Потом оттуда вызывается пользовательский main()

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А __main() - штука нужная. Эта библиотечная функция инициализирует глобальные переменные, которые используются в Си-шном коде. Потом оттуда вызывается пользовательский main()

Ясно понятно. А где эта функция __main описана? Или где вообще про нее почитать можно?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что странно, описание гуглится плохо.

 

Зато есть локальная копия:

The entry point of a program is at __main in the C library where library code:

- Copies non-root (RO and RW) execution regions from their load addresses to their execution addresses. Also, if any data sections are compressed, they are decompressed from the load address to the execution address.

- Zeroes ZI regions.

- Branches to __rt_entry.

 

The library function __rt_entry() runs the program as follows:

Sets up the stack and the heap by one of a number of means that include calling __user_setup_stackheap(), calling __rt_stackheap_init(), or loading the absolute addresses of scatter-loaded regions.

Calls __rt_lib_init() to initialize referenced library functions, initialize the locale and, if necessary, set up argc and argv for main().

For C++, calls the constructors for any top-level objects by way of __cpp_initialize__aeabi_.

Calls main(), the user-level root of the application.

From main(), your program might call, among other things, library functions.

Calls exit() with the value returned by main().

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ясно понятно. А где эта функция __main описана? Или где вообще про нее почитать можно?

 

Скорее всего где-то в стандарте CMSIS описано. Еще подробности должны быть в хэлпе Keil.

Вот из хэлпа:

ARM Compiler toolchain v5.02 for µVision Linker Reference

 

-- cut here --

 

--startup=symbol, --no_startup

This option enables the linker to use alternative C libraries with a different startup symbol if required.

 

Syntax

--startup=symbol

By default, symbol is set to __main.

 

--no_startup does not take a symbol argument.

 

Default

The default is --startup=__main.

 

Usage

The linker includes the C library startup code if there is a reference to a symbol that is defined by the C library startup code. This symbol reference is called the startup symbol. It is automatically created by the linker when it sees a definition of main(). The --startup option enables you to change this symbol reference.

 

If the linker finds a definition of main() and does not find a reference to (or definition of) symbol, then it generates an error.

 

If the linker finds a definition of main() and a reference to (or definition of) symbol, and no entry point is specified, then the linker generates a warning.

 

 

-- cut here --

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...