📄 ksnd_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 void kernel_sch_mbf(const T_KERNEL_MBFCB_ROM *mbfcb_rom,
T_KERNEL_MBFCB_RAM *mbfcb_ram, UB chr); /* 1キャラクタ流慨 */
/* メッセ〖ジバッファへの流慨 */
ER kernel_snd_mbf(
const T_KERNEL_MBFCB_ROM *mbfcb_rom, /* メッセ〖ジバッファコントロ〖ルブロック(ROM婶) */
T_KERNEL_MBFCB_RAM *mbfcb_ram, /* メッセ〖ジバッファコントロ〖ルブロック(RAM婶) */
VP msg, /* 流慨メッセ〖ジの黎片戎孟 */
UINT msgsz) /* 流慨メッセ〖ジのサイズ(バイト眶) */
{
T_MKNL_TCB *mtcb;
SIZE fresz;
SIZE tail;
INT i;
/* 流慨略ちタスクをチェック */
mtcb = mknl_ref_qhd(&mbfcb_ram->sndque); /* 流慨略ち乖误の黎片タスクを徊救 */
if ( mtcb != NULL )
{
return E_TMOUT; /* 流慨略ちが贷にあればタイムアウト */
}
/* 减慨略ちタスクチェック */
mtcb = mknl_ref_qhd(&mbfcb_ram->rcvque); /* 减慨略ち乖误の黎片タスクを徊救 */
if ( mtcb != NULL )
{
/* 减慨タスクの略ちを豺近 */
__hos_bcopy((VP)mtcb->data, msg, msgsz); /* デ〖タコピ〖 */
mknl_rmv_que(mtcb); /* 略ち乖误から猴近 */
mknl_rmv_tmout(mtcb); /* タイムアウト略ち乖误から猴近 */
mknl_wup_tsk(mtcb, (ER_UINT)msgsz); /* タスクの略ち豺近 */
return E_OK; /* 赖撅窗位 */
}
/* 鄂きサイズチェック */
if ( mbfcb_ram->fmbfsz < msgsz + sizeof(UINT) )
{
return E_TMOUT; /* タイムアウト */
}
/* サイズ流慨 */
for ( i = sizeof(UINT) - 1; i >= 0; i-- )
{
/* 惧疤から界に8bit帽疤で今き哈み */
kernel_sch_mbf(mbfcb_rom, mbfcb_ram, (UB)((msgsz >> (i * 8)) & 0xff));
}
/* 琐萨疤弥换叫 */
tail = mbfcb_ram->head - mbfcb_ram->fmbfsz;
if ( mbfcb_ram->head < mbfcb_ram->fmbfsz )
{
tail += mbfcb_rom->mbfsz;
}
/* デ〖タ流慨 */
fresz = (UINT)mbfcb_rom->mbfsz - tail; /* バッファ擂り手しまでの鄂きサイズ换叫 */
if ( fresz >= msgsz ) /* 擂り手し稍妥か冉年 */
{
__hos_bcopy((UB *)mbfcb_rom->mbf + tail, msg, msgsz); /* デ〖タコピ〖 */
}
else
{
__hos_bcopy((UB *)mbfcb_rom->mbf + tail, msg, fresz); /* 擂り手し爬までコピ〖 */
__hos_bcopy((UB *)mbfcb_rom->mbf, (UB *)msg + fresz, msgsz - fresz); /* 荒りを黎片からコピ〖 */
}
/* 鄂きサイズ构糠 */
mbfcb_ram->fmbfsz -= msgsz;
/* 流慨改眶インクリメント */
mbfcb_ram->smsgcnt++;
return E_OK;
}
/* 1キャラクタ流慨 */
void kernel_sch_mbf(
const T_KERNEL_MBFCB_ROM *mbfcb_rom, /* メッセ〖ジバッファコントロ〖ルブロック(ROM婶) */
T_KERNEL_MBFCB_RAM *mbfcb_ram, /* メッセ〖ジバッファコントロ〖ルブロック(RAM婶) */
UB chr) /* 流慨するキャラクタ */
{
SIZE tail;
/* 琐萨疤弥换叫 */
tail = mbfcb_ram->head - mbfcb_ram->fmbfsz;
if ( mbfcb_ram->head < mbfcb_ram->fmbfsz )
{
tail += mbfcb_rom->mbfsz;
}
/* 1キャラクタ流慨 */
*((UB *)mbfcb_rom->mbf + tail) = chr;
/* バッファ鄂きサイズ构糠 */
mbfcb_ram->fmbfsz--;
}
/* ------------------------------------------------------------------------ */
/* Copyright (C) 1998-2002 by Project HOS */
/* ------------------------------------------------------------------------ */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -