?? rtos.h
字號:
/************************************************************************************************************************
* RTOS.h
*
*
*
************************************************************************************************************************/
#ifndef _RTOS_H_
#define _RTOS_H_
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.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 4 /*設定運行任務的數量 */
#define OS_MAX_SEM 10 /*最大信號量的數量 */
#define Total_Stack_Size 500 /*系統總的堆棧空間 */
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");
/*自定義系統變量*/
unsigned int OSIdleCtr;
unsigned int ostimes;
unsigned char timeint;
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 + -