当前位置: 首页 > news >正文

单片机使用基于时间片轮询系统的-状态机-[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

/*-------------------------------------------------------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_BEGINx=0;FnDSP_Sci.send_message("  task-1-case0>",true);MOS_Delay(20);                                    //delay 20msFnDSP_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>

下一章,待续。。。。

           

http://www.lryc.cn/news/135435.html

相关文章:

  • 前端开发怎么解决性能优化的问题? - 易智编译EaseEditing
  • 共享球拍小程序:打破拥有束缚,尽享运动乐趣
  • uniapp 微信小程序 绘制海报,长按图片分享,保存海报
  • 爬虫异常捕获与处理方法详解
  • 制作网络课堂学习平台(标签嵌套,后代选择器)
  • 基于医疗领域数据微调LLaMA——ChatDoctor模型
  • UDP TCP 报文内容
  • Boost开发指南-4.8operators
  • c# 泛型约束
  • android frida
  • Linux下的Shell编程——正则表达式入门(四)
  • 使用VisualStudio制作上位机(一)
  • 【前端从0开始】JavaSript——自定义函数
  • 如何在Windows、Mac和Linux操作系统上安装Protocol Buffers(protobuf)编译器
  • 简单介绍 CPU 的工作原理
  • UE4/5数字人MetaHuman的控制绑定资产使用
  • 二、11.系统交互
  • 敏捷管理工具/国内软件敏捷开发工具
  • Selenium环境+元素定位大法
  • Vue3 用父子组件通信实现页面页签功能
  • HCIP STP协议
  • 链表的顶级理解
  • 探索贪心算法:理解与实现JAVA语言
  • 数字孪生技术对旅游行业能起到什么作用?
  • 攻防世界-Web_php_include
  • Python Opencv实践 - 直方图显示
  • 2分钟搭建自己的GPT网站
  • deepdiff比较两个json文件数据差异性
  • 文件内容搜索工具 - Python实现
  • vue静态html加载外部组件