[quote name='xelax' date='Aug 3 2007, 11:22' post='279357']
Имеется at91sam7x256 evalution kit плата. Скачал и установил Eclipse и YAGARTO gcc.
Что касается eclipse. Надо просто понимать, что отладчик -- gdb. Остальное -- красивые обёртки. Конфеты в них те же самые.
[quote]
Скачал и скомпилил start example с сайта атмела. Всё получилось, загрузилось и заработало. Но.... Очень много нового и непонятного.
И самое непонятное для меня смысл ассемблеровских стартапных исходников (видел подобное в Keil).
[/quote]
А как ты представляешь C-шный стартап? Я вот /в общем случае/
не представляю. В частном -- может быть... далеко не всегда.
Понятное, дело, он может быть не полностью ассемблерный.
Ассемблера там на самом деле-то всего ничего нужно.
Смысл простой. C(++)-компилятор расчитывает на то, что к моменту
вызова main() будет обнулёна секция bss, будут скопированы из ROM в RAM
данные из .data -- это как минимум. Потом в main() могут передаваться какие-то аргументы (например, от монитора-загрузчика). Обработка преываний опять же -- C не имеет для этого средств.
Настойка какой-то критичной части аппаратуры, что требуется, возможно, сразу
после старта CPU.
[quote]
Вот собственно вопросы знатокам gcc:
1. Глубокий смысл этих файлов каков?
2. Можно как-нибудь обойтись без них или переписать на С?
[/quote]
1. См. выше.
2. Можно в части случаев на части архитектур. В части случаев нельзя.
[quote]
З.Ы. В IARе у меня ничего погдобного не было, всё что нужно я инициализировал сам в коде, использовал настройки проекта и настраивал xcl файлы линкера. Этого хватало.
[/quote]
Там стартап был положен в комплект компилятора. Как это делается, например, для avr-gcc (winavr). Но опять же, в ряде случаев такой стартап чем-то не устраивает и его приходится менять. Keil для чего, например, даёт исходники и подробно разъясняет в документации как это делается.
Совет: напиши собственный стартап и собственные скрипты для линкера. ОЧЕНЬ ПОМОЖЕТ в понимании КАК ЭТО РАБОТАЕТ. И, возможно, во многих других вопросах. Только времени придётся сколько-то затратить.
[quote name='Stanislav' post='279437' date='Aug 3 2007, 14:25']
Инициализация С-шной среды (глобальных переменных, стэка, прерываний и т.д.)
Нельзя. Для запуска процедуры main означенные действия должны быть выполнены. См. стандарты C/C++.
[/quote]
А main не нужно (забыл, написал я выше или нет, но типовой же стартап содержит смешанный на C и ассемблере код). Ничто не мешает написать что-то вроде следующего:
int main(int argc, char *argv[]);
void _start(void) __attribute__((naked));
void _start(void)
{
while (1) {
memset(__bss_start__, 0, __bss_end__ - __bss_start__);
memcpy(_data, _etext, _edata - _data);
main(0, NULL);
}
}
Но во-первых режимы ARM'а без хотя бы asm("blablabla CPSR") уже не
получится. Во-вторых сложно настроить стек (а без этого сишная программа
сразу же свалится) -- можно использовать опять же asm() и полагаться
на оптимизатор который не додумается что-то разместить в стеке.
Потом сложности с обработкой прерывываний того же порядка, плюс
чрезвычайно неэффективный код, если это вообще возможно, не уверен.
И, наконец, нужно как-то сформировать вектор прерываний. Думаю
можно как-то выкрутиться, но уже сложно (и, видимо, опять asm()).
Реально проще написать на ассемблере. Там всего-то строк 200.
По крайней мере там где проще. Там где не проще в примерах и у меня есть C-шная функция, вызываемая непосредственно из стартапа, до вызова main() (и до всяких там обнулений bss, но уже с настроенным стеком). В ней я, например, генератор завожу и биты в портах в безопасное состояние устанавливаю.
Приложу к письму пример своего стартапа (crt0.S) и C-функции из него вызываемой (main.c).
Прикрепленные файлы
main.c.txt ( 2.74 килобайт )
Кол-во скачиваний: 156
crt0.S.txt ( 5.08 килобайт )
Кол-во скачиваний: 221