📄 linos.h
字号:
#ifndef LINOS_H
#define LINOS_H
#ifdef __cplusplus
extern "C" {
#endif
#include "..\cpu\os_cpu.h"
#include "..\cpu\os_cfg.h"
#define OS_VERSION 100u //equ ucosii 270u
#ifdef OS_GLOBALS
#define OS_EXT
#else
#define OS_EXT extern
#endif
#ifndef FALSE
#define FALSE 0
#endif
#ifndef TRUE
#define TRUE 1
#endif
/*----------------------------------------------------------------------------*/
/* System var */
/*----------------------------------------------------------------------------*/
#if OS_TIME_GET_SET_EN>0 //Config:OS_TIME_GET_SET_EN
OS_EXT volatile INT32U OSTime; //系统Tick
#endif
OS_EXT INT32U OSCtxSwCtr; //任务切换计数
OS_EXT INT8U OSIntNesting; //中断嵌套计数
OS_EXT INT8U OSIntExitY; //中断调度变量
OS_EXT INT8U OSLockNesting; //中断锁定调度计数
OS_EXT BOOLEAN OSRunning; //系统运行标志
extern INT8U const OSMapTbl[8]; //优先级位表
extern INT8U const OSUnMapTbl[256]; //优先级索引表
void OSCpuInit(void); //系统CPU初始化程序
void OSInit(void); //系统初始化程序
INT8U OS_TCBInit(INT8U prio,OS_STK *ptos); //任务产生TCB初始化
void OSStart(void); //系统开始程序
void OSStartHighRdy(void); //系统开始启动就绪最高优先级程序
void OS_Sched(void); //任务级调度程序
void OSCtxSw(void); //任务级切换程序
void OSIntEnter(void); //中断进入程序(此程序一般有中断汇编程序直接完成)
void OSIntExit(void); //中断退出调度程序
void OSIntCtxSw(void); //中断级切换程序
#if OS_SCHED_LOCK_EN > 0 //Config:OS_SCHED_LOCK_EN
void OSSchedLock(void); //调度锁定程序
void OSSchedUnlock(void); //调度解锁程序
#endif
/*----------------------------------------------------------------------------*/
/* IDL Task var */
/*----------------------------------------------------------------------------*/
#define OS_IDLE_PRIO (OS_LOWEST_PRIO) //空闲任务优先级
OS_EXT volatile INT32U OSIdleCtr; //IDL任务运行计数
OS_EXT OS_STK OSTaskIdleStk[OS_TASK_IDLE_STK_SIZE]; //IDL 任务堆栈,Config:OS_TASK_IDLE_STK_SIZE
void OS_TaskIdle(void *p_arg); //空闲任务程序
/*----------------------------------------------------------------------------*/
/* State Task var */
/*----------------------------------------------------------------------------*/
#define OS_STAT_PRIO (OS_LOWEST_PRIO-1) //状态任务优先级
#if OS_TASK_STAT_EN > 0
OS_EXT INT8S OSCPUUsage; //Cpu利用率
OS_EXT INT32U OSIdleCtrMax; //空函数运行最大计数值的1/100
OS_EXT BOOLEAN OSStatRdy; //状态任务准备标志
OS_EXT OS_STK OSTaskStatStk[OS_TASK_STAT_STK_SIZE]; //状态任务堆栈
void OSStatInit(void); //状态初始化程序
void OS_TaskStat(void *p_arg); //状态任务程序
#endif
/*----------------------------------------------------------------------------*/
/* EVENT */
/*----------------------------------------------------------------------------*/
#define OS_EVENT_EN (((OS_Q_EN > 0) && (OS_MAX_QS > 0)) || (OS_MBOX_EN > 0) || (OS_SEM_EN > 0) || (OS_MUTEX_EN > 0))
#define OS_EVENT_TBL_SIZE ((OS_LOWEST_PRIO>>3) + 1) //事件表达小,与OS_RDY_TBL_SIZE相等
//事件类型值
#define OS_EVENT_TYPE_UNUSED 0
#define OS_EVENT_TYPE_MBOX 1
#define OS_EVENT_TYPE_Q 2
#define OS_EVENT_TYPE_SEM 3
#define OS_EVENT_TYPE_MUTEX 4
#define OS_EVENT_TYPE_FLAG 5
//事件数据结构
#if(OS_EVENT_EN > 0) && (OS_MAX_EVENTS > 0)
typedef struct os_event {
INT8U OSEventType; //事件类型
INT8U OSEventGrp; //等待事件发生的任务组
INT16U OSEventCnt; //Semaphore计数(不用于别的事件)
void *OSEventPtr; //消息或队列指针
INT8U OSEventTbl[OS_EVENT_TBL_SIZE]; //任务等待事件表,类似OSRdyTbl
}OS_EVENT;
#endif
OS_EXT OS_EVENT *OSEventFreeList; //指向空闲事件块指针
OS_EXT OS_EVENT OSEventTbl[OS_MAX_EVENTS]; //任务控制块表,类似OSTCBTbl
#if OS_EVENT_EN > 0
INT8U OS_EventTaskRdy(OS_EVENT *pevent, void *msg, INT8U msk); //任务等待事件就绪函数
void OS_EventTaskWait(OS_EVENT *pevent); //任务等待事件函数
void OS_EventTO(OS_EVENT *pevent);
void OS_EventWaitListInit(OS_EVENT *pevent); //事件等待清单初始化
#endif
/*----------------------------------------------------------------------------*/
/* TASK TCB */
/*----------------------------------------------------------------------------*/
#define OS_PRIO_SELF 0xFF //表示当前任务优先级
#if OS_TASK_STAT_EN>0 //Config:OS_TASK_STAT_EN
#define OS_N_SYS_TASKS 2 //系统任务数:IDL,STAT
#else
#define OS_N_SYS_TASKS 1 //系统任务书:IDL
#endif
#define OS_RDY_TBL_SIZE ((OS_LOWEST_PRIO>>3)+1) //就绪表大小,Config:OS_LOWEST_PRIO
//任务状态值
#define OS_STAT_RDY 0x00 //就绪状态
#define OS_STAT_SEM 0x01 //等待信号量状态
#define OS_STAT_MBOX 0x02 //等待油箱状态
#define OS_STAT_Q 0x04 //等待队列状态
#define OS_STAT_SUSPEND 0x08 //挂起状态
#define OS_STAT_MUTEX 0x10 //等待互拆信号量状态
#define OS_STAT_FLAG 0x20 //等待事件标志状态
typedef struct os_tcb
{
OS_STK *OSTCBStkPtr; //堆栈当前指针
struct os_tcb *OSTCBNext; //指向下一个TCB
struct os_tcb *OSTCBPrev; //指向前一个TCB
#if OS_EVENT_EN > 0
OS_EVENT *OSTCBEventPtr; //事件控制块指针
#endif
#if ((OS_Q_EN > 0) && (OS_MAX_QS > 0)) || (OS_MBOX_EN > 0)
void *OSTCBMsg; //从OSMboxPost() or OSQPost()接收到的信息
#endif
INT16U OSTCBDly; //延时等待
INT8U OSTCBStat; //任务状态
INT8U OSTCBPrio; //任务优先级
INT8U OSTCBX; //用于快速访问就绪表:OSRdyTbl数组值中的位
INT8U OSTCBBitX; //用于快速访问就绪表:OSRdyTbl数组值中位的位码
INT8U OSTCBY; //用于快速访问就绪表:OSRdyTbl数组下标
INT8U OSTCBBitY; //用于快速访问就绪表:OSRdyTbl数组下标的位码
}OS_TCB;
OS_EXT INT8U OSTaskCtr; //任务产生计数
OS_EXT INT8U OSPrioCur; //当前任务优先级
OS_EXT INT8U OSPrioHighRdy; //就绪任务最高优先级
OS_EXT INT8U OSRdyGrp; //就绪组清单
OS_EXT INT8U OSRdyTbl[OS_RDY_TBL_SIZE]; //就绪表
OS_EXT OS_TCB *OSTCBCur; //指向当前任务
OS_EXT OS_TCB *OSTCBFreeList; //指向空的TCBS列表
OS_EXT OS_TCB *OSTCBHighRdy; //指向高优先就绪任务
OS_EXT OS_TCB *OSTCBList; //指向TCBS列表
OS_EXT OS_TCB *OSTCBPrioTbl[OS_LOWEST_PRIO+1]; //TCBS优先级指针表,Config:OS_LOWEST_PRIO
OS_EXT OS_TCB OSTCBTbl[OS_MAX_TASKS+OS_N_SYS_TASKS]; //TCBS表,Config:OS_MAX_TASKS
INT8U OSTaskCreate(void (*task)(void *pd),void *p_arg,OS_STK *ptos,INT8U prio); //任务产生函数
OS_STK *OSTaskStkInit(void (*task)(void *pd),void *p_arg,OS_STK *ptos,INT16U opt); //任务堆栈初始化函数
#if OS_TASK_CHANGE_PRIO_EN > 0 //Config:OS_TASK_CHANGE_PRIO_EN
INT8U OSTaskChangePrio(INT8U oldprio,INT8U newprio); //任务优先级改变函数
#endif
#if OS_TASK_SUSPEND_EN > 0
INT8U OSTaskSuspend(INT8U prio); //任务挂起函数
INT8U OSTaskResume(INT8U prio); //任务恢复函数
#endif
/*----------------------------------------------------------------------------*/
/* TIME */
/*----------------------------------------------------------------------------*/
void OSTimeDly(INT16U ticks); //当前任务延时程序
#if OS_TIME_DLY_RESUME_EN > 0
INT8U OSTimeDlyResume(INT8U prio); //
#endif
/*----------------------------------------------------------------------------*/
/* ERROR CODE */
/*----------------------------------------------------------------------------*/
#define OS_NO_ERR 0
#define OS_ERR_EVENT_TYPE 1u
#define OS_ERR_PEND_ISR 2u
#define OS_ERR_POST_NULL_PTR 3u
#define OS_ERR_PEVENT_NULL 4u
#define OS_ERR_POST_ISR 5u
#define OS_ERR_QUERY_ISR 6u
#define OS_ERR_INVALID_OPT 7u
#define OS_ERR_TASK_WAITING 8u
#define OS_TIMEOUT 10u
#define OS_TASK_NOT_EXIST 11u
#define OS_ERR_EVENT_NAME_TOO_LONG 12u
#define OS_ERR_FLAG_NAME_TOO_LONG 13u
#define OS_ERR_TASK_NAME_TOO_LONG 14u
#define OS_ERR_PNAME_NULL 15u
#define OS_MBOX_FULL 20u
#define OS_Q_FULL 30u
#define OS_Q_EMPTY 31u
#define OS_PRIO_EXIST 40u
#define OS_PRIO_ERR 41u
#define OS_PRIO_INVALID 42u
#define OS_SEM_OVF 50u
#define OS_TASK_DEL_ERR 60u
#define OS_TASK_DEL_IDLE 61u
#define OS_TASK_DEL_REQ 62u
#define OS_TASK_DEL_ISR 63u
#define OS_NO_MORE_TCB 70u
#define OS_TIME_NOT_DLY 80u
#define OS_TIME_INVALID_MINUTES 81u
#define OS_TIME_INVALID_SECONDS 82u
#define OS_TIME_INVALID_MILLI 83u
#define OS_TIME_ZERO_DLY 84u
#define OS_TASK_SUSPEND_PRIO 90u
#define OS_TASK_SUSPEND_IDLE 91u
#define OS_TASK_RESUME_PRIO 100u
#define OS_TASK_NOT_SUSPENDED 101u
#define OS_MEM_INVALID_PART 110u
#define OS_MEM_INVALID_BLKS 111u
#define OS_MEM_INVALID_SIZE 112u
#define OS_MEM_NO_FREE_BLKS 113u
#define OS_MEM_FULL 114u
#define OS_MEM_INVALID_PBLK 115u
#define OS_MEM_INVALID_PMEM 116u
#define OS_MEM_INVALID_PDATA 117u
#define OS_MEM_INVALID_ADDR 118u
#define OS_MEM_NAME_TOO_LONG 119u
#define OS_ERR_NOT_MUTEX_OWNER 120u
#define OS_TASK_OPT_ERR 130u
#define OS_ERR_DEL_ISR 140u
#define OS_ERR_CREATE_ISR 141u
#define OS_FLAG_INVALID_PGRP 150u
#define OS_FLAG_ERR_WAIT_TYPE 151u
#define OS_FLAG_ERR_NOT_RDY 152u
#define OS_FLAG_INVALID_OPT 153u
#define OS_FLAG_GRP_DEPLETED 154u
#ifdef __cplusplus
}
#endif
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -