チュートリアル
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 );
・・・