?? sosos_core.h
字號:
/*=========================================================================================
項目名稱: 小型開源實時操作系統
軟件版本: VER 1.0
目標平臺: AVR系列單片機
工具鏈 : AVR-GCC(V4.1.2) WINAVR-20070525
開發人員: 韓驍
開發時間: 2007-07-05
版權 : GPL(GNU General Public License)
文件名稱: sosos.c
文件說明:
小型開源實時操作系統的核心包含文件
=========================================================================================*/
#ifndef __SOSOS_CORE_H
#define __SOSOS_CORE_H
#include "sosos_cfg.h"
#if SOSOS_TASK_ENALBE != 1
#define SOSOS_GET_TASK_ID_ENABLE 0//獲得認為ID
#define SOSOS_SUSPEND_TASK_ENABLE 0//任務掛起
#define SOSOS_RESUME_TASK_ENABLE 0//任務恢復
#define SOSOS_DELAY_TASK_ENABLE 0//任務延時
#endif
#if SOSOS_SEM_ENABLE != 1
#define SOSOS_LOGIC_SEM_ENABLE 0//邏輯型信號量
#define SOSOS_COUNT_SEM_ENABLE 0//計數型信號量
#define SOSOS_QUERY_SEM_ENABLE 0//查詢信號量
#endif
#if SOSOS_MUTEX_ENABLE != 1
#define SOSOS_QUERY_MUTEX_ENABLE 0//查詢互斥型信號量
#endif
#if SOSOS_FLAG_ENABLE !=1
#define SOSOS_QUERY_FLAG_ENABLE 0//查詢事件標志
#endif
#if SOSOS_TASK_ENALBE == 1
typedef struct SOSOS_TCB{
SOSOS_ADDRESS TASK_STACK_POINT;//任務堆棧指針
#if STACK_SIZE_REPORT_ENABLE == 1
SOSOS_ADDRESS TASK_STACK_BUTTON;//任務棧底
unsigned int TASK_STACK_SIZE;//任務堆棧的大小
#endif
unsigned char TASK_STATE;//任務狀態
SOSOS_ADDRESS EVENT_INDICATION;//事件指示
SOSOS_TIMEOUT_TYPE TASK_TIMEOUT;//超時定時器
} SOSOS_TCB;//任務控制表結構
#endif
//任務狀態定義
#define TASK_STATE_TIMEOUT_OFFSET 0x70//事件延時推出標記偏移
#define TASK_STATE_OK 0x00//任務狀態正常
#define TASK_STATE_DELAY 0x10//等待延時,延時時間在EVENT_INDICATION內
#define TASK_STATE_SEM 0x11//等待信號量
#define TASK_STATE_MUTEX 0x12//等待互斥型信號量
#define TASK_STATE_FLAG 0x13//等待事件標志
#define TASK_STATE_SEM_TIMEOUT (TASK_STATE_SEM+TASK_STATE_TIMEOUT_OFFSET)
#define TASK_STATE_MUTEX_TIMEOUT (TASK_STATE_MUTEX+TASK_STATE_TIMEOUT_OFFSET)
#define TASK_STATE_FLAG_TIMEOUT (TASK_STATE_FLAG+TASK_STATE_TIMEOUT_OFFSET)
#if SOSOS_FLAG_ENABLE ==1
typedef struct SOSOS_EVENT_FLAG{
SOSOS_FLAG_TYPE *FLAG_POINT;//事件標志組指針
SOSOS_FLAG_TYPE FLAG_WAIT;//等待的事件標志狀態
SOSOS_FLAG_TYPE FLAG_MSK;//事件標志屏蔽(為1的位有效)
} SOSOS_EVENT_FLAG;//事件標志結構
#endif
#if SOSOS_MUTEX_ENABLE == 1
typedef struct SOSOS_MUTEX{
SOSOS_ADDRESS NEXT_MUTEX;//指向下一個互斥型信號量
unsigned char INHERIT_PRI;//繼承的優先級
unsigned char OWN_TASK_PRI;//擁有任務的優先級
unsigned char OWN_TASK_ID;//擁有任務的ID
unsigned char MUTEX_VALUE;//互斥型信號量的值
}SOSOS_MUTEX;//互斥型信號量
SOSOS_MUTEX *SOSOS_MUTEX_POINT;//互斥型信號量鏈表頭指針
#endif
volatile unsigned char SOSOS_TASK_READY[SOSOS_PRI_MAX];//任務就緒表
SOSOS_TCB TCB[SOSOS_PRI_MAX*SOSOS_MAX_TASK_PER_PRI];//任務控制塊
unsigned char SOSOS_TASK_STACK[SOSOS_TASK_STACK_SIZE];//任務堆棧
SOSOS_ADDRESS SOSOS_TASK_STACK_TOP;//任務堆棧頂
#if SOSOS_MUTEX_ENABLE == 1
register unsigned char SOSOS_RUNNING_INHERIT_PRI asm("r6"); //繼承后的優先級
#endif
register unsigned char SOSOS_TICKS asm("r7"); //時鐘滴答計數器
register unsigned char SOSOS_TIMESLICE asm("r8"); //時間片寄存器
register unsigned char SOSOS_WAIT_TASK asm("r9"); //等待任務優先級標識
register unsigned char SOSOS_RUNNING_TASK_PRI asm("r10");//當前任務優先級
register unsigned char SOSOS_RUNNING_TASK_ID asm("r11"); //當前任務ID
register unsigned char SOSOS_RUNNING_TASK_ID_INDEX asm("r12"); //當前任務ID索引
volatile register unsigned char SOSOS_INT_NEST asm("r13"); //中斷嵌套計數器
register unsigned char SOSOS_INT_SP_L asm("r14"); //中斷堆棧指針
register unsigned char SOSOS_INT_SP_H asm("r15"); //中斷堆棧指針
volatile register unsigned char SOSOS_STATE asm("r17"); //系統狀態字節
//SOSOS_STATE定義
#define STATE_SCHED_REQ 0x00//任務調度請求
#define STATE_SCHED_RUN 0x01//任務調度中
void SososSched(void);//任務調度
//中斷操作
#define DISABLE_INTERRUPT()\
__asm__ __volatile__("CLI \n\t")
#define ENABLE_INTERRUPT()\
__asm__ __volatile__("SEI \n\t")
//臨界區操作
#define ENTER_CRITICAL()\
__asm__ __volatile__("IN __tmp_reg__,__SREG__ \n\t");\
__asm__ __volatile__("CLI \n\t");\
__asm__ __volatile__("PUSH __tmp_reg__ \n\t")
#define EXIT_CRITICAL()\
__asm__ __volatile__("POP __tmp_reg__ \n\t");\
__asm__ __volatile__("OUT __SREG__,__tmp_reg__ \n\t")
//定義寄存器入棧宏
#define SOSOS_PUSH_REGISTER()\
__asm__ __volatile__("PUSH __zero_reg__ \n\t");\
__asm__ __volatile__("PUSH __tmp_reg__ \n\t");\
__asm__ __volatile__("PUSH R16 \n\t");\
__asm__ __volatile__("IN R16,__SREG__ \n\t");\
__asm__ __volatile__("PUSH R16 \n\t");\
__asm__ __volatile__("EOR __zero_reg__,__zero_reg__ \n\t");\
__asm__ __volatile__("PUSH R18 \n\t");\
__asm__ __volatile__("PUSH R19 \n\t");\
__asm__ __volatile__("PUSH R20 \n\t");\
__asm__ __volatile__("PUSH R21 \n\t");\
__asm__ __volatile__("PUSH R22 \n\t");\
__asm__ __volatile__("PUSH R23 \n\t");\
__asm__ __volatile__("PUSH R24 \n\t");\
__asm__ __volatile__("PUSH R25 \n\t");\
__asm__ __volatile__("PUSH R26 \n\t");\
__asm__ __volatile__("PUSH R27 \n\t");\
__asm__ __volatile__("PUSH R30 \n\t");\
__asm__ __volatile__("PUSH R31 \n\t");\
__asm__ __volatile__("PUSH R28 \n\t");\
__asm__ __volatile__("PUSH R29 \n\t")
#define SOSOS_PUSH_REGISTER_NO 18//入棧的寄存器數量
//定義寄存器出棧宏
#define SOSOS_POP_REGISTER()\
__asm__ __volatile__("POP R29 \n\t");\
__asm__ __volatile__("POP R28 \n\t");\
__asm__ __volatile__("POP R31 \n\t");\
__asm__ __volatile__("POP R30 \n\t");\
__asm__ __volatile__("POP R27 \n\t");\
__asm__ __volatile__("POP R26 \n\t");\
__asm__ __volatile__("POP R25 \n\t");\
__asm__ __volatile__("POP R24 \n\t");\
__asm__ __volatile__("POP R23 \n\t");\
__asm__ __volatile__("POP R22 \n\t");\
__asm__ __volatile__("POP R21 \n\t");\
__asm__ __volatile__("POP R20 \n\t");\
__asm__ __volatile__("POP R19 \n\t");\
__asm__ __volatile__("POP R18 \n\t");\
__asm__ __volatile__("POP R16 \n\t");\
__asm__ __volatile__("OUT __SREG__,R16 \n\t");\
__asm__ __volatile__("POP R16 \n\t");\
__asm__ __volatile__("POP __tmp_reg__ \n\t");\
__asm__ __volatile__("POP __zero_reg__ \n\t")
//定義中斷宏
#define SOSOS_ISR(vector)\
void vector (void) __attribute__ ((signal,naked));\
void vector (void)
//進入中斷
#define SOSOS_ENTER_INTERRUPT()\
SOSOS_PUSH_REGISTER();\
if(SOSOS_INT_NEST==0){\
if(test_0(SOSOS_STATE,STATE_SCHED_RUN)){\
TCB[SOSOS_RUNNING_TASK_PRI*SOSOS_MAX_TASK_PER_PRI+SOSOS_RUNNING_TASK_ID].TASK_STACK_POINT=SP;\
}\
__asm__ __volatile__("IN r30 ,__SP_L__ \n\t");\
__asm__ __volatile__("IN r31 ,__SP_H__ \n\t");\
__asm__ __volatile__("OUT __SP_L__,r14 \n\t");\
__asm__ __volatile__("OUT __SP_H__,r15 \n\t");\
__asm__ __volatile__("PUSH R30 \n\t");\
__asm__ __volatile__("PUSH R31 \n\t");\
}\
SOSOS_INT_NEST++
//離開中斷
#define SOSOS_EXIT_INTERRUPT()\
DISABLE_INTERRUPT();\
if(SOSOS_INT_NEST>0)\
SOSOS_INT_NEST--;\
if(SOSOS_INT_NEST==0){\
__asm__ __volatile__("POP R31 \n\t");\
__asm__ __volatile__("POP R30 \n\t");\
__asm__ __volatile__("OUT __SP_L__,r30 \n\t");\
__asm__ __volatile__("OUT __SP_H__,r31 \n\t");\
if(test_1(SOSOS_STATE,STATE_SCHED_REQ)){\
if(test_0(SOSOS_STATE,STATE_SCHED_RUN)){\
SososSched();\
}\
}\
}\
SOSOS_POP_REGISTER();\
__asm__ __volatile__("RETI \n\t")
#endif //__SOSOS_CORE_H
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -