找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1746|回复: 3
收起左侧

MCU_OS调度器的实现(微操作系统程序)

  [复制链接]
ID:685385 发表于 2022-1-9 18:38 | 显示全部楼层 |阅读模式
       MCU的微操作系统,简单来说就是一个算法,而任何算法都是是基于数据结构的

学习大型OS,还是需要数据结构基础的,对于非软件专业的人,可能没有学过。。。。。。

       还好,有微小的算法系统,可以实现MCU软件的设计,这个比较容易理解,需要的可以讨论,

这个是基于一本书上的实例代码,把他的主要内容总结了一下,下载可以直接套用,   自己再编写也没多少代码。。。。。。。。。。。。。。。。。。。

单片机源程序如下:
  1. #include "OS.h"
  2. // 中断服务函数 ,没歌1s 来调度这个函数

  3. //调度器的实现

  4. void SCH_Update()
  5. {
  6.         unsigned char Index;
  7.        
  8.         for(Index =0;Index < SCH_MAX_TASKS;Index++)
  9.         {
  10.                 if(SCH_tasks_G[Index].pTask)  // 任务存在,不为0  ,这个涉及,任务的删除
  11.                 {
  12.                           //判断这个任务是否要执行
  13.                         if(0 == SCH_tasks_G[Index].Delay)
  14.                         {
  15.                                 SCH_tasks_G[Index].RunMe += 1;   //这个任务要运行
  16.                                
  17.                                 //判断这个任务是周期性,还是单次任务
  18.                                 if(SCH_tasks_G[Index].Period)
  19.                                 {
  20.                                         SCH_tasks_G[Index].Delay = SCH_tasks_G[Index].Period;
  21.                                        
  22.                                 }                                       
  23.                                
  24.                         }
  25.                         else
  26.                         {
  27.                                 SCH_tasks_G[Index].Delay -= 1;
  28.                         }
  29.                 }
  30.                
  31.         }
  32.        
  33. }




  34. //任务的添加

  35. unsigned char SCH_Add_Task(void (*pTask)(),const unsigned int Delay,const unsigned int Period)
  36. {
  37.         unsigned char Index = 0;
  38.        
  39.         while((SCH_tasks_G[Index].pTask != 0)&&(Index < SCH_MAX_TASKS))
  40.         {
  41.                 Index++;
  42.         }
  43.        
  44.         if(Index == SCH_MAX_TASKS)
  45.         {
  46.                 //ERROE_CODE =
  47.                
  48.                 return SCH_MAX_TASKS;
  49.         }
  50.        
  51.         SCH_tasks_G[Index].pTask = pTask;
  52.         SCH_tasks_G[Index].Delay = Delay;
  53.         SCH_tasks_G[Index].Period = Period;
  54.        
  55.         SCH_tasks_G[Index].RunMe = 0;
  56.        
  57.         return Index;
  58. }


  59. // 任务的删除

  60. unsigned char SCH_Delete_Task(Task_ID)
  61. {
  62.         unsigned char Return_Code = 0;
  63.        
  64.         //判断这个地方的函数指针是否为0
  65.         if(0 == SCH_tasks_G[Task_ID].pTask)
  66.         {
  67.                 // 这里没有任务.....
  68.                 //
  69.                 //设置全局错误变量    ,也可以不要这个错误机制
  70.                 //Error =
  71.                 Return_Code = 0;
  72.         }
  73.         else
  74.         {
  75.                 Return_Code = 1;
  76.         }
  77.         SCH_tasks_G[Task_ID].pTask = 0x0000;
  78.         SCH_tasks_G[Task_ID].Delay = 0;
  79.         SCH_tasks_G[Task_ID].Period = 0;
  80.         SCH_tasks_G[Task_ID].RunMe = 0;
  81.         return Return_Code;
  82. }


  83. //216
  84. void SCH_Dispatch_Tasks()
  85. {
  86.         unsigned char Index;
  87.         //所有的任务轮训之后,再释放CPU
  88.         for(Index = 0;Index < SCH_MAX_TASKS;Index++)
  89.         {
  90.                 if(SCH_tasks_G[Index].RunMe > 0)
  91.                 {
  92.                         (*SCH_tasks_G[Index].pTask)();  //执行任务
  93.                        
  94.                         SCH_tasks_G[Index].RunMe -= 1;  // 复位/减小RunMe的标志
  95.                        
  96.                         //周期性任务会自动再次执行
  97.                        
  98.                         // 如果这个是单次任务,将他从队列中删除,不是单次任务,就需要手动删除
  99.                         if(0 == SCH_tasks_G[Index].Period)
  100.                         {
  101.                                 SCH_Delete_Task(Index);
  102.                         }
  103.                        
  104.                 }
  105.         }
  106. }



  107. //启动调度器

  108. void SCH_Start()
  109. {
  110.          //EA= 1;
  111.         ;
  112. }





  113. void AX()
  114. {
  115. }


  116. int main()
  117. {
  118.         //
  119.         unsigned char Task_ID;
  120.         Task_ID = SCH_Add_Task(AX,1000,0);
  121.        
  122.         SCH_Start();
  123.        
  124.         while(1)
  125.         {
  126.                 SCH_Dispatch_Tasks();
  127.         }
  128.        
  129. }
复制代码

Keil代码下载:
onr.zip (12.68 KB, 下载次数: 18)

评分

参与人数 1黑币 +70 收起 理由
admin + 70 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:301191 发表于 2022-1-12 01:30 | 显示全部楼层
顶一下
回复

使用道具 举报

ID:262 发表于 2022-1-13 00:17 | 显示全部楼层
这种思路对于大项目还是很有帮助的
回复

使用道具 举报

ID:65241 发表于 2022-3-1 20:09 | 显示全部楼层
SCH_Start()里该运行些什么呢?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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