单片机/MCU论坛
直播中

yuu_cool

3年用户 93经验值
擅长:电源/新能源 嵌入式技术
私信 关注
[文章]

【51单片机】51单片机MyCreateOS的源代码

`

  1. #include                       //51 单片机头文件

  2. #define GPIO0_CONCTRON P0                    // 定义 IO
  3. #define GPIO1_CONCTRON P1
  4. #define GPIO2_CONCTRON P2
  5. #define GPIO3_CONCTRON P3

  6. #define true 1
  7. #define flase 0

  8. #define MaxTask 3               // 总任务数
  9. #define Task_one 0                 // 任务 0
  10. #define Task_two 1                       // 任务 1
  11. #define Task_three 2                  // 任务 2
  12. #define Task_one_Period 100           // 任务 0 的挂起周期        // 也就是说 它过了这个时间再运行
  13. #define Task_two_Period 4000                // 任务 0 的挂起周期
  14. #define Task_three_Period 70                 // 任务 0 的挂起周期

  15. int count = 0;
  16. typedef struct                        // 结构体
  17. {
  18. unsigned int wTaskPeriod;                   // 运行周期
  19. unsigned int wTaskCount;                  // 运行周期计数器
  20. unsigned int wEvent;                         // 任务信号
  21. }OSTCB;

  22. OSTCB OS_TCB[MaxTask];

  23. void OS_Create_Task(unsigned int mTaskPro,unsigned int mTaskPreiod)              // 创建任务第一个参数 任务 ID 号 第二个参数 任务运行周期
  24. {
  25. OS_TCB[mTaskPro].wTaskPeriod= mTaskPreiod;                           // 把任务运行周期加载到 TCB 结构体
  26. }
  27. void OS_Event_Post(unsigned char mTask,unsigned int mEvent)         // 任务信号邮箱
  28. {
  29. OS_TCB[mTask].wEvent =( 1<
  30. }
  31. void OS_Updata_Task(void)                 // 任务加载
  32. {
  33. int mTemp;
  34. for(mTemp = 0;mTemp < MaxTask;mTemp ++)                  // 查询三个任务,
  35. {
  36. OS_TCB[mTemp].wTaskCount ++;

  37. if(OS_TCB[mTemp].wTaskCount == OS_TCB[mTemp].wTaskPeriod)
  38.       // 如果运行周期计数器 = 运行周期 则任务发送信号量 说明改任务要运行了
  39. {
  40. OS_TCB[mTemp].wTaskCount = 0;
  41. OS_Event_Post(mTemp,mTemp);                          // 第一个参数任务 ID 号 第二个参数 任务信号量
  42. }
  43. }
  44. }
  45. void OS_Task_Int(void)                           // 任务初始化
  46. {
  47. unsigned char mTemp;
  48. for(mTemp = 0;mTemp < MaxTask;mTemp ++)
  49. {
  50. OS_TCB[mTemp].wTaskPeriod = 0;
  51. OS_TCB[mTemp].wTaskCount = 0;
  52. OS_TCB[mTemp].wEvent = 0;
  53. }
  54. }
  55. unsigned int OS_Event_Pend(unsigned char mTask)                    // 发送任务邮箱
  56. {
  57. unsigned int mTaskEvent;                         // 发送这个任务的信号量
  58. mTaskEvent = OS_TCB[mTask].wEvent;
  59. OS_TCB[mTask].wEvent &=~mTaskEvent;                 // 运行完后就清这个任务的信号量
  60. return mTaskEvent;
  61. }
  62. void Int_Hardware(void)                        //51 单片机复位
  63. {
  64. GPIO0_CONCTRON = 0xff;
  65. GPIO1_CONCTRON = 0x01;
  66. GPIO2_CONCTRON = 0xff;
  67. GPIO3_CONCTRON = 0xff;
  68. }
  69. void Task1(void)                          // 任务 1 运行函数
  70. {
  71. unsigned int GetEvent;
  72. while(1)
  73. {
  74. GetEvent = OS_Event_Pend(Task_one);
  75. if(GetEvent == 0)
  76. {
  77. return;
  78. }
  79. if(GetEvent &(1<
  80. {
  81. GPIO0_CONCTRON = ~GPIO0_CONCTRON;
  82. }
  83. }
  84. }
  85. void Task2(void)                              // 任务 2 行函数
  86. {
  87. unsigned int GetEvent;
  88. while(1)
  89. {
  90. GetEvent = OS_Event_Pend(Task_two);
  91. if(GetEvent == 0)
  92. {
  93. return;
  94. }
  95. if(GetEvent & (1<
  96. {

  97. GPIO1_CONCTRON = ~GPIO1_CONCTRON;
  98. }
  99. }
  100. }
  101. void Task3(void)                       // 任务 3 行函数
  102. {
  103. unsigned int GetEvent;                       // 获取信号量
  104. while(1)
  105. {
  106. GetEvent = OS_Event_Pend(Task_three);
  107.                           // 查任务是否运行完 返回信号量
  108. if(GetEvent == 0)                             // 如任务运行完成任务挂起,等待下次运行
  109. {
  110. return;
  111. }
  112. if(GetEvent & (1<
  113.                               // 有任务在运行,就运行这个任务
  114. {
  115. GPIO2_CONCTRON = ~GPIO2_CONCTRON;                       // 单片机 IO 取反
  116. }
  117. }
  118. }
  119. void OS_start(void)                     // 任务开始
  120. {
  121. while(1)
  122. {
  123. Task1();
  124. Task2();
  125. Task3();
  126. }
  127. }
  128. void main(void)
  129. {
  130. IE = 0x82;                            // 开中断
  131. TMOD = 0x01;
  132. TH0 = (65536-1)/256;
  133. TL0 = (65536-1)%256;
  134. TR0 = 1;                       // 开定时器
  135. Int_Hardware();                         // 硬件复位
  136. OS_Task_Int();                          // 任务初始化
  137. while(1)
  138. {
  139. OS_Create_Task(Task_one,Task_one_Period);               // 在 TCB 结构体里任务加载下面 3 个任务
  140. OS_Create_Task(Task_two,Task_two_Period);
  141. OS_Create_Task(Task_three,Task_three_Period);
  142. OS_start();
  143. }
  144. }
  145. void inter(void) interrupt 1                    // 任务毫秒 查循一次进行任务调度
  146. {
  147. TH0 = (65536-1)/256;

  148. TL0 = (65536-1)%256;
  149. OS_Updata_Task();                                    // 任务查询,更新 和 发送

  150. }

51单片机实验案例及源码可下载附件哦!!!!


` 1.png
51DEMO.zip (260.88 KB)
(下载次数: 2, 2021-8-2 16:11 上传)

回帖(1)

王栋春

2021-8-2 22:39:31
收藏备用,感谢楼主分享
举报

更多回帖

发帖
×
20
完善资料,
赚取积分