理化学研究所サイクロトロン研究室
基礎科学特別研究員
1998年 (平成10年)11月5日
ソフトウェアー
このシステムのブロックダイヤグラムを下図に示します。

高速な割込みを実現するため、データ収集プロセスをデバイスドライバーの形で
カーネルに組み込みました。
データ収集プロセス内に無限ループを作ったり、LAMのクリアを忘れた場合には
AT互換機がハングアップすることがあります。注意して下さい。(この場合、CAMAC
の電源を切って下さい。)
データ収集プロセスでは、デバイスドライバーに許されたサブルーチンしか
callできない。浮動小数点計算やファイル制御はできません。
CAMACでLAMが発生すると、インターフェースボードはIRQ(インターラプトリクエスト)
を発生し、割込みルーチン(dc_int.c)に制御を移します。
このルーチンはLAM発生時に行なうCAMACコマンドを書き、読んだデータを
イベントバッファ(最長2キロワード)に書き込みます。
イベントは、デバイスドライバーの64キロワードのバッファーにコピーされ、
ブロック化プロセス(dma_control)からREADコマンドで読まれ、
共有メモリー上に作成した8連の16キロバイトのブロックに書き込まれます。
デバイスドライバーの64キロワードのバッファーが一杯になった場合には、
ブロック化プロセスから読まれるまでデータ収集を停止するようにしています。
ブロック化プロセスは、必要な場合にはブロック毎にファイル又はデバイスに
保存します。
共有メモリーのバッファーは、複数のプロセス(オンラインモニターや状況モニター)
で読むことができます。
ユーザが指定したコマンドは、I/O制御命令を用いてデバイスドライバーに
送られるため、制御用プロセス(COM)が消えても、データ収集系に影響を与えない
ように設計しています。
dc_int_init():初期化時、クリアー時に呼ばれます。
dc_int_start():データ収集開始時に呼ばれます。
dc_int_stop():データ収集終了時に呼ばれます。
dc_int(unsigned short *):LAM信号が入る度に呼ばれます。
dc_int_clear():dc_int終了後と、データ収集開始時、ブロックの終了の
スケーラー読み出し後に呼ばれます。
次の事象を読めるようにシステムをクリアーするために使われます。
dc_intの引き数のbufferには、データを入れて下さい。
buffer[0]には全バッファー長(buffer[0]を含む)を代入して下さい。
このデータは、ブロック化プロセスに渡され、ディスクに書かれ、
解析プロセスで使用されます。
このサブルーチンでは以下のCAMAC制御コマンドが使用できます。
例
#include "camack.c"
#define INPUT_REGISTER 1 /* station number of input register */
#define INPUT_REG_RF 0 /* read function of input register */
#define INPUT_REG_RA 0 /* read sub-address of input register */
#define INPUT_REG_CF 9 /* clear function of input register */
#define INPUT_REG_CA 0 /* clear sub-address of input register */
#define ADC 2 /* station number of ADC */
#define ADC_RF 0 /* read function of ADC */
#define ADC_CF 9 /* clear function of ADC */
#define ADC_CA 0 /* clear sub-address of ADC */
#define SCALER 4 /* station number of scaler */
#define SCALER_RF 0 /* read function for scaler */
#define SCALER_CF 9 /* clear function for scaler */
#define SCALER_CA 0 /* clear sub-address for scaler */
#define OUTPUT_REGISTER 5 /* station number of output register */
#define OUTPUT_REG_F 17 /* write function of output register */
#define OUTPUT_REG_A 0 /* write sub-address of output register*/
#define LAM_N ADC /* LAM source is ADC */
#define LAM_F 26 /* function for enable-LAM */
#define LAM_A 0 /* sub-address for enable-LAM */
static long loop=0,data;
static int stat;
static void dc_int_init(),dc_int_start(),dc_int_stop(),dc_int_clear();
static void dc_int_init()
{
camac_CNAF(0,SCALER,SCALER_CA,SCALER_CF); /* clear scaler */
}
static void dc_int_start()
{
camac_write24(0x0000f0);
camac_CNAF(0,OUTPUT_REGISTER,OUTPUT_REG_A,OUTPUT_REG_F);
/* send signal to output register A=5-8 */
dc_int_clear(); /* clear LAM and modules */
camac_CNAF(0,LAM_N,LAM_A,LAM_F); /* enable LAM */
}
static void dc_int_stop()
{
camac_CNAF(0,LAM_N,LAM_A,24); /* disable LAM */
camac_write24(0x000f00);
camac_CNAF(0,OUTPUT_REGISTER,OUTPUT_REG_A,OUTPUT_REG_F);
/* send signal to output register A=9-12 */
}
static void dc_int_clear()
{
camac_CNAF(0,ADC,ADC_CA,ADC_CF); /* clear data of ADC */
camac_CNAF(0,ADC,ADC_CA,10); /* clear LAM of ADC */
camac_CNAF(0,INPUT_REGISTER,INPUT_REG_CA,INPUT_REG_CF);
/* clear input register */
camac_write24(0x00000f);
camac_CNAF(0,OUTPUT_REGISTER,OUTPUT_REG_A,OUTPUT_REG_F);
/* send signal to output register A=1-4 */
}
static int dc_int(unsigned short buffer[])
{
long j;
loop++;
j=inl(BASE_ADDRESS+4); /* check LAM */
if(j==0){
printk("dc_int: interrupt %d happened, %d, LAM=%lx\n",IRQ,loop,j);
/* write warning for illegal LAM to dmesg */
return(-1); /* return */
}
buffer[0]=8; /* fixed event length (8 words) */
camac_CNAF(0,INPUT_REGISTER,INPUT_REG_RA,INPUT_REG_RF);
buffer[1]=camac_read16(); /* first data is bit pattern of input register*/
camac_CNAF(0,ADC,0,ADC_RF);
buffer[2]=camac_read16(); /* second data is ADC A=0 */
camac_CNAF(0,ADC,1,ADC_RF);
buffer[3]=camac_read16(); /* the third data is ADC A=1 */
camac_CNAF(0,ADC,2,ADC_RF);
buffer[4]=camac_read16(); /* the fourth data is ADC A=2 */
camac_CNAF(0,ADC,3,ADC_RF);
buffer[5]=camac_read16(); /* the fifth data is ADC A=3 */
camac_CNAF(0,SCALER,0,SCALER_RF);
j=camac_read24();
buffer[6]=j&0xffff;
buffer[7]=(j>>16)&0xffff; /* 24 bit write for scaler */
return(0);
}
例
#include "/cern/97a/include/cfortran/cfortran.h"
#include "/cern/97a/include/cfortran/hbook.h"
/* these include files are need for calling HBOOK subroutines
from the C language */
#define HBOOK_SIZE 200000
void analyze_(unsigned short int data[])
{
static int loop=0;
int i,j;
if(loop==0){
HLIMAP(HBOOK_SIZE,"SAMPLE"); /* make global section "SAMPLE"*/
HBOOK1(11,"SSD1R-L",4095,0.5,4095.5,0.0);/* define 1-dim histograms */
HBOOK1(12,"SSD2R-L",4095,0.5,4095.5,0.0);/* see HBOOK manuals in CERN-lib*/
HBOOK1(13,"SSD3R-L",4095,0.5,4095.5,0.0);
HBOOK1(14,"SSD4R-L",4095,0.5,4095.5,0.0);
HBOOK1(15,"SSD5R-L",4095,0.5,4095.5,0.0);
HBOOK1(16,"SSD6R-L",4095,0.5,4095.5,0.0);
HBOOK1(17,"SSD7R-L",4095,0.5,4095.5,0.0);
HBOOK1(18,"SSD8R-L",4095,0.5,4095.5,0.0);
HBOOK1(19,"SSDR-L",4095,0.5,4095.5,0.0);
HBOOK1(21,"SSD1L-L",4095,0.5,4095.5,0.0);
HBOOK1(22,"SSD2L-L",4095,0.5,4095.5,0.0);
HBOOK1(23,"SSD3L-L",4095,0.5,4095.5,0.0);
HBOOK1(24,"SSD4L-L",4095,0.5,4095.5,0.0);
HBOOK1(25,"SSD5L-L",4095,0.5,4095.5,0.0);
HBOOK1(26,"SSD6L-L",4095,0.5,4095.5,0.0);
HBOOK1(27,"SSD7L-L",4095,0.5,4095.5,0.0);
HBOOK1(28,"SSD8L-L",4095,0.5,4095.5,0.0);
HBOOK1(29,"SSDL-L",4095,0.5,4095.5,0.0);
HBOOK1(31,"SSD1R-H",4095,0.5,4095.5,0.0);
HBOOK1(32,"SSD2R-H",4095,0.5,4095.5,0.0);
HBOOK1(33,"SSD3R-H",4095,0.5,4095.5,0.0);
HBOOK1(34,"SSD4R-H",4095,0.5,4095.5,0.0);
HBOOK1(35,"SSD5R-H",4095,0.5,4095.5,0.0);
HBOOK1(36,"SSD6R-H",4095,0.5,4095.5,0.0);
HBOOK1(37,"SSD7R-H",4095,0.5,4095.5,0.0);
HBOOK1(38,"SSD8R-H",4095,0.5,4095.5,0.0);
HBOOK1(39,"SSDR-H",4095,0.5,4095.5,0.0);
HBOOK1(41,"SSD1L-H",4095,0.5,4095.5,0.0);
HBOOK1(42,"SSD2L-H",4095,0.5,4095.5,0.0);
HBOOK1(43,"SSD3L-H",4095,0.5,4095.5,0.0);
HBOOK1(44,"SSD4L-H",4095,0.5,4095.5,0.0);
HBOOK1(45,"SSD5L-H",4095,0.5,4095.5,0.0);
HBOOK1(46,"SSD6L-H",4095,0.5,4095.5,0.0);
HBOOK1(47,"SSD7L-H",4095,0.5,4095.5,0.0);
HBOOK1(48,"SSD8L-H",4095,0.5,4095.5,0.0);
HBOOK1(49,"SSDL-H",4095,0.5,4095.5,0.0);
}
loop++;
i=data[1]&0x07; /* the event data are stored in data */
HF1(11+i,(float)data[2],1.0); /* fill histograms */
HF1(19,(float)data[2],1.0);
HF1(31+i,(float)data[3],1.0);
HF1(39,(float)data[3],1.0);
i=(data[1]>>3)&0x07;
HF1(21+i,(float)data[4],1.0);
HF1(29,(float)data[4],1.0);
HF1(41+i,(float)data[5],1.0);
HF1(49,(float)data[5],1.0);
}
| start |
| carrige-return (or sca ....) |
| stop |
| set | |
| path+filename | たとえば、/data/test |
| open | /data/test.runnoというファイルを開く |
| comment | |
| start | |
| carrige-return (or sca ....) | |
| stop | |
| close | |
| comment |
| set | |
| /dev/device | st0: scsi tape, fd0: floppy (upto 89blocks) |
| open | /dev/st0というファイルが開かれる。 |
| comment | |
| start | |
| carrige-return (or sca ....) | |
| stop | |
| close | |
| comment |
| address | BASE ADDRESS+0 | BASE ADDRESS+4 | BASE ADDRESS+8 | |||
|---|---|---|---|---|---|---|
| BIT | write | read | write | read | write | read |
| 31 | - | - | - | - | - | - |
| 30 | - | - | - | - | - | - |
| 29 | - | - | - | - | - | - |
| 28 | - | - | - | - | - | - |
| 27 | - | - | - | - | - | - |
| 26 | - | - | - | - | - | - |
| 25 | - | - | - | - | - | - |
| 24 | - | - | - | - | - | - |
| 23 | - | - | - | LAM station 24 | data bit 24 | data bit 24 |
| 22 | - | - | - | LAM station 23 | data bit 23 | data bit 23 |
| 21 | - | - | - | LAM station 22 | data bit 22 | data bit 22 |
| 20 | - | - | - | LAM station 21 | data bit 21 | data bit 21 |
| 19 | - | - | - | LAM station 20 | data bit 20 | data bit 20 |
| 18 | - | - | crate Address 04 | LAM station 19 | data bit 19 | data bit 19 |
| 17 | - | - | crate Address 02 | LAM station 18 | data bit 18 | data bit 18 |
| 16 | - | - | crate Address 01 | LAM station 17 | data bit 17 | data bit 17 |
| 15 | - | - | - | LAM station 16 | data bit 16 | data bit 16 |
| 14 | - | - | - | LAM station 15 | data bit 15 | data bit 15 |
| 13 | - | - | station number 16 | LAM station 14 | data bit 14 | data bit 14 |
| 12 | - | - | station number 08 | LAM station 13 | data bit 13 | data bit 13 |
| 11 | - | - | station number 04 | LAM station 12 | data bit 12 | data bit 12 |
| 10 | - | - | station number 02 | LAM station 11 | data bit 11 | data bit 11 |
| 9 | - | - | station number 01 | LAM station 10 | data bit 10 | data bit 10 |
| 8 | - | - | subaddress 08 | LAM station 9 | data bit 09 | data bit 09 |
| 7 | LAM internal | LAM internal | subaddress 04 | LAM station 8 | data bit 08 | data bit 08 |
| 6 | reset | LAM sum | subaddress 02 | LAM station 7 | data bit 07 | data bit 07 |
| 5 | - | online | subaddress 01 | LAM station 6 | data bit 06 | data bit 06 |
| 4 | - | done | function 16 | LAM station 5 | data bit 05 | data bit 05 |
| 3 | enable interrupt | enable interrupt | function 08 | LAM station 4 | data bit 04 | data bit 04 |
| 2 | inhibit | inhibit | function 04 | LAM station 3 | data bit 03 | data bit 03 |
| 1 | initialize | no-X | function 02 | LAM station 2 | data bit 02 | data bit 02 |
| 0 | clear | no-Q | function 01 | LAM station 1 | data bit 01 | data bit 01 |