Миро Самек. Построение простых систем на ARM-контроллерах с использованием инструментов GNU (перевод)


Часть 5

В этой части описываются опции тонкой настройки приложения через выбор набора инструкций ARM и THUMB и размещение "горячего" кода в оперативной памяти.


5.1 Компиляция под ARM/THUMB набор инструкций

Дополним предыдущее обсуждение рассмотрением опций компилятора, позволяющих выбрать набор инструкций ("-marm" для ARM и "-mthumb" для THUMB). Выбор производится в файле "Makefile" для каждого проектного модуля отдельно. Например, в следующем фрагменте кода модуль "low_level_init.c" компилируется под набор инструкций ARM а модуль "blinky.c" - под набор THUMB:

 

      # choose the ARM or THUMB compilation for each module...

      $(BINDIR)/low_level_init.o: $(BLDDIR)/low_level_init.c $(APP_DEP)
            $(CC) -marm $(CCFLAGS) $(CCINC) $<

      $(BINDIR)/isr.o: $(BLDDIR)/isr.c $(APP_DEP)
            $(CC) -marm $(CCFLAGS) $(CCINC) $<

      $(BINDIR)/bsp.o: $(BLDDIR)/bsp.c $(APP_DEP)
            $(CC) -mthumb $(CCFLAGS) $(CCINC) $<

      $(BINDIR)/blinky.o: $(BLDDIR)/blinky.c $(APP_DEP)
            $(CC) -mthumb $(CCFLAGS) $(CCINC) $<
										


5.2 Размещение кода в оперативной памяти (RAM)

Как отмечалось в первой части статьи, размещение активно используемых ("горячих") фрагментов кода в оперативной памяти может существенно улучшить производительность и уменьшить потребление в большинстве ARM-контроллеров.

Стартовый код и директивы компоновщика, обсуждавшиеся во второй и третьей частях, поддерживают кодовую секцию ".fastcode", которая запускается в оперативной памяти. Код этой секции располагается в программной памяти и копируется в оперативную в процессе начальной загрузки.

Есть два пути для размещения конкретной функции в секции ".fastcode":

1. Тот факт, что каждая функция помещается в отдельную секцию (опция компилятора "-ffunction-sections"), позволяет явным образом указать размещение кода каждой функции в управляющем файле компоновщика. Например, "blinky.ld" для проекта "Blinky" предлагает образец возможного расположения функции "Blinky_dispatch()" в оперативной памяти.

2. Можно разместить код функции в секции ".fastcode.text", используя директиву "__attribute__ ((section (".text.fastcode")))". В модуле "isr.c" приводится пример для функции "BSP_fiq()".

 

      __attribute__ ((section (".text.fastcode")))
      void BSP_fiq(void) {                            /* FIQ ISR*/
            ...
      }
										

ПредпросмотрAttachmentSize
bare_metal_arm_systems_html.zip327.73 КБ
blinky_files.zip173.94 КБ