📄 actobjframework-ht.c.bak
字号:
/********************************************************************************************************
* Filename : ActObjFrameWork.C
* Programmer : Haven
* 描述: 基于优先级的多线程,每个线程执行RTC(run to complete)
* 只能定义8个优先级,多个线程同时就绪时,先执行最高优先级。
*********************************************************************************************************
*/
#define FRAMEWORK_GLOBALS
#include "..\includes\includes.h"
#if FK_EventFlag_EN
FKEvent ActObjEventFlag[8] @0x45; //prio-1对应prio
//注意,如果0x45地址变动,则FKEventFlagBit-HT.H也要改动,
//是绝对地址定的位
#endif
static INT8U const PRIORITY_TABLE[]= {0, 1, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4};
static INT8U const READY_CLR_AND[] = {0xFF, 0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF, 0x7F};
static INT8U const READY_SET_OR[] = {0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80};
void ActObjInit(void)
{
#if FK_EventFlag_EN
INT8U i;
#endif
ActObjReadySet = 0;
#if FK_EventFlag_EN
for (i = 0; i < 8; i++) {
ActObjEventFlag[i] = 0;
}
#endif
}
#if FK_EventFlag_EN
void ActObjEvtPost(INT8U prio, INT8U sig) //事件发送
{
INT8U a;//为减少关中断时间,把a计算放外面
sig &= 0x0F;
a = READY_SET_OR[prio];
prio -- ;
OS_ENTER_CRITICAL();
ActObjEventFlag[prio] |= sig; //发事件,不是队列,考虑处理事件速度
ActObjReadySet |= a; //置就绪位
OS_EXIT_CRITICAL();
}
#endif
#if FK_EventFlag_EN
void ActObjEvtPostISR(INT8U prio, INT8U sig)
{
ActObjReadySet |= READY_SET_OR[prio]; //置就绪位
ActObjEventFlag[prio-1] |= (sig & 0x0F); //发事件
}
#endif
#if FK_EventFlag_EN
void ActObjEvtClr(INT8U prio) //清事件
{
OS_ENTER_CRITICAL();
ActObjEventFlag[prio-1] &= 0xF0; //处理后,清事件信号
OS_EXIT_CRITICAL();
}
#endif
void ActObjSet(INT8U prio)
{
INT8U a;//为减少关中断时间,把a计算放外面
a = READY_SET_OR[prio];
OS_ENTER_CRITICAL();
ActObjReadySet |= a;
OS_EXIT_CRITICAL();
}
void ActObjSetISR(INT8U prio)
{
ActObjReadySet |= READY_SET_OR[prio];
}
void ActObjScheduler(void)
{
INT8U prionum,ready;
prionum = 0;
ready = ActObjReadySet;
if (ready != 0) {
if ((ready & 0xF0) != 0U) {//找出就绪活动对象中的最高优先级的对象
prionum = PRIORITY_TABLE[ready >> 4] + 4;
}else{
prionum = PRIORITY_TABLE[ready];
}
ready = READY_CLR_AND[prionum];
OS_ENTER_CRITICAL();
ActObjReadySet &= ready;//执行完成,清就绪位
OS_EXIT_CRITICAL();
}
switch(prionum){
case 0:
break;
case 8: //ok
CountRunSeep(); //计算车速
CountMotTheer(); //计算表针应在的位置
break;
case 7:
CountMotTheer(); //计算表针应在的位置
break;
case 6: //ok
//CountMotTheer(); //计算表针应在的位置
break;
case 5:
break;
case 4:
break;
case 3:
break;
case 2:
break;
case 1:
break;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -