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

 
 
 
Reply to this topicStart new topic
> Зачем нужны *.mac и csturtup.s файлы, Обьясните пожалуйста!!!
bureau
сообщение Dec 29 2008, 21:27
Сообщение #1


Знающий
****

Группа: Свой
Сообщений: 625
Регистрация: 22-02-07
Пользователь №: 25 593



В IARe при отладке сначала код грузится с этих файлов. Собственно говоря что это дает?
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Dec 30 2008, 00:36
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Наверное все-таки из cstartup.s. Идея проста - выполнить все подготовительные операции, необходимые для старта главного модуля задачи - main() или какого-либо иного. Что конкретно делает cstartup - зависит от процессора, конкретного распределения памяти (ROM, RAM). И прочего ...

А что из комментариев в cstartup.s неясно что он делает и зачем?
Go to the top of the page
 
+Quote Post
bureau
сообщение Jan 2 2009, 19:37
Сообщение #3


Знающий
****

Группа: Свой
Сообщений: 625
Регистрация: 22-02-07
Пользователь №: 25 593



А болие подробней описание каким образом организовуются эти "подготовительные операции, необходимые для старта главного модуля задачи - main()" можно услышать?
Вот например создаю я абсолютно с нуля новый проект. Передо мной только компилятор и датасшит на камень. Откуда мне брать информацию про создание startup кода?
Go to the top of the page
 
+Quote Post
HARMHARM
сообщение Jan 2 2009, 19:57
Сообщение #4


читатель даташитов
****

Группа: Свой
Сообщений: 853
Регистрация: 5-11-06
Из: Днепропетровск
Пользователь №: 21 999



Цитата(bureau @ Jan 2 2009, 21:37) *
А болие подробней описание каким образом организовуются эти "подготовительные операции, необходимые для старта главного модуля задачи - main()" можно услышать?

Поиск рулит. Вкратце - для C нужно как минимум настроить стек. Для C++ еще всякое...
Цитата
Вот например создаю я абсолютно с нуля новый проект. Передо мной только компилятор и датасшит на камень. Откуда мне брать информацию про создание startup кода?

Из примеров производителя контроллера и производителя компилятора.
Go to the top of the page
 
+Quote Post
uriy
сообщение Jan 8 2009, 16:07
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 429
Регистрация: 30-11-05
Из: Ижевск
Пользователь №: 11 606



Обычно с компилятором бывают дефолтовые стартап файлы для контроллеров, которые он поддерживает. В Keil для ARM, например, есть даже подобие визарда для редактирования этого файла.
Go to the top of the page
 
+Quote Post
rvk
сообщение Jan 8 2009, 17:28
Сообщение #6


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

Группа: Свой
Сообщений: 165
Регистрация: 13-05-06
Из: Камышин
Пользователь №: 17 067



Цитата(bureau @ Dec 30 2008, 00:27) *
В IARe при отладке сначала код грузится с этих файлов. Собственно говоря что это дает?


IAR\процессор\src\lib\startup.s90 исходный код файла.
Все что он делает, это затирает нулем все переменные из сегмента DATAZ, и
инициализирует глобальные переменные теми значениями, которые указаны
в программе, плюс настраивает стек.
В любом случае все эти операции программисту пришлось бы делать.
Ничего такого сверхъестественного этот код не далает.
И по моему, на него внимание обращать нет смысла.
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jan 8 2009, 18:09
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



До поры до времени можно и не обращать, пока ваша задача не перешагнет некий default'овый порог сложности. И если не разобраться в том, что к чему в этом самом startup'e, в один "прекрасный" момент все грохнется, о чем свидетельствуют многочисленные "гласы вопиющего" на нашем форуме.
Go to the top of the page
 
+Quote Post
rvk
сообщение Jan 8 2009, 20:42
Сообщение #8


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

Группа: Свой
Сообщений: 165
Регистрация: 13-05-06
Из: Камышин
Пользователь №: 17 067



Цитата(sergeeff @ Jan 8 2009, 21:09) *
До поры до времени можно и не обращать, пока ваша задача не перешагнет некий default'овый порог сложности. И если не разобраться в том, что к чему в этом самом startup'e, в один "прекрасный" момент все грохнется, о чем свидетельствуют многочисленные "гласы вопиющего" на нашем форуме.


Может просветите, раз уж такие страхи нагоняете.
С другой стороны вот пример из инета http://en.mikrocontroller.net/topic/149982.
Суть в чем, человек пишет, с startup.s взятым из проекта от Atmel моя программа не работает, они все такие и сякие.
На что ему Martin Thomas отвечает, вообще то такие вопросы хорошо бы в IAR отправить, но раз
уж вы спросили, отвечаю, в вашем startup.s код загрузчика "закомментирован" (во как).
Вы говорит, по прежнему уверены, что это код Atmel:)

Сообщение отредактировал rvk - Jan 8 2009, 20:46
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jan 8 2009, 21:48
Сообщение #9


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Речь идет, к примеру, о размерах стеков для вашей задачи.


К тому же, приведенный вами пример, как раз демонстрирует тот факт, что человек не понимает как устроен startup для конкретного компилятора и от этого начинает рассылать письма с вопросами.
Go to the top of the page
 
+Quote Post
rvk
сообщение Jan 9 2009, 04:37
Сообщение #10


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

Группа: Свой
Сообщений: 165
Регистрация: 13-05-06
Из: Камышин
Пользователь №: 17 067



Да стек важная штука, и если его не хватит, мало не покажется, но он настраивается прямо в проекте.
Кто мешает настроить размер стека в опциях проекта, не залезая в startup.s.

Сообщение отредактировал rvk - Jan 9 2009, 04:48
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Jan 9 2009, 07:18
Сообщение #11


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Вы задаете вопросы безотносительно какого-то конкретного процессора, задачи (C или C++), конфигурации системы, использования динамической паняти и пр. И хотите получить ответ на какой вопрос? Если что-то устанавливается в проекте и вас больше ничего не интересует, т.е. тех настроек, которые реализованы в стандартном startup'e достаточно, ну и отлично. Пишите свой проект на здоровье.

Тем не менее хорошим тоном считается, что вся необходимая soft и hard инициализация была выполнена до вызова main.
Go to the top of the page
 
+Quote Post
rvk
сообщение Jan 9 2009, 08:58
Сообщение #12


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

Группа: Свой
Сообщений: 165
Регистрация: 13-05-06
Из: Камышин
Пользователь №: 17 067



В чем смысл закладывать все в startup.s, если он запускается до main.
По другому поставлю вопрос. Какая разница, проинициализирована периферия в startup.s файле или в main.c

Сообщение отредактировал rvk - Jan 9 2009, 09:41
Go to the top of the page
 
+Quote Post
ek74
сообщение Jan 9 2009, 09:36
Сообщение #13


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

Группа: Свой
Сообщений: 81
Регистрация: 4-08-05
Из: г. Саратов
Пользователь №: 7 351



Цитата(rvk @ Jan 9 2009, 11:58) *
По другому поставлю вопрос. Какая разница, проинициализирована периферия в startup.s файле или в main.c


А если Вы пишите на C++, и у Вас есть глобальные статические экземпляры некоторых классов (конструкторы таких объектов вызываются ДО main). И самое главное - эти объекты должны работать с железом. В этом случаи инициализация периферии в main будет как на бане гудок.
Go to the top of the page
 
+Quote Post
rvk
сообщение Jan 9 2009, 09:50
Сообщение #14


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

Группа: Свой
Сообщений: 165
Регистрация: 13-05-06
Из: Камышин
Пользователь №: 17 067



Цитата(ek74 @ Jan 9 2009, 12:36) *
А если Вы пишите на C++, и у Вас есть глобальные статические экземпляры некоторых классов (конструкторы таких объектов вызываются ДО main). И самое главное - эти объекты должны работать с железом. В этом случаи инициализация периферии в main будет как на бане гудок.


Согласен конструкторы вызываются до main, но программу и сами конструкторы определяет программист в своем коде.
Думаю конструкторы пользователя инициализируются где угодно, только не в ассемблерном файле startup.s от производителя IAR.
Ведь топик стартер спрашивал о startup.s.
Ведь если startup.s хоть как то причастен к процедуре инициализации классов пользователя, тогда получается совершенно
тяжелая ситуация, мало написать программу на C++, так еще потом вручную редактировать откомпилированный файл.
Это больше похоже на борьбу с глюками среды программирования, чем на штатную работу с ней. Или я чего то не понимаю.

Сообщение отредактировал rvk - Jan 9 2009, 09:53
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Jan 9 2009, 10:00
Сообщение #15


Гуру
******

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



Цитата(rvk @ Jan 9 2009, 10:58) *
По другому поставлю вопрос. Какая разница, проинициализирована периферия в startup.s файле или в main.c
Бывает, что без этого вообще никак. Типичный пример - msp430. У него собака включена после сброса и настроена на 32768 тактов генератора. Если в программе много переменных, то в процессе их инициализации стартапом собака сработает. Приходится ее  затыкать  перед инициализацией.

Еще один случай - загрузчик. Сразу после старта процессор разгоняется, быстро происходят нужные проверки и если все хорошо - управление сразу передается на точку старта приложения. До инициализации переменных загрузчика или, тем более, main() загрузчика управление в таких случаях не доходит вообще.

Цитата(rvk @ Jan 9 2009, 11:50) *
Ведь если startup.s хоть как то причастен к процедуре инициализации классов пользователя,
Да, причастен. Именно оттуда и вызываются конструкторы статических объектов.
Цитата(rvk @ Jan 9 2009, 11:50) *
тогда получается совершенно тяжелая ситуация, мало написать программу на C++, так еще потом вручную редактировать откомпилированный файл.
Зачем? Компилятор складывает указатели на вызовы конструкторов в отдельный сегмент, линкер собирает их в таблицу, стартап проходит по таблице и тупо вызывает функции по указателю пока не наткнется на 0. Все. Более того, все это уже скомпилировано и лежит в библиотеке. Поэтому самый простой ответ - пока вы не знаете, зачем нужен startup.s - он вам не нужен. Готовый библиотечный подлинкуется автоматически.

P.S. Все почему-то пишут про cstartup.s, но никто не сказал ни слова про .mac
bureau: гляньте на вот такой пример его содержимого, возможно вам все станет ясно:
CODE

execUserPreload()
{
Reset();
Remap_FLASH();
__writeMemory32(0xD3,0x98,"Register"); // CPSR = SVC mode, ARM, IRQ, FIQ disabled
}

execUserReset()
{
Reset();

Remap_FLASH();

__writeMemory32(0xD3,0x98,"Register"); // CPSR = SVC mode, ARM, IRQ, FIQ disabled
__writeMemory32(0x00000000,0xB4,"Register");
}

__var tmp;
Remap_FLASH()
{
tmp = __readMemory32(0x00200000, "Memory"); // read from RAM area
__writeMemory32(~tmp, 0x00200000, "Memory"); // alter RAM area
if( ~tmp == __readMemory32(0x00000000, "Memory") ) // check if altering mirrored to remap area
{
__writeMemory32(0x00000001, 0xFFFFFF00,"Memory");
}
__writeMemory32(tmp, 0x00200000 ,"Memory"); // restore RAM data
__message " remap " ;
}


Reset()
{
__writeMemory32(0xA5000004, 0xFFFFFD00, "Memory"); // reset the peripherals
if( __driverType("jlink") )
{
__sleep(1000000); // wait
__emulatorSpeed(32000); // set JTAG speed ~ slow clock
}
__writeMemory32(0x00000001, 0xFFFFFC20,"Memory"); // OSC enable, no timeout

while (! (__readMemory32(0xFFFFFC68, "Memory") & (1 << 0)) ); // wait until MOSCS

// Assuming 18.432 MHz osc
__writeMemory32(0x00190605, 0xFFFFFC2C,"Memory"); // *26/5 set LOCK after 6 SCLK

__writeMemory32(0x00000004, 0xFFFFFC30,"Memory"); // PRES = 2
while (! (__readMemory32(0xFFFFFC68, "Memory") & (1 << 3)) ); // wait untli MCKRDY

__writeMemory32(0x00000007, 0xFFFFFC30,"Memory"); // MCK = PLLCK / 2
while (! (__readMemory32(0xFFFFFC68, "Memory") & (1 << 3)) ); // wait untli MCKRDY

if( __driverType("jlink") )
{
__emulatorSpeed(0); // auto-detect new JTAG speed
__sleep(1000000); // wait
}
__message " MCK ready " ;
}


Сообщение отредактировал Сергей Борщ - Jan 9 2009, 10:10


--------------------
На любой вопрос даю любой ответ
"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

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

 


RSS Текстовая версия Сейчас: 18th July 2025 - 14:27
Рейтинг@Mail.ru


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