Chinaunix首页 | 论坛 | 博客
  • 博客访问: 7723766
  • 博文数量: 961
  • 博客积分: 15795
  • 博客等级: 上将
  • 技术积分: 16612
  • 用 户 组: 普通用户
  • 注册时间: 2010-08-07 14:23
文章分类

全部博文(961)

文章存档

2016年(1)

2015年(61)

2014年(41)

2013年(51)

2012年(235)

2011年(391)

2010年(181)

分类: 嵌入式

2012-05-31 14:18:09


点击(此处)折叠或打开

  1. /**
  2.  *     uCOS_51 for MCS-51
  3.  *     任务挂起和恢复
  4.  * 2012-5-31 lzy
  5.  */

  6. #include "..\ucos_51\ucos-ii\inc\includes.h"

  7. // 任务优先级别定义
  8. #define APPSTARTPRIO     TASK_START_PRIO
  9. #define TIMINGPRIO        APPSTARTPRIO+1
  10. #define POWERLEDPRIO     OS_LOWEST_PRIO - 2        // 定义灯为最低优先级别 【空闲任务】

  11. sbit WorkLedCtrl=P3^4;    // 灯引脚定义

  12. // 栈定义
  13. OS_STK AppStartStk[TASK_STK_SIZE];
  14. OS_STK TimingStk[TASK_STK_SIZE];
  15. OS_STK PowerLedStk[TASK_STK_SIZE];

  16. // 任务声明
  17. void AppStart(void *ppdata) REENTRANT;
  18. void Timing(void *ppdata) REENTRANT;
  19. void PowerLed(void *ppdata) REENTRANT;        // 工作指示灯任务

  20. int main()
  21. {
  22.     InitSystem();     // 系统初始化

  23.     OSTaskCreate(AppStart, (void *)0, AppStartStk, APPSTARTPRIO);

  24.     
  25.     OSStart(); // 启动多任务管理

  26.     return 0;
  27. }

  28.   
  29. /*
  30. *********************************************************************************************************
  31. * 系统开始任务
  32. *
  33. * 描述 : 开定时器T0中断,创建消息邮箱以及所有其他的任务,然后自我删除。
  34. *
  35. * 参数 : ppdata
  36. *
  37. * 注意 : 系统启动后第一时间开定时器中断,否则系统其它任务无法得到执行。             
  38. *********************************************************************************************************
  39. */
  40. void AppStart(void *ppdata) REENTRANT
  41. {
  42.     ppdata=ppdata;

  43.     ET0=1; /* 谨记:系统启动后第一时间开定时器中断 */
  44.     
  45.     OSTaskCreate(PowerLed, (void *)0, PowerLedStk, POWERLEDPRIO);
  46.     OSTaskCreate(Timing, (void *)0, TimingStk, TIMINGPRIO);

  47.     OSTaskDel(OS_PRIO_SELF);    // 自我删除    
  48. }

  49. /*
  50. *********************************************************************************************************
  51. * 计时任务
  52. *
  53. * 描述 : 定时1S,每隔2秒挂起或恢复PowerLed任务 。
  54. *
  55. * 参数 : ppdata
  56. *
  57. * 注意 :              
  58. *********************************************************************************************************
  59. */
  60. void Timing(void *ppdata) REENTRANT
  61. {
  62.      INT8U time = 0;
  63.      ppdata=ppdata;

  64.      for(;;)
  65.     {
  66.         OS_ENTER_CRITICAL();
  67.         time++; /* 保护临界资源 */
  68.         OS_EXIT_CRITICAL();

  69.         // 当time能被4整除则恢复
  70.         // 当time不能被4整除但能被2整除则挂起
  71.         if(time%4 == 0)        
  72.          OSTaskResume(POWERLEDPRIO);     // 恢复PowerLed任务
  73.         else if(time%2 == 0)    
  74.          OSTaskSuspend(POWERLEDPRIO);     // 挂起PowerLed任务

  75.         OSTimeDlyHMSM(0,0,1,0);
  76.     }
  77. }

  78. /*
  79. *********************************************************************************************************
  80. * 工作状态指示任务
  81. *
  82. * 描述 : CPU正常工作时,每秒钟闪烁5次,不工作时不闪烁,控制端口P3.4。
  83. *
  84. * 参数 : ppdata
  85. *
  86. * 注意 : 一个时钟节拍为0.02s,建议优先级设为最低,高于系统空闲任务和系统统计任务。强烈引起您的重视:
  87. *             ..\ucos_51\ucos-ii\src\ucos_ii.h    
  88. *                     OS_EXT DF_IDATA volatile INT32U OSIdleCtr;
  89. *             "OSIdleCtr" 变量务必设置为 "idata" 存储类型,否则任务运行节拍变慢。             
  90. *********************************************************************************************************
  91. */

  92. void PowerLed(void *ppdata) REENTRANT
  93. {
  94. #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
  95.     OS_CPU_SR cpu_sr;
  96. #endif

  97.     ppdata=ppdata;

  98.     for(;;)
  99.     {
  100.         OS_ENTER_CRITICAL();
  101.         WorkLedCtrl=!WorkLedCtrl; /* 保护临界资源 */
  102.         OS_EXIT_CRITICAL();

  103.         OSTimeDlyHMSM(0,0,0,200);
  104.     }
  105. }

 

源码+仿真: 复件 uCOS_51.rar   

阅读(1595) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~