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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Какие действия происходят в МК до main() ?, Какой язык используется в .xcl файле?
Толик
сообщение Nov 20 2007, 06:55
Сообщение #1


Участник
*

Группа: Новичок
Сообщений: 30
Регистрация: 26-02-07
Из: Москва
Пользователь №: 25 687



Хотелось бы вообще разобраться, какие действия происходят в микроконтроллере до того как мы попадаем в main() ?

Зачем нужен .mac файл?

Какой язык используется в .xcl файле?

Где про всё это почитать можно? unsure.gif
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Nov 20 2007, 07:20
Сообщение #2


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(Толик @ Nov 20 2007, 08:55) *
Хотелось бы вообще разобраться, какие действия происходят в микроконтроллере до того как мы попадаем в main() ?

Примерно такой порядок:
инициализация интерфейса внешней памяти и указателей стека;
инициализация "кучи", если она есть;
__low_level_init - низкоуровневые инициализации, которые пользователь считает нужным сделать;
обнуление неинициализируемых глобальных обьектов в ОЗУ;
инициализация инициализируемых глобальных обьектов в ОЗУ;
запуск конструкторов глобальных обьектов.
Цитата(Толик @ Nov 20 2007, 08:55) *
Зачем нужен .mac файл?

Для отладки в C-SPY.
Цитата(Толик @ Nov 20 2007, 08:55) *
Какой язык используется в .xcl файле?

Собственный.
Цитата(Толик @ Nov 20 2007, 08:55) *
Где про всё это почитать можно? unsure.gif

Документация на английском языке в папках avr[arm]\doc и common\doc исчерпывающая.
Непонятности разрешаются поиском по форуму.
Go to the top of the page
 
+Quote Post
VladislavS
сообщение Nov 20 2007, 09:56
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 475
Регистрация: 14-04-05
Из: Москва
Пользователь №: 4 140



Цитата(Толик @ Nov 20 2007, 09:55) *
Зачем нужен .mac файл?


Отвечу поточнее. С его помощью отладчик переводит процессор в состояние, подходящее для загрузки программы в память и начала отладки. Обычно это запуск генераторов, ремап, инициализация SDRAM, установка режима работы, установка счетчика команд и т.д.
Go to the top of the page
 
+Quote Post
Толик
сообщение Nov 20 2007, 10:23
Сообщение #4


Участник
*

Группа: Новичок
Сообщений: 30
Регистрация: 26-02-07
Из: Москва
Пользователь №: 25 687



Ну вот, в часности, не понятно откуда МК знает делать ремап или нет (или при работе без программатора ремап можно делать только самому?)? Или с какого адреса начинать заполнять RAM (мы же не записываем .xml файл в МК).
Как я понимаю после запуска МК у нас есть указатель на 0x000000 адрес где у нас начинается файл CsSstarpUp, оперативная память пуста, но к этому времени у нас уже должно произойти распределение памяти с помощью XCL, всяких там __ramfunc ....... так вот где всё это (может это карта памяти называется) распределение лежит и как оно происходит?

А как называется собсвенный язык XCL? (По название полегче будет найти описание)

Цитата(IgorKossak @ Nov 20 2007, 10:20) *
Документация на английском языке в папках avr[arm]\doc и common\doc исчерпывающая

laughing.gif А где, пардон, эти папки?

Цитата(IgorKossak @ Nov 20 2007, 10:20) *
Примерно такой порядок:
инициализация интерфейса внешней памяти и указателей стека;
инициализация "кучи", если она есть;
__low_level_init - низкоуровневые инициализации, которые пользователь считает нужным сделать;
обнуление неинициализируемых глобальных обьектов в ОЗУ;
инициализация инициализируемых глобальных обьектов в ОЗУ;
запуск конструкторов глобальных обьектов.

Так это же файл CsStartUp, да? А где же .xcl? Я уже выше написал

На всю эту кучу(не путать с динам. памятью) вопросов и соображений можно не отвечать, а просто отослать к соотв. литературе unsure.gif

Цитата(VladislavS @ Nov 20 2007, 12:56) *
Отвечу поточнее. С его помощью .......

О-о-о.... процесс понимания пошёл....спасибо yeah.gif

А вот такой вопрос...а надо ли в нём разбираться и в чём это может помочь? И по каким источникам разбираться?
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Nov 20 2007, 10:45
Сообщение #5


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(Толик @ Nov 20 2007, 12:23) *
laughing.gif А где, пардон, эти папки?
Так это же файл CsStartUp, да? А где же .xcl?

В основной папке установленного продукта (если Вы его установили).
Да.
.xcl это командный файл линкера и делается, как правило, на базе шаблона из какого-нибудь примера. См. папки arm\examples, arm\config, ...
Цитата(Толик @ Nov 20 2007, 12:23) *
А как называется собсвенный язык XCL? (По название полегче будет найти описание)

Файл common\xlink.ENU.pdf разъясняет все директивы и опции, применяемые в файле .xcl.
О названии языка никогда не слышал.
Go to the top of the page
 
+Quote Post
Толик
сообщение Nov 20 2007, 11:21
Сообщение #6


Участник
*

Группа: Новичок
Сообщений: 30
Регистрация: 26-02-07
Из: Москва
Пользователь №: 25 687



Спасибо. smile.gif
Цитата(IgorKossak @ Nov 20 2007, 13:45) *
См. папки arm\examples, arm\config, ...
Файл common\xlink.ENU.pdf разъясняет все директивы и опции, применяемые в файле .xcl.

Как говориться за что боролись, на то и напоролись... всё на английском, надо напрягаться читать.....а хотелось просто чего-нибудь почитать-расслабиться пока делать нечего...ну хоть буду знать куда лезть в случае необходимости.

А вот как заполняется RAM я так и не понял....ну и ладно....спасибо, что хоть сразу не прогнали
Go to the top of the page
 
+Quote Post
Kirill Frolov
сообщение Nov 20 2007, 11:26
Сообщение #7


Частый гость
**

Группа: Новичок
Сообщений: 111
Регистрация: 10-02-07
Из: St.Petersburg, Russia
Пользователь №: 25 241



Цитата(Толик @ Nov 20 2007, 09:55) *
Хотелось бы вообще разобраться, какие действия происходят в микроконтроллере до того как мы попадаем в main() ?


Запускается C-стартап. Который выполняет следующие действия: настройка необходимого минимума аппаратуры, прерываний, стека, возможно включение кварцевого генератора и настройка портов ввода-вывода (многое, конечно, можно вынести в main, но main запускается с большой задержкой).
Потом инициализация C-переменных (глобальных) и вызов конструкторов C++ классов. После всего запускается main.


--------------------
[ZX]
Go to the top of the page
 
+Quote Post
Толик
сообщение Nov 20 2007, 11:53
Сообщение #8


Участник
*

Группа: Новичок
Сообщений: 30
Регистрация: 26-02-07
Из: Москва
Пользователь №: 25 687



Цитата(Kirill Frolov @ Nov 20 2007, 14:26) *
Запускается C-стартап. Который выполняет следующие действия:

Дело - то всё в том, что когда мы находимся на первой строчке стартапа, в RAMе у нас уже есть куча наших переменных или функций, которые неизвестно как туда попали....ну в случае работы с отладчиком(или программатором...как он там называется) - ясно, а вот без него....ну то есть при обыной работе.....или после RESETa?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 20 2007, 12:12
Сообщение #9


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Толик @ Nov 20 2007, 13:53) *
Дело - то всё в том, что когда мы находимся на первой строчке стартапа, в RAMе у нас уже есть куча наших переменных или функций, которые неизвестно как туда попали...
Откуда у вас такая информация? После включения питания процессор начинает исполнять программу с адреса 0. Больше он ничего не умеет. По адресу 0 находится команда перехода на cstartup. Если вы смотрели внимательно исходники cstartup, то могли заметить, что сначала настраиваются стеки, потом вызывается пользовательская функция __low_level_init() (если пользователь ее не определеил, то из библиотеки подлинковывается заглушка, которая просто возвращает 1). Если __low_level_init() вернул 0, то происходит запуск main(). Если __low_level_init() вернул 1, то происходит инициализация ОЗУ - копирование в ОЗУ функций __ramfunc, присваивание начальных значений проинициализированным глобальным и статическим переменным, обнуление ненициализированных глобальных, вызов конструкторов. И только после этого происходит запуск main(). Все. Никаких чудес. Все "неизвестно как" происходит в cstartup. Нужен ремап - делайте его вручную в __low_level_init() или в main().


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
IgorKossak
сообщение Nov 20 2007, 12:18
Сообщение #10


Шаман
******

Группа: Модераторы
Сообщений: 3 064
Регистрация: 30-06-04
Из: Киев, Украина
Пользователь №: 221



Цитата(Толик @ Nov 20 2007, 13:53) *
Дело - то всё в том, что когда мы находимся на первой строчке стартапа, в RAMе у нас уже есть куча наших переменных или функций, которые неизвестно как туда попали....ну в случае работы с отладчиком(или программатором...как он там называется) - ясно, а вот без него....ну то есть при обыной работе.....или после RESETa?

Копирование функций, обьявленных как __ramfunc, из flash в RAM тоже происходит в стартапе. Либо они могут загрузиться в RAM из внешней памяти внутренним загрузчиком. Какие у Вас аппаратные особенности (какой МК, как сконфигурирована начальная загрузка и есть ли она вообще) - неизвестно.
Go to the top of the page
 
+Quote Post
Толик
сообщение Nov 20 2007, 12:50
Сообщение #11


Участник
*

Группа: Новичок
Сообщений: 30
Регистрация: 26-02-07
Из: Москва
Пользователь №: 25 687



Цитата(IgorKossak @ Nov 20 2007, 15:18) *
Копирование функций, обьявленных как __ramfunc, из flash в RAM тоже происходит в стартапе.


Программирую AT91SAM7A3 (отладочную плату). Так вот взял стандартный проект с бегающими огоньками.....написал у одной функции __ramfunc, затем запустил FLASH Debug.....затем не выполняя программу начинаю смотреть RAM с 0x00200000 и вижу там функцию указанную как __ramfunc, хотя csstartup ещё не выполнялся. crying.gif
Go to the top of the page
 
+Quote Post
vet
сообщение Nov 20 2007, 13:07
Сообщение #12


Знающий
****

Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32



Можно предположить, что устройство не выключалось, а код в ОЗУ остался с прошлой отладки.


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post
Толик
сообщение Nov 20 2007, 13:14
Сообщение #13


Участник
*

Группа: Новичок
Сообщений: 30
Регистрация: 26-02-07
Из: Москва
Пользователь №: 25 687



Цитата(vet @ Nov 20 2007, 16:07) *
Можно предположить, что устройство не выключалось, а код в ОЗУ остался с прошлой отладки.

Да нет, врядли.....когда изменил код и опять запустил Flash Debug в RAMe уже была моя изменённая ф-ция. Скорее всего программатор сам всё программирует без csstartup'a.....тогда он во Flash прошивает совсем другой стартап нежели который выполняется при Флэш дебаге.... unsure.gif
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Nov 20 2007, 13:53
Сообщение #14


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(Толик @ Nov 20 2007, 14:50) *
затем не выполняя программу начинаю смотреть RAM с 0x00200000 и вижу там функцию указанную как __ramfunc, хотя csstartup ещё не выполнялся. crying.gif
На самом деле программа начала выполняться. После прошивки флеш отладчик дает ресет на процессор, процессор начинать выполнять программу (с cstartup), а в это время отладчик перехватывает управление, переводит процессор в режим ARM и ставит PC на нулевой адрес. Вот пока отладчик перехватывает управление и успевает выполниться некоторая часть cstartup, в вашем случае - копирование функций. Чтобы убедиться - напишите свою __low_level_init() с достаточно длинным циклом, чтобы процессор какое-то время повисел в цикле.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Kirill Frolov
сообщение Nov 20 2007, 14:04
Сообщение #15


Частый гость
**

Группа: Новичок
Сообщений: 111
Регистрация: 10-02-07
Из: St.Petersburg, Russia
Пользователь №: 25 241



Цитата(Толик @ Nov 20 2007, 14:53) *
Дело - то всё в том, что когда мы находимся на первой строчке стартапа, в RAMе у нас уже есть куча наших переменных или функций, которые неизвестно как туда попали...


Есть. Неинициализированных.

Нет, я допускаю, что startup запускается не непосредственно, а из какой-либо программы монитора...


--------------------
[ZX]
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 23rd July 2025 - 15:30
Рейтинг@Mail.ru


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