Цитата(Igor26 @ Apr 20 2007, 07:42)

Я хелпе на IAR не нашел ничего про __low_level_init().
Ой! Compiler Reference->System startup and termination или просто поиск по ключевому слову __low_level_init.
Цитата
The value returned by __low_level_init determines whether or not data segments 0, the data should be initialized by the system startup code. If the function returns segments will not be initialized.
В папках \src\lib компилятора находим "рыбу" low_level_init.c, в конце которого также есть комментарий:
Код
/* Return 1 to indicate that normal segment */
/* initialization should be performed. If */
/* normal segment initialization should not */
/* be performed, return 0. */
return 1;
Если будете использовать __low_level_init в проектах на С++, не забудьте объявить его как extern "C".
Вот еще нашел в хелпе, в разделе
Implementation of system startup code, про рихтовку стартапа:
Цитата
Note: Do not modify the file cstartup.s90 unless required by your application. Your __low_level_init for first option should be to use a customized version of initialization code.
Цитата(satellite-plus @ Apr 20 2007, 08:35)

Для исключения лишнего кода я прописываю пустые функции.
void __low_level_init(void){}
void __memclr(void){}
void __flashcpy(void){}
void __segment_init(void){}
Интересно. Но буду спорить.
1)__low_level_init должен возвращать число. Объявляя его как void можно как минимум получить жалобу линкера, как максимум - непредсказуемое поведение программы в зависимости от содержимого R16 в момент вызова этой функции. Можно конечно говорить, что он был проициализирован где-то незадолго до этого, ветвлений нет и значение в этой точке всегда одинаково, но это можно гарантировать ровно до перехода на новую версию компилятора и вообще вам повезло что там именно такое значение. Если "жаба душит" на одну команду LDI R16, 0 то надо редактировать cstartup и выбросить оттуда RCALL __low_level_init и проверку, что потянет за собой выбрасывание на этапе линковки всего __low_level_init() в виде оставшегося RET. Во-первых это еще экономия, во-вторых - поведение будет детерменированным без шаманства.
2) __memclr() - обнуляет все глобальные и статические переменные, которым при объявлении явно не присвоено какое-либо значение. Выполнена в виде цикла ST Z+, R?
Вам ведь все равно приходится каким-то образом присваивать переменным начальные значения, и сомневаюсь что отдельно для кажой переменной это получится эффективнее чем в цикле всем скопом. Единственный вариант, который приходит в голову - ваша программа не использует глобальных переменных вообще. Но в этом случае скорее всего применение нескольких глобальных переменных может дать выигрыш в коде больший, чем выкидывание __memclr. И опять же правя cstartup вы сэкономите еще один RCALL и RET.
3) __flashcpy() - пропущу, не знаю что она делает.
4) __segment_init() - копирование образов сегментов XXXX_I (инициализированные глобальные и статические переменные) в ОЗУ из флеша из сегментов XXXX_ID. Делается парой вложенных циклов сразу для всех переменных. Сомневаюсь, что вручную вы сделаете ту же работу эффективнее. Аргументы те же, что и в п.2.
Резюме моих возражений - искать где экономить код нужно не здесь а в основной программе.