Chinaunix首页 | 论坛 | 博客
  • 博客访问: 631579
  • 博文数量: 1008
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 5175
  • 用 户 组: 普通用户
  • 注册时间: 2012-07-31 09:44
文章分类
文章存档

2012年(1008)

我的朋友

分类:

2012-08-01 10:59:02

原文地址:uCOS_51 时钟、中断 作者:luozhiyong131


点击(此处)折叠或打开

  1. /**
  2.  *     uCOS_51 for MCS-51
  3.  *     时钟、中断
  4.  * 由中断服务程序激活任务程序的工作特点
  5.  * 2012-5-31 lzy
  6.  */

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

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

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

  12. BOOLEAN InterKey = FALSE; // 中断与任务联系的变量

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

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

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

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

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

  25.     return 0;
  26. }

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

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

  45.     OSTaskDel(OS_PRIO_SELF);    // 自我删除    
  46. }


  47. // 灯闪烁任务
  48. void PowerLed(void *ppdata) REENTRANT
  49. {
  50. #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
  51.     OS_CPU_SR cpu_sr;
  52. #endif

  53.     ppdata=ppdata;

  54.     for(;;)
  55.     {
  56.         if(InterKey)
  57.         {
  58.             InterKey = FALSE;

  59.             OS_ENTER_CRITICAL();
  60.             WorkLedCtrl=!WorkLedCtrl; /* 保护临界资源 */
  61.             OS_EXIT_CRITICAL();
  62.         }
  63. //        OSTimeDlyHMSM(0,0,0,200);
  64.     }
  65. }

  66. // 时间节拍服务函数的钩子函数 由系统自动调用
  67. INT8U InterCtr = 0;
  68. void OSTimeTickHook (void) REENTRANT
  69. {
  70.     InterCtr++;
  71.     if(InterCtr == 10)
  72.     {
  73.         InterKey = TRUE;
  74.         InterCtr = 0;
  75.     }
  76.         
  77. }
源码+仿真: 复件 uCOS_51.rar   
阅读(273) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~