ガレスタさんのDIY日記

電子回路、Web、組み込み、自作エフェクターを語るblog

MCUXpresso SDK attribute sectionマクロについて

自分用メモです。(皆さんの参考になれば幸いです。

ものとしてはcr_section_macros.hにて定義されている配置変更マクロについてです。
本来はgnu拡張機能

 __attribute__ ((section("セクションの名前”)))

と言う書き方をする。これを簡易化するためのマクロの話。
要は関数のメモリ配置の変更だったり変数配置メモリ変更だったりが行えます。

メモリ配置

使い方についてですがコメント部分に説明があるのでそれを参考にする。
まず以下のようなコードがある。

__SECTION(data,RAM1) char buffer[1024] ;

このように書くとbufferという配列がRAM1に配置されると言うことになる。
このSECTION自体はdefineマクロで構成されており

#define __SECTION(type, bank) __attribute__ ((section("." #type ".$" #bank)))

このような内容になる。
この#ってのが文字列型演算子で””つけたのと同じ意味になる。

複数引数になってるのはIBMの資料によると

複数の section 属性が変数宣言に適用された場合、最後の指定が用いられます。変数定義は上書きできないため、用いられる変数宣言で示されるセクションは、変数定義のセクションと一致している必要があります。定義済みの各変数は、1 つのセクションにのみ存在できます。

なのでこの場合RAM1だけ有効になるってこと。
なんでこうしてるのかは多分コードの可読性向上のためだと思われる。

実際にやってみるとこのような感じだ。
f:id:gsmcustomeffects:20180114231533p:plain
bufferと言う変数だけ異なる部分に配置されたことがわかる。
f:id:gsmcustomeffects:20180114231503p:plain

実際のメモリコンフィグはこのようになっており
f:id:gsmcustomeffects:20180114231741p:plain

直接セクション名を指定しなくてもエイリアスでRAM1とかそう言う感じで指定できる。

コード配置

次にコード配置になる
マクロとしては二つあって

 // Macros for causing functions to be relocated to RAM
#define __RAM_FUNC_EXT(name) __attribute__ ((section(".ramfunc.$" #name)))
#define __RAM_FUNC __attribute__ ((section(".ramfunc")))

// Macros to be used in preference to __RAM_FUNC to better match __DATA behaviour
#define __RAMFUNC_EXT(bank, name) __SECTION_EXT(ramfunc, bank, name)
#define __RAMFUNC(bank) __SECTION(ramfunc, bank)

上の方が単純にセクションの上から配置されるやつで(多分そう)下が明示的に好きなRAM領域に配置するやつ

使い方は

__RAMFUNC(RAM) void fooRAM(void) {...

な感じになる。