⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 framework.c

📁 嵌入式软件构件:TMR计时器管理、CLK实时时钟、KEY键盘扫描、LED数码显示、LCD显示、COMM串口通信
💻 C
字号:
/********************************************************************************************************* Filename   : FrameWork.C* Programmer : Haven* 描述: 基于优先级的多线程,每个线程执行RTC(run to complete)*         只能定义8个优先级,多个线程同时就绪时,先执行最高优先级。* DATE:       2007.11.18**********************************************************************************************************/#define  FRAMEWORK_GLOBALS#include "..\includes\includes.H"extern const EVTQ * ActObjEvtQList[9];const SM_STRU * ActObjList[9] = {    (SM_STRU *)0,            (SM_STRU *)&ActObj1,//最低优先级    (SM_STRU *)&ActObj2,    (SM_STRU *)&ActObj3,    (SM_STRU *)&ActObj4,    (SM_STRU *)&ActObj5,    (SM_STRU *)&ActObj6,    (SM_STRU *)&ActObj7,    (SM_STRU *)&ActObj8 //最高优先级};const INT8U   PRIORITY_TABLE[]= {0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4};const INT8U   READY_CLR_AND[] = {0xFF, 0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF, 0x7F};const INT8U   READY_SET_OR[]  = {0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};void ActObjInit(void){    ActObjReadyList = 0;        EvtQueInit();    #if EVENTDEFER_EN    EvtDeferInit();    #endif}/**************************************************************函数名:void ActObjScheduler(void) 功能:  实现基于优先级的凋度,同时取事件信号***************************************************************/void ActObjScheduler(void) {    INT8U prionum;    INT8U ready;    SM_STRU  *a;    EVTQ *q;	prionum = 0;	ready = ActObjReadyList;    if (ready != 0) {        if ((ready & 0xF0) != 0U) {//找出就绪线程中的最高优先级的线程                    prionum = PRIORITY_TABLE[ready >> 4] + 4;        }else{            prionum = PRIORITY_TABLE[ready];        }        a = (SM_STRU *)ActObjList[prionum];        #if HFSM_EN        HfsmDispatch((HFSM *)a);        #else        FsmDispatch((FSM *)a);        #endif        q = (EVTQ *)ActObjEvtQList[prionum];        OS_ENTER_CRITICAL();        if(--q->EvtQNRead == 0){            ActObjReadyList &= READY_CLR_AND[prionum];//没有未处理信号,清就绪位        }else{            SIG(a) = q->EvtQueSigPtr[q->EvtQOutIx];            #if (EVENT_PARAM_SIZE != 0)            PAR(a) = q->EvtQueParPtr[q->EvtQOutIx];            #endif            ++q->EvtQOutIx;            if(q->EvtQOutIx == q->EvtBufSize) {                q->EvtQOutIx = 0;              }                                           }          OS_EXIT_CRITICAL();     }}/*****************************************************************函数名:void ActObjInitTran(INT8U prio,State firststat)输入参数:线程优先级号,第一个状态函数名功能    :线程初始化,并执行进入动作 ****************************************************************/void ActObjInitTran(INT8U prio,STAT_PTR firststat)   {     SM_STRU   *a;    #if HFSM_EN    #else    STAT_PTR s;    #endif        a = (SM_STRU *)ActObjList[prio];        #if HFSM_EN   //层次状态机    HfsmCtor((HFSM *)a,firststat);                            HfsmInit((HFSM *)a);     #else         //有限状态机    ((FSM *)a)->StatFunPtr = (STAT_PTR)(firststat);    ((FSM *)a)->EventSig    = (EVENT_SIG)(ENTRY_SIG);     s = ((FSM *)a)->StatFunPtr;    (*s)(a);     #endif}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -