单片机论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

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

51单片机简单多任务调度实现代码

[复制链接]
跳转到指定楼层
楼主
g753388438 发表于 2017-7-18 10:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
  1. //注意
  2. //任务优先级必须小于任务个数,不然会死机
  3. //任务优先级并非真实的,高有限级的任务不会打断低优先级的任务
  4. //只是当2个任务执行的时间到了,高优先级的任务会优先执行
  5. //任务的优先级同时也是任务的句柄,任务创建和使能的时候会用到
  6. //任务无法删除,可以通过失能,失任务不执行
  7. #define Rtos_Num 5//任务个数  

  8. //简单任务调度
  9. typedef struct{
  10.         void (*fTask)(void);//任务指针
  11.         uint8_t  runFlag;//运行标志位  1使能  0失能
  12.         uint16_t  uLenTick;//任务调度周期
  13.         uint32_t  uNextTick;//下次执行时间
  14. }sTask;

  15. //        extern uint32_t Rtos_SysTim; //系统时间   一般是1ms定时器
  16. //创建任务
  17. void Rtos_Creat(void *Task_Name,uint8_t Priority,uint8_t enable,uint32_t starttim,uint16_t tim);
  18. //任务使能
  19. void Rtos_En(uint8_t Priority,uint8_t enable);
  20. //开始执行任务
  21. void Rtos_Run(void);
复制代码


简易任务调度.rar

39.22 KB, 下载次数: 27, 下载积分: 黑币 -5

任务调度

评分

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

查看全部评分

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

使用道具 举报

沙发
 楼主| g753388438 发表于 2017-7-18 10:55 | 只看该作者
贴出了所有的代码,但是只显示了一部分
回复

使用道具 举报

板凳
 楼主| g753388438 发表于 2017-7-18 10:55 | 只看该作者
  1. /创建任务
  2. //任务名称 任务优先级  使能    开始时间    周期  
  3. void Rtos_Creat(void *Task_Name,uint8_t Priority,uint8_t enable,uint32_t starttim,uint16_t tim)
  4. {
  5.         if(Priority>=Rtos_Num)
  6.         {
  7.                 while(1)
  8.                 {
  9.                         //可做其他处理
  10.                         printf("任务出错");               
  11.                 }
  12.         }
  13.         mTaskTab[Priority].fTask=(void(*)(void))Task_Name;//函数名
  14.         mTaskTab[Priority].runFlag =enable;//使能
  15.         mTaskTab[Priority].uNextTick=starttim;//任务开始执行的时间
  16.         mTaskTab[Priority].uLenTick=tim;//任务开始执行的时间
  17. }
  18. //任务使能  失能
  19. //任务优先级   使能
  20. void Rtos_En(uint8_t Priority,uint8_t enable)
  21. {
  22.         if(Priority>=Rtos_Num)
  23.         {
  24.                 while(1)
  25.                 {
  26.                         //可做其他处理
  27.                         printf("任务出错");               
  28.                 }
  29.         }
  30.         mTaskTab[Priority].runFlag =enable;//使能
  31. }
  32. //开始调度
  33. void Rtos_Run(void)
  34. {
  35.         while(1)
  36.         {
  37.                 for (uint8_t  i = 0; i < (sizeof (mTaskTab)/sizeof(sTask)); i++)
  38.                 {
  39.                         if ((mTaskTab[i].uNextTick <= Rtos_SysTim)&&(mTaskTab[i].runFlag==1))
  40.                         {
  41.                                         mTaskTab[i].uNextTick += mTaskTab[i].uLenTick;
  42.                                         mTaskTab[i].fTask();        
  43.                         }
  44.                 }
  45.         }
  46. }
复制代码
回复

使用道具 举报

地板
多德 发表于 2017-7-23 21:26 | 只看该作者
黑币不够啊
回复

使用道具 举报

5#
bhjyqjs 发表于 2018-2-13 10:27 | 只看该作者
很不错,谢谢楼主分享
回复

使用道具 举报

6#
wdliming 发表于 2018-7-22 09:09 | 只看该作者
谢谢分享
回复

使用道具 举报

7#
wdliming 发表于 2018-7-24 20:46 | 只看该作者
谢谢分享!!
回复

使用道具 举报

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

本版积分规则

QQ|手机版|小黑屋|单片机论坛 |51黑电子论坛单片机.

Powered by 单片机教程网

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