AURIX3Gのアドレッシングモードが16Mを超えて正しくリンクできない問題について

Tip / ログイン to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
Translation_Bot
Community Manager
Community Manager
Community Manager

コンパイラーが AURIX プロジェクトをコンパイルする場合、通常、関数呼び出しでは最大アドレス範囲が 16M の ABS24 アドレス指定モードが使用されます。新世代の AURIX3G チップの最大フラッシュ アドレスは 20/24M です。OTA パーティショニングの代わりにアドレス範囲全体が使用される場合、アドレス範囲を超える可能性があります。この状況に対処する方法についてのガイダンスを持っている人はいますか (前向きに検討してください)解決策)アドレス指定の問題は、コードの一部の位置を調整するのではなく、回りくどい操作によって解決されますか?

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/AURIX/%E5%85%B3%E4%BA%8EAURIX3G%E5%AF%BB%E5%9D%80%E6%96%B9%E5%BC%8F%E8%B6%85%E8%BF%8716M-%E6%97%A0%E6%B3%95%E6%AD%A3%E7%A1%AELINK%E9%97%AE%E9%A2%98/td-p/647842

0 件の賞賛
1 解決策
Translation_Bot
Community Manager
Community Manager
Community Manager

これは、次のいずれかのオプションを使用して解決できます。

1) +/- 16MB の呼び出し距離範囲外で、影響を受ける関数の間接呼び出しを使用します。これを行うには、関数宣言に間接キーワードを適用します。

__indirect void func_1(void) // この関数は呼び出し元の +/- 16MB 範囲外にあります
{}

int main(void)
{
    func();
    return 0;
}

2) リンカにこのような状況に対処してもらいます。リンカー オプション --long-branch-veneers をリンカー呼び出しに追加できます。次に、リンカは +/- 16 MB の範囲内にベニア セクションを作成し、ベニア セクションには呼び出し先への間接ジャンプが含まれます。

逆アセンブリダンプでは次のようになります。

 

.sdecl '.text.file_1.func',コード 0x81600000
。宗派'.text.file_1.func'
81600000 00 90 機能: ret

.sdecl '.text.file_1.main',コード 0x80000004
。宗派'.text.file_1.main'
80000004 6d 00 04 00 main: _veneer_func を呼び出します
80000008 82 02 mov d2,#0x0
8000000a 00 90 ret

.sdecl '.ztext.veneer.func',コード 0x8000000c
。宗派'.ztext.veneer.func'
8000000c 91 00 16 c8 _veneer_func: movh.aa12,#0x8160
80000010 d9 cc 00 00 lea a12,[a12]0x0
80000014 dc 0c ji a12

 

間接呼び出しを防ぐもう 1 つのオプションは、間接呼び出しを必要としない選択されたメモリ領域に配置されるリンカー LSL グループに関数を含むセクションを追加することで、関数が必要な範囲内に配置されるようにすることです。

よろしくお願いします、

ウルリッヒ・クロイド
TASKINGツールのサポート

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/AURIX/%E5%85%B3%E4%BA%8EAURIX3G%E5%AF%BB%E5%9D%80%E6%96%B9%E5%BC%8F%E8%B6%85%E8%BF%8716M-%E6%97%A0%E6%B3%95%E6%AD%A3%E7%A1%AELINK%E9%97%AE%E9%A2%98/m-p/648809

元の投稿で解決策を見る

0 件の賞賛
6 返答(返信)
Translation_Bot
Community Manager
Community Manager
Community Manager

論理アドレス空間は、コアがアドレスを命令にエンコードする別の方法を持つメモリの範囲です。たとえば、Tricore の 32 ビット線形アドレス空間には、16 個の 24 ビット サブ空間と 16 個の 14 ビット サブ空間が含まれています。 .abs18 空間は線形空間のサブセットです。 ABS24 の概念により、32 ビットのアドレス空間で 24 ビットの絶対アドレスを使用できるようになります。たとえば、ABS24 では、アドレス マッピングをmapで定義し、 abs18のアドレス空間をlinearのアドレス空間マッピングすることで、24 ビットのアドレス空間に制限できます。したがって、32 ビット アドレスをアドレス指定するために abs24 について心配する必要はありません。参照: 第 7.7.4 章https://www.tasking.com/support/tricore/tc_user_guide_v2.5.pdf

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/AURIX/%E5%85%B3%E4%BA%8EAURIX3G%E5%AF%BB%E5%9D%80%E6%96%B9%E5%BC%8F%E8%B6%85%E8%BF%8716M-%E6%97%A0%E6%B3%95%E6%AD%A3%E7%A1%AELINK%E9%97%AE%E9%A2%98/m-p/648461

0 件の賞賛
Translation_Bot
Community Manager
Community Manager
Community Manager

こんにちはこんにちは、

原理は明確で、変数の近くのアドレス指定と同様です。しかし、変数では #pragma を使用して特定の変数アドレス指定メソッドを定義できますが、コードを呼び出すにはどうすればよいでしょうか?例えば:

void func1(void)

{

func2();

}

func1 がリンク時にアドレス 0x80000000 を選択し、func2 がリンク時に 0x81600000 を選択すると、それらの間のアドレスは 16M を超え、コンパイラによってコンパイルされる命令は abs24 Jump になります。その後、リンクにエラーが報告されます。

func1 と func2 のアドレス位置が強く必要な場合、この問題をどのように解決すればよいでしょうか?ジャンプを絶対アドレス指定に強制的に変更するコンパイラ設定のようなものはありますか?

 

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/AURIX/%E5%85%B3%E4%BA%8EAURIX3G%E5%AF%BB%E5%9D%80%E6%96%B9%E5%BC%8F%E8%B6%85%E8%BF%8716M-%E6%97%A0%E6%B3%95%E6%AD%A3%E7%A1%AELINK%E9%97%AE%E9%A2%98/m-p/648759

0 件の賞賛
Translation_Bot
Community Manager
Community Manager
Community Manager

おそらく、これには C 言語の代わりにアセンブリ言語を使用する必要があります。ユーザーマニュアルで説明されているように、「JI」(間接ジャンプ)命令は、32 ビットのアドレスジャンプ操作を容易にします。C 言語でのこの命令の適切な使用方法については、Tasking に問い合わせることをお勧めします。@ユーザー13836

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/AURIX/%E5%85%B3%E4%BA%8EAURIX3G%E5%AF%BB%E5%9D%80%E6%96%B9%E5%BC%8F%E8%B6%85%E8%BF%8716M-%E6%97%A0%E6%B3%95%E6%AD%A3%E7%A1%AELINK%E9%97%AE%E9%A2%98/m-p/648771

0 件の賞賛
Translation_Bot
Community Manager
Community Manager
Community Manager

これは、次のいずれかのオプションを使用して解決できます。

1) +/- 16MB の呼び出し距離範囲外で、影響を受ける関数の間接呼び出しを使用します。これを行うには、関数宣言に間接キーワードを適用します。

__indirect void func_1(void) // この関数は呼び出し元の +/- 16MB 範囲外にあります
{}

int main(void)
{
    func();
    return 0;
}

2) リンカにこのような状況に対処してもらいます。リンカー オプション --long-branch-veneers をリンカー呼び出しに追加できます。次に、リンカは +/- 16 MB の範囲内にベニア セクションを作成し、ベニア セクションには呼び出し先への間接ジャンプが含まれます。

逆アセンブリダンプでは次のようになります。

 

.sdecl '.text.file_1.func',コード 0x81600000
。宗派'.text.file_1.func'
81600000 00 90 機能: ret

.sdecl '.text.file_1.main',コード 0x80000004
。宗派'.text.file_1.main'
80000004 6d 00 04 00 main: _veneer_func を呼び出します
80000008 82 02 mov d2,#0x0
8000000a 00 90 ret

.sdecl '.ztext.veneer.func',コード 0x8000000c
。宗派'.ztext.veneer.func'
8000000c 91 00 16 c8 _veneer_func: movh.aa12,#0x8160
80000010 d9 cc 00 00 lea a12,[a12]0x0
80000014 dc 0c ji a12

 

間接呼び出しを防ぐもう 1 つのオプションは、間接呼び出しを必要としない選択されたメモリ領域に配置されるリンカー LSL グループに関数を含むセクションを追加することで、関数が必要な範囲内に配置されるようにすることです。

よろしくお願いします、

ウルリッヒ・クロイド
TASKINGツールのサポート

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/AURIX/%E5%85%B3%E4%BA%8EAURIX3G%E5%AF%BB%E5%9D%80%E6%96%B9%E5%BC%8F%E8%B6%85%E8%BF%8716M-%E6%97%A0%E6%B3%95%E6%AD%A3%E7%A1%AELINK%E9%97%AE%E9%A2%98/m-p/648809

0 件の賞賛
Translation_Bot
Community Manager
Community Manager
Community Manager

はい、分かりました。解決策をありがとう!

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/AURIX/%E5%85%B3%E4%BA%8EAURIX3G%E5%AF%BB%E5%9D%80%E6%96%B9%E5%BC%8F%E8%B6%85%E8%BF%8716M-%E6%97%A0%E6%B3%95%E6%AD%A3%E7%A1%AELINK%E9%97%AE%E9%A2%98/m-p/649282

0 件の賞賛
Translation_Bot
Community Manager
Community Manager
Community Manager

答えてくれてありがとう〜分かりました

smartconx_target@Q!w2e3r4t5y6u7i8o9p0||/t5/AURIX/%E5%85%B3%E4%BA%8EAURIX3G%E5%AF%BB%E5%9D%80%E6%96%B9%E5%BC%8F%E8%B6%85%E8%BF%8716M-%E6%97%A0%E6%B3%95%E6%AD%A3%E7%A1%AELINK%E9%97%AE%E9%A2%98/m-p/649303

0 件の賞賛