6

ARM チップ用のプログラムを IAR コンパイラから gcc に移植しています。

__segment_begin元のコードでは、やなどの IAR 固有の演算子__segment_sizeを使用して、特定のメモリ セグメントの先頭とサイズを取得していました。

GCCで同じことをする方法はありますか? GCC マニュアルを検索しましたが、関連するものは見つかりませんでした。


詳細:
問題のメモリ セグメントは、プログラムがチップ上の特定の周辺機器と正しくインターフェイスできるように、固定位置に配置する必要があります。元のコードでは、__segment_begin演算子を使用してこのメ​​モリのアドレスを取得し、このメモリ__segment_sizeがオーバーフローしないようにします。

これらのメモリ セグメントの開始と終了を示す変数を追加することで同じ機能を実現できますが、GCC に同様の演算子があり、コンパイラに依存するコードの量を最小限に抑えるのに役立つ場合は、作成して維持する必要があります。

4

2 に答える 2

2

リンカーのフラグは--section-startどうですか?私が読んだものはここでサポートされています。

使用方法の例は、AVR Freaks Forumで見つけることができます。

const  char  __attribute__((section (".honk"))) ProjString[16] = "MY PROJECT V1.1";

次に、リンカーのオプションに追加する必要があります: -Wl,--section-start=.honk=address.

于 2011-03-13T20:41:59.510 に答える
1

GCC の最新バージョンでは、各セグメントに対して 2 つの変数、つまり __start_MY_SEGMENT と __stop_MY_SEGMENT を宣言します。これらの変数を使用するには、必要な型の extern として宣言する必要があります。その後、「&」演算子を使用して、そのセグメントの開始と終了のアドレスを取得します。

extern uint8_t __start_MY_SEGMENT;
extern uint8_t __stop_MY_SEGMENT;
#define MY_SEGMENT_LEN (&__stop_MY_SEGMENT - &__start_MY_SEGMENT)
于 2016-06-02T06:02:07.517 に答える