TOPPERS/ATK2-SC3 <RH850プロセッサ依存部設計方針(CCRH版)> ---------------------------------------------------------------------- TOPPERS ATK2 Toyohashi Open Platform for Embedded Real-Time Systems Automotive Kernel Version 2 Copyright (C) 2014-2015 by Center for Embedded Computing Systems Graduate School of Information Science, Nagoya Univ., JAPAN 上記著作権者は,以下の (1)〜(3)の条件を満たす場合に限り,本ドキュメ ント(本ドキュメントを改変したものを含む.以下同じ)を使用・複製・改 変・再配布(以下,利用と呼ぶ)することを無償で許諾する. (1) 本ドキュメントを利用する場合には,上記の著作権表示,この利用条件 および下記の無保証規定が,そのままの形でドキュメント中に含まれて いること. (2) 本ドキュメントを改変する場合には,ドキュメントを改変した旨の記述 を,改変後のドキュメント中に含めること.ただし,改変後のドキュメ ントが,TOPPERSプロジェクト指定の開発成果物である場合には,この限 りではない. (3) 本ドキュメントの利用により直接的または間接的に生じるいかなる損害 からも,上記著作権者およびTOPPERSプロジェクトを免責すること.また, 本ドキュメントのユーザまたはエンドユーザからのいかなる理由に基づ く請求からも,上記著作権者およびTOPPERSプロジェクトを免責すること. 本ドキュメントは,AUTOSAR(AUTomotive Open System ARchitecture)仕様 に基づいている.上記の許諾は,AUTOSARの知的財産権を許諾するものではな い.AUTOSARは,AUTOSAR仕様に基づいたソフトウェアを商用目的で利用する 者に対して,AUTOSARパートナーになることを求めている. 本ドキュメントは,無保証で提供されているものである.上記著作権者およ びTOPPERSプロジェクトは,本ドキュメントに関して,特定の使用目的に対す る適合性も含めて,いかなる保証も行わない.また,本ドキュメントの利用 により直接的または間接的に生じたいかなる損害に関しても,その責任を負 わない. $Id: prc_design.txt 164 2015-06-03 01:22:29Z t_ishikawa $ ---------------------------------------------------------------------- ○概要 本ドキュメントでは,GCCからCCRHに向けて変更した設計事項をざっくりと 記録する. ◯ ターゲット定義のセクション カーネルのターゲット依存部が定義するセクション名の対応は下記のとおり であり,prc_mem.yaml|arxmlによって定義する 凡例:gcc依存部でのセクション名 → ccrh依存部でのセクション名 .text_kernel → kernel.text .rodata_kernel → kernel.const .data_kernel → kernel.data .bss_kernel → kernel.bss .srpw_kernel → kernel.srpw.bss .text_shared → shared.text .rodata_shared → shared.const .data_shared → shared.data .bss_shared → shared.bss また,上記セクションが配置されるOSAPは下記のとおり 凡例:OSAP名 - 所属するセクション名 prc_osap_kernel (信頼OSAP) - kernel.text - kernel.const - kernel.data - kernel.bss - kernel.srpw.bss (無所属) - shared.text - shared.const - shared.data - shared.bss また,ジェネレータが自動的に定義するセクション名,具体的にはユーザ スタックのセクション名は下記のとおり. 凡例:gcc依存部でのセクション名 → ccrh依存部でのセクション名 .user_stack. → .user_stack..bss .shared_user_stack. → .shared_user_stack..bss ◯ prc_support.asm まず,v850_gcc/prc_support.S から ccrh/gcc2ccrh.rb によりアセンブリを 生成する. そして,上記セクション名の変換規則に従い,セクション配置指定を変更する. また,ccrhでは,C言語のマクロをアセンブリに取り込めないため,v850asm.inc にマクロ定義を記述する. ※prc_asm.tf で出力する案も考えられる ◯ DEFINE_VAR_SEC_NOBITS(type, var, sec) 非依存部で定義した変数を,特定のセクションに配置するためのマクロである. 現状では,共有リード専有ライトのカーネル変数をセクション配置する目的で のみ使用している. ccrhではpragmaによるセクション配置を行うため,上記マクロではextern宣言 をするように変更し,prc_tool.c で変数の実体の宣言およびセクション配置を 指定する. ※defineマクロにおいてpragmaを展開することはできなかった. ※defineマクロにおいてセクション名を展開することはできなかった. #define SECTION section1 #pragma section SECTION とすると,SECTIONというセクションに配置される ◯ カーネル変数,コードのセクション配置指定 非依存部で定義されている変数および関数などを,kernel.xxxxセクションに 配置するために,Platfrom_Types.hにおいて,kernel_impl.hからincludeされた 場合に,#pragma section kernel を生成するようにした. ここで,cfgのパス1においてkernelセクションに配置されることを防ぐために, ガードをかけている. cfgのパス1では,ccrhデフォルトのセクション配置指定を使用するため,kernel というセクションは存在しない. また,Os_Lcfg.c / kernel_mem.c に生成されるデータや関数もkernelセクション に配置するため,prc.tfにおいて,#pragma section kernel を生成するようにした. ◯ tf ・OsMemoryModuleをサポートしないため,TOPPERS_SUPPORT_ATT_MOD を0にする. ・MPUにセットする番地について,ccrhではセクションの境界を示すラベル名が,  '.'を含むため,C言語で使用することができない(構造体のメンバとして扱わ  れてしまう).そのため,パス2では0をMPU初期化ブロックに出力しておき,  パス4で,メモリオブジェクトとして登録されたセクションのラベル名から  配置アドレスをSYMBOLで取得して,MPU初期化ブロックに出力する. ・ccrhでは,サイズが空のセクションを配置すると,警告を発する.  この警告を回避するために,arxmlで登録されたすべてのセクションに対して,  ダミーのシンボルを生成し,Os_Lcfg_asm.asm に出力する. ・ccrh/ldscript.tf において,CS+でリンクオプションを指定するための  pythonスクリプト,ldscript.pyを出力する.  このpythonスクリプトを実行する方法として,以下の方法を検討した.  (1) パス4とatk2-sc3本体のビルド前にユーザに実行してもらう.   - ユーザの手間になる,実行し忘れによるエラーが起こる可能性もある.  (2) パス4とatk2-sc3本体のビルド前にCS+にプレビルド自動実行してもらう.   - プレビルド時にビルドオプションを書き換えることはできなかったため却下.  (3) CS+にパス2のビルド後にポストビルド自動実行してもらい,パス4と    atk2-sc3本体のプロジェクトファイル(xml)を書き換える.   - パス2のあとに書き換えたプロジェクトファイルを自動で開き直すところで   エラーとなり,ユーザに再度プロジェクトを開き直してもらう必要がある. 現状は(3)で実装している.  本スクリプトでは,セクションの配置順,ROM化するデータセクション,  アライメントするセクションのためのリンクオプションを指定する. ・ccrhでは,出力セクションという概念がなく,入力セクションをメモリ  オブジェクトごとにまとめた出力セクションを生成し,その境界値を取得する  ことで,MPUの設定情報を生成するという従来手法(GCC依存部)が使用できない.  そのため,MPUに設定するアドレスを取得するために,すべてのセクションを  メモリオブジェクトごとに,リンク順にサーチし,始めて見つかった空でない  セクションの開始番地をそのメモリオブジェクトの開始番地として,最後に  見つかった空でないセクションの終了番地をそのメモリオブジェクトの終了  番地としている. ・セクションのラベル名の制約により,kernel_mem.tf における標準のメモリ  オブジェクト初期化ブロックを生成できない.  その部分については,prc_meminib.tf で生成する. ○ TIPS ・sdata/sbss は,pragmaで変数をgp_dispxxセクションに配置すると生成される ・sdata/sbss は,デフォルトではgp相対でアクセスされない.-MApオプションを  つけてリンクした結果出力されるblsファイルを,コンパイルオプション-Omap=  で指定することで,gp相対でアクセスされるコードが生成される.  gp相対を使うのであれば,パス4のビルド時にもgp相対を使うようにビルドすべき  と考えられる.