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

📄 rtos.h

📁 嵌入式教程嵌入式教程嵌入式教程嵌入式教程嵌入式教程嵌入式教程嵌入式教程
💻 H
字号:
/************************************************************************************************************************
*										RTOS.h
*
*
*
************************************************************************************************************************/
#ifndef _RTOS_H_
#define _RTOS_H_

#include <avr/io.h>
#include <avr/interrupt.h>

#define 	Uint_8bit		unsigned char
#define 	Int_8bit		char
#define 	Uint_16bit		unsigned int
#define 	Int_16bit		int
#define 	Int_32bit		float

#define		TaskIsRuning	1				/*任务运行				*/
#define		TaskIsRdy		2				/*任务就绪				*/
#define		TaskIsPend		3				/*任务挂起				*/
#define		TaskIsInt		4				/*任务被中断			*/

/*进入临界代码区*/
#define		OS_ENTER_CRITICAL()         \
asm volatile(                          \
"IN   __tmp_reg__,__SREG__"    "\n\t"   \
"PUSH __tmp_reg__"             "\n\t"   \
"CLR  __zero_reg__"            "\n\t"   \
"CLI"                          "\n\t"   \
)  \

/*退出临界代码区*/
#define		OS_EXIT_CRITICAL()          \
asm volatile(                          \
"POP  __tmp_reg__"            "\n\t"     \
"OUT  __SREG__,__tmp_reg__"   "\n\t"     \
"CLR  __zero_reg__"           "\n\t"     \
)   \

/*中断调度请求函数,作为一个宏定义是因为用C写的时候在中断之后程序不能正常运行,不知道原因*/
#define OSIntSchedReq()                 \
asm volatile(                          \
"IN   __tmp_reg__,__SREG__"    "\n\t"   \
"PUSH __tmp_reg__"             "\n\t"   \
"CLR  __zero_reg__"            "\n\t"   \
"CLI"                          "\n\t"   \
"ORI     R16,0x02"             "\n\t"   \
"POP  __tmp_reg__"             "\n\t"   \
"OUT  __SREG__,__tmp_reg__"    "\n\t"   \
"CLR  __zero_reg__"            "\n\t"   \
)  \

#define OS_TASKS			3				/*设定运行任务的数量	*/
#define OS_MAX_SEM			10				/*最大信号量的数量		*/
#define Total_Stack_Size	400				/*系统总的堆栈空间		*/

Uint_8bit Stack[Total_Stack_Size];

register Uint_8bit OSRdyTbl			asm("r2");		/*任务运行就绪表	*/
register Uint_8bit OSPrioCur			asm("r3");		/*正在运行的任务	*/
register Uint_8bit OSIntNesting		asm("r4");
/*
	中断嵌套计数器
	只有当中断嵌套数为0,并且有中断要求时,才能在退出中断时,进行任务调度
*/
register Uint_8bit OSPrioHighRdy		asm("r5");		/*更高优先级的任务	*/
register Uint_8bit OSCoreState			asm("r16");
/*
	系统核心标志位 ,R16 编译器没有使用
	只有大于R15的寄存器才能直接赋值 例LDI R16,0x01
	0x01 正在任务 切换  0x02 有中断要求切换
*/

/*任务控制块数据结构*/
typedef struct TaskCtrBlock
{
	Uint_16bit	OSTaskStackTop;		/*保存任务的堆栈顶		*/
	Uint_16bit	OSWaitTick;			/*任务延时时钟			*/
	Uint_8bit	OSTaskStatus;		/*任务状态				*/
} OS_TCB;

/*信号量数据结构*/
typedef struct SemBlk
{
	Uint_8bit OSEventType;			/*型号 0,信号量独占型;1信号量共享型*/ 
	Uint_8bit OSEventState;			/*状态 0,不可用;1,可用				*/
	Uint_8bit OSTaskPendTbl;		/*等待信号量的任务列表				*/
} OS_EVENT;

OS_TCB		TCB[OS_TASKS+1];		/*定义任务控制块,加一是因为有一个空闲任务*/
OS_EVENT 	Sem[OS_MAX_SEM];		/*定义信号量控制块					*/

/*防止被编译器占用 */
register Uint_8bit tempR6  asm("r6");
register Uint_8bit tempR7  asm("r7");
register Uint_8bit tempR8  asm("r8");
register Uint_8bit tempR9  asm("r9");
register Uint_8bit tempR10 asm("r10");
register Uint_8bit tempR11 asm("r11");
register Uint_8bit tempR12 asm("r12");
register Uint_8bit tempR13 asm("r13");
register Uint_8bit tempR14 asm("r14");
register Uint_8bit tempR15 asm("r15");
register Uint_8bit tempR16 asm("r17");

void OSTaskCreate(void (*Task)(void),Uint_8bit *Stack,Uint_8bit TaskID);
void OSStartTask(void);
void OS_TASK_SW(void);
void OSSched(void);
void IntSwitch(void);
void OSTaskSuspend(Uint_8bit prio);
void OSTaskResume(Uint_8bit prio);
void OSTimeDly(Uint_16bit ticks);
void OSSemCreat(Uint_8bit Index,Uint_8bit Type);
Uint_8bit OSTaskSemPend(Uint_8bit Index,Uint_16bit Timeout);
void OSSemPost(Uint_8bit Index);
void OSTaskSemPost(Uint_8bit Index);
void OSSemClean(Uint_8bit Index);
void TCN0Init(void);
void IdleTask(void);
void OSInit(void);
void OSFindPrioHighRdy (void);
void OSIntEnter(void);
void OSIntExit(void);

#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -