|
|
  |
Зачем нужны *.mac и csturtup.s файлы, Обьясните пожалуйста!!! |
|
|
|
Jan 2 2009, 19:57
|

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

|
Цитата(bureau @ Jan 2 2009, 21:37)  А болие подробней описание каким образом организовуются эти "подготовительные операции, необходимые для старта главного модуля задачи - main()" можно услышать? Поиск рулит. Вкратце - для C нужно как минимум настроить стек. Для C++ еще всякое... Цитата Вот например создаю я абсолютно с нуля новый проект. Передо мной только компилятор и датасшит на камень. Откуда мне брать информацию про создание startup кода? Из примеров производителя контроллера и производителя компилятора.
|
|
|
|
|
Jan 8 2009, 17:28
|
Частый гость
 
Группа: Свой
Сообщений: 165
Регистрация: 13-05-06
Из: Камышин
Пользователь №: 17 067

|
Цитата(bureau @ Dec 30 2008, 00:27)  В IARe при отладке сначала код грузится с этих файлов. Собственно говоря что это дает? IAR\процессор\src\lib\startup.s90 исходный код файла. Все что он делает, это затирает нулем все переменные из сегмента DATAZ, и инициализирует глобальные переменные теми значениями, которые указаны в программе, плюс настраивает стек. В любом случае все эти операции программисту пришлось бы делать. Ничего такого сверхъестественного этот код не далает. И по моему, на него внимание обращать нет смысла.
|
|
|
|
|
Jan 8 2009, 20:42
|
Частый гость
 
Группа: Свой
Сообщений: 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
|
|
|
|
|
Jan 9 2009, 09:36
|
Частый гость
 
Группа: Свой
Сообщений: 81
Регистрация: 4-08-05
Из: г. Саратов
Пользователь №: 7 351

|
Цитата(rvk @ Jan 9 2009, 11:58)  По другому поставлю вопрос. Какая разница, проинициализирована периферия в startup.s файле или в main.c А если Вы пишите на C++, и у Вас есть глобальные статические экземпляры некоторых классов (конструкторы таких объектов вызываются ДО main). И самое главное - эти объекты должны работать с железом. В этом случаи инициализация периферии в main будет как на бане гудок.
|
|
|
|
|
Jan 9 2009, 09:50
|
Частый гость
 
Группа: Свой
Сообщений: 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
|
|
|
|
|
Jan 9 2009, 10:00
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|