📄 microros.h
字号:
/*
*******************************************************************************
*
* MicroROS
*
* Copyright (C) 2007 <amwox@163.com>
*
* Statement : 发布这个软件是希望和大家一起学习探讨操作系统的原理及使用,
* 在符合<<许可协议>>的条件下可以自由使用。
*
* Description : 看过AVRX、uc/OS II…不是系统移植不方便,就是过于庞大,占用不少的
* 内存,对于微型嵌入系统来说是非不利的。于是,有了自已动手的想法。
* MicroROS是一个微型嵌入式操作系统。采用基于优先级抢占和FCFS相结合
* 的调度算法。最多可以定义256个优先级,0的优先级最高。不同的任务可
* 以有相同的优先级,按的FCFS(先到先服务)算法进行调度。
* 从MicroROS上可以看到AVRX的影子,也可以说MicroROS是AVRX改进型的C
* 语言版。
* 向AVRX和uc/OS II和作者致谢。
*
* File : MicroROS.h
* Author : amwox
* Edition : V0.10
* History : 2007-10-29 created
* 2008-01-28 在PID中增加了事件链表指针,对事件处理作了相应的修改
*******************************************************************************
*/
#ifndef __MIRCOROS__H__
#define __MIRCOROS__H__
#include "..\os_config.h"
#include "os_macro.h"
/*
*******************************************************************************
* 数据结构
*******************************************************************************
*/
typedef enum {
FALSE = 0,TRUE = 1
}BOOL;
typedef unsigned char CHAR;
typedef unsigned char BYTE;
typedef unsigned short int WORD;
typedef unsigned long DWORD;
typedef signed char SBYTE;
typedef signed short int SWORD;
typedef signed long SDWORD;
typedef unsigned char STACK;
typedef unsigned char CPU_SREG;
typedef struct PID {
struct PID * pNext; /*进程在列表中的链接指针*/
STACK * pCP; /*上下文切换指针*/
struct PID * pEventNext;
WORD TimerCnt; /*进程定时计数器*/
void (*pTaskName) (void); /*任务函数名*/
BYTE State; /*进程状态*/
BYTE Priority; /*进程优先级,0的优先级最高*/
} *pPID,PID;
#if SEMAPHORE_EN > 0
typedef struct SEM {
WORD SemCnt; /*资源计数器*/
pPID pSemList;
#if EVENT_BLOCK_COUNT > 0
BYTE BlockCnt; /*阻塞进程计数器,在==1时与pProcess配合可以获得最佳的响应时间*/
#endif
}*pSEM,SEM;
#endif
#if MUTEX_EN > 0
typedef struct MUTEX {
pPID pLockMutex; /*互斥体锁定的进程*/
BYTE Priority; /*天花板优先级*/
BYTE LockPriority; /*锁定的进程的优先级*/
#if EVENT_BLOCK_COUNT > 0
BYTE BlockCnt; /*阻塞进程计数器*/
#endif
}*pMUTEX,MUTEX;
#endif
#if MAILBOX_EN > 0
typedef struct MAILBOX {
void * pMail; /*mail指针*/
pPID pMailList;
#if EVENT_BLOCK_COUNT > 0
BYTE BlockCnt; /*阻塞计数器*/
#endif
}*pMAILBOX, MAILBOX;
#endif
typedef struct KernelData {
STACK * pIdleStack; /*IDLE堆栈*/
pPID pRunning; /*正在运行的进程*/
pPID pRunList; /*进程运行列表*/
pPID pTimerList; /*定时器列表*/
BYTE SysLevel; /*内核状态*/
}KernelData;
/*
*******************************************************************************
* 任务定义:每一个任务都需要指定堆栈,PID,PCB,为了简化将其定义为一个宏
*******************************************************************************
*/
#define TASK_DEF(name, stksize, priority) \
STACK name##Stk [stksize + MINCONTEXT] ; \
void name(void);\
PID name##Pid = { \
NULL,\
&name##Stk[sizeof(name##Stk)-1] , \
NULL,\
0,\
name,\
BV(PID_READY),\
priority \
}
#define GetTaskPid(name) &name##Pid
#define NAKED __C_task /*定义的函数不插入保存和恢复可变寄存器中的数据的代码*/
/*
*******************************************************************************
* 宏
*******************************************************************************
*/
#define LIMITLESS 0xFFFF /*无限制*/
/* **************************** 错误代码定义********************************* */
#define NO_ERROR 0
#define UNKNOW_ERROR 1
#define TIME_OUT 2
#define BUFFER_OVER 3
#define BUFFER_EMPTY 4
#define LOCK_STATE 5
#define ADDRESS_ERROR 6
#define NO_RESOURCE 10
#define NO_ACK 15
#define NOT_EXIST 255
/* **************************** 进程状态定义********************************* */
#define PID_RUNNING 0 /*进程处于运行状态*/
#define PID_READY 1 /*进程处于就绪状态*/
#define PID_SUSPEND 2 /*进程被挂起,以下状态都必须置该位*/
#define PID_IDLE 3 /*进程处于睡眠状态*/
#define PID_SEMAPHARE 4 /*进程正在等待一信号量*/
#define PID_MAILBOX 5 /*进程正在等待一邮箱*/
#define PID_MUTEX 6 /*进程正在等待一互斥信号*/
//#define PID_SingleStep 7 /*单步调试模式*/
/*
*******************************************************************************
* 内核API
*******************************************************************************
*/
/* ****************************** os_cpu.c ********************************** */
void OS_IdleTask(void);
void OS_KernelInit(void); /*OS内核初始化,一般在main中最先调用*/
/* **************************** os_tasking.c ******************************** */
NAKED void OS_Start(void); /*启动OS*/
void OS_TaskCreate(pPID pProcess); /*创建任务*/
void OS_TaskResume(pPID pProcess); /*恢复任务运行*/
void OS_TaskSuspend(pPID pProcess); /**/
void OS_TaskSleep(WORD ticks); /*任务进入睡眠状态,睡眠时间为ticks*/
/* ***************************** os_timer.c ********************************* */
//void OS_TimeTick(void); /*OS Tick,由定时中断调用*/
void OS_TimeHook(void); /*在OS_TimeTick中调用*/
/* ************************** os_semaphores.c ******************************* */
#if SEMAPHORE_EN > 0
void OS_SemaphoreCreate(pSEM pSem, WORD cnt);
BYTE OS_SemaphorePend(pSEM pSem, WORD cnt, WORD timeout);
void OS_SemaphorePost(pSEM pSem, WORD cnt);
#endif
/* ************************** os_mutex.c ******************************* */
#if MUTEX_EN > 0
void OS_MutexCreate(pMUTEX pMutex, BYTE priority);
BYTE OS_MutexLock(pMUTEX pMutex, WORD timeout);
void OS_MutexUnLock(pMUTEX pMutex);
#endif
/* ************************** os_semaphores.c ******************************* */
#if MAILBOX_EN > 0
void OS_MailBoxCreate(pMAILBOX pMailBox);
BYTE OS_MailBoxPend(pMAILBOX pMailBox, void ** pMail, WORD timeout);
void OS_MailBoxPost(pMAILBOX pMailBox, void * pMail);
#endif
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -