付録A INtime C 言語アプリケーションソースコードの一部抜粋

付録A INtime C 言語アプリケーションソースコードの一部抜粋
void inALL(DWORD BaseAddr, WORD* Inbuf)
{
Inbuf[0] = inhword(BaseAddr+(0*2));
Inbuf[1] = inhword(BaseAddr+(1*2));
Inbuf[3] = inhword(BaseAddr+(3*2));
Inbuf[4] = inhword(BaseAddr+(4*2));
}
void outALL(DWORD BaseAddr, WORD* Outbuf)
{
outhword(BaseAddr+(5*2), Outbuf[5]);
outhword(BaseAddr+(6*2), Outbuf[6]);
outhword(BaseAddr+(7*2), Outbuf[7]);
outhword(BaseAddr+(8*2), Outbuf[8]);
}
/*タイマスレッド------void TIME(timesem *TimeEve)
{
DWORD Dsta;
while(1)
{
/*Phase1: スタートを待つ-----------------*/
WaitForRtSemaphore(TimeEve->S_Sem, 1, WAIT_FOREVER);
/*Phase2: 時間のカウント & キャンセル受け入れ---------*/
Dsta = WaitForRtSemaphore(TimeEve->C_Sem, 1, 5000);
if(Dsta != WAIT_FAILED) {
//キャンセル発生
continue;
/*Phase3: タイマ満了時の処理------else if(0x0001 == GetLastRtError())
{
// タイマイベント送信
ReleaseRtSemaphore(TimeEve->Comp_Sem, 1);
}
}
}
/*メインロジック------void main(void)
{
/*タイマ処理を行うスレッド生成----------------------------------*/
TimeH0 = CreateRtThread(PRIO, TIME, 4096, &TimeEve[0]);
while(1)
{
RtSleepEx(1); //1ms 周期
// (2) デバイスから情報読み込み
inALL(BaseAddr, Inbuf);
// (3) 単純コピー処理
Outbuf[5] = Inbuf[0];
Outbuf[6] = Inbuf[1];
p. 1
Outbuf[7] = Inbuf[3];
Outbuf[8] = Inbuf[4];
// (4) タイマ&カウンタ動作スイッチ取得
bit_Enable
= Getrelay(Inbuf[2], 11);
// (5) タイマ処理
for(i=0;i<5;i++)
{
bit_var = Getrelay(Inbuf[2], i);
if(bit_var == 0x0001) // タイマ条件を満了
{
// タイマスタート
ReleaseRtSemaphore(TimeEve[i].S_Sem, 1);
}
}
//(7) CH2 の 14 ビット目を、CH2 の 12 ビット目にコピー
if(Getrelay(Inbuf[2],14))
Outbuf[2] |= 0x1000;
else
Outbuf[2] &= 0xEFFF;
//(8) CH2 の 15 ビット目を、CH2 の 11 ビット目にコピー
if(Getrelay(Inbuf[2],15))
Outbuf[2] |= 0x800;
else
Outbuf[2] &= 0xF7FF;
//(9) CH10 ~ 13or16or20 の 1 ビット目(反転)をコピー
for(i=10;i<=13;i++)
{
if( !Getrelay(Inbuf[i],0) )
Outbuf[i] = 0xFFFF;
else
Outbuf[i] = 0x0000;
}
// (11) デバイスに書き込み
outALL(BaseAddr, Outbuf);
p. 2