主要内容

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真软件との通信を確立するために必要なターゲットアプリケーションの段階を表しています。

次の表は,タ,ゲットアプリケ,ションが各段階で呼び出さなければならない関数を示しています。

段階 関数 目的

初始化

extmodeParseArgs

エクスタナルモドのコマンドラン引数を抽出する。

modelName_initialize

生成されたS金宝appimulinkモデルコ,ドを初期化する。

extmodeInit

エクスタ,ナルモ,ドのタ,ゲット接続性を初期化する。

主机启动请求

extmodeWaitForHostRequest

[実行]ボタンをクリックしたときに作成される,開発用コンピュ.タ.からの開始要求を待機する。

运行

modelName_step

生成されたS金宝appimulinkモデルコドの1のステップを実行する。

extmodeEvent

モデルのサンプル時間IDの場合,モデルステップ関数によって生成された信号をサンプリングし,開発用コンピューターに送信するために通信プロトコルのトランスポート層にパケットの内容を渡す。

extmodeBackgroundRun

物理的な通信インターフェイスとのパケットの送受信を行い,選択した通信プロトコルに従ってパケットの内容を処理する。

主机停止请求或模拟完成

extmodeStopRequested

エクスターナルモードシミュレーションの停止要求を開発用コンピューターのモデルから受信するかどうかをチェックする。この要求は,[停止]ボタンをクリックしたときに作成される。

extmodeSimulationComplete

生成されたモデルコ,ドの実行が完了したかどうかをチェックする。
重置

modelName_terminate

生成されたS金宝appimulinkモデルコ,ドを終了する。

extmodeReset

エクスタ,ナルモ,ドのタ,ゲット接続性を初期状態にリセットする。

以下の疑似コード例は,ターゲットアプリケーションでさまざまなフローチャート段階を実装する方法を示しています。运行段階の間は,エクスタ,ナルモ,ドの実行時環境には少なくとも2のスレッドが必要です。

  • 生成されたモデルコ,ドの実行を行う周期的なスレッド。

  • エクスタ,ナルモ,ド通信スタックの実行とパケットの送信と受信を行うバックグラウンドスレッド。

疑似コ,ドは,同じ而()ル,プ内でperiodicThreadextmodeBackgroundRunを逐次的に実行することで,マルチスレッドのシミュレ,ションを行います。

/*-------------伪代码示例-------------*/ /*定义周期线程*/ 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.hAPIの使用を有効にするには,タ,ゲットアプリケ,ションをビルドする前に以下を実行します。

set_param(模型,“TLCOptions”“-aExtModeXCPClassicInterface = 0”);

システムタゲットファルがert.tlcまたはertベ,スであり,GenerateSampleERTMain“上”に設定されている場合,コ,ドジェネレ,タ,はert_main.cを作成し,既定では,ext_mode.hで定義されたAPIを使用します。ext_work.hAPIの使用を有効にするには,タ,ゲットアプリケ,ションをビルドする前に以下を実行します。

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プラットフォム抽象化レヤは次のものを提供します。

目标パッケ,ジを使用してS金宝appimulinkとタ,ゲットハ,ドウェアの間の接続性を指定できます。次のようにして指定します。

  • XCPドラaapl . exeバ目标。CommunicationInterfaceクラスを使用します。

  • XCPプラットフォム抽象化レヤの他の部分には目标。XCPPlatformAbstractionクラスを使用します。

的XCPプラットフォーム抽象化レイヤーを指定しない場合,ソフトウェアで既定のプラットフォーム抽象化レイヤーが使用されます。Linux®、窗户®,およびMacの各プラットフォ,ムがサポ,トされています。詳細にいては,XCPエクスタナルモドシミュレションの接続性のカスタマズを参照してください。

カスタマ化学键ズの例に化学键いては,カスタム抽出化レ▪▪ヤ▪▪の作成を参照してください。

XCPドラaapl . exeバ

XCPドラバは通信チャネルを通じてXCPメッセジを送受信します。エクスターナルモードシミュレーションでは,ビルドプロセスによってドライバーファイルがビルド情報に自動的に追加されます。

XCPドラaapl . exeバrtiostreamAPIに基づいています。たとえば,ホストベ,スのエクスタ,ナルモ,ドシミュレ,ションでは以下のrtiostreamファ@ @ルが使用されます。

  • matlabroot\工具箱\编码器\ rtiostream \ src \ rtiostreamtcpip \ rtiostream_tcpip.c

  • matlabroot\工具箱\编码器\ rtiostream \ src \ rtiostreamserial \ rtiostream_serial.c

rtiostream通信チャネルの実装とテストの詳細にいては,以下を参照してください。

rtiostreamの情報は次のようにして指定します。

詳細にいては,カスタム抽出化レ▪▪ヤ▪▪の作成を参照してください。

メモリアロケタ

的XCPサーバーソフトウェアでは,内部データ構造体を保持するために,可変サイズの連続メモリブロックを動的に割り当てる必要があります。エクスターナルモードシミュレーションでは,ビルドプロセスによってメモリアロケーターファイルがビルド情報オブジェクトに自動的に追加されます。

XCP_MEM_ALIGNMENTプリプロセッサマクロによるメモリアロケタのアラメントを構成します。次に例を示します。

#定义xcp_mem_align

接続性に目标パッケ,ジを使用する場合は,目标。XCPPlatformAbstractionクラスのBuildDependenciesプロパティを使用します。次に例を示します。

xcpplatformabstract . builddependencies . definitions = {“XCP_MEM_ALIGNMENT = 8”};
XCPエクスタナルモドシミュレションの接続性のカスタマズを参照してください。

その他のプラットフォム抽象化レヤの機能

スが定義されます。

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  #define XCP_MUTEX_DEFINE(lock) pthread_mutex_t lock #define XCP_MUTEX_INIT(lock) pthread_mutex_init(&(lock), NULL) #define XCP_MUTEX_LOCK(lock) pthread_mutex_lock(&(lock)) #define XCP_MUTEX_UNLOCK(lock) pthread_mutex_unlock(&(lock))…# endif

スリプ

指定された時間が経過するまで呼び出しスレッドスリ,プを作成するスリ,プ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_PRINTFプリプロセッサマクロを定義しない場合,既定の実装は空です。

アドレス変換

的XCP標準は,メモリ内の変数のアドレスを32ビットのアドレスと8ビット拡張として表します。

的XCPクライアントは,ビルドプロセスによって作成されるデバッグ情報を解析して,モデルの信号およびパラメーターのアドレスを抽出します。デバッグ情報は侏儒または配电盒形式です。

XCPクラaapl . exeアントは,引数addressExtensionおよび地址を含むXCPコマンドを送信して,パラメ,タ,および信号へのアクセスを要求します。

addressExtensionおよび地址の情報がターゲットハードウェアによって受信されると,XCPサーバーはアドレスをターゲットハードウェアのメモリ内の変数の位置に変換しなければなりません。変数の位置はロ,ダ,によって割り当てられ,タ,ゲット固有です。

XCP_ADDRESS_GET ()マクロを使用して変換ロジックを指定します。LinuxおよびWindows システムの既定の実装は次のとおりです。

#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
現在,32ビットのハ,ドウェアア,キテクチャのみがサポ,トされているため,addressExtensionは0です。

メモリの設定およびコピ

メモリのコピ,操作およびメモリの設定操作の最適化されたバ,ジョンを指定できます。

XCP_MEMCPYおよびXCP_MEMSETプリプロセッサマクロを定義しないと,既定の実装では標準c関数memcpyおよびmemsetが指定されます。

# XCP_MEMCPY #定义XCP_MEMCPY memcpy #endif #

コマンドラ@ @ン引数の解析

ターゲットハードウェアでコマンドライン引数の解析がサポートされていない場合,プリプロセッサマクロEXTMODE_DISABLE_ARGS_PROCESSINGを定義します。

- wオプションを置き換えるために,このコマンドを使用して仿金宝app真软件から接続メッセージを受け取るまでターゲットアプリケーションが待機状態に移行したままになることを指定できます。

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

カスタム抽出化レ▪▪ヤ▪▪の作成

カスタムプラットフォム抽象化レヤを作成するには,以下を実行します。

  1. ヘッダファル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 . #

  2. ヘッダファルを登録します。

    • 接続性に目标パッケ,ジを使用する場合は,目标。XCPPlatformAbstractionクラスのBuildDependenciesプロパティを使用して必要な情報を指定します。XCPエクスタナルモドシミュレションの接続性のカスタマズを参照してください。

    • 接続性に目标パッケ,ジを使用しない場合は,コ,ド生成後のコマンドを定義します。

      函数myXCPTargetPostCodeGenCommand buildInfo buildInfo.addDefines (“-DXCP_CUSTOM_PLATFORM”“选择”);添加我的rtiostreambuildInfo.addSourceFiles (customRtIOStreamFileName...customRtIOStreamSrcPath);%如果目标硬件不支持解析命令金宝app% line参数buildInfo.addDefines (“-DEXTMODE_DISABLE_ARGS_PROCESSING”“选择”);结束

参考

|||||||||

関連するトピック

外部のWebサ电子邮箱ト