久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 6591|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 蜜桃精品视频在线 | 精品免费视频一区二区 | 中文字幕精品一区二区三区在线 | 午夜视频在线免费观看 | 国产精品永久免费视频 | 91啪影院| 日韩视频区 | 国产精品久久久久久久久久久久 | 久久中文网 | 日韩成人国产 | 精品欧美一区二区在线观看欧美熟 | 久草网址 | 国产美女在线播放 | 99久久精品免费 | 国产成人综合久久 | 国产在线精品一区二区三区 | 一区二区精品 | 日本久草| 91免费观看 | 99re热这里只有精品视频 | 日本一区二区三区在线观看 | 中国黄色在线视频 | 欧美国产视频 | 日本天天操 | 欧美日本亚洲 | 天天天天天操 | 亚洲精品久久久一区二区三区 | 久久精品成人 | av天空| 日韩精品无码一区二区三区 | 免费人成在线观看网站 | 国产精品一区在线观看 | 天天舔天天 | 九九综合 | 久久激情网 | 中国人pornoxxx麻豆 | 日本中文字幕一区 | 国产免费一区 | 成人免费在线网 | 亚洲精品乱码 | 国产一区精品在线 |