📄 krcv_mbf.c
字号:
/* ------------------------------------------------------------------------ */
/* Hyper Operating System V4 μITRON4.0慌屯 Real-Time OS */
/* カ〖ネル巴赂攫鼠年盗ヘッダ メッセ〖ジバッファ */
/* */
/* Copyright (C) 1998-2002 by Project HOS */
/* http://sourceforge.jp/projects/hos/ */
/* ------------------------------------------------------------------------ */
#include "knl_mbf.h"
#include "hoslib.h"
static UB kernel_rch_mbf(const T_KERNEL_MBFCB_ROM *mbfcb_rom,
T_KERNEL_MBFCB_RAM *mbfcb_ram); /* 1キャラクタ减慨 */
/* メッセ〖ジバッファからの减慨(カ〖ネル柒婶簇眶) */
ER_UINT kernel_rcv_mbf(
const T_KERNEL_MBFCB_ROM *mbfcb_rom, /* メッセ〖ジバッファコントロ〖ルブロック(ROM婶) */
T_KERNEL_MBFCB_RAM *mbfcb_ram, /* メッセ〖ジバッファコントロ〖ルブロック(RAM婶) */
VP msg) /* 减慨メッセ〖ジを呈羌する黎片戎孟 */
{
T_MKNL_TCB *mtcb;
UINT msgsz;
UINT tmpsz;
INT i;
/* メッセ〖ジ赂哼チェック */
if ( mbfcb_ram->smsgcnt == 0 ) /* メッセ〖ジが痰い眷圭 */
{
/* 流慨略ちタスクチェック */
mtcb = mknl_ref_qhd(&mbfcb_ram->sndque); /* 减慨略ち乖误の黎片タスクを徊救 */
if ( mtcb != NULL )
{
T_KERNEL_MBFDAT *mbfdat;
/* 流慨デ〖タ减け艰り */
mbfdat = (T_KERNEL_MBFDAT *)mtcb->data;
__hos_bcopy(msg, mbfdat->msg, mbfdat->msgsz); /* デ〖タコピ〖 */
/* 流慨タスクの略ちを豺近 */
mknl_rmv_que(mtcb); /* 略ち乖误から猴近 */
mknl_rmv_tmout(mtcb); /* タイムアウト略ち乖误から猴近 */
mknl_wup_tsk(mtcb, E_OK); /* タスクの略ち豺近 */
return (ER_UINT)mbfdat->msgsz; /* 赖撅窗位 */
}
return E_TMOUT; /* タイムアウト */
}
/* サイズ减慨 */
msgsz = 0;
for ( i = 0; i < sizeof(UINT); i++ )
{
/* 惧疤から界に8bitずつ粕み叫し */
msgsz <<= 8;
msgsz += kernel_rch_mbf(mbfcb_rom, mbfcb_ram);
}
/* デ〖タ减慨 */
tmpsz = (UINT)mbfcb_rom->mbfsz - mbfcb_ram->head; /* 擂り手し爬までのサイズを换叫 */
if ( tmpsz >= msgsz ) /* 擂り手し冉年 */
{
__hos_bcopy(msg, (UB *)mbfcb_rom->mbf + mbfcb_ram->head, msgsz); /* デ〖タコピ〖 */
}
else
{
__hos_bcopy(msg, (UB *)mbfcb_rom->mbf + mbfcb_ram->head, tmpsz); /* 擂り手し爬までコピ〖 */
__hos_bcopy((UB *)msg + tmpsz, (UB *)mbfcb_rom->mbf, msgsz - tmpsz); /* 荒りを黎片からコピ〖 */
}
/* ポインタ构糠 */
mbfcb_ram->head += msgsz;
if ( mbfcb_ram->head >= mbfcb_rom->mbfsz )
{
mbfcb_ram->head -= (UINT)mbfcb_rom->mbfsz;
}
/* バッファ鄂きサイズ构糠 */
mbfcb_ram->fmbfsz += msgsz;
/* 流慨改眶デクリメント */
mbfcb_ram->smsgcnt--;
return (ER_UINT)msgsz; /* 流慨サイズを手す */
}
/* 1キャラクタ减慨 */
UB kernel_rch_mbf(
const T_KERNEL_MBFCB_ROM *mbfcb_rom, /* メッセ〖ジバッファコントロ〖ルブロック(ROM婶) */
T_KERNEL_MBFCB_RAM *mbfcb_ram) /* メッセ〖ジバッファコントロ〖ルブロック(RAM婶) */
{
UB chr;
/* 1キャラクタ减慨 */
chr = *((UB *)mbfcb_rom->mbf + mbfcb_ram->head);
/* ポインタ构糠 */
if ( mbfcb_ram->head + 1 < (UINT)mbfcb_rom->mbfsz )
{
mbfcb_ram->head++;
}
else
{
mbfcb_ram->head = 0;
}
/* バッファ鄂きサイズ构糠 */
mbfcb_ram->fmbfsz++;
return chr;
}
/* ------------------------------------------------------------------------ */
/* Copyright (C) 1998-2002 by Project HOS */
/* ------------------------------------------------------------------------ */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -