チュートリアル

サンプルドライバ内で使用している関数について説明します。

DT10ではテストポイント(マクロ)を通過すると、ドライバ関数『_TP_BusOut()関数』が呼ばれ、
通過情報(引数dat・addr)を出力する仕組みになっています。
(addrはソースファイルの識別番号、datはソースファイル内でのテストポイントの通し番号です。)

_TP_BusOut 関数

テストポイントが通過した際に呼び出される関数です。
関数内では、ポートの初期化関数やクリティカルセクションを制御する関数、引数addr・datを出力する関数を呼び出しています。

例) GPIO接続用サンプルドライバ

void _TP_BusOut( DT_UINT addr, DT_UINT dat )
{
   portInit();
   enterCritical();
   _TP_BusOutDrv( addr, dat );
   exitCritical();
}

_TP_BusOutDrv 関数

テストポイントの通過情報出力を制御する関数です。
_TP_BusOutDrv関数では、CSをLowにした後、_TP_BusOut関数の引数のdat(16bit)とaddr(24bit)を出力し、CSをHiに戻します。
datとaddrのラッチタイミングは、GPIOの場合はCLKの立ち上がりと立下りの両エッジ、SPIの場合は立ち上がりエッジです。

例) GPIO接続用サンプルドライバ

DT_INLINE void _TP_BusOutDrv( DT_UINT addr, DT_UINT dat )
{
   portSetCS(0);
   _TP_Bus4BitOutDrv( dat >> 12 );
   _TP_Bus4BitOutDrv( dat >> 8 );
   _TP_Bus4BitOutDrv( dat >> 4 );
   _TP_Bus4BitOutDrv( dat );
   addr &= 0xfffff;
   if( addr >= 0x10000 ) _TP_Bus4BitOutDrv( addr >> 16 );
   if( addr >= 0x1000 ) _TP_Bus4BitOutDrv( addr >> 12 );
   if( addr >= 0x0100 ) _TP_Bus4BitOutDrv( addr >> 8 );
   if( addr >= 0x0010 ) _TP_Bus4BitOutDrv( addr >> 4 );
   _TP_Bus4BitOutDrv( addr );
   portSetCS(1);
}

※ _TP_Bus4BitOutDrv関数は、GPIO接続におけるDATポートの出力制御をする関数です。

例) SPI接続用サンプルドライバ

DT_INLINE void _TP_BusOutDrv( DT_UINT addr, DT_UINT dat )
{
   DT_UINT   i, s;
   portSetCLK(1);
   portSetCS(0);
   for( i = 0x8000; i != 0; i >>= 1 )
   {
      _TP_Bus1BitOutDrv( dat & i );
   }
   addr &= 0xfffff;
   if( addr != 0 )
   {
      s = addr >> 1;
      for( i = 1; s != 0; s >>= 1, i <<= 1 );
      for( ; i != 0; i >>= 1 )
      {
         _TP_Bus1BitOutDrv( addr & i );
      }
   }
   portSetCS(1);
}

※ _TP_Bus1BitOutDrv関数は、SPI接続におけるDATポートの出力制御をする関数です。

テストポイントと_TP_BusOut 関数の仕組み

テストポイント挿入時に自動生成されたDT10テストポイント用のヘッダファイル定義を通じて、_TP_BusOut 関数をコールします。

例) テストポイントを挿入したソースファイル

テストポイントを挿入した各ソースファイル毎に、_TP_BusOut 関数宣言を追加する必要はありません。
テストポイントを挿入したソースファイルをコンパイルするときは、DT_(ソースファイル名).hも必要となります。

例) 自動生成されるDTヘッダファイルの内容

__DtEXTERN	void	_TP_BusOut( unsigned int addr, unsigned int dat );
__DtEXTERN	void	_TP_MemoryOutput( unsigned int addr, unsigned int dat, void *value, unsigned int size );
__DtEXTERN	void	_TP_WritePoint( unsigned int addr, unsigned int dat, void *value, unsigned int size );
__DtEXTERN	void	_TP_EventTrigger( unsigned int addr, unsigned int dat, unsigned int event_id );
__DtEXTERN	void	_TP_EventTrigger32( unsigned int addr, unsigned int dat, unsigned int event_id );

/* TestPoint DisableList ---------------------------------------------------*/
#define	__Dt__DtFunc_Task_RGBLED__DtStep_0	/*FuncIn*/	_TP_BusOut( __DtBaseAddress,  0x0000 );
#define	__Dt__DtFunc_Task_RGBLED__DtStep_1	/*while*/	_TP_BusOut( __DtBaseAddress,  0x0001 );
#define	__Dt__DtFunc_Task_RGBLED__DtStep_2	/*if*/	_TP_BusOut( __DtBaseAddress,  0x0002 );
・・・

戻る