目录
问题概述
- 如何同步两个任务的运行?
- 如何处理多个任务共享资源的冲突问题?
- 如何在多个任务间传递消息通信?
- 如何在中断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