首页 > 其他分享 >时间控制块的原理与创建

时间控制块的原理与创建

时间:2024-12-14 19:28:43浏览次数:8  
标签:控制 创建 任务 事件 原理 tEvent include tEventType

目录

问题概述

事件控制块原理

设计实现


问题概述

  • 如何同步两个任务的运行?
  • 如何处理多个任务共享资源的冲突问题?
  • 如何在多个任务间传递消息通信?
  • 如何在中断ISR与任务之间传递多个事件标志?

事件控制块原理

  • 任务在事件控制块上等待,暂停运行
  • 事件发生,通知事件控制块
  • 事件控制块通知等待任务列表中的任务
  • 被通知的任务脱离事件控制块,继续运行

两大核心功能:任务进入事件控制块等待、发生事件给控制块恢复任务运行。

设计实现

  • 定义事件控制块
  • 注明任务等待的事件参数
  • 事件控制块的初始化

tEvent.c

#include "tinyOS.h"

/* 事件控制块初始化函数 */
void tEventInit(tEvent *event, tEventType type)
{
	event->type = tEventTypeUnknow;
	tListInit(&event->waitList);
}

tEvent.h

#ifndef __TEVENT_H
#define __TEVENT_H

#include "tLib.h"

/* 事件控制块类型 */
typedef enum _tEventType{
	tEventTypeUnknow,
}tEventType;

/* 事件控制块 */
typedef struct _tEvent{
	tEventType type;		//事件控制块类型
	tList waitList;			//等待列表
}tEvent;


void tEventInit(tEvent *event, tEventType type);


#endif

tinyOS.h

#ifndef __TINYOS_H
#define __TINYOS_H

#include <stdint.h>
#include "tLib.h"
#include "tConfig.h"
#include "tEvent.h"

/* 错误码 */
typedef enum _tError{
	tErrorNoError = 0,		//没有错误发生
}tError;

#define TINYOS_TASK_STATE_RDY				0					//任务就绪
#define TINYOS_TASK_STATE_DESTORYED	(1 << 1)	//任务删除状态位
#define TINYOS_TASK_STATE_DELAYED		(1 << 2) 	//任务处于延时状态
#define TINYOS_TASK_SYATE_SUSPEND		(1 << 3)	//任务挂起状态位

//堆栈单元类型
typedef uint32_t tTaskStack;

/* 任务结构 */
typedef struct _tTask {
	uint32_t *stack;							//指向堆栈的指针
	tNode linkNode;								//优先级队列的链接结点
	uint32_t delayTicks;					//软延时计数器
	tNode delayNode;							//通用的结点结构
	uint32_t prio;								//优先级字段
	uint32_t state;								//任务状态
	uint32_t slice;								//时间片计数器
	uint32_t suspendCount;				//任务挂起计数器
	
	void (*clean) (void *param);	//清理函数
	void *cleanParam;							//清理函数参数
	uint8_t requestDeleteFlag;		//删除请求标记
	
	tEvent *waitEvent;						//任务在等待哪一个事件控制块
	void *eventMsq;								//等待事件数据存放的位置
	uint32_t waitEventResult;			//等待结果
}tTask;

extern tTask *currentTask;			
extern tTask *nextTask;				

uint32_t tTaskEnterCritical(void);
void tTaskExitCritical(uint32_t status);

void tTaskSwitch(void);		//和CPU相关,写在switch.c
void tTaskRunFirst(void);

void tTaskSchedInit(void);
void tTaskSchedDisable(void);
void tTaskSchedEnable(void);
void tTaskSchedRdy(tTask *task);
void tTaskSchedUnRdy(tTask *task);
void tTaskSchedRemove(tTask *task);
void tTaskSched(void);
void tTimeTaskWait(tTask *task, uint32_t ticks);
void tTimeTaskWakeUp(tTask *task);
void tTimeTaskRemove(tTask *task);
void tTaskSystemTickHandler(void);
void tTaskDelay(uint32_t delay);

/* 任务查询结构 */
typedef struct _tTaskInfo {
	uint32_t delayTicks;		//延时还剩多少个tick数
	uint32_t prio;					//优先级
	uint32_t state;					//状态
	uint32_t slice;					//还有多少个时间片
	uint32_t suspendCount;	//挂起次数
}tTaskInfo;

void tTaskInit(tTask *task, void(*entry)(void *), void *param, uint32_t prio, tTaskStack *stack);
void tTaskSuspend(tTask *task);
void tTaskWakeUp(tTask *task);
void tTaskSetCleanCallFunc(tTask *task, void (*clean)(void *param), void *param);
void tTaskForceDelete(tTask *task);
void tTaskRequestDelete(tTask *task);
uint8_t tTaskIsRequestedDelete(void);
void tTaskDeleteSelf(void);

void tTaskGetInfo(tTask *task, tTaskInfo *info);
void tSetSysTickPeriod(uint32_t ms);
void tInitApp(void);

	
#endif

标签:控制,创建,任务,事件,原理,tEvent,include,tEventType
From: https://blog.csdn.net/daybydayby/article/details/144430015

相关文章

  • Java中创建线程的几种方式
    盘点一下Java中创建线程的几种方式一、继承Thread类,重写run()方法publicclassMyThreadextendsThread{@Overridepublicvoidrun(){System.out.println("mythreadstart"+Thread.currentThread().getName());}publicstaticvoidmain......
  • C语言:控制台扫雷游戏的实现(递归实现雷的排查)
    废话少说,直接上主思路代码一,主思路代码​intmain(){ intinput=0; do { menu(); printf("请输入选择:\n"); scanf("%d",&input); switch(input) { case1: game(); break; case0: break; } }while(input); return0;}​二......
  • 转载:【AI系统】计算图原理
    在前面的文章曾经提到过,目前主流的AI框架都选择使用计算图来抽象神经网络计算表达,通过通用的数据结构(张量)来理解、表达和执行神经网络模型,通过计算图可以把AI系统化的问题形象地表示出来。本文将会以AI概念落地的时候,遇到的一些问题与挑战,因此引出了计算图的概念来对神经网......
  • 砖砸:【AI系统】计算图的控制流实现
    计算图在数学上作为一个有向无环图(DAG,DirectedAcyclicGraph),能够把神经网络模型的概念抽象出来作为同一描述,不过在计算机的编程中,会遇到很多if、else、while、for等控制流语句,有向无环图改如何表示控制流变成了计算图中一个很重要的问题。好处在于,引入控制流之后,开发者可以向计......
  • 星号游走程序(流星雨):一个多彩的控制台动画
    引言在这个项目中,我将介绍一个名为“星号游走程序”的控制台应用程序。该程序通过控制台输出渐变色的星号,并支持多种游走模式和用户交互。本文将详细介绍程序的功能、实现方式以及如何使用它。功能概述1.随机游走模式在随机游走模式下,星号会在控制台内随机移动,形成一种动......
  • 清华大学出品的《自然语言处理:原理、方法与应用》硬核书 |含PDF
    前言人工智能自然语言处理领域的发展也经历了很多大事件,有预测蛋白质结构的alphafold模型、有1750亿参数量的超大无比GPT3屠榜自然语言处理各个任务的榜单,也有实现增量推理与分布式推理的盘古预训练模型。总体来讲,自2018年底谷歌公司发布BERT预训练模型后,自然语言处理领域......
  • 转载:【AI系统】卷积操作原理
    卷积是神经网络里面的核心计算之一,它是一种特殊的线性运算。而卷积神经网络(CNN)是针对图像领域任务提出的神经网络,其受猫的视觉系统启发,堆叠使用卷积层和池化层提取特征。它在CV领域方面的突破性进展引领了深度学习的热潮。回到卷积本身,其变种丰富、计算复杂,神经网络运行时大部......
  • Oracle PL/SQL(变量-条件控制-循环控制-游标-异常)
    一、SQL语句:DML-数据操作语言【insertupdatedelete】DQL-数据查询语言【select】DDL-数据定义语言【createdroptruncate】DCL-数据控制语言【grantrevoke】TCL-事务控制语言【commitrollback】数据库命令:DESC、SHOWUSER、CALLPL/SQL过程化语言/结构化查询语言。二......
  • 如何创建和使用Python虚拟环境
    在Python开发中,使用虚拟环境是一个非常重要的实践。它可以帮助我们隔离项目依赖,避免不同项目之间的包冲突。本文将详细介绍如何创建、激活、使用和退出虚拟环境。1.创建虚拟环境首先,我们需要使用venv模块来创建一个虚拟环境。以下命令将在当前目录下创建一个名为venv的虚拟环境......
  • 转载:【AI系统】低比特量化原理
    计算机里面数值有很多种表示方式,如浮点表示的FP32、FP16,整数表示的INT32、INT16、INT8,量化一般是将FP32、FP16降低为INT8甚至INT4等低比特表示。模型量化则是一种将浮点值映射到低比特离散值的技术,可以有效的减少模型的参数大小、内存消耗和推理延迟,但往往带来较大的精......