找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6686|回復(fù): 25
打印 上一主題 下一主題
收起左側(cè)

偽操作系統(tǒng)胚胎版,分享大家會繼續(xù)完善

  [復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:564182 發(fā)表于 2019-7-25 00:18 | 只看該作者 回帖獎勵 |倒序?yàn)g覽 |閱讀模式

偽操作系統(tǒng)胚胎版,分享大家會繼續(xù)完善。

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


/*
*   名稱:  Hzl_OS 0.01
*   說明:  偽操作系統(tǒng)(無任務(wù)切換)胚胎版
*           帶任務(wù)優(yōu)先級實(shí)時操作系統(tǒng)。
*
*/
#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()                          //看門狗清理任務(wù)
{
    unsigned long s=0;
//Event_List[2]=1;    //發(fā)生事件
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()       //空閑任務(wù)
{
  // Idle();
  //  UART1_write(0x07);
}



int main(int argc, char** argv)
{

    UART1Init();
    T1Iinit();


    Task_List[0]=Task0;     //初步化任務(wù)表
    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++)   //查找最高優(yōu)先級任務(wù)
       {
           if(Event_List[Task_PQH]>0)                   //有事件發(fā)生
               break;
       }


       Task_List[Task_PQH]();           //執(zhí)行任務(wù)
    }

    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 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:564182 發(fā)表于 2019-7-25 00:24 | 只看該作者
核心代碼就幾十行,用單片機(jī)測試基本能用。大家有什么問題和建議請留言。
回復(fù)

使用道具 舉報(bào)

板凳
ID:282095 發(fā)表于 2019-7-25 11:02 | 只看該作者
樓主是基于linux操作系統(tǒng)的嗎
回復(fù)

使用道具 舉報(bào)

地板
ID:564182 發(fā)表于 2019-7-25 11:57 來自手機(jī) | 只看該作者
基于單片機(jī)的rtos
回復(fù)

使用道具 舉報(bào)

5#
ID:351097 發(fā)表于 2019-7-25 15:10 | 只看該作者
值得學(xué)習(xí)借鑒! 現(xiàn)在的好的系統(tǒng)功能太復(fù)雜了,反正不容易理解。這個挺容易理解的。while(1)死循環(huán)里面一直輪詢?nèi)蝿?wù)的執(zhí)行標(biāo)志,如果查詢到任務(wù)要執(zhí)行,就執(zhí)行函數(shù)。也可以去參考TI的OSAL,這個也是采用輪詢查詢?nèi)蝿?wù)的RTOS。
回復(fù)

使用道具 舉報(bào)

6#
ID:564182 發(fā)表于 2019-7-25 16:47 來自手機(jī) | 只看該作者
hzn1990 發(fā)表于 2019-7-25 11:57
基于單片機(jī)的rtos

task0優(yōu)先級最高,可以執(zhí)行清看門狗任務(wù)
task0最低,為空閑任務(wù),無事件可以讓單片機(jī)進(jìn)入休眠單片機(jī)低功耗也能保持實(shí)時性,中斷喚醒,彈射事件,執(zhí)行相關(guān)任務(wù)。
回復(fù)

使用道具 舉報(bào)

7#
ID:351097 發(fā)表于 2019-8-5 10:29 | 只看該作者
hzn1990 發(fā)表于 2019-7-25 16:47
task0優(yōu)先級最高,可以執(zhí)行清看門狗任務(wù)
task0最低,為空閑任務(wù),無事件可以讓單片機(jī)進(jìn)入休眠單片機(jī)低功 ...

兄弟,你的RTOS現(xiàn)在還有再更新嗎?
回復(fù)

使用道具 舉報(bào)

8#
ID:564182 發(fā)表于 2019-8-7 18:30 來自手機(jī) | 只看該作者
沒有你 發(fā)表于 2019-8-5 10:29
兄弟,你的RTOS現(xiàn)在還有再更新嗎?

論壇沒啥人氣沒積極性,在加上工作比較忙。以后慢慢完善。
回復(fù)

使用道具 舉報(bào)

9#
ID:20772 發(fā)表于 2019-8-21 21:54 | 只看該作者
感謝分享,正在學(xué)習(xí)中ing
回復(fù)

使用道具 舉報(bào)

10#
ID:247125 發(fā)表于 2019-9-1 11:07 | 只看該作者
經(jīng)典,謝謝分享。
回復(fù)

使用道具 舉報(bào)

11#
ID:20672 發(fā)表于 2019-9-16 18:06 | 只看該作者
不錯,謝謝分享~~
回復(fù)

使用道具 舉報(bào)

12#
ID:20672 發(fā)表于 2019-9-16 18:07 | 只看該作者
沒后文啊
回復(fù)

使用道具 舉報(bào)

13#
ID:142699 發(fā)表于 2019-11-12 09:41 | 只看該作者
沒看出來有優(yōu)先級,還沒寫完吧這個程序
回復(fù)

使用道具 舉報(bào)

14#
ID:564182 發(fā)表于 2019-11-28 17:09 | 只看該作者
更新一下:

***************************************************************************
* 文件名稱: main.c
* 文件說明: 主函數(shù)
* 版本:     V0.10  Max 2019.8.15   創(chuàng)建
* 其他:     該文件不做編程
* ************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include "Hos.h"
#include "DeviceDriver.h"
/*********配置位禁止修改**************/
__CONFIG(0x3FE4);
__CONFIG(0xFFF); //配置位
/************************************/
/***************************************************************************
* 函數(shù)名稱: int main(void)
* 函數(shù)說明: 主函數(shù)
* 參數(shù):     無
* 返回值:   無
* 版本:     V0.10  Max 2019.8.15   創(chuàng)建
* 其他:     禁止修改
* ************************************************************************/
int main(int argc, char** argv)
  {
     OSCCONbits.IRCF = 0b1111;          //禁止修改主頻--16mHz
    /**************************硬件初始化*********************************/
     Driver_Init();                     //驅(qū)動初始化
   /*****************************系統(tǒng)*************************************/
     HOS_EventInit();                   //事件初始化
     HOS_AddTask();                     //添加任務(wù)表
     HOS_StartEvent();                  //任務(wù)啟動事件彈射
     HOS_Run();                         //系統(tǒng)運(yùn)行
  /***********************************************************************/
     
    return (EXIT_SUCCESS);
}
// TO ---> Happ


/***************************************************************************
* 文件名稱: Hos.c
* 文件說明: 系統(tǒng)相關(guān)函
* 版本:     V0.10  Max 2019.8.15   創(chuàng)建
* 其他:     只能修改HOS_AddTask(void),HOS_StartEvent(void)
*************************************************************************/
#include "Hos.h"
#include "Happ.h"
/***************************************************************************
* 函數(shù)名稱: void HOS_AddTask(void)
* 函數(shù)說明: 添加函表
* 參數(shù):     無
* 返回值:   無
* 版本:     V0.10  Max 2019.8.15   創(chuàng)建
* 其他:     可修改添加函數(shù)
*************************************************************************/
void  HOS_AddTask(void)
   {
     Task_PCB[0].Task = Task0 ;                  //初始化函數(shù)
     Task_PCB[1].Task = Task1 ;                  //初始化函數(shù)
     Task_PCB[2].Task = Task2 ;                  //初始化函數(shù)
     Task_PCB[3].Task = Task3 ;                  //初始化函數(shù)
     Task_PCB[4].Task = Task4 ;                  //初始化函數(shù)
     Task_PCB[5].Task = Task5 ;                  //初始化函數(shù)
     Task_PCB[6].Task = Task6 ;                  //初始化函數(shù)
     Task_PCB[7].Task = Task7 ;                  //初始化函數(shù)
   }
/***************************************************************************
* 函數(shù)名稱: void  HOS_StartEvent(void)
* 函數(shù)說明: 發(fā)送啟動事件
* 參數(shù):     無
* 返回值:   無
* 版本:     V0.10  Max 2019.8.15   創(chuàng)建
* 其他:     可修改添加啟動事件
*************************************************************************/
void  HOS_StartEvent(void)
{
  
}
/***************************************************************************
* 函數(shù)名稱:  TypEvent  HOS_WriteEvent(uint8 PQH ,TypEvent EVENT  )
* 函數(shù)說明: 寫對應(yīng)任務(wù)的事件
* 參數(shù):     PQH    :任務(wù)優(yōu)先級
*            EVENT : 標(biāo)志事件
* 返回值:     無
* 版本:     V0.10  Max 2019.8.15   創(chuàng)建
* 其他:     禁止修改
*************************************************************************/
void  HOS_WriteEvent(uint8 PQH ,TypEvent EVENT )
{
   Task_PCB[PQH].Event |= EVENT ;
}
/***************************************************************************
* 函數(shù)名稱: TypEvent  HOS_ClearEvent(uint8 PQH ,TypEvent EVENT  )
* 函數(shù)說明: 清除任務(wù)的事件
* 參數(shù):     PQH    :任務(wù)優(yōu)先級
*            EVENT : 標(biāo)志事件
* 返回值:    無
* 版本:     V0.10  Max 2019.8.15   創(chuàng)建
* 其他:     禁止修改
*************************************************************************/
void  HOS_ClearEvent(uint8 PQH ,TypEvent EVENT  )
{
  Task_PCB[PQH].Event &= ~EVENT ;
}
/***************************************************************************
* 函數(shù)名稱: TypEvent   HOS_ReadEvent(uint8 PQH )
* 函數(shù)說明: 讀對應(yīng)任務(wù)的事件
* 參數(shù):     PQH    :任務(wù)優(yōu)先級
* 返回值:   returu :任務(wù)事件
* 版本:     V0.10  Max 2019.8.15   創(chuàng)建
* 其他:     禁止修改
* ************************************************************************/
TypEvent   HOS_ReadEvent(uint8 PQH )
{
   return Task_PCB[PQH].Event ;
}
/***************************************************************************
* 函數(shù)名稱: void HOS_Init(void)
* 函數(shù)說明: 系統(tǒng)初始化
* 參數(shù):     無
* 返回值:   無
* 版本:     V0.10  Max 2019.8.15   創(chuàng)建
* 其他:     禁止修改
* ************************************************************************/
void  HOS_EventInit(void)
{
     for(Task_PQH=0;Task_PQH<Task_Size-1;Task_PQH++)          //初始化事件表
      {
          Task_PCB[Task_PQH].Event = 0 ;
      }
}

/***************************************************************************
* 函數(shù)名稱: void HOS_Run(void)
* 函數(shù)說明: 任務(wù)運(yùn)行函數(shù)
* 參數(shù):     無
* 返回值:   無
* 版本:     V0.10  Max 2019.8.15   創(chuàng)建
* 其他:     禁止修改
* ************************************************************************/
void HOS_Run(void)
{
    while(1)                  //死循環(huán)
    {
       for(Task_PQH=0;Task_PQH<Task_Size-1;Task_PQH++)        //查找最高優(yōu)先級任務(wù)
        {
           if( Task_PCB[Task_PQH].Event > 0 )                 //有事件發(fā)生
               break;
         }
         Task_PCB[Task_PQH].Task(Task_PQH) ;                 //執(zhí)行任務(wù)
         
     }
  
}


/***************************************************************************
* 文件名稱: Hos.h
* 文件說明: 系統(tǒng)配置文件
* 版本:     V0.00  Max 2019.8.15   創(chuàng)建
* 其他:     
* ************************************************************************/
#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               //任務(wù)數(shù)量0-255
uint8     Task_PQH;                      //優(yōu)先級寄存器(禁寫)
/*******************************任務(wù)屬性塊***********************************/
  struct
  {
   TypEvent  Event;                       //事件
   void (*Task)(uint8);                   //任務(wù)函數(shù)
   //可以擴(kuò)展添加任意數(shù)據(jù)
   }Task_PCB[Task_Size ] ;
/********************************系統(tǒng)函數(shù)***********************************/
  void  HOS_Run(void);
  void  HOS_EventInit(void);
  void  HOS_StartEvent(void);
  void  HOS_AddTask(void);
/*****************************事件操作函數(shù)**********************************/
  TypEvent   HOS_ReadEvent(uint8 PQH);
  void       HOS_ClearEvent(uint8 PQH ,TypEvent EVENT);
  void       HOS_WriteEvent(uint8 PQH ,TypEvent EVENT);
#endif /* HOS_H */








回復(fù)

使用道具 舉報(bào)

15#
ID:564182 發(fā)表于 2019-11-28 17:15 | 只看該作者
jianfeii 發(fā)表于 2019-11-12 09:41
沒看出來有優(yōu)先級,還沒寫完吧這個程序

for(Task_PQH=0;Task_PQH<Task_Size-1;Task_PQH++)   //查找最高優(yōu)先級任務(wù)
       {
            if(Event_List[Task_PQH]>0)                   //有事件發(fā)生
               break;
        }

查找事件Task_PQH永遠(yuǎn)是從0開始的。如果有事件就退出并執(zhí)行那個函數(shù)。如果都沒有事件就執(zhí)行空閑任務(wù)。
回復(fù)

使用道具 舉報(bào)

16#
ID:290005 發(fā)表于 2020-3-3 19:54 | 只看該作者
收藏了
回復(fù)

使用道具 舉報(bào)

17#
ID:290005 發(fā)表于 2020-3-3 20:00 | 只看該作者
樓主 出個例程吧
回復(fù)

使用道具 舉報(bào)

18#
ID:290005 發(fā)表于 2020-4-7 21:52 | 只看該作者
已收藏
樓主還在?繼續(xù)完善
回復(fù)

使用道具 舉報(bào)

19#
ID:468878 發(fā)表于 2020-7-23 09:48 | 只看該作者

同意,不會用操作系統(tǒng)
回復(fù)

使用道具 舉報(bào)

20#
ID:378108 發(fā)表于 2023-1-8 10:22 | 只看該作者
你這個可不行,在時間中斷里調(diào)用任務(wù)函數(shù),是很危險的
回復(fù)

使用道具 舉報(bào)

21#
ID:142059 發(fā)表于 2023-3-17 14:14 來自手機(jī) | 只看該作者
任務(wù)里你試試放個延時函數(shù),后面的代碼就運(yùn)行不到了
回復(fù)

使用道具 舉報(bào)

22#
ID:291668 發(fā)表于 2023-3-23 19:49 | 只看該作者
實(shí)時系統(tǒng)小白,看不太懂,這跟裸機(jī)程序有什么優(yōu)勢嗎?
回復(fù)

使用道具 舉報(bào)

23#
ID:1078060 發(fā)表于 2023-5-17 14:40 | 只看該作者
要加優(yōu)先級的話,對TASK加一個排序就行了,就可以了
回復(fù)

使用道具 舉報(bào)

24#
ID:564182 發(fā)表于 2023-11-7 14:08 | 只看該作者
zhxzhx 發(fā)表于 2023-1-8 10:22
你這個可不行,在時間中斷里調(diào)用任務(wù)函數(shù),是很危險的

不能加長延時函數(shù),必須用延時事件來延時。
回復(fù)

使用道具 舉報(bào)

25#
ID:564182 發(fā)表于 2023-11-7 14:10 | 只看該作者
lynn5302 發(fā)表于 2023-5-17 14:40
要加優(yōu)先級的話,對TASK加一個排序就行了,就可以了

嗯,本身就是有優(yōu)先級的偽操作系統(tǒng),函數(shù)越靠前優(yōu)先級越高。
回復(fù)

使用道具 舉報(bào)

26#
ID:564182 發(fā)表于 2023-11-7 14:12 | 只看該作者
Angle145 發(fā)表于 2023-3-17 14:14
任務(wù)里你試試放個延時函數(shù),后面的代碼就運(yùn)行不到了

沒有任務(wù)切換,沒有出棧入棧,所以沒有系統(tǒng)延時函數(shù),只能用延時事件來延時。
回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表