📄 rtos.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 + -