XCPサバソフトウェアのカスタマズ
金宝app®エクスターナルモードシミュレーション用のXCP通信プロトコルは,クライアント/サーバー方式の通信プロトコルです。既定では,ソフトウェアは次のXCPエクスタナルモドシミュレションをサポトします。
ERT (
ert.tlc
)およびGRT (grt.tlc
)システムタゲットファルを使用して生成されるコドのための開発用コンピュタ上。
カスタムターゲットハードウェアのシステムターゲットファイルがERTまたGRTはシステムターゲットファイルから派生している場合,用意されたAPIを使用してXCPターゲットの接続性を提供できます。XCPエクスタ,ナルモ,ドの制限事項が適用されます。
エクスタ,ナルモ,ドのタ,ゲット接続性ソフトウェアは以下で構成されます。
エクスタナルモド抽象化レヤ
XCPサ,バ,プロトコル層
XCPサ,バ,トランスポ,ト層
XCPプラットフォム抽象化レヤ
エクスタナルモド抽象化レヤ
エクスターナルモードシミュレーション中に仿真软金宝app件と通信するには,ターゲットアプリケーションはエクスターナルモード抽象化レイヤーから関数を呼び出さなければなりません。
ソスコドファルの親フォルダは次のとおりです。
matlabroot \工具箱\编码器\ xcp \ src \ \ ext_mode目标
この層のAPIは包括\ ext_mode.h
で宣言され,src \ xcp_ext_mode.c
で実装されます。
金宝app仿真软件と通信するために,ターゲットアプリケーションはエクスターナルモード抽象化レイヤーで公開されたサービスを使用します。このフローチャートは,仿金宝app真软件との通信を確立するために必要なターゲットアプリケーションの段階を表しています。
次の表は,タ,ゲットアプリケ,ションが各段階で呼び出さなければならない関数を示しています。
段階 | 関数 | 目的 |
---|---|---|
|
エクスタナルモドのコマンドラン引数を抽出する。 | |
|
生成されたS金宝appimulinkモデルコ,ドを初期化する。 | |
エクスタ,ナルモ,ドのタ,ゲット接続性を初期化する。 | ||
|
[実行]ボタンをクリックしたときに作成される,開発用コンピュ.タ.からの開始要求を待機する。 | |
|
|
生成されたS金宝appimulinkモデルコドの1のステップを実行する。 |
モデルのサンプル時間IDの場合,モデルステップ関数によって生成された信号をサンプリングし,開発用コンピューターに送信するために通信プロトコルのトランスポート層にパケットの内容を渡す。 |
||
物理的な通信インターフェイスとのパケットの送受信を行い,選択した通信プロトコルに従ってパケットの内容を処理する。 |
||
主机停止请求或模拟完成 |
エクスターナルモードシミュレーションの停止要求を開発用コンピューターのモデルから受信するかどうかをチェックする。この要求は,[停止]ボタンをクリックしたときに作成される。 |
|
生成されたモデルコ,ドの実行が完了したかどうかをチェックする。 | ||
重置 |
|
生成されたS金宝appimulinkモデルコ,ドを終了する。 |
エクスタ,ナルモ,ドのタ,ゲット接続性を初期状態にリセットする。 |
以下の疑似コード例は,ターゲットアプリケーションでさまざまなフローチャート段階を実装する方法を示しています。运行
段階の間は,エクスタ,ナルモ,ドの実行時環境には少なくとも2のスレッドが必要です。
生成されたモデルコ,ドの実行を行う周期的なスレッド。
エクスタ,ナルモ,ド通信スタックの実行とパケットの送信と受信を行うバックグラウンドスレッド。
疑似コ,ドは,同じ而()
ル,プ内でperiodicThread
とextmodeBackgroundRun
を逐次的に実行することで,マルチスレッドのシミュレ,ションを行います。
/*-------------伪代码示例-------------*/ /*定义周期线程*/ void periodicThread(void){/*运行模型步骤函数*/ modelName_step();/*通知外部模式抽象层周期事件*/ extmodeEvent(PERIODIC_EVENT_ID, currentSimulationTime);} /*目标应用程序的主要函数*/ Main (int argc, char *argv[]) {/*------------- INITIALIZE -------------*/ /*解析外部模式命令行参数*/ extmodeParseArgs(argc, argv);/*初始化模型*/ modelName_initialize();/*初始化外部模式目标连接*/ extmodeInit(extModeInfo, finalSimulationTime);/*-------------主机启动请求-------------*/ /*等待从开发计算机接收到启动请求*/ extmodeWaitForHostRequest(EXTMODE_WAIT_FOREVER);/*------- HOST STOP REQUEST OR SIMULATION COMPLETE -------*/ /*当模拟未完成且未收到停止请求时*/ While (!extmodeSimulationComplete() && !extmodeStopRequested()) {/*------------- RUN -------------*/ periodicThread();extmodeBackgroundRun ();} /*------------- 重置 -------------*/ /* 终止模式* / modelName_terminate ();/*重置外部模式目标连通性*/ extmodeReset(); return 0; }
関数を呼び出すコ,ドを表示するには,[システムタゲットファル]を(ert.tlc)
に設定してXCP通信を使用したエクスタ,ナルモ,ドシミュレ,ションの例を実行します。次に,コ,ドジェネレ,タ,フォルダ,にあるert_main.c
を開きます。
メモ
システムタゲットファルがgrt.tlc
またはGRTベスの場合,コドジェネレタはrt_main.c
を作成し,既定では,内部ファesc escルext_work.h
で定義されたAPIを使用します。ext_mode.h
APIの使用を有効にするには,タ,ゲットアプリケ,ションをビルドする前に以下を実行します。
set_param(模型,“TLCOptions”,“-aExtModeXCPClassicInterface = 0”);
システムタゲットファルがert.tlc
またはertベ,スであり,GenerateSampleERTMain
が“上”
に設定されている場合,コ,ドジェネレ,タ,はert_main.c
を作成し,既定では,ext_mode.h
で定義されたAPIを使用します。ext_work.h
APIの使用を有効にするには,タ,ゲットアプリケ,ションをビルドする前に以下を実行します。
set_param(模型,“TLCOptions”,“-aExtModeXCPClassicInterface = 1”);
XCPサ,バ,プロトコル層
的XCPサーバープロトコル層では,自動化システムと測定システムの国際標準化団体(ASAM)の規格であるASAM MCD-1 XCPに従ってXCPコマンドとデータを解釈します。
ソ,スコ,ドフォルダ,は次のとおりです。
matlabroot \工具箱\编码器\ xcp \ src \ \ src \奴隶\协议目标
XCPサ,バ,トランスポ,ト層
的XCPサーバートランスポート層は,ASAMの仕様に従って通信メディアに対してメッセージを送受信します。
ソ,スフォルダ,は以下のとおりです。
matlabroot \工具箱\编码器\ xcp \ src \目标\ \运输\ src奴隶
XCPプラットフォム抽象化レヤ
XCPプラットフォム抽象化レヤは次のものを提供します。
物理的な通信ンタフェスを通じて生デタを送受信するためのXCPドラaapl . exeバ。
静的なメモリアロケタの実装。
その他のタ,ゲットハ,ドウェア固有の機能。
目标
パッケ,ジを使用してS金宝appimulinkとタ,ゲットハ,ドウェアの間の接続性を指定できます。次のようにして指定します。
XCPドラaapl . exeバ
目标。CommunicationInterface
クラスを使用します。XCPプラットフォム抽象化レヤの他の部分には
目标。XCPPlatformAbstraction
クラスを使用します。
的XCPプラットフォーム抽象化レイヤーを指定しない場合,ソフトウェアで既定のプラットフォーム抽象化レイヤーが使用されます。Linux®、窗户®,およびMacの各プラットフォ,ムがサポ,トされています。詳細にいては,XCPエクスタナルモドシミュレションの接続性のカスタマズを参照してください。
カスタマ化学键ズの例に化学键いては,カスタム抽出化レ▪▪ヤ▪▪の作成を参照してください。
XCPドラaapl . exeバ
XCPドラバは通信チャネルを通じてXCPメッセジを送受信します。エクスターナルモードシミュレーションでは,ビルドプロセスによってドライバーファイルがビルド情報に自動的に追加されます。
XCPドラaapl . exeバrtiostream
APIに基づいています。たとえば,ホストベ,スのエクスタ,ナルモ,ドシミュレ,ションでは以下のrtiostream
ファ@ @ルが使用されます。
matlabroot
\工具箱\编码器\ rtiostream \ src \ rtiostreamtcpip \ rtiostream_tcpip.cmatlabroot
\工具箱\编码器\ rtiostream \ src \ rtiostreamserial \ rtiostream_serial.c
rtiostream
通信チャネルの実装とテストの詳細にいては,以下を参照してください。
通信程序流API(嵌入式编码)
rtiostream
の情報は次のようにして指定します。
接続性に
目标
パッケ,ジを使用する場合は,目标。CommunicationInterface
クラスを使用します。XCPエクスタナルモドシミュレションの接続性のカスタマズを参照してください。目标
パッケ,ジを使用しない場合は,rtiostream
ファ@ @ルをビルド情報オブジェクトに追加します。
詳細にいては,カスタム抽出化レ▪▪ヤ▪▪の作成を参照してください。
メモリアロケタ
的XCPサーバーソフトウェアでは,内部データ構造体を保持するために,可変サイズの連続メモリブロックを動的に割り当てる必要があります。エクスターナルモードシミュレーションでは,ビルドプロセスによってメモリアロケーターファイルがビルド情報オブジェクトに自動的に追加されます。
XCP_MEM_ALIGNMENT
プリプロセッサマクロによるメモリアロケタのアラメントを構成します。次に例を示します。
#定义xcp_mem_align
接続性に目标
パッケ,ジを使用する場合は,目标。XCPPlatformAbstraction
クラスのBuildDependencies
プロパティを使用します。次に例を示します。
xcpplatformabstract . builddependencies . definitions = {“XCP_MEM_ALIGNMENT = 8”};
その他のプラットフォム抽象化レヤの機能
スが定義されます。
matlabroot \工具箱\编码器\ xcp奴隶\ \ src \目标\ \包括\ xcp_platform.h平台
以下の表では,ターゲットハードウェアで展開するXCPサーバーソフトウェアに提供しなければならない機能について説明します。
機能 | 詳細 |
---|---|
相互排除 |
“相互排除“サポートを使用してシステムのデータ構造にアクセスするために,XCPドライバーは基本APIに依存して定義,初期化,ロックおよびロック解除を行います。 タ,ゲットハ,ドウェアの相互排除をサポ,トするには,カスタム実装を提供します。 LinuxおよびWindowsの既定の実装では,相互排除がサポ,トされています。 #if defined(_WIN32) || defined(__WIN32__) || defined(WIN32)…#define XCP_MUTEX_DEFINE(lock) HANDLE lock #define XCP_MUTEX_INIT(lock) lock = CreateMutex(0, FALSE, 0) #define XCP_MUTEX_LOCK(lock) WaitForSingleObject((lock), INFINITE) #define XCP_MUTEX_UNLOCK(lock) ReleaseMutex(lock) #else…#include |
スリプ | 指定された時間が経過するまで呼び出しスレッドスリ,プを作成するスリ,プAPIを提供します。LinuxおよびWindowsシステムの既定の実装は次のとおりです。 #if defined(_WIN32) || defined(__WIN32__) || defined(WIN32)…#定义XCP_SLEEP(seconds,microseconds) Sleep((seconds) * 1000 \ + (((microseconds) + 1000 - 1) / 1000)) #else…#if _POSIX_C_SOURCE >= 199309L #定义XCP_SLEEP(seconds,microseconds) do {struct timespec t;\ t.tv_sec = seconds;T.tv_nsec =微秒* 1000;nanosleep(&t, NULL);} while(0) #else /* nanosleep不可用请改用select。*/ #定义XCP_SLEEP(秒,微秒)do {struct timeval t;\ T.tv_sec =秒;\ t.tv_usec =微秒;select(0, NULL, NULL, NULL, &t);} while(0) #endif /* _POSIX_C_SOURCE >= 199309L */…# endif |
ログ |
診断メッセージを生成するために,XCPサーバーソフトウェアにはターゲットハードウェアによって提供されるログサービスをサポートするカスタム出力APIが必要です。 |
アドレス変換 |
的XCP標準は,メモリ内の変数のアドレスを32ビットのアドレスと8ビット拡張として表します。 的XCPクライアントは,ビルドプロセスによって作成されるデバッグ情報を解析して,モデルの信号およびパラメーターのアドレスを抽出します。デバッグ情報は侏儒または配电盒形式です。 XCPクラaapl . exeアントは,引数
#if defined(__MINGW32__) || defined(__MINGW64__) #define XCP_ADDRESS_GET(addressExtension, address) \ (uint8_T*) ((uintptr_t) address) #else #define XCP_ADDRESS_GET(addressExtension, address) \ (uint8_T*) ((address) + (uint8_T*)&__ImageBase) #endif addressExtension は0です。 |
メモリの設定およびコピ |
メモリのコピ,操作およびメモリの設定操作の最適化されたバ,ジョンを指定できます。
# XCP_MEMCPY #定义XCP_MEMCPY memcpy #endif # |
コマンドラ@ @ン引数の解析 |
ターゲットハードウェアでコマンドライン引数の解析がサポートされていない場合,プリプロセッサマクロ
set_param(modelName, 'OnTargetWaitForStart', 'on'); -DON_TARGET_WAIT_FOR_START = 1 )をコンパleiラに提供します。 |
構造体のパッキングと配置 |
XCPソフトウェアスタックの実装では,c構造体のパッキングと配置が必要です。プラットフォーム抽象化レイヤーでは,コンパイラ固有のプリプロセッサ命令を使用してパッキングと配置の情報を提供します。 C構造体をパッキングおよび配置するために,以下のプリプロセッサ命令を提供します。 #define XCP_PRAGMA_PACK_BEGIN(n) #define XCP_PRAGMA_PACK_END() #define XCP_ATTRIBUTE_ALIGNED(n) #define xcp_attribute_wrapped XcpSetDaqListModeCmdPacketFrame {uint8_T PID;/*包标识符,总是XCP_PID_SET_DAQ_LIST_MODE */ uint8_T模式;/* DAQ列表模式(XCP DAQ模式位掩码)*/ uint16_T daqListId;/* DAQ列表Id */ uint16_T eventId;/*事件通道号*/ uint8_T prescaler;/*传输速率预分级*/ uint8_T优先级;/* DAQ列表优先级(0xFF -> highest) */} XcpSetDaqListModeCmdPacketFrame;XCP_PRAGMA_PACK_END() XCP_PRAGMA_PACK_BEGIN(XCP_MEM_ALIGNMENT) struct XCP_ATTRIBUTE_ALIGNED(XCP_MEM_ALIGNMENT) xcpFifoEntry {struct xcpFifoEntry *next;size_t msgFrameSize;/*在AG单元*/}; XCP_PRAGMA_PACK_END() GCCコンパaapl . exeラでは,以下の命令を使用します。 #define XCP_PRAGMA_PACK_BEGIN(n) #define XCP_PRAGMA_PACK_END() #define XCP_ATTRIBUTE_ALIGNED(n) __attribute__((aligned(n))) #define xcp_attribute__ ((wrapped)) 微软®Visual c++®コンパesc escラでは,以下の命令を使用します。 #define PRAGMA(n) _Pragma(#n) #define XCP_PRAGMA_PACK_BEGIN(n) PRAGMA(pack(push, n)) #define XCP_PRAGMA_PACK_END() PRAGMA(pack(pop)) #define XCP_ATTRIBUTE_ALIGNED(n) #define xcp_attribute_wrapped |
カスタム抽出化レ▪▪ヤ▪▪の作成
カスタムプラットフォム抽象化レヤを作成するには,以下を実行します。
ヘッダファル
xcp_platform_custom.h
を指定します。このLinuxの例では必要な関数が定義されます。# XCP_PLATFORM_CUSTOM_H #define XCP_PLATFORM_CUSTOM_H /* XCP_ADDRESS_GET */ #include
#define XCP_ADDRESS_GET(addressExtension, address) (uint8_T*) ((uintptr_t) address) /* XCP_MUTEX */ #include #define XCP_MUTEX_DEFINE(lock) pthread_mutex_t lock #define XCP_MUTEX_INIT(&(lock),NULL) #define XCP_MUTEX_LOCK(lock) pthread_mutex_lock(&(lock)) #define XCP_MUTEX_UNLOCK(lock) pthread_mutex_unlock(&(lock)) /* XCP_SLEEP */ #include /* gettimeofday */ #if _POSIX_C_SOURCE >= 199309L #include /* for nanosleep */ #else #include #include /* for select */ #endif /* _POSIX_C_SOURCE >= 199309L */ #if _POSIX_C_SOURCE >= 199309L #define XCP_SLEEP(seconds,microseconds) do {struct timespec t;\ t.tv_sec = seconds;T.tv_nsec =微秒* 1000;nanosleep(&t, NULL);} while(0) #else /* nanosleep不可用请改用select。*/ #定义XCP_SLEEP(秒,微秒)do {struct timeval t;\ T.tv_sec =秒;\ t.tv_usec =微秒;select(0, NULL, NULL, NULL, &t);} while(0) #endif /* _POSIX_C_SOURCE >= 199309L */ #endif . # ヘッダファルを登録します。
接続性に
目标
パッケ,ジを使用する場合は,目标。XCPPlatformAbstraction
クラスのBuildDependencies
プロパティを使用して必要な情報を指定します。XCPエクスタナルモドシミュレションの接続性のカスタマズを参照してください。接続性に
目标
パッケ,ジを使用しない場合は,コ,ド生成後のコマンドを定義します。函数myXCPTargetPostCodeGenCommand buildInfo buildInfo.addDefines (“-DXCP_CUSTOM_PLATFORM”,“选择”);添加我的rtiostreambuildInfo.addSourceFiles (customRtIOStreamFileName...customRtIOStreamSrcPath);%如果目标硬件不支持解析命令金宝app% line参数buildInfo.addDefines (“-DEXTMODE_DISABLE_ARGS_PROCESSING”,“选择”);结束
参考
extmodeBackgroundRun
|extmodeEvent
|extmodeGetFinalSimulationTime
|extmodeInit
|extmodeParseArgs
|extmodeReset
|extmodeSetFinalSimulationTime
|extmodeSimulationComplete
|extmodeStopRequested
|extmodeWaitForHostRequest
関連するトピック
- エクスターナルモードシミュレーションによるパラメーター調整,信号監視,コード実行プロファイリング
- XCP通信を使用したエクスタ,ナルモ,ドシミュレ,ション
- 金宝appSimulinkとタ,ゲットハ,ドウェアの間のエクスタ,ナルモ,ドの接続性の設定