目的:【1】用C实现一个超轻量化任务管理系统
【2】具有任务suspend, resume, runonce ,auto loop ,task_delay功能
【3】易于移植,不涉及硬件底层。
示例例码:
- 利用switch case结构实现了单一层的 task_delay功能。弊端就是switch..case不能再做嵌套了,只能使用if语句。其实也不是不能实现多层switch..case嵌套,只是那样系统变的复杂。失去我原来的目的。
- 任务分为三种:
auto: 自动循环执行
runonce: 运行完一次后,自动注销
manual: 任务的起停由状态信号控制,自动循环执行
- 引入面向对像化的handle句柄策略,这样方便操作单前task参数。
Task1:使用宏代码实现的:Task_delay
Task2:switch...case原始代码实现的: task_delay
/*-------------------------------------------------------
MOS_Queue_Add(task1,_TASK_AUTO ,20,_TASK_RUN);
MOS_Queue_Add(task2,_TASK_RUNONCE,30,_TASK_RUN);
MOS_Queue_Add(task3,_TASK_AUTO ,40,_TASK_RUN);
MOS_Queue_Add(task4,_TASK_RUNONCE,40,_TASK_STOP);
MOS_Queue_Add(task5,_TASK_MANUAL ,40,_TASK_STOP);
--------------------------------------------------------*/
void task1(TMos_QueuePtr handle)
{
static int x=0;
_MOS_BEGIN
x=0;
FnDSP_Sci.send_message(" task-1-case0>",true);
MOS_Delay(20); //delay 20ms
FnDSP_Sci.send_message(" task-1-case1>",true);
MOS_Wait_Until(&x,1000,50);
{
x++;
FnDSP_Sci.Send_Lable_Value("x:",x);
if (x>=10){
FnDSP_Sci.send_message("task1-Break!!!",true);
MOS_Wait_Break; //Break from the current Loop.
}
}Wait_Timeout{
FnDSP_Sci.send_message("task1-timeout!!!",true);
}
//MOS_Wait_Next;
FnDSP_Sci.Send_Lable_Value("wait finished:",x);
_MOS_END
}
//----------------------------------------------------//
void task2(TMos_QueuePtr handle)
{
switch(handle->task.line_idx)
{
case 0:
FnDSP_Sci.send_message(" task-2-case0>",true);
handle->task.timer_dt=10;
handle->task.line_idx=1;
handle->task.delay_flg=true;
break;
case 1:
FnDSP_Sci.send_message(" task-2-case1>",true);
MOS_Set_Task(task4,_TASK_RUN);
MOS_Set_Task(task5,_TASK_RUN);
break;
default:
break;
}
}
//----------------------------------------------------//
void task3(void)
{
FnDSP_Sci.send_message(" task-3>",true);
}
//----------------------------------------------------//
void task4(void)
{
FnDSP_Sci.send_message(" task-4>",true);
}
//----------------------------------------------------//
void task5(void)
{
FnDSP_Sci.send_message(" task-5>",true);
}
运行结果:
系统间隔为 1ms时钟,进行状态机的标志刷新。整个状态机可以理解为一个由多模块组成的大循环,但是又解决了平时循序执行时的 delay 死等的问题。 这样系统处理能力就得到一定的提高。转为task化管理,系统更加结构化。
task-1-case0>
task-2-case0>
task-3>
task-4>
task-1-case1>
task-2-case1>
>x:1 task-3>
task-5>
>x:2
>x:3
>x:4
>x:5
>x:6 task-3>
>x:7task1-timeout!!!
>wait finished:7
task-1-case0>
task-3>
task-1-case1>
下一章,待续。。。。文章来源:https://www.toymoban.com/news/detail-666451.html
文章来源地址https://www.toymoban.com/news/detail-666451.html
到了这里,关于单片机使用基于时间片轮询系统的-状态机-[1]的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!