单片机使用基于时间片轮询系统的-状态机-[1]

目的:【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

objectivec 复制代码
/*-------------------------------------------------------
    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>

下一章,待续。。。。

相关推荐
碰大点1 分钟前
数据库“Driver not loaded“错误,单例模式重构方案
数据库·sql·qt·单例模式·重构
武子康6 分钟前
Java-173 Neo4j + Spring Boot 实战:从 Driver 到 Repository 的整合与踩坑
java·数据库·spring boot·后端·spring·nosql·neo4j
哥哥还在IT中6 分钟前
深入理解MySQL事务隔离级别与锁机制(从ACID到MVCC的全面解析)
数据库·mysql
万米商云8 分钟前
让数据“开口说话”:商城大数据如何预测元器件价格波动与供应风险?
大数据
李慕婉学姐1 小时前
Springboot智慧旅游管理系统6w63eon8(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
数据库·spring boot·旅游
爱吃猫的鱼星2 小时前
SQL 分类
数据库·oracle
数数科技的数据干货3 小时前
从爆款到厂牌:解读游戏工业化的业务持续增长道路
运维·数据库·人工智能
熊猫在哪3 小时前
macos安装mysql
数据库·mysql·macos
q***46523 小时前
在Django中安装、配置、使用CKEditor5,并将CKEditor5录入的文章展现出来,实现一个简单博客网站的功能
数据库·django·sqlite
XINVRY-FPGA6 小时前
XC95288XL-10TQG144I Xilinx AMD CPLD
arm开发·单片机·嵌入式硬件·mcu·fpga开发·硬件工程·fpga