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