ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Суббота
20 апреля
1046017 Топик полностью
VladislavS. (22.10.2020 08:32, просмотров: 359) ответил evgeniy1294 на Как и обещал, сделаю развернутое пояснение. Для начала стоит обратить внимание на выхлоп компилятора, для чего скормим файл прошивки программе readelf (в качестве примера я взял пример blink из своей либины):
1. Проверка if (dl != ds) не нужна. На этапе компиляции значения dl и ds неизвестны, их линкер подставляет. Поэтому оптимизация тут не сработает. А дальше while и без этой проверки всё правильно сделает. 

2. Можно __libc_init_array(); написать самому и компилировать с ключом -nostartfiles. Тогда можно неплохо сэкономить на размере кода.

  extern void (*__preinit_array_start[]) (void) __attribute__((weak));
  extern void (*__preinit_array_end[]) (void) __attribute__((weak));
  extern void (*__init_array_start[]) (void) __attribute__((weak));
  extern void (*__init_array_end[]) (void) __attribute__((weak));
  extern void (*__fini_array_start[]) (void) __attribute__((weak));
  extern void (*__fini_array_end[]) (void) __attribute__((weak));

  // Iterate over all the preinit/init routines (mainly static constructors).
  inline void __attribute__((always_inline)) __run_init_array (void)
  {
    int count = __preinit_array_end - __preinit_array_start;
    for (int i = 0; i < count; i++)
      __preinit_array_start[i] ();

    count = __init_array_end - __init_array_start;
    for (int i = 0; i < count; i++)
      __init_array_start[i] ();
  }


3. Всё что после вызова main() как бы не имеет смысла, зачем этот код?


4. __set_MSP нужен только при отладке, отладчик обычно не устанавливает стек при загрузке как это делается при ресете. Уместно спрятать его под ifdef, чтобы в релиз не попадало.


5. По феншую вызывать Init() до инициализации сегментов данных. Они ведь могут быть в каком-нибудь внешнем SDRAM, который Init() как раз и инициализирует. Да даже просто на более высокой тактовой инициализация быстрее выполнится.


Казалось бы, мелочи, но когда их много...