Цитата(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