找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4910|回复: 25
打印 上一主题 下一主题
收起左侧

伪操作系统胚胎版,分享大家会继续完善

  [复制链接]
跳转到指定楼层
楼主
ID:564182 发表于 2019-7-25 00:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

伪操作系统胚胎版,分享大家会继续完善。

由于工作比较忙先分享原始版。以后在慢慢完善。大家一起交流。


/*
*   名称:  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;   
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏11 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:564182 发表于 2019-7-25 00:24 | 只看该作者
核心代码就几十行,用单片机测试基本能用。大家有什么问题和建议请留言。
回复

使用道具 举报

板凳
ID:282095 发表于 2019-7-25 11:02 | 只看该作者
楼主是基于linux操作系统的吗
回复

使用道具 举报

地板
ID:564182 发表于 2019-7-25 11:57 来自手机 | 只看该作者
基于单片机的rtos
回复

使用道具 举报

5#
ID:351097 发表于 2019-7-25 15:10 | 只看该作者
值得学习借鉴! 现在的好的系统功能太复杂了,反正不容易理解。这个挺容易理解的。while(1)死循环里面一直轮询任务的执行标志,如果查询到任务要执行,就执行函数。也可以去参考TI的OSAL,这个也是采用轮询查询任务的RTOS。
回复

使用道具 举报

6#
ID:564182 发表于 2019-7-25 16:47 来自手机 | 只看该作者
hzn1990 发表于 2019-7-25 11:57
基于单片机的rtos

task0优先级最高,可以执行清看门狗任务
task0最低,为空闲任务,无事件可以让单片机进入休眠单片机低功耗也能保持实时性,中断唤醒,弹射事件,执行相关任务。
回复

使用道具 举报

7#
ID:351097 发表于 2019-8-5 10:29 | 只看该作者
hzn1990 发表于 2019-7-25 16:47
task0优先级最高,可以执行清看门狗任务
task0最低,为空闲任务,无事件可以让单片机进入休眠单片机低功 ...

兄弟,你的RTOS现在还有再更新吗?
回复

使用道具 举报

8#
ID:564182 发表于 2019-8-7 18:30 来自手机 | 只看该作者
没有你 发表于 2019-8-5 10:29
兄弟,你的RTOS现在还有再更新吗?

论坛没啥人气没积极性,在加上工作比较忙。以后慢慢完善。
回复

使用道具 举报

9#
ID:20772 发表于 2019-8-21 21:54 | 只看该作者
感谢分享,正在学习中ing
回复

使用道具 举报

10#
ID:247125 发表于 2019-9-1 11:07 | 只看该作者
经典,谢谢分享。
回复

使用道具 举报

11#
ID:20672 发表于 2019-9-16 18:06 | 只看该作者
不错,谢谢分享~~
回复

使用道具 举报

12#
ID:20672 发表于 2019-9-16 18:07 | 只看该作者
没后文啊
回复

使用道具 举报

13#
ID:142699 发表于 2019-11-12 09:41 | 只看该作者
没看出来有优先级,还没写完吧这个程序
回复

使用道具 举报

14#
ID:564182 发表于 2019-11-28 17:09 | 只看该作者
更新一下:

***************************************************************************
* 文件名称: 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 */








回复

使用道具 举报

15#
ID:564182 发表于 2019-11-28 17:15 | 只看该作者
jianfeii 发表于 2019-11-12 09:41
没看出来有优先级,还没写完吧这个程序

for(Task_PQH=0;Task_PQH<Task_Size-1;Task_PQH++)   //查找最高优先级任务
       {
            if(Event_List[Task_PQH]>0)                   //有事件发生
               break;
        }

查找事件Task_PQH永远是从0开始的。如果有事件就退出并执行那个函数。如果都没有事件就执行空闲任务。
回复

使用道具 举报

16#
ID:290005 发表于 2020-3-3 19:54 | 只看该作者
收藏了
回复

使用道具 举报

17#
ID:290005 发表于 2020-3-3 20:00 | 只看该作者
樓主 出個例程吧
回复

使用道具 举报

18#
ID:290005 发表于 2020-4-7 21:52 | 只看该作者
已收藏
樓主還在?繼續完善
回复

使用道具 举报

19#
ID:468878 发表于 2020-7-23 09:48 | 只看该作者
hui223 发表于 2020-3-3 20:00
樓主 出個例程吧

同意,不会用操作系统
回复

使用道具 举报

20#
ID:378108 发表于 2023-1-8 10:22 | 只看该作者
你这个可不行,在时间中断里调用任务函数,是很危险的
回复

使用道具 举报

21#
ID:142059 发表于 2023-3-17 14:14 来自手机 | 只看该作者
任务里你试试放个延时函数,后面的代码就运行不到了
回复

使用道具 举报

22#
ID:291668 发表于 2023-3-23 19:49 | 只看该作者
实时系统小白,看不太懂,这跟裸机程序有什么优势吗?
回复

使用道具 举报

23#
ID:1078060 发表于 2023-5-17 14:40 | 只看该作者
要加优先级的话,对TASK加一个排序就行了,就可以了
回复

使用道具 举报

24#
ID:564182 发表于 2023-11-7 14:08 | 只看该作者
zhxzhx 发表于 2023-1-8 10:22
你这个可不行,在时间中断里调用任务函数,是很危险的

不能加长延时函数,必须用延时事件来延时。
回复

使用道具 举报

25#
ID:564182 发表于 2023-11-7 14:10 | 只看该作者
lynn5302 发表于 2023-5-17 14:40
要加优先级的话,对TASK加一个排序就行了,就可以了

嗯,本身就是有优先级的伪操作系统,函数越靠前优先级越高。
回复

使用道具 举报

26#
ID:564182 发表于 2023-11-7 14:12 | 只看该作者
Angle145 发表于 2023-3-17 14:14
任务里你试试放个延时函数,后面的代码就运行不到了

没有任务切换,没有出栈入栈,所以没有系统延时函数,只能用延时事件来延时。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表