📄 fixmem.c
字号:
/* ------------------------------------------------------------------------- */
/* HOS 屌掕挿儊儌儕僾乕儖娗棟 */
/* */
/* Copyright (C) 1998-2002 by Project HOS */
/* ------------------------------------------------------------------------- */
#include "itron.h"
/* -------------------------------------------------------------- */
/* 屌掕儊儌儕僾乕儖偼嬻偒僽儘僢僋偺愭摢晹暘傪巊偭偰嬻偒僽儘僢僋 */
/* 偺儕僗僩傪嶌傞偙偲偵傛偭偰娗棟偡傞丅儕僗僩偵楢寢偝傟偰偄側偄 */
/* 晹暘偑巊梡拞偱偁傞丅嵟彫僽儘僢僋僒僀僘偼 sizeof(void *) */
/* -------------------------------------------------------------- */
/* 屌掕挿儊儌儕僾乕儖偺弶婜壔 */
void __ini_mpf(void)
{
UB i;
UH j;
UH cnt;
UH sz;
UB *blk;
for ( i = 0; i < fmcbcnt; i++ ) {
fmcbtbl[i].que.tskcnt = 0;
fmcbtbl[i].freeblk = fmcbstbl[i].mpfhead;
blk = (UB *)fmcbstbl[i].mpfhead;
cnt = fmcbstbl[i].mpfcnt - 1;
sz = fmcbstbl[i].mpfsz;
for ( j = 0; j < cnt; j++ ) {
*(VP *)blk = (VP)(blk + sz);
blk += sz;
}
*(VP *)blk = NADR;
}
}
/* 屌掕挿儊儌儕僽儘僢僋妉摼 */
ER get_blf(VP *p_blf, ID mpfid)
{
T_FMCB *fmcb;
const T_FMCBS *fmcbs;
ER ercd;
#if __ERR_CHECK_LEVEL >= 4
if ( mpfid <= 0 )
return E_ID;
if ( mpfid > fmcbcnt || fmcbstbl[mpfid - 1].mpfcnt == 0 )
return E_NOEXS;
#endif
#if __ERR_CHECK_LEVEL >= 3
if ( sysstat != TSS_TSK )
return E_CTX;
#endif
fmcb = &fmcbtbl[mpfid - 1];
fmcbs = &fmcbstbl[mpfid - 1];
__set_imsk();
/* 儊儌儕偑偁傞側傜妱傝摉偰傞 */
if ( fmcb->freeblk != NADR ) {
*p_blf = fmcb->freeblk;
fmcb->freeblk = *(VP *)fmcb->freeblk;
__res_imsk();
return E_OK;
}
/* 懸偪忬懺偵偡傞 */
curtcb->tskstat = TTS_WAI;
curtcb->tskwait = TTW_SEM;
__del_que(curtcb);
/* 屌掕挿儊儌儕僾乕儖偺懸偪峴楍偵捛壛 */
__adt_que(&fmcb->que, curtcb);
/* 僨傿僗僷僢僠 */
ercd = __tsk_dsp();
/* 儊儌儕僽儘僢僋僙僢僩 */
*p_blf = curtcb->data; /* ercd == E_OK 側傜 data 偵傾僪儗僗偑擖傞 */
__res_imsk();
return ercd;
}
/* 屌掕挿儊儌儕僽儘僢僋妉摼乮億乕儕儞僌乯 */
ER pget_blf(VP *p_blf, ID mpfid)
{
T_FMCB *fmcb;
const T_FMCBS *fmcbs;
#if __ERR_CHECK_LEVEL >= 4
if ( mpfid <= 0 )
return E_ID;
if ( mpfid > fmcbcnt || fmcbstbl[mpfid - 1].mpfcnt == 0 )
return E_NOEXS;
#endif
fmcb = &fmcbtbl[mpfid - 1];
fmcbs = &fmcbstbl[mpfid - 1];
__set_imsk();
/* 嬻偒儊儌儕偑柍偗傟偽幐攕 */
if ( fmcb->freeblk == NADR ) {
__res_imsk();
return E_TMOUT;
}
/* 儊儌儕偑偁傞側傜妱傝摉偰傞 */
*p_blf = fmcb->freeblk;
fmcb->freeblk = *(VP *)fmcb->freeblk;
__res_imsk();
return E_OK;
}
/* 屌掕挿儊儌儕僽儘僢僋曉媝 */
ER rel_blf(ID mpfid, VP blf)
{
T_FMCB *fmcb;
const T_FMCBS *fmcbs;
T_TCB *tcb;
#if __ERR_CHECK_LEVEL >= 4
if ( mpfid <= 0 )
return E_ID;
if ( mpfid > fmcbcnt || fmcbstbl[mpfid - 1].mpfcnt == 0 )
return E_NOEXS;
#endif
fmcb = &fmcbtbl[mpfid - 1];
fmcbs = &fmcbstbl[mpfid - 1];
__set_imsk();
if ( fmcb->que.tskcnt == 0 ) {
/* 懸偪僞僗僋偑柍偗傟偽儊儌儕奐曻 */
*(VP *)blf = fmcb->freeblk;
fmcb->freeblk = blf;
}
else {
/* 懸偪僞僗僋偵儊儌儕傪搉偟偰懸偪夝彍 */
tcb = fmcb->que.head;
tcb->data = blf;
__wup_dsp(tcb, E_OK);
}
__res_imsk();
return E_OK;
}
/* 屌掕挿儊儌儕僾乕儖忬懺嶲徠 */
ER ref_mpf(T_RMPF *pk_rsem, ID mpfid)
{
T_FMCB *fmcb;
const T_FMCBS *fmcbs;
UH cnt;
VP adr;
#if __ERR_CHECK_LEVEL >= 4
if ( mpfid <= 0 )
return E_ID;
if ( mpfid > fmcbcnt || fmcbstbl[mpfid - 1].mpfcnt == 0 )
return E_NOEXS;
#endif
fmcb = &fmcbtbl[mpfid - 1];
fmcbs = &fmcbstbl[mpfid - 1];
__set_imsk();
/* 嬻偒僽儘僢僋僇僂儞僩 */
cnt = 0;
adr = fmcb->freeblk;
while ( adr != NADR ) {
adr = *(VP *)adr;
cnt++;
}
/* 懸偪僞僗僋俬俢偺庢摼 */
if ( fmcb->que.tskcnt == 0 )
pk_rsem->wtsk = FALSE;
else
pk_rsem->wtsk = fmcb->que.head - tcbtbl + 1;
__res_imsk();
pk_rsem->exinf = fmcbs->exinf; /* 奼挘忣曬 */
pk_rsem->frbcnt = cnt; /* 嬻偒儊儌儕悢 */
return E_OK;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -