前面写了switch case做任务调度的应用,这边写一下如何实现.像一般的RTOS一样都有一个任务控制块(TCB)列表来管理所有的任务,所以这里也需要一个结构体来管理动作任务,这里叫做ACB吧.
动作任务管理结构体
这个结构体用来记录当前动作任务的当前步骤,函数地址,事件处理函数的函数地址,动作名称,运行时间等.
typedef struct _ACB
{
uint8_t nStep; // 分支动作步骤
uint8_t nChildID; //子动作ID
uint32_t nDelay; // 延时
uint32_t nStartTime;
uint32_t nUsedTime;
uint32_t nStatus; //当前状态
ActionEvent EventQueue[4]; //动作事件队列
uint8_t nEventCnt; //事件数量和个数
void (*AppCallBack)(); //业务动作函数指针
void (*EventCallback)(); //事件处理函数指针
void (*ActionCallback)(); //当前运行的函数指针
char ActionParam[10]; //动作参数
//17
char* pActionName; //动作名称
char* pErrorInfo; //错误信息
//8
struct _ACB* next; //上一个控制块 便于删除添加到就绪队列
struct _ACB* prev; //下一个控制块 便于添加删除到就绪队列
} ACB;
动作任务创建
//将OpApp业务函数指针和ACB结构体绑定
void AddAction(int nID,void (*OpApp)(),const char* pActionName)
{
if(nID<90)
{
mOS.ActionPool[nID].AppCallBack = OpApp;
mOS.ActionPool[nID].EventCallback = EventAction;
mOS.ActionPool[nID].ActionCallback = OpApp;
mOS.ActionPool[nID].nStatus = 0xff;
mOS.ActionPool[nID].nEventCnt = 0;
mOS.ActionPool[nID].nUsedTime = 0;
mOS.ActionPool[nID].nStartTime = 0;
mOS.ActionPool[nID].pActionName = (char*)pActionName;
}
}
动作任务执行
1.动作结构体初始化,添加到就绪队列
//根据ID启动动作任务
int8_t StartAction(uint8_t ActionId)
{
if(ActionId>90)
{
return false;
}
ACB* pAction = &mOS.ActionPool[ActionId];
pAction->ActionStartTime = mOS.SystemTime;
pAction->nStep = STEP1;
pAction->nEventCnt = 0;
pAction->nUsedTime = 0;
pAction->nChildID = 0;
pAction->EventCallback = EventAction;
pAction->ActionCallback = pAction->AppCallBack;//先指向业务函数指针
AddReadyActionToTail(pAction); //把当前的控制块添加到就绪队列
return true;
}
//将要运行的动作添加到就绪运行队列
void AddReadyActionToTail(ACB * pAction)
{
pAction->nStaus = 0;
pAction->next = NULL;
pAction->prev = mOS.tail; //
if(mOS.head==NULL)
{
mOS.head = pAction;
}
if(mOS.tail!=NULL) //当就绪链表没有动作时 tail为空
{
mOS.tail->next = pAction;
}
mOS.tail = pAction; //移动尾部指针
}
2.就绪队列遍历
inline void AppLoop()
{
mOS.current = mOS.head;
while(mOS.current!=NULL)
{
mOS.current->ActionCallback();
DelFinishAction(); //需要把完成的任务从就绪队列删除
mOS.current = mOS.current->next;
}
}
//动作完成后,并计算动作使用时间,从链表删除
inline void DelFinishAction()
{
if(mOS.current->nStatus==0) //动作任务正在运行
{
return ;
}
//统计任务耗时
mOS.current->nUsedTime = mOS.SystemTime - mOS.CurrentAction->nStartTime; //当前时间减去开始时间
if(mOS.head==mOS.tail) //只有一个元素
{
mOS.head= NULL;
mOS.tail = NULL;
return ;
}
if(mOS.current==mOS.head) //头部删除,需要将头部指针往后移动
{
mOS.head = mOS.current->next;
return ;
}
if(mOS.current==mOS.tail) //尾部删除,需要将尾部指针往前移动
{
mOS.tail = mOS.current->prev;
mOS.tail->next = NULL;
return ;
}
//中间删除
mOS.current->prev->next = mOS.current->next;
mOS.current->next->prev = mOS.current->prev;
}
-
Switch
+关注
关注
1文章
446浏览量
56823 -
RTOS
+关注
关注
19文章
572浏览量
117587 -
结构体
+关注
关注
1文章
78浏览量
10609
发布评论请先 登录
相关推荐
【资料】RT-Threa操作系统中任务的概念及实现任务所用到的数据结构
本文将介绍RT-Thread操作系统中任务的概念,以及系统中实现任务所用到的数据结构等。 任务的概念 在RT-Thread系统中任务通常与我们操作系统理论课中提到的进程和线程没有严格区别
发表于 03-23 15:11
通过HarmonyOS分布式能力实现任务的跨设备迁移设计资料分享
的文档或图片素材,此时需要在不同设备间反复操作。想要解决这些问题,我们可以通过 HarmonyOS 的分布式能力实现任务的跨设备迁移,保证业务在手机、平板等终端间无缝衔接,轻松的完成多设备之间的协同
发表于 03-25 16:59
单片机工具大集合
软件列表:1、51系列单片机模拟软件(汉化)2、串中通信助手3、字模软件4、色环电阻识别,5、LcdEmluator50图形编辑器6、PWM计算小软件 单片机小精灵 超级单片机工具中断系统仿真台 进制转换 音乐代码转换 单片机实验动态演示 数码管7段显示编码工具
发表于 08-16 00:41
诚聘单片机工程师
猎头职位:单片机工程师【北京】职位描述:1、主要负责基于STM32系列单片机业务部分代码的编写以及改版维护;2、各项目单片机方面软件的管理和归档,建立文档目录;3、编制测试软件和测试说明,并参与部分
发表于 12-07 11:21
【NUCLEO-F412ZG试用体验】FreeRTOS_事件标志组实现任务和中断的同步
使用事件标志组可以实现任务和任务之间以及任务和中断之间的通信或者同步。首先说明,本例程参考了《安富莱_STM32-V5开发板_FreeRTOS教程(V1.0)》,是在上上期报告的基础上,把按键中断由
发表于 12-28 21:19
【NUCLEO-F412ZG试用体验】FreeRTOS_信号量实现任务和中断的同步
上一期是用事件标志组实现的任务和中断同步,使用信号量一样可以实现任务之间以及任务和中断的同步。首先说明,本例程参考了官方例程。实验现象:1、3个LED闪烁。2、按键按下,发送相关信息。步骤:1、使能信号量。2、编写测试代码。新建信号量中断中发送信号量任务中等待信号量,并做相应处理3、测试。
发表于 01-03 19:24
如何采用FPGA实现μC/OS-Ⅱ任务管理模块?
本文针对传统实时操作系统内核占用系统资源、影响系统实时性的问题,提出了用单独的硬件电路实现实时操作系统中的系统调用和任务调度器的方案。重点给出了采用FPGA实现μC/OS-Ⅱ任务管理模块的过程。仿真结果表明,任务管理的硬件实现保持了系统调用的正确性
发表于 04-26 06:14
KEYSIGHT 4款入门新品,全流程实现任务的自动化集中管理
地集成为一体 ,从单独仪器的配置操作到监视多个仪器和远程测试、分析、共享仪器和数据,至测试报告的生成,实现任务的自动化集中管理。EDU33210A 系列 20MHz 函数和任意波形发生器, 单通道和
发表于 05-13 10:05
【单片机】Proteus和Keil分别创建单片机工程 精选资料分享
【征服单片机】技能篇:Proteus和Keil如何分别创建单片机工程?大家好!我是皮皮猫。每文一言: 要想改变命运,首先改变自己。本篇文章:本篇文章,主要是关于Proteus和Keil如何分别创建
发表于 07-15 09:50
单片机工程5之串口通信
合泰杯——合泰单片机工程5之串口通信前言一、usat例程分析?二、编写程序1.发送定时1秒发送字符2.读入数据总结前言这一章更新的是关于合泰单片机串口通信的内容,用的是HT66F2390的芯片和板子
发表于 07-23 09:00
单片机工程师是程序员吗
程师做的工作就是程序开发,使用C语言来驱动单片机的硬件资源,以及完成一个逻辑任务,实现一定的功能的过程。但是单片机工程师又不是严格意义上的程序员,因为程序员是纯粹在电脑上写代码的一个职业,而单片机是需要软硬件结合才能实现产品的功能。单片机工程师的程序开发,不仅要
发表于 11-09 09:14
单片机工作的基本时序
文章目录文章目录00 写在前面01 C51基本数据类型总结02 C51数据类型扩充定义03 关于单片机04 单片机工作的基本时序05 单片机复位06 80C51的中断系统07 定时器08 串口通信
发表于 11-18 08:44
单片机工作原理
单片机工作原理:1、主要器件cpu(负责运算与控制)、存储器(程序存储在ROM存储器中,临时变量存放在RAM存储器中)、IO(输入、输出),三者相互配合实现单片机的运行。2、同步:多个独立的部分按照
发表于 11-23 07:25
合泰单片机工程外部中断的相关资料分享
合泰杯——合泰单片机工程4之外部中断前言一、中断初始化函数二、中断函数主函数总结前言继上一次的按键输入工程,这一次我们来利用按键来进行外部中断实验,当按键按下时,单片机去执行中断函数的程序,也就
发表于 12-03 06:14
单片机工作基础三要素
。内存ROM与RAM,存程序的地方。管脚有电源,复位,晶振和 IO 口这 4 类管脚。前三者是单片机工作基础三要素。IO 口能识别按健的输入,也能输出驱动继电器工作的开关信号,也能跟外围器件进行通信。电平高(1),低(0)是一个范围,不是只是0V和3.3V才是高低电平。时间执行指
发表于 01-20 06:53
单片机工程之点亮LED记录
合泰杯——合泰单片机工程之点亮LED团队中很多成员参加了下个学期合泰杯的比赛,所以想利用寒假的时间来整理一套例程来进行学习和参考。提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档合泰
发表于 01-24 06:00
uCOS-III任务间切换的实现
RTOS进行多任务管理。在引入RTOS的后,编程思想和裸机系统程序设计有所不同,我们会根据产品所要实现的功能,将整个系统分割成一个个独立的且无法返回的函数,这些函数也就是我们通常所讲的任务。不同的任务在RTOS内核的管理下不停运行,宏观上,不同的任务之间仿佛是在同时运行的。但
发表于 02-18 06:16
基于实时操作系统的单片机应用系统设计
介绍了Small RTOS 51 多任务操作系统的基本原理,结合单片机控制的电子存包柜,简要介绍了移植small RTOS51 及通过消息队列实现任务通讯的软件设计方法。
发表于 01-06 16:21
•51次下载
51单片机多任务机制的实现策略研究
从操作系统实现多任务机制的原理入手,分析了51单片机实现多任务机制的基本条件,论述了5l单片机实现多任务控制的二种方案。
发表于 09-19 17:26
•159次下载
单片机系统多任务实现方法
考虑到成本等因素,大多数单片机系统的开发还是基于处理器直接编写,但开发者经常面临同时处理多个任务的要求,提出了一种单片机多任务程序设计的方法
发表于 11-21 16:47
•749次下载
利用Keil C51实现单片机与PC机串口通信任务2
【LabVIEW从入门到精通】5.2.4.3 利用Keil C51实现单片机与PC机串口通信任务2(方法2)
发表于 01-08 15:47
•24次下载
Dispatch Queue任务执行与Dispatch Source
导读本文为读《Concurrency Programming Guide》笔记第三篇,在对OS X和iOS应用开发中实现任务异步执行的技术、注意事项、Operation与Dispatch
发表于 10-11 11:54
•0次下载
单片机教程之单片机入门到单片机工程师的教程免费下载
本文档的主要内容详细介绍的是单片机教程之单片机入门到单片机工程师的教程免费下载主要内容包括了:第一章----按键程序编写的基础,第二章----基于状态转移的独立按键程序设计,第三章----模块化编程初识,第四章----渐明渐暗的灯,第五章----多任务环境下的数码管编程设计
发表于 11-14 17:06
•34次下载
如何使用51单片机实现多任务机制的策略详细资料说明
51单片机在微型智能控制系统中应用很广,随着人们对控制系统的要求不断提高,51单片机的功能局限越发明显。特别是51系列单片机不具有实时多任务支持功能,大大限制其在控制系统中的进一步发展。而多任务
发表于 07-17 17:38
•4次下载
spring4.0如何整合Quartz实现任务调度详细资料和程序说明
Quartz框架是一个全功能、开源的任务调度服务,可以集成几乎任何的java应用程序—从小的单片机系统到大型的电子商务系统。Quartz可以执行上千上万的任务调度。
发表于 05-06 18:23
•1次下载
实用单片机工具应用程序合集免费下载
本文档的主要内容详细介绍的是超级单片机工具软件应用程序合集免费下载包括了:51波特率计算应用程序,超级单片机工具软件,单片机小精灵。
发表于 04-28 16:24
•30次下载
多个任务时,如何保证单片机工作效率及每个任务完成的及时性?资料下载
电子发烧友网为你提供多个任务时,如何保证单片机工作效率及每个任务完成的及时性?资料下载的电子资料下载,更有其他相关的电路图、源代码、课件教程、中文资料、英文资料、参考设计、用户指南、解决方案等资料,希望可以帮助到广大的电子工程师们。
发表于 04-12 08:41
•2次下载
实时多任务机制在低功耗单片机系统中的最小实现
简要介绍低功耗单片机系统的设计原则。详细阐述了实时多任务程序结构的特点以及在低功耗单片机中的一种最小实现方法。结合低功耗热能测量系统实例介绍其具体实现过程。
发表于 06-24 10:26
•23次下载
单片机工程师是程序员吗?真实的月薪到底有多少?
程师做的工作就是程序开发,使用C语言来驱动单片机的硬件资源,以及完成一个逻辑任务,实现一定的功能的过程。但是单片机工程师又不是严格意义上的程序员,因为程序员是纯粹在电脑上写代码的一个职业,而单片机是需要软硬件结合才能实现产品的功能。单片机工程师的程序开发,不仅要
发表于 11-04 17:36
•16次下载
【单片机】Proteus和Keil分别创建单片机工程
【征服单片机】技能篇:Proteus和Keil如何分别创建单片机工程?大家好!我是皮皮猫。每文一言: 要想改变命运,首先改变自己。本篇文章:本篇文章,主要是关于Proteus和Keil如何分别创建
发表于 11-14 18:36
•11次下载
串口 单片机 文件_通俗易懂的单片机工作原理
单片机工作原理: 1、主要器件cpu(负责运算与控制)、存储器(程序存储在ROM存储器中,临时变量存放在RAM存储器中)、IO(输入、输出),三者相互配合实现单片机的运行。 2、同步:多个独立的部分
发表于 11-15 11:36
•18次下载
单片机执行指令过程详解
单片机执行指令过程详解单片机执行程序的过程,实际上就是执行我们所编制程序的过程。即逐条指令的过程。计算机每执行一条指令都可分为三个阶段进行。即取指令-----分析指令-----执行指令。...
发表于 11-17 09:36
•19次下载
c语言实现任务调度器
一、介绍调度器是常用的一种编程框架,也是操作系统的拆分多任务的核心,比如单片机的裸机程序框架,网络协议栈的框架如can网关、485网关等等,使用场合比较多,是做稳定产品比较常用的编程技术二、原理1
发表于 12-22 18:51
•8次下载
单片机开发框架——TMF任务管理框架(一)
统一调度管理,既有利于实现“高内聚低耦合”,提高系统可靠性,同时也为任务处理带来极大便利。主要功能如下:(1)任务管理:当系统需要执行某个任务时,只须设置该任务结点的执行状态字,就可以由管理程序完成任务的
发表于 12-31 18:55
•11次下载
单片机是怎么执行指令的?
单片机执行程序的过程,实际上就是执行我们所编制程序的过程。即逐条指令的过程。计算机每执行一条指令都可分为三个阶段进行。即取指令-----分析指令-----执行指令。
发表于 02-09 11:13
•2次下载
单片机执行指令的过程
单片机执行程序的过程,实际上就是执行我们所编制程序的过程。即逐条指令的过程。计算机每执行一条指令都可分为三个阶段进行。即取指令-----分析指令-----执行指令。
取指令的任务是:根据程序计数器
发表于 02-11 15:26
•3次下载
基于51单片机的多任务机制及应用
1 引言传统的单片机程序一般采用单任务机制,单任务系统具有简单直观、易于控制的优点。然而由于程序只能按顺序依次执行,缺乏灵活性,只能使用中断函数实时地处
发表于 11-13 10:30
•4106次阅读
如何在Windows上设置英特尔硬件加速执行管理器
了解如何在Windows上设置英特尔®硬件加速执行管理器(英特尔®HAXM),以帮助您的Android模拟器以更快的速度运行。
通俗易懂的单片机工作原理
单片机工作原理: 1、主要器件cpu(负责运算与控制)、存储器(程序存储在ROM存储器中,临时变量存放在RAM存储器中)、IO(输入、输出),三者相互配合实现单片机的运行。 2、同步:多个独立的部分
部署处理特定任务的单片机来简化复杂设计
。不过,如果使用一个大型单片机处理复杂的应用,可能会在执行小型后台处理任务时遇到CPU资源方面的问题,这些任务虽然并不复杂,但十分耗时。8位和16位MCU等小型器件可用于减轻32位器件的工作负荷。 试想一下这样一个示例:将一个32位MCU用于控制
单片机工控事件
单片机工控通常有延时,电机状态,传感器状态等通用耗时操作,业务程序查询这些状态,就会产生大量的冗余代码,不简洁.使用事件则是把这些通用操作丢给系统去处理,系统操作完成后,则运行业务程序的下一个Step.
评论