wiki:epics/streamdevice/tracemask

Version 3 (modified by obina, 7 years ago) (diff)

--

asynSetTracemask の指定について

PDF文書にも記載していますが、ioc shell 上でデバッグする際に どのようなメッセージが行き来しているかをみることは重要です。

正式なドキュメントは本家のサイト http://www.aps.anl.gov/epics/modules/soft/asyn/ からasynDriverへのリンクを参照してください。

書式

asynSetTraceMask(portName,addr,mask)
asynSetTraceIOMask(portName,addr,mask)

定義は公式ドキュメントのTrace Interfaceの項か、ソース ${EPICS_BASE}/../modules/soft/asyn/[ver]/asyn/asynDriver/asynDriver.h を参照。 (バージョンによって違いがあり、下の例はR4-31)

Trace Interface

/*asynTrace is implemented by asynManager*/
/*All asynTrace methods can be called from any thread*/
/* traceMask definitions*/
#define ASYN_TRACE_ERROR     0x0001
#define ASYN_TRACEIO_DEVICE  0x0002
#define ASYN_TRACEIO_FILTER  0x0004
#define ASYN_TRACEIO_DRIVER  0x0008
#define ASYN_TRACE_FLOW      0x0010
#define ASYN_TRACE_WARNING   0x0020

/* traceIO mask definitions*/
#define ASYN_TRACEIO_NODATA 0x0000
#define ASYN_TRACEIO_ASCII  0x0001
#define ASYN_TRACEIO_ESCAPE 0x0002
#define ASYN_TRACEIO_HEX    0x0004

デフォルトでは TraceMask が 0x1, TraceIOMask が 0x0 になっているので、 エラーが出たときのみログが表示されるようになっている。

使用例: iocsh上での操作

お勧めは

  • 通常時はデフォルトのまま
    asynSetTraceMask(PS1, 0, 0x1)
    asynSetTraceIOMask(PS1, 0, 0x0)
    
  • デバッグ時には traceError と traceIODriver を有効にして
    asynSetTraceMask(PS1, 0, 0x9)
    asynSetTraceIOMask(PS1, 0, 0x4)
    

としておけば、バイナリ列がどのように行き来しているか分かる。(ASCIIで読みたいときにはIOMaskを0x1に)

とにかく全部見たい場合、まずは

asynSetTraceMask(PS1, 0, -1)
asynSetTraceIOMask(PS1, 0, -1)

とかやっても良いです(後で適切なマスクにした方が幸せになれます)。

使用例: AsynRecord GUI

デバッグ用にもともと用意されているレコード類を使うことも便利です。

まずはスタートアップスクリプト st.cmd 内の iocInit より前の位置において

cd $(ASYN)
dbLoadRecords("db/asynRecord.db","P=asyn,R=Test,PORT=PS1,ADDR=0,IMAX=0,OMAX=0")

cd ${TOP}/iocBoot/${IOC}
iocInit

とします。そしてGUIの起動は例えば

medm -x -macro "P=asyn,R=Test" /pf/epics/R315.5/modules/soft/asyn/4-31/opi/medm/asynRecord.adl

のように直接指定すれば良いです(バージョンは使っているioc, asyn と合わせたほうが無難です)。 CSS BOY, medm, edm のGUIが用意されていますので、お好きなモノをお使いください。最新の asyn(R4-31) ではcaqtdm ファイルもあります。

注:PF内でやる場合、他の人とレコード名が衝突しないよう、P=の引数は 自分の名前+asynにするようにしてください。