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任务环格式 { } }
|
|
文章评论(0条评论)
登录后参与讨论