Community Translation - Placing Functions at Specific Flash Address to Conform to IEC 60730 Class B Tests - KBA230832

Tip / Sign in to post questions, reply, level up, and achieve exciting badges. Know more

cross mob
keni_4440091
Level 7
Level 7
500 replies posted 100 solutions authored 50 solutions authored

Hi

I want to translate KBA230832, please confirm to my work.

Regards,

Nino

0 Likes
2 Replies
JennaJo
Moderator
Moderator
Moderator
1000 replies posted 750 replies posted 500 replies posted

Hi, Nino-san

Confirm to work this KBA.

Thanks,

Jenna

Jenna Jo
0 Likes

タイトル:IEC 60730クラスBテスト準拠のための特定Flashアドレスでの関数の配置 - KBA230832

バージョン 2

ChaitanyaV_61 2020/07/19 23:36 に作成。ChaitanyaV_61 2020/07/19 23:37 に変更。

Author: AH_96        Version: **

質問:

Arm® GCCでコンパイルする場合、大きなアプリケーションコードにおいて要求されるアドレスに、どのようにプログラムカウンター関数を配置しますか?

回答:

この資料は下記のアプリケーションノートを参照した事を前提としています:AN89056 - PSoC® 4 - IEC 60730 Class B and IEC 61508 SIL Safety Software Library およびAN89610 - PSoC® 4 and PSoC 5LP Arm® Cortex® Code Optimization AN89056およびAN89610で記述されているIEC 60730規格では、ビットにいくつかのパターンと共に絶対アドレスを持つわずかな関数を要求します (それは、下位ビットは0x15555または0xaaaaのような0b0101でなければいけません)。しかし、時おりコードサイズはこれよりも大きく、かつオーバーラップを起こす事があります。この場合、ユーザーは手動で配置した関数とカスタムリンカースクリプトを記述する必要があります。

下記の手順は正しいアドレスで配置された関数とカスタムリンカースクリプトの作成方法を示しています:

  1. カスタムリンカースクリプトを生成する手順:
    1. 作成したリンカースクリプトでプロジェクトをビルドします。
    2. 作成したリンカースクリプトファイルをコピーします。例えば、project_folder<project_folder>\Generated_Source\cm0plusgcc.ldを。cm0plusgccは例として選択されています。リンカースクリプトの実際の名前は、選択されているデバイスのCPUに依存します。
    3. Project > Build Settings > ARM GCC <version> > Linker > General > Custom Linker Scriptをクリックし、前の手順でプロジェクトフォルダにコピーしたリンカースクリプトを選択します。

  2. カスタムリンカースクリプトが準備できたら、nmプログラムで使用するシンボルを生成します。GNU nmプログラムはオブジェクトファイルからシンボルを列記します。PSoC
Creator
でバンドルされるGCCに関して、初期設定場所はC:\Program Files (x86)\Cypress\PSoC Creator\<PSoC Creator Version>\PSoC Creator\import\gnu\arm\<arm
version installed>\bin\arm-none-eabi-nm.exe
になります。これはnmプログラムへのパスになります。

  3. コードセクションシンボルのリストを生成するこれらの手順に従って下さい:

a. コマンドプロンプトを開き、ディレクトリを、.hexおよび.elfファイルが保存されているフォルダであるプロジェクト出力フォルダに変更します。ここへの標準パスは\<ProjectName>.cydsn\CortexM0\ARM_GCC_541\Debug\です。

b. ランコマンド: "<path to nm>\arm-none-eabi-nm.exe" -a -n <ProjectName>.elf >[RMB1] [AH2] [GKK3] <ProjectName>.defsym

注意: <ProjectName>.elfの後ろの“>” シンボルは<ProjectName>.defsymと呼ばれる新しいファイルの出力を生成するために追加されます。

c. 下記のコマンドで<ProjectName>.defsymからコードセクションシンボルのみを選択します:

findstr "\<T\> \<t\>" <ProjectName>.defsym > <ProjectName>.defsym.code.

pastedImage_10.png

  4. 多重ラインが修正可能で、かつ置き換えダイアログの“\r” および“\n”のような拡張シンボルの使用が可能なnotepad++のような拡張されたテキストエディタの中の<ProjectName>.defsym.codeファイルを開きます。

  5 . ファイル内の最初の文字の前の位置にテキストポインタを移動させます。Alt+Shift (notepad++では)を押した状態でPage DownまたはArrow Downボタンを何度か押してファイルの全てのラインの修正を開始します。

  6. テキストポインタがファイルの最後の空でない行に移動した時に、Alt+Shiftボタンを離します。

  7. 下記のスクリーンショットに示すように、エディターの最初の列のシンボル名の最初の文字に一致するまで削除ボタンを押します。

pastedImage_15.png

  8. 多重ライン編集モードでKEEP(*(*と書き込むと、すべての選択されたラインの開始でKEEP(*(*となります。

pastedImage_20.png

  9. 下記のこれらの手順で、ファイル内の全ての空でないラインの終わりに))を入れます。

a. 置換シートカットキー(notepad++ではClrt+H)またはメニューコマンド検索>置換を押します。

b. 置換ダイアログの検索フィールドで、最終ラインに応じて\r\n、または\nと書きます。(Windowsの初期設定は“\r\n”

c. 置換フィールドに))\r\nまたは ))\nと書きます。

d. 拡張(\n, \r, \0 …)検索モードnotepad++)として選択されることを確認して下さい。

e. 全て置換をクリック。

  10. シンボルcyfitter_cfgのラインを探して下さい。

  11. このラインの上のラインを削除して下さい。(ファイルの最初から、このラインを除くこのラインまでのライン)

pastedImage_29.png

  12. 特定のアドレスに配置される必要があるシンボル名のラインを探します。クラスBテストでは、シンボル名はSelfTest_PCAAAA およびSelfTest_PC5555です。これらをファイルの最終ラインに移動します。

  13. 手順1で生成したカスタムリンカースクリプトファイルにこのファイルの全ての内容をコピーします。これはテキスト= MAX(., 0x100)を含んだラインの後に配置する必要があります; リンカースクリプトの.text領域内。

pastedImage_36.png  14. プロジェクトをクリーンし、ビルドします。

  15. 新しいシンボルリストファイル<ProjectName>.defsym.codeを生成するために手順3を繰り返します。

  16. 生成された<ProjectName>.defsym.codeファイルで、0xAAAAよりも低い、一番高いアドレスのシンボルを探してください。

pastedImage_44.png

この場合、func12A1E4のアドレスになります。従って、SelfTest_PCAAAA関数はこの関数より前に配置される必要があります。

  17. カスタムリンカースクリプトを開き、手順16で述べたシンボルを含むラインの前に. = MAX(., 0xAAAA);を挿入します。

  18. KEEP(*(*SelfTest_PCAAAA))テキストのラインを削除し、手順17で述べたラインの後にそれを挿入します。

pastedImage_51.png

  19. プロジェクトをクリーンし、ビルドします。

  20. 新しいシンボルリストファイル<ProjectName>.defsym.codeを生成するために手順3を繰り返します。

  21. 0x15555よりも低い、一番高いアドレスのシンボルを探します。

  22. カスタムリンカースクリプトを開き、手順21で述べたシンボルを含むラインの前に. = MAX(., 0x15555);を挿入します。

  23. KEEP(*(*SelfTest_PC5555))テキストのラインを削除し、手順22で述べたラインの後にそれを挿入します。

  24. プロジェクトをクリーンし、ビルドします。そして、SelfTest_PCAAAAおよびSelfTest_PC5555が適切なアドレスに配置されている事を確認します。

10 閲覧 カテゴリ: MCU & PSoC: PSoC 4  タグ: class b, iec 60730

0 Likes