📄 framework.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 + -