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

📄 actobjframework-ht.c.bak

📁 此文件是一个完整的发动机转速表,用步进电机实现指示功能,利用HOLTECK的HT46R232作为MCU.
💻 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 + -