本帖最后由 流年丶 于 2019-7-7 20:52 编辑
游客,如果您要查看本帖隐藏内容请
回复
用了几年的前后台程序框架,稳定可靠,保证每次执行的任务都为最高优先级任务,楼下会对该程序框架做一些说明。
按键状态机:支持短按,长按,双击处理,程序简洁,简单易懂。
LED状态机:支持各个频率的LED闪烁,常亮,常暗操作。
注:该程序是从 基于2G通讯项目中截取下来的两个模块,项目源码不好分享,有兴趣可以加我Q
:842936992。
//本程序只供学习使用,未经作者许可,不得用于其它任何用途
//引用请注明出处,有问题可在本帖中提出讨论,也可加我Q一起交流探讨
。
while(1)
{
while(SYS_MainTask)
{
INT8U temp = SYS_TaskMapTbl[SYS_MainTask];
SYS_TaskTbl[temp].go_fun(temp);
}
}
TaskMapTbl[]是一个任务优先级查询表,输入一个8位数,输出从第0位开始,第1个bit1所在的位数,例如0X01的第0位为bit1,因此TaskMapTbl[0x01]=0,0X06的第1位和第2位为bit1,第1位在第2位的前面(优先更高),因此TaskMapTbl[0x06]=1。
可见,语句INT8U temp = TaskMapTbl[MainTask];获取了当前优先级最高的主任务。
TaskTbl[]是一个数组,该数组中的成员是函数指针,数组共有8个数据成员,每个数据成员为主任务的函数入口地址,其定义如下。
typedef struct
{
void (*go_fun)(INT8U prio); //带参数的函数指针 用于执行任务函数
}SYS_TaskStruct;
const SYS_TaskStruct TaskTbl[8] = { //任务列表 TASK0优先级最高
TASK0,
TASK1,
TASK2,
TASK3,
TASK4,
TASK5,
TASK6,
TASK7
};
可见,语句TaskTbl[temp].go_fun(temp);即执行主任务函数。
进入主任务函数后,同样道理,可先由相应的SubTask[]来获取并执行该主任务下最高优先权的子任务。
由于任务间的调用经常是相互的,某一任务执行完成后,有可能激活另一优先权更高的任务,系统在每个任务执行完成后,重新判断MainTask,因此可确保下一个被执行的任务一定是优先权最高的任务。
一周热门 更多>