main.c
上传用户:dongxin
上传日期:2022-06-22
资源大小:370k
文件大小:6k
源码类别:

uCOS

开发平台:

Others

  1. /*
  2.  * File: main.c
  3.  * Purpose: sample program
  4.  *
  5.  */
  6. //#include "support_common.h" /* include peripheral declarations and more */
  7. #include "includes.h"
  8. #include <stdio.h>
  9. #define TASK_STK_SIZE 512
  10. //定义一些全局变量
  11. OS_STK MAIN_TASK_STK[TASK_STK_SIZE];
  12. OS_STK  TASK1_STK[TASK_STK_SIZE];
  13. OS_STK  TASK2_STK[TASK_STK_SIZE];
  14. OS_STK TASK3_STK[TASK_STK_SIZE];
  15. OS_STK DEL_TASK_STK[TASK_STK_SIZE];
  16. OS_STK LED_TASK_STK[TASK_STK_SIZE];
  17. OS_STK  SETTIME_TASK_STK[TASK_STK_SIZE];
  18. OS_STK  SHOWTIME_TASK_STK[TASK_STK_SIZE];
  19. char reStr[8];
  20. INT8U delPrio;
  21. //定义信号量和邮箱
  22. OS_EVENT *delSEM;
  23. OS_EVENT *allMBOX;
  24. OS_EVENT *task1MBOX;
  25. OS_EVENT *task2MBOX;
  26. OS_EVENT *task3MBOX;
  27. OS_EVENT *sw2SEM;
  28. OS_EVENT *sw1SEM;
  29. //任务函数原型
  30. void mainTask(void *pdata);
  31. void task1(void *pdata);
  32. void task2(void *pdata);
  33. void task3(void *pdata);
  34. void delTask(void *pdata);
  35. void ledTask(void *pdata);
  36. void showTimeTask(void *pdata);
  37. void main(void)
  38. {
  39. DisableInterrupts();
  40. // printf("hellonr");
  41. //系统再一次初始化
  42. PITInit(); //初始化时钟中断
  43. IRQInit(); //初始化按键中断
  44. LEDInit(); //初始化LED灯
  45. UartInit(0,60,19200,1); //初始化串口
  46. OSInit();
  47. //创建信号量及消息邮箱
  48. delSEM   = OSSemCreate(0);
  49. sw1SEM = OSSemCreate(0);
  50. sw2SEM = OSSemCreate(0);
  51. allMBOX  = OSMboxCreate((void *)0);
  52. task1MBOX = OSMboxCreate((void *)0);
  53. task2MBOX = OSMboxCreate((void *)0);
  54. task3MBOX = OSMboxCreate((void *)0);
  55. EnableInterrupts(); 
  56. printf("rn The uc/os II is running ! rn");
  57. printf("rn----------------------------------------rn");
  58. //创建任务
  59. OSTaskCreate(mainTask, (void *)0, &MAIN_TASK_STK[TASK_STK_SIZE-1],1);
  60. OSTaskCreate(task1, (void *)0, &TASK1_STK[TASK_STK_SIZE-1], 9);
  61. OSTaskCreate(task2, (void *)0, &TASK2_STK[TASK_STK_SIZE-1], 10);
  62. OSTaskCreate(task3, (void *)0, &TASK3_STK[TASK_STK_SIZE-1], 11);
  63. OSTaskCreate(ledTask, (void *)0, &LED_TASK_STK[TASK_STK_SIZE-1], 12);
  64. OSTaskCreate(delTask, (void *)0, &DEL_TASK_STK[TASK_STK_SIZE-1], 2);
  65. OSTaskCreate(showTimeTask,(void *)0, &SHOWTIME_TASK_STK[TASK_STK_SIZE-1],15);
  66. OSStart();
  67. }
  68. void mainTask(void *pdata)
  69. {
  70. char *msg = "running";
  71. INT8U *premsg1 = 0, *premsg2 = 0, *premsg3 = 0;
  72. pdata = 0;
  73. //第一个运行的任务开启时钟中断
  74. EnableTIN0Int();
  75. while (1)
  76. {
  77. printf("nrNow the created tasks number is :%4dnr",OSTaskCtr);
  78. //放弃运行,增加等待allMBOX的任务
  79. OSTimeDly(10);
  80. //释放信号量,task1.task2.task3运行
  81. OSMboxPostOpt(allMBOX,(void *)msg, OS_POST_OPT_BROADCAST);
  82. //给task1, task2, task3运行的机会
  83. OSTimeDly(10);
  84. //无等待的查看是否接收到消息
  85. premsg1 = OSMboxAccept(task1MBOX);
  86. //如果接受到消息,打印出接受到的消息
  87. if(premsg1 !=(void *) 0)
  88. {
  89. printf("nrReceive a message :%snr",(char *)premsg1);
  90. }
  91. premsg2 = OSMboxAccept(task2MBOX);
  92. if(premsg2 !=(void *) 0)
  93. {
  94. printf("nrReceive a message :%snr",(char *)premsg2);
  95. }
  96. premsg3 = OSMboxAccept(task3MBOX);
  97. if(premsg3 != (void *)0)
  98. {
  99. printf("nrReceive a message :%snr",(char *)premsg3);
  100. }
  101. //每10秒运行一次
  102. OSTimeDlyHMSM(0,0,10,0);
  103. }
  104. }
  105. void task1(void *pdata)
  106. {
  107. INT8U perr;
  108. char  *msg = "I am task1"; //发送给主任务的消息
  109. INT32U runCtr = 1; //记录任务运行的次数
  110. pdata = pdata;
  111. while(1)
  112. {
  113. //等待运行信号
  114. OSMboxPend(allMBOX, 0, &perr);
  115. printf("nrmy name is task1, and my priority is %4d nr", OSTCBCur ->OSTCBPrio);
  116. printf("This is task1 %4dth runningnr",runCtr++);
  117. //向主任务发送信号
  118. OSMboxPost(task1MBOX,(void *)msg);
  119. //放弃运行
  120. OSTimeDly(1);
  121. }
  122. }
  123. void task2(void *pdata)
  124. {
  125. INT8U  perr;
  126. char   *msg = "I am task2";
  127. INT32U runCtr = 1;
  128. pdata = pdata;
  129. while(1)
  130. {
  131. OSMboxPend(allMBOX, 0, &perr);
  132. printf("nrmy name is task2, and my priority is %4d nr", OSTCBCur ->OSTCBPrio);
  133. printf("This is task2 %4dth runningnr",runCtr++);
  134. OSMboxPost(task2MBOX,(void *)msg);
  135. OSTimeDly(1);
  136. }
  137. }
  138. void task3(void *pdata)
  139. {
  140. INT8U perr;
  141. char  *msg = "I am task3";
  142. INT32U runCtr = 1;
  143. pdata = pdata;
  144. while(1)
  145. {
  146. OSMboxPend(allMBOX, 0, &perr);
  147. printf("nrmy name is task3, and my priority is %4d nr", OSTCBCur ->OSTCBPrio);
  148. printf("This is task3 %4dth runningnr",runCtr++);
  149. OSMboxPost(task3MBOX,(void *)msg);
  150. OSTimeDly(1);
  151. }
  152. }
  153. void delTask(void *pdata)
  154. {
  155. INT8U err;
  156. INT8U result;
  157. pdata = pdata;
  158. while(1)
  159. {
  160. //等待删除信号
  161. OSSemPend(delSEM,0,&err);
  162. //将欲删除的任务挂起
  163. OSTaskSuspend(delPrio);
  164. result = OSTaskDel(delPrio);
  165. switch (result)
  166. {
  167. case OS_ERR_NONE:
  168. printf("nrThe task with prio %4d is deleted successnr",delPrio);
  169. break;
  170. case OS_ERR_TASK_DEL_IDLE:
  171. printf("nrYour want to delete the idle task ! Error!!!nr");
  172. break;
  173. case OS_ERR_PRIO_INVALID:
  174. printf("nrThe prio you want to delete is invalid! Please check!nr");
  175. break;
  176. case OS_ERR_TASK_DEL:
  177. printf("nrThe task can't be  deleted nownr");
  178. break;
  179. case OS_ERR_TASK_NOT_EXIST:
  180. printf("nr The task with prio %4d don't existnr",delPrio);
  181. break;
  182. case OS_ERR_TASK_DEL_ISR:
  183. printf("nrYou can't delete a task in the ISR!!!nr");
  184. break;
  185. }
  186. //放弃运行
  187. OSTimeDly(1);
  188. }
  189. }
  190. void ledTask(void *pdata)
  191. {
  192. INT8U err;
  193. INT8U loop;
  194. pdata = pdata;
  195. while(1)
  196. {
  197. //等待信号sw1SEM
  198. OSSemPend(sw1SEM, 0, &err);
  199. //LED循环闪亮3次
  200. for(loop = 0; loop < 3; loop++)
  201. {
  202. MCF_GPIO_PORTTC |= 0x01; //led1 light
  203. OSTimeDly(10);
  204. MCF_GPIO_PORTTC &= 0x0E; //LED1 go off
  205. MCF_GPIO_PORTTC |= 0x02; //led2 light
  206. OSTimeDly(10);
  207. MCF_GPIO_PORTTC &= 0x0D; //led2 go off
  208. MCF_GPIO_PORTTC |= 0x04; //led3 light
  209. OSTimeDly(10);
  210. MCF_GPIO_PORTTC &= 0x0B; //led3 go off
  211. MCF_GPIO_PORTTC |= 0x08; //led4 light
  212. OSTimeDly(10);
  213. MCF_GPIO_PORTTC &= 0x07; //led4 go off
  214. }
  215. //放弃运行
  216. OSTimeDly(1);
  217. }
  218. }
  219. void showTimeTask(void *pdata)
  220. {
  221. INT32U hour,min,sec;
  222. INT8U err;
  223. pdata = pdata;
  224. while(1)
  225. {
  226. //等待信号sw2SEM
  227. OSSemPend(sw2SEM, 0, &err);
  228. hour = (OSTime / (OS_TICKS_PER_SEC * 3600)) % 24;
  229. min = (OSTime / (OS_TICKS_PER_SEC * 60)) % 60;
  230. sec = (OSTime / OS_TICKS_PER_SEC) % 60;
  231. printf("nr The OS runned time is %2d:%2d:%2dnr",hour,min,sec);
  232. //放弃运行
  233. OSTimeDly(1);
  234. }
  235. }