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

📄 sosos_core.h

📁 基于AVR平台的RTOS
💻 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 + -