|
Стартап и скрипт линкера из CMSIS для Sourcery CodeBench |
|
|
|
Jun 6 2013, 08:09
|
Профессионал
    
Группа: Участник
Сообщений: 1 040
Регистрация: 3-01-07
Пользователь №: 24 061

|
Всем привет! Помогите разобраться, пожалуйста. Стартап и скрипт взял из CMSIS 3.01 (\Device\ARM\ARMCM3\Source\GCC): gcc_arm.ld, startup_ARMCM3.S (приложил к теме). Подцепляю к простейшему тестовому проекту. При сборке линкер ругался сначала на отсутствие libnosys.a (ее действительно нет в дистрибе компилятора) - убрал ее из списка в скрипте. Ошибка пропала. Но так и не нашел, что это за либа, для чего нужна и почему ее нет... Потом линкер ругался на отсутствие "_start". Странно, откуда эта метка в стартапе и почему так называется? Поставил вместо нее "main" - все собралось. Ошибок нет. Но осадок сомнения остался - уже две ошибки в этих двух файлах... кто знает, что там еще? Надеялся, что все заработает "из коробки". Пока не зашивал, не уверен в работоспособности, будем пробовать. Насколько можно верить этим файлам? Что еще в них придется корректировать (ну, кроме размеров RAM, ROM, размеров стека и кучи)?
Прикрепленные файлы
GCC.zip ( 3.82 килобайт )
Кол-во скачиваний: 14
--------------------
Благодарю заранее!
|
|
|
|
|
 |
Ответов
|
Jun 7 2013, 14:44
|
Профессионал
    
Группа: Участник
Сообщений: 1 040
Регистрация: 3-01-07
Пользователь №: 24 061

|
AHTOXA, есть вопросы по Вашему стартапу, прошу помочь разобраться  Строки 12-23. Что это? Где определено? В доке на компилятор не нашел. Строки 207-454. (intfunc)((unsigned long)&_estack) - для чего это вначале таблицы векторов? Строки 465-487. Тут, вроде, более менее понятно. Инициализируем инициализируемые переменные своими значениями, инициализируем нулями неинициализируемые переменные, инициализируем железо (что конкретно только не понятно пока), инициализируем внешнюю память, если она есть, вызываем конструкторы. init_HW() - это что-то типа SystemInit() из system_stm32f10x.c в SPL? Вызов init_HW() до вызова конструкторов т. к., конструкторы могут работать с железом? Видимо в scmRTOS есть реализованная функция init_HW()?
--------------------
Благодарю заранее!
|
|
|
|
|
Jun 7 2013, 16:59
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(koluna @ Jun 7 2013, 20:44)  Строки 12-23. Что это? Где определено? В доке на компилятор не нашел. Это переменные из линкерного скрипта. Границы секций. Цитата(koluna @ Jun 7 2013, 20:44)  Строки 207-454. (intfunc)((unsigned long)&_estack) - для чего это вначале таблицы векторов? Ну, у нас таблица указателей на функции, а первый элемент в ней - адрес стека. Приходится преобразовывать тип, чтобы компилятор не ругался. Цитата(koluna @ Jun 7 2013, 20:44)  Строки 465-487. Тут, вроде, более менее понятно. Инициализируем инициализируемые переменные своими значениями, инициализируем нулями неинициализируемые переменные, инициализируем железо (что конкретно только не понятно пока), инициализируем внешнюю память, если она есть, вызываем конструкторы. init_HW() - это что-то типа SystemInit() из system_stm32f10x.c в SPL? Вызов init_HW() до вызова конструкторов т. к., конструкторы могут работать с железом? Видимо в scmRTOS есть реализованная функция init_HW()?  Да, всё именно так. Просто сначала я придумал название init_HW(), а потом в ST придумали SystemInit()  Можете заменить одно на другое. (Если что, то функцию init_HW() можно посмотреть здесь).
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Jun 7 2013, 19:53
|
Профессионал
    
Группа: Участник
Сообщений: 1 040
Регистрация: 3-01-07
Пользователь №: 24 061

|
Цитата(AHTOXA @ Jun 7 2013, 20:59)  Это переменные из линкерного скрипта. Границы секций. Я потом посмотрел скрипт, увидел их там и понял... к тому же они используются для инициализации переменных и вызова конструкторов. Просто названия у них не особо очевидные... Кстати, это именно переменные, которые определяются в скрипте и глобальны для всей программы? Не совсем понятно что это. Вроде, одно и тоже... но зачем тогда два идентификатора? Код extern unsigned long _etext; extern unsigned long _sidata; Тут правильно? Код extern unsigned long _sdata; // Начало секции размещения инициализированных данных (RAM) extern unsigned long _edata; // Ее конец extern unsigned long _sbss; // Начало секции размещения неициализированных данных (RAM) extern unsigned long _ebss; // Ее конец extern unsigned long _estack; // Конец стека (конец RAM) extern unsigned long __ctors_start__; // Начало секции размещения конструкторов (FLASH) extern unsigned long __ctors_end__; // Ее конец extern unsigned long __dtors_start__; // Начало секции размещения деструкторов (FLASH) extern unsigned long __dtors_end__; // Ее конец Код Ну, у нас таблица указателей на функции, а первый элемент в ней - адрес стека. Приходится преобразовывать тип, чтобы компилятор не ругался. С преобразованием-то понятно, а вот с тем что первый элемент адрес стека - нет, видимо, так для ARM надо. Перечитаю про прерывания  Спасибо большое за консультации. В общем, параллельно надо в скрипт линкера вникать
--------------------
Благодарю заранее!
|
|
|
|
|
Jun 7 2013, 21:39
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(koluna @ Jun 8 2013, 01:53)  Кстати, это именно переменные, которые определяются в скрипте и глобальны для всей программы? Да. Линкер знает их адреса (из скрипта). В любом месте программы вы можете объявить переменную с таким именем. (Здесь нам нужна не сама переменная, а её адрес. Хотя я видел, как в линкерном скрипте объявляли регистры процессора. В этом нет особого смысла, но это возможно  ). Цитата(koluna @ Jun 8 2013, 01:53)  Не совсем понятно что это. Вроде, одно и тоже... но зачем тогда два идентификатора? Код extern unsigned long _etext; extern unsigned long _sidata; Там есть какой-то перечень предопределённых имён, которые нужны встроенным стартапам. Так что в скрипте объявляются разные возможные варианты, например, end и __end. Памяти они не занимают, так что не жалко. Цитата(koluna @ Jun 8 2013, 01:53)  Тут правильно? Да, всё так.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Jun 10 2013, 12:41
|
Профессионал
    
Группа: Участник
Сообщений: 1 040
Регистрация: 3-01-07
Пользователь №: 24 061

|
Цитата(AHTOXA @ Jun 8 2013, 01:39)  Да. Линкер знает их адреса (из скрипта). В любом месте программы вы можете объявить переменную с таким именем. (Здесь нам нужна не сама переменная, а её адрес. Хотя я видел, как в линкерном скрипте объявляли регистры процессора. В этом нет особого смысла, но это возможно  ). Кстати, а для чего в программе могут понадобиться такие переменные? Цитата Там есть какой-то перечень предопределённых имён, которые нужны встроенным стартапам. Так что в скрипте объявляются разные возможные варианты, например, end и __end. Памяти они не занимают, так что не жалко. А где, кстати, перечень? Может быть так много имен для совместимости?
--------------------
Благодарю заранее!
|
|
|
|
|
Jun 10 2013, 18:56
|

фанат дивана
     
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684

|
Цитата(koluna @ Jun 10 2013, 18:41)  Кстати, а для чего в программе могут понадобиться такие переменные? Ну мало ли. Например, end/_end/__end часто используются менеджерами кучи. Цитата(koluna @ Jun 10 2013, 18:41)  А где, кстати, перечень? Может быть так много имен для совместимости? Не уверен, что этот перечень где-то формализован. Скорее, это происходит так: перестаёт компилироваться каким-то компилятором программа - добавляем ещё одну переменную. В общем, не надо особо с этим заморачиваться, основную идею поняли, заработало - и нормуль. Если вдруг понадобится что-то специфическое, то тогда уже погружаться, да
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Jun 11 2013, 07:46
|
Профессионал
    
Группа: Участник
Сообщений: 1 040
Регистрация: 3-01-07
Пользователь №: 24 061

|
Цитата(AHTOXA @ Jun 10 2013, 22:56)  Ну мало ли. Например, end/_end/__end часто используются менеджерами кучи. Не уверен, что этот перечень где-то формализован. Скорее, это происходит так: перестаёт компилироваться каким-то компилятором программа - добавляем ещё одну переменную. Понятно, спасибо  Разбираюсь с линкером потихонечку. Будут и по нему вопросы
--------------------
Благодарю заранее!
|
|
|
|
Сообщений в этой теме
koluna Стартап и скрипт линкера из CMSIS для Sourcery CodeBench Jun 6 2013, 08:09 Непомнящий Евгений Я в свое время сам писал и скрипт и стартап. Чем-т... Jun 6 2013, 08:22 koluna Цитата(Непомнящий Евгений @ Jun 6 2013, 12... Jun 6 2013, 08:42 koluna Кто-нибудь выскажет свое мнение?
Или мир разделилс... Jun 6 2013, 11:58 _Артём_ Цитата(koluna @ Jun 6 2013, 14:58) И нет ... Jun 6 2013, 17:32  koluna Цитата(_Артём_ @ Jun 6 2013, 21:32) Скрип... Jun 6 2013, 18:27  AHTOXA Попробуйте скрипты и стартап от scmRTOS. Я точно з... Jun 6 2013, 18:29 koluna AHTOXA, спасибо большое!
Но мне хотелось бы вс... Jun 7 2013, 10:59 koluna Вопросы по Вашему скрипту.
Зачем вообще придумали... Jun 12 2013, 14:58 AHTOXA Ничего себе, сколько вопросов
Сразу предупреждаю, ... Jun 12 2013, 18:45  koluna Цитата(AHTOXA @ Jun 12 2013, 22:45) Ничег... Jun 13 2013, 07:40   AHTOXA Цитата(koluna @ Jun 13 2013, 13:40) Зачем... Jun 13 2013, 08:36   Непомнящий Евгений Цитата(koluna @ Jun 13 2013, 11:40) Зачем... Jun 13 2013, 08:43 koluna Вот здесь зачем выравнивание перед таблицей вектор... Jun 13 2013, 18:41 Сергей Борщ QUOTE (koluna @ Jun 13 2013, 21:41) Вот з... Jun 13 2013, 19:12  Terminator Цитата(Сергей Борщ @ Jun 14 2013, 02:12) ... Jun 14 2013, 01:51  koluna Цитата(Сергей Борщ @ Jun 13 2013, 23:12) ... Jun 14 2013, 13:41 AHTOXA Цитата(koluna @ Jun 14 2013, 00:41) Вот з... Jun 13 2013, 19:48  koluna Цитата(AHTOXA @ Jun 13 2013, 23:48) Ох, д... Jun 14 2013, 18:25   AHTOXA Цитата(koluna @ Jun 15 2013, 00:25) Ааа..... Jun 14 2013, 19:19    koluna Цитата(AHTOXA @ Jun 14 2013, 23:19) Начал... Jun 15 2013, 10:27     AHTOXA Цитата(koluna @ Jun 15 2013, 16:27) Недов... Jun 15 2013, 10:57      koluna Цитата(AHTOXA @ Jun 15 2013, 14:57) Давай... Jun 15 2013, 19:56       AHTOXA Цитата(koluna @ Jun 16 2013, 01:56) Как я... Jun 15 2013, 20:26        koluna Цитата(AHTOXA @ Jun 16 2013, 00:26) Нет. ... Jun 16 2013, 07:25         AHTOXA Цитата(koluna @ Jun 16 2013, 13:25) Так, ... Jun 16 2013, 10:00 Сергей Борщ QUOTE (AHTOXA @ Jun 13 2013, 22:48) А чем... Jun 14 2013, 19:50 AHTOXA Цитата(Сергей Борщ @ Jun 15 2013, 01:50) ... Jun 15 2013, 05:43 Сергей Борщ QUOTE (AHTOXA @ Jun 15 2013, 13:57) Но у ... Jun 15 2013, 22:03 AHTOXA Цитата(Сергей Борщ @ Jun 16 2013, 04:03) ... Jun 15 2013, 22:33  Сергей Борщ QUOTE (AHTOXA @ Jun 16 2013, 01:33) 128 с... Jun 15 2013, 23:15   AHTOXA Цитата(Сергей Борщ @ Jun 16 2013, 05:15) ... Jun 16 2013, 19:48 koluna О счетчике позиций.
Может быть вот это:
Код__exid... Jun 17 2013, 14:51 Сергей Борщ QUOTE (koluna @ Jun 17 2013, 17:51) было ... Jun 18 2013, 07:54  AHTOXA Вот ведь дилемма... С одной стороны, "возможн... Jun 18 2013, 08:46 koluna Не совсем разобрался с адресацией: абсолютная и от... Jun 18 2013, 11:02 AHTOXA Цитата(koluna @ Jun 18 2013, 17:02) Вот в... Jun 18 2013, 13:00 koluna Цитата(AHTOXA @ Jun 18 2013, 17:00) Нет. ... Jun 18 2013, 13:25 AHTOXA Цитата(koluna @ Jun 18 2013, 19:25) Знаю.... Jun 18 2013, 16:58  koluna Цитата(AHTOXA @ Jun 18 2013, 20:58) А фиг... Jun 18 2013, 17:43   AHTOXA Да, всё так. Jun 18 2013, 17:54   Сергей Борщ QUOTE (koluna @ Jun 18 2013, 20:43) Вот и... Jun 18 2013, 18:34 koluna Пока так и не понял, "--gc-sections" раб... Jun 18 2013, 15:52 koluna Мучает меня вопрос по секциям все-таки...
.init_... Jun 18 2013, 18:37 AHTOXA Цитата(koluna @ Jun 19 2013, 00:37) .init... Jun 18 2013, 19:44  koluna Цитата(AHTOXA @ Jun 18 2013, 23:44) Можно... Jun 19 2013, 07:41   AHTOXA Цитата(koluna @ Jun 19 2013, 13:41) Наско... Jun 19 2013, 08:04    koluna Цитата(AHTOXA @ Jun 19 2013, 12:04) Емним... Jun 19 2013, 09:44     Сергей Борщ QUOTE (koluna @ Jun 19 2013, 12:44) Кстат... Jun 19 2013, 10:02      koluna Понятно, спасибо.
А с деструкторами все-таки что?... Jun 19 2013, 12:31       Сергей Борщ QUOTE (koluna @ Jun 19 2013, 15:31) А с д... Jun 19 2013, 13:11 koluna Судя по всему для EABI, по аналогии с конструктора... Jun 19 2013, 14:10 koluna Что такое common-символы (секция COMMON)?
Из доки ... Jun 19 2013, 18:30 koluna И все-таки хотелось бы немного поговорить и о скри... Jun 20 2013, 16:26 koluna Посмотрел у себя файлы crt* в папках компилятора:
... Jun 21 2013, 20:50
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|