伪操作系统胚胎版,分享大家会继续完善
伪操作系统胚胎版,分享大家会继续完善。
由于工作比较忙先分享原始版。以后在慢慢完善。大家一起交流。
/*
* 名称: Hzl_OS 0.01
* 说明: 伪操作系统(无任务切换)胚胎版
* 带任务优先级实时操作系统。
*
*/
#include< stdio.h>
#include< stdlib.h>
#include< p24FJ128GA010.h>
#define Task_Size 8
unsigned char Event_List[Task_Size];
unsigned char Task_PQH;
void (*Task_List[Task_Size])(void);
void Task0() //看门狗清理任务
{
unsigned long s=0;
//Event_List[2]=1; //发生事件
Event_List[0]=0; //清除事件
//UART1_write(0x00);
}
void Task1()
{
UART1_write(0x01);
}
void Task2()
{
UART1_write(0x02);
}
void Task3()
{
UART1_write(0x03);
}
void Task4()
{
UART1_write(0x04);
}
void Task5()
{
UART1_write(0x05);
}
void Task6() {
UART1_write(0x06);
}
void Task7() //空闲任务
{
// Idle();
// UART1_write(0x07);
}
int main(int argc, char** argv)
{
UART1Init();
T1Iinit();
Task_List[0]=Task0; //初步化任务表
Task_List[1]=Task1;
Task_List[2]=Task2;
Task_List[3]=Task3;
Task_List[4]=Task4;
Task_List[5]=Task5;
Task_List[6]=Task6;
Task_List[7]=Task7;
for(Task_PQH=0;Task_PQH<Task_Size;Task_PQH++) //初始化事件
{
Event_List[Task_PQH]=0;
}
while(1)
{
for(Task_PQH=0;Task_PQH<Task_Size-1;Task_PQH++) //查找最高优先级任务
{
if(Event_List[Task_PQH]>0) //有事件发生
break;
}
Task_List[Task_PQH](); //执行任务
}
return (EXIT_SUCCESS);
}
void __attribute__((__interrupt__)) _T1Interrupt(void) //10ms中断
{
// WriteTimer1(0);
jp++;
if(jp>=10)
{
jp=0;
Event_List[0]=1; //启动事件
}
IFS0bits.T1IF = 0;
}
值得学习借鉴! 现在的好的系统功能太复杂了,反正不容易理解。这个挺容易理解的。while(1)死循环里面一直轮询任务的执行标志,如果查询到任务要执行,就执行函数。也可以去参考TI的OSAL,这个也是采用轮询查询任务的RTOS。
更新一下:
***************************************************************************
* 文件名称: main.c
* 文件说明: 主函数
* 版本: V0.10 Max 2019.8.15 创建
* 其他: 该文件不做编程
* ************************************************************************/
#include< stdio.h>
#include< stdlib.h>
#include "Hos.h"
#include "DeviceDriver.h"
/*********配置位禁止修改**************/
__CONFIG(0x3FE4);
__CONFIG(0xFFF); //配置位
/************************************/
/***************************************************************************
* 函数名称: int main(void)
* 函数说明: 主函数
* 参数: 无
* 返回值: 无
* 版本: V0.10 Max 2019.8.15 创建
* 其他: 禁止修改
* ************************************************************************/
int main(int argc, char** argv)
{
OSCCONbits.IRCF = 0b1111; //禁止修改主频--16mHz
/**************************硬件初始化*********************************/
Driver_Init(); //驱动初始化
/*****************************系统*************************************/
HOS_EventInit(); //事件初始化
HOS_AddTask(); //添加任务表
HOS_StartEvent(); //任务启动事件弹射
HOS_Run(); //系统运行
/***********************************************************************/
return (EXIT_SUCCESS);
}
// TO ---> Happ
/***************************************************************************
* 文件名称: Hos.c
* 文件说明: 系统相关函
* 版本: V0.10 Max 2019.8.15 创建
* 其他: 只能修改HOS_AddTask(void),HOS_StartEvent(void)
*************************************************************************/
#include "Hos.h"
#include "Happ.h"
/***************************************************************************
* 函数名称: void HOS_AddTask(void)
* 函数说明: 添加函表
* 参数: 无
* 返回值: 无
* 版本: V0.10 Max 2019.8.15 创建
* 其他: 可修改添加函数
*************************************************************************/
void HOS_AddTask(void)
{
Task_PCB[0].Task = Task0 ; //初始化函数
Task_PCB[1].Task = Task1 ; //初始化函数
Task_PCB[2].Task = Task2 ; //初始化函数
Task_PCB[3].Task = Task3 ; //初始化函数
Task_PCB[4].Task = Task4 ; //初始化函数
Task_PCB[5].Task = Task5 ; //初始化函数
Task_PCB[6].Task = Task6 ; //初始化函数
Task_PCB[7].Task = Task7 ; //初始化函数
}
/***************************************************************************
* 函数名称: void HOS_StartEvent(void)
* 函数说明: 发送启动事件
* 参数: 无
* 返回值: 无
* 版本: V0.10 Max 2019.8.15 创建
* 其他: 可修改添加启动事件
*************************************************************************/
void HOS_StartEvent(void)
{
}
/***************************************************************************
* 函数名称: TypEvent HOS_WriteEvent(uint8 PQH ,TypEvent EVENT )
* 函数说明: 写对应任务的事件
* 参数: PQH :任务优先级
* EVENT : 标志事件
* 返回值: 无
* 版本: V0.10 Max 2019.8.15 创建
* 其他: 禁止修改
*************************************************************************/
void HOS_WriteEvent(uint8 PQH ,TypEvent EVENT )
{
Task_PCB[PQH].Event |= EVENT ;
}
/***************************************************************************
* 函数名称: TypEvent HOS_ClearEvent(uint8 PQH ,TypEvent EVENT )
* 函数说明: 清除任务的事件
* 参数: PQH :任务优先级
* EVENT : 标志事件
* 返回值: 无
* 版本: V0.10 Max 2019.8.15 创建
* 其他: 禁止修改
*************************************************************************/
void HOS_ClearEvent(uint8 PQH ,TypEvent EVENT )
{
Task_PCB[PQH].Event& = ~EVENT ;
}
/***************************************************************************
* 函数名称: TypEvent HOS_ReadEvent(uint8 PQH )
* 函数说明: 读对应任务的事件
* 参数: PQH :任务优先级
* 返回值: returu :任务事件
* 版本: V0.10 Max 2019.8.15 创建
* 其他: 禁止修改
* ************************************************************************/
TypEvent HOS_ReadEvent(uint8 PQH )
{
return Task_PCB[PQH].Event ;
}
/***************************************************************************
* 函数名称: void HOS_Init(void)
* 函数说明: 系统初始化
* 参数: 无
* 返回值: 无
* 版本: V0.10 Max 2019.8.15 创建
* 其他: 禁止修改
* ************************************************************************/
void HOS_EventInit(void)
{
for(Task_PQH=0;Task_PQH<Task_Size-1;Task_PQH++) //初始化事件表
{
Task_PCB[Task_PQH].Event = 0 ;
}
}
/***************************************************************************
* 函数名称: void HOS_Run(void)
* 函数说明: 任务运行函数
* 参数: 无
* 返回值: 无
* 版本: V0.10 Max 2019.8.15 创建
* 其他: 禁止修改
* ************************************************************************/
void HOS_Run(void)
{
while(1) //死循环
{
for(Task_PQH=0;Task_PQH<Task_Size-1;Task_PQH++) //查找最高优先级任务
{
if( Task_PCB[Task_PQH].Event > 0 ) //有事件发生
break;
}
Task_PCB[Task_PQH].Task(Task_PQH) ; //执行任务
}
}
/***************************************************************************
* 文件名称: Hos.h
* 文件说明: 系统配置文件
* 版本: V0.00 Max 2019.8.15 创建
* 其他:
* ************************************************************************/
#ifndef HOS_H
#define HOS_H
/***************************************************************************/
typedef unsigned char uint8;
typedef unsigned int uint16;
typedef unsigned char TypEvent; //事件类型8,16,32
/**************************************************************************/
#define Task_Size 8 //任务数量0-255
uint8 Task_PQH; //优先级寄存器(禁写)
/*******************************任务属性块***********************************/
struct
{
TypEvent Event; //事件
void (*Task)(uint8); //任务函数
//可以扩展添加任意数据
}Task_PCB[Task_Size ] ;
/********************************系统函数***********************************/
void HOS_Run(void);
void HOS_EventInit(void);
void HOS_StartEvent(void);
void HOS_AddTask(void);
/*****************************事件操作函数**********************************/
TypEvent HOS_ReadEvent(uint8 PQH);
void HOS_ClearEvent(uint8 PQH ,TypEvent EVENT);
void HOS_WriteEvent(uint8 PQH ,TypEvent EVENT);
#endif /* HOS_H */
***************************************************************************
* 文件名称: main.c
* 文件说明: 主函数
* 版本: V0.10 Max 2019.8.15 创建
* 其他: 该文件不做编程
* ************************************************************************/
#include< stdio.h>
#include< stdlib.h>
#include "Hos.h"
#include "DeviceDriver.h"
/*********配置位禁止修改**************/
__CONFIG(0x3FE4);
__CONFIG(0xFFF); //配置位
/************************************/
/***************************************************************************
* 函数名称: int main(void)
* 函数说明: 主函数
* 参数: 无
* 返回值: 无
* 版本: V0.10 Max 2019.8.15 创建
* 其他: 禁止修改
* ************************************************************************/
int main(int argc, char** argv)
{
OSCCONbits.IRCF = 0b1111; //禁止修改主频--16mHz
/**************************硬件初始化*********************************/
Driver_Init(); //驱动初始化
/*****************************系统*************************************/
HOS_EventInit(); //事件初始化
HOS_AddTask(); //添加任务表
HOS_StartEvent(); //任务启动事件弹射
HOS_Run(); //系统运行
/***********************************************************************/
return (EXIT_SUCCESS);
}
// TO ---> Happ
/***************************************************************************
* 文件名称: Hos.c
* 文件说明: 系统相关函
* 版本: V0.10 Max 2019.8.15 创建
* 其他: 只能修改HOS_AddTask(void),HOS_StartEvent(void)
*************************************************************************/
#include "Hos.h"
#include "Happ.h"
/***************************************************************************
* 函数名称: void HOS_AddTask(void)
* 函数说明: 添加函表
* 参数: 无
* 返回值: 无
* 版本: V0.10 Max 2019.8.15 创建
* 其他: 可修改添加函数
*************************************************************************/
void HOS_AddTask(void)
{
Task_PCB[0].Task = Task0 ; //初始化函数
Task_PCB[1].Task = Task1 ; //初始化函数
Task_PCB[2].Task = Task2 ; //初始化函数
Task_PCB[3].Task = Task3 ; //初始化函数
Task_PCB[4].Task = Task4 ; //初始化函数
Task_PCB[5].Task = Task5 ; //初始化函数
Task_PCB[6].Task = Task6 ; //初始化函数
Task_PCB[7].Task = Task7 ; //初始化函数
}
/***************************************************************************
* 函数名称: void HOS_StartEvent(void)
* 函数说明: 发送启动事件
* 参数: 无
* 返回值: 无
* 版本: V0.10 Max 2019.8.15 创建
* 其他: 可修改添加启动事件
*************************************************************************/
void HOS_StartEvent(void)
{
}
/***************************************************************************
* 函数名称: TypEvent HOS_WriteEvent(uint8 PQH ,TypEvent EVENT )
* 函数说明: 写对应任务的事件
* 参数: PQH :任务优先级
* EVENT : 标志事件
* 返回值: 无
* 版本: V0.10 Max 2019.8.15 创建
* 其他: 禁止修改
*************************************************************************/
void HOS_WriteEvent(uint8 PQH ,TypEvent EVENT )
{
Task_PCB[PQH].Event |= EVENT ;
}
/***************************************************************************
* 函数名称: TypEvent HOS_ClearEvent(uint8 PQH ,TypEvent EVENT )
* 函数说明: 清除任务的事件
* 参数: PQH :任务优先级
* EVENT : 标志事件
* 返回值: 无
* 版本: V0.10 Max 2019.8.15 创建
* 其他: 禁止修改
*************************************************************************/
void HOS_ClearEvent(uint8 PQH ,TypEvent EVENT )
{
Task_PCB[PQH].Event& = ~EVENT ;
}
/***************************************************************************
* 函数名称: TypEvent HOS_ReadEvent(uint8 PQH )
* 函数说明: 读对应任务的事件
* 参数: PQH :任务优先级
* 返回值: returu :任务事件
* 版本: V0.10 Max 2019.8.15 创建
* 其他: 禁止修改
* ************************************************************************/
TypEvent HOS_ReadEvent(uint8 PQH )
{
return Task_PCB[PQH].Event ;
}
/***************************************************************************
* 函数名称: void HOS_Init(void)
* 函数说明: 系统初始化
* 参数: 无
* 返回值: 无
* 版本: V0.10 Max 2019.8.15 创建
* 其他: 禁止修改
* ************************************************************************/
void HOS_EventInit(void)
{
for(Task_PQH=0;Task_PQH<Task_Size-1;Task_PQH++) //初始化事件表
{
Task_PCB[Task_PQH].Event = 0 ;
}
}
/***************************************************************************
* 函数名称: void HOS_Run(void)
* 函数说明: 任务运行函数
* 参数: 无
* 返回值: 无
* 版本: V0.10 Max 2019.8.15 创建
* 其他: 禁止修改
* ************************************************************************/
void HOS_Run(void)
{
while(1) //死循环
{
for(Task_PQH=0;Task_PQH<Task_Size-1;Task_PQH++) //查找最高优先级任务
{
if( Task_PCB[Task_PQH].Event > 0 ) //有事件发生
break;
}
Task_PCB[Task_PQH].Task(Task_PQH) ; //执行任务
}
}
/***************************************************************************
* 文件名称: Hos.h
* 文件说明: 系统配置文件
* 版本: V0.00 Max 2019.8.15 创建
* 其他:
* ************************************************************************/
#ifndef HOS_H
#define HOS_H
/***************************************************************************/
typedef unsigned char uint8;
typedef unsigned int uint16;
typedef unsigned char TypEvent; //事件类型8,16,32
/**************************************************************************/
#define Task_Size 8 //任务数量0-255
uint8 Task_PQH; //优先级寄存器(禁写)
/*******************************任务属性块***********************************/
struct
{
TypEvent Event; //事件
void (*Task)(uint8); //任务函数
//可以扩展添加任意数据
}Task_PCB[Task_Size ] ;
/********************************系统函数***********************************/
void HOS_Run(void);
void HOS_EventInit(void);
void HOS_StartEvent(void);
void HOS_AddTask(void);
/*****************************事件操作函数**********************************/
TypEvent HOS_ReadEvent(uint8 PQH);
void HOS_ClearEvent(uint8 PQH ,TypEvent EVENT);
void HOS_WriteEvent(uint8 PQH ,TypEvent EVENT);
#endif /* HOS_H */
for(Task_PQH=0;Task_PQH<Task_Size-1;Task_PQH++) //查找最高优先级任务
{
if(Event_List[Task_PQH]>0) //有事件发生
break;
}
查找事件Task_PQH永远是从0开始的。如果有事件就退出并执行那个函数。如果都没有事件就执行空闲任务。