原创 HotTask51任务循环的构成及任务锁机制

2009-2-16 07:38 1583 0 分类: MCU/ 嵌入式
HotTask51 发表于 2009-2-16 07:38 裸奔式实时操作系统HotTask51 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

楼主: HotTask51任务循环的构成及任务锁机制


HotTask51和一般的OS一样,他们同裸奔最大的不同就在于任务函数
有个死循环把任务套在循环中。

而裸奔由于无内核控制强行豪夺正在运行的程序及函数,故运行期间
不能在某处死循环。

在协作式或裸奔任务(如菜农经典的“零耗时键盘”)中,他们的任务
都会在约定的时间内,脱离死循环体,给其他任务以更多更平均的机会。

由于任务运行的长短时间的不同,有些任务可能更长时间独占系统的
全部资源。

而剥夺式OS在这方面就要比他们优先的多,虽然必须拥有一个带硬件
中断的定时器。

所以大多的OS任务体内是有循环语句while(1)或for(;;)来完成对任务
的“绑架”及停留。

在定时器节拍中断的作用下,OS剥夺低级任务并进行断点资源的保护
及任务相互间的切换。

HotTask51采用任务循环互锁机制,系统和用户各自有一把,若双方
都代开任务循环锁,则任务死循环。

当任意方解锁时,任务脱离任务循环体,交出控制权给OS。

任务主动交权,只需解锁用户任务锁。

系统夺权要复杂些,若是节拍中断,肯定要剥夺任务运行的权利。
但在非节拍中断的期间,因为任务内的函数可能没有运行到检测锁处,

任务不会自己放弃权利给OS。当然这是OS也未获得控制权。
但系统的任务锁若在切换前解锁后交权给任务,则该任务就被赋予了
协作式的任务,即任务是开环的。

HotTask51片段:

#define HotTASK void//任务函数
typedef void (*pHotTaskFUNC)(void);//任务函数指针

//测试系统任务和节拍任务锁
#define TestHotTaskLock(taskLockId) (HotTaskStruct.bHotTaskSystemLock.Regs\
                                   & HotTaskStruct.bHotTaskTickLock.Regs\
                                   & (1 << (taskLockId)))
//测试系统任务
#define TestHotTaskSystemLock(taskLockId) (HotTaskStruct.bHotTaskSystemLock\
                                   & (1 << (taskLockId)))
//测试节拍任务
#define TestHotTaskTickLock(taskLockId) (HotTaskStruct.bHotTaskTickLock\
                                   & (1 << (taskLockId)))


//系统任务和节拍任务上锁
#define HotTaskLock(taskLockId) HotTaskSystemLock(taskLockId);\
                                HotTaskTickLock(taskLockId)

//系统任务上锁
#define HotTaskSystemLock(taskLockId) HotTaskStruct.bHotTaskSystemLock.Regs |= (1 << (taskLockId))
//打开节拍任务上锁
#define HotTaskTickLock(taskLockId) HotTaskStruct.bHotTaskTickLock.Regs |= (1 << (taskLockId))

//系统任务和节拍任务解锁
#define HotTaskUnLock(taskLockId) HotTaskSystemUnLock(taskLockId);\
                                  HotTaskTickUnLock(taskLockId)

//系统任务解锁
#define HotTaskSystemUnLock(taskLockId) HotTaskStruct.bHotTaskSystemLock.Regs &= ~(1 << (taskLockId))
//节拍任务解锁
#define HotTaskTickUnLock(taskLockId) HotTaskStruct.bHotTaskTickLock.Regs &= ~(1 << (taskLockId))

//HotTask51的任务循环语句
#define HotTask_while(taskLockId) while(TestHotTaskLock(taskLockId))
/*------------------------------------------------------------------------------
//HotTask51任务的声明及应用
HotTASK Task1(void);//此时并不知道他是几号任务

HotTASK Task1()//一个HotTASK类型的函数,名称Task1,和实际就是void类型的函数
{//下面的任务循环才能知晓本任务挂接在那个系统或用户任务号上
    HotTask_while(HotTask_UserId1)//HotTask51用户普通任务1
    {
        HotTaskWait(HotTask_UserId1, 1);//此后都必须和HotTask_UserId1挂接
    }
}


可以看到:

一般任务的写法:
void Task1()
{
  while(1)
  {
//...................
  }
}

而HotTask51是这样书写的现在还未完成“HotTask51的命名规范”)

#include "task.h"

HotTASK TaskInit()//HotTask_Init
{
HRESULT __result = S_FALSE;//失败
    __result = HotTaskCreate(HotTask_UserId1,//任务1
                             Task1,//任务函数1
                             HotTask_Prio2//2级
                            );
    if (__result == S_OK)
    {
        __result = HotTaskCreate(HotTask_UserId2,//任务2
                                 Task2,//任务函数2
                                 HotTask_Prio6//6级
                                );
        if (__result == S_OK)
        {
            __result = HotTaskCreate(HotTask_UserId3,//任务3
                                     Task2,//任务函数2
                                     HotTask_Prio2//2级
                                    );
        }
    }
    HotTask_while(HotTask_UserInitId)//HotTask51任务环格式
    {
    }
}


/*--------------------------------------------------------
    HotTask51的任务环构造
---------------------------------------------------------*/
HotTASK Task1()//HotTask_User1
{
    HotTask_while(HotTask_UserId1)//HotTask51任务环格式
    {
        HotTaskWait(HotTask_UserId1, 1);
    }
}

HotTASK Task2()//HotTask_User2
{
    HotTask_while(HotTask_UserId2)//HotTask51任务环格式
    {
    }
}

HotTASK Task3()//HotTask_User3
{
    HotTask_while(HotTask_UserId3)//HotTask51任务环格式
    {
    }
}
 
PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
0
关闭 站长推荐上一条 /4 下一条