⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 linos.h

📁 采用C++改写的uCOS-II,目标系统为MSP430系列CPU。
💻 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 + -