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

2012年(1008)

我的朋友

分类:

2012-08-01 10:58:54

原文地址:uCOS_51 消息邮箱 作者:luozhiyong131


点击(此处)折叠或打开

  1. /**
  2.  * uCOS_51 for MCS-51
  3.  * 消息邮箱
  4.  * 利用消息邮箱进行数据通讯
  5.  * 2012-6-1 lzy
  6.  */

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

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

  12. //void *msg_p;     // 消息邮箱
  13. bit msg_p = 1;
  14. sbit WorkLedCtrl=P3^4; // 灯引脚定义
  15.  
  16. // 栈定义
  17. OS_STK AppStartStk[TASK_STK_SIZE];
  18. OS_STK CtrLedStk[TASK_STK_SIZE];
  19. OS_STK PowerLedStk[TASK_STK_SIZE];

  20. // 任务声明
  21. void AppStart(void *ppdata) REENTRANT;
  22. void CtrLed(void *ppdata) REENTRANT;
  23. void PowerLed(void *ppdata) REENTRANT; // 工作指示灯任务

  24. int main()
  25. {
  26.     InitSystem(); // 系统初始化

  27.     OSTaskCreate(AppStart, (void *)0, AppStartStk, APPSTARTPRIO);
  28.     OSTaskCreate(CtrLed, (void *)0, CtrLedStk, CTRLEDPRIO);
  29.     
  30.     OSStart(); // 启动多任务管理

  31.     return 0;
  32. }

  33. bit Open=0, Off=1;

  34. // 发送信息至邮箱
  35. void CtrLed(void *ppdata) REENTRANT
  36. {    
  37.     ppdata=ppdata;

  38.     for(;;)
  39.     {
  40.      if(msg_p == 0)             // 数据发送至邮箱
  41.              msg_p = Off;
  42.         else
  43.              msg_p = Open;

  44.          OSTimeDlyHMSM(0,0,0,500);
  45.     }
  46. }
  47.   
  48. /*
  49. ******************************************************************************************** 
  50. * 系统开始任务
  51. *
  52. * 描述 : 开定时器T0中断,创建消息邮箱以及所有其他的任务,然后自我删除。
  53. *
  54. * 参数 : ppdata
  55. *
  56. * 注意 : 系统启动后第一时间开定时器中断,否则系统其它任务无法得到执行。
  57. *********************************************************************************************
  58. */
  59. void AppStart(void *ppdata) REENTRANT
  60. {
  61.     ppdata=ppdata;

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

  65.     OSTaskDel(OS_PRIO_SELF); // 自我删除
  66. }


  67. // 灯闪烁任务
  68. void PowerLed(void *ppdata) REENTRANT
  69. {
  70. #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
  71.     OS_CPU_SR cpu_sr;
  72. #endif

  73.     ppdata=ppdata;

  74.     for(;;)
  75.     {
  76.      OS_ENTER_CRITICAL();
  77.      WorkLedCtrl= msg_p; /* 保护临界资源 */
  78.      OS_EXIT_CRITICAL();
  79. // OSTimeDlyHMSM(0,0,0,500);
  80.     }
  81. }
源码+仿真: 复件 uCOS_51.rar   


点击(此处)折叠或打开

  1. /*
  2. *********************************************************************************************
  3. * uC/OS-II
  4. * The Real-Time Kernel
  5. *
  6. * (c) Copyright 1992-2002, Jean J. Labrosse, Weston, FL
  7. * All Rights Reserved
  8. *
  9. *
  10. * uCOS_51 for MCS-51
  11. *
  12. * File : main.c
  13. * Created by : QQ 591881218
  14. *********************************************************************************************
  15. */

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

  17. // ---------------------------------

  18. #define APPSTARTPRIO     TASK_START_PRIO    
  19. #define UARTRCVPRIO        APPSTARTPRIO + 2
  20. #define UARTSENDPRIO    UARTRCVPRIO + 2
  21. #define POWERLEDPRIO     OS_LOWEST_PRIO - 2

  22. #define OK                0
  23. #define ACK                1
  24. #define ENTER            0x0D

  25. // ---------------------------------

  26. sbit WorkLedCtrl=P3^4;

  27. OS_EVENT *UartMbox;
  28. OS_EVENT *AckMbox;

  29. OS_STK AppStartStk[TASK_STK_SIZE];
  30. OS_STK PowerLedStk[TASK_STK_SIZE];
  31. OS_STK UartRcvStk[TASK_STK_SIZE];
  32. OS_STK UartSendStk[TASK_STK_SIZE];

  33. // ---------------------------------

  34. void AppStart(void *ppdata) REENTRANT;
  35. void PowerLed(void *ppdata) REENTRANT;
  36. void UartRcv(void *ppdata) REENTRANT;
  37. void UartSend(void *ppdata)    REENTRANT;

  38. // ---------------------------------

  39. int main(void)
  40. {
  41.     InitSystem();

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

  43.     OSStart();

  44.     return OK;
  45. }

  46. /*
  47. *********************************************************************************************
  48. * 系统开始任务
  49. *
  50. * 描述 : 开定时器T0中断,创建消息邮箱以及所有其他的任务,然后自我删除。
  51. *
  52. * 参数 : ppdata
  53. *
  54. * 注意 : 系统启动后第一时间开定时器中断,否则系统其它任务无法得到执行。             
  55. *********************************************************************************************
  56. */
  57. void AppStart(void *ppdata) REENTRANT
  58. {
  59.     ppdata=ppdata;
  60.     ET0=1; /* 谨记:系统启动后第一时间开定时器中断 */

  61.     UartMbox=OSMboxCreate((void *)0);
  62.     AckMbox=OSMboxCreate((void *)0);

  63.     LogoDisp();
  64.     PrintStr("You can input by the terminal!\n\n\n");
  65.     
  66.     OSTaskCreate(PowerLed, (void *)0, PowerLedStk, POWERLEDPRIO);
  67.     OSTaskCreate(UartRcv, (void *)0, UartRcvStk, UARTRCVPRIO);
  68.     OSTaskCreate(UartSend, (void *)0, UartSendStk, UARTSENDPRIO);

  69.     OSTaskDel(OS_PRIO_SELF);    
  70. }

  71. /*
  72. *********************************************************************************************
  73. * 工作状态指示任务
  74. *
  75. * 描述 : CPU正常工作时,每秒钟闪烁5次,不工作时不闪烁,控制端口P3.4。
  76. *
  77. * 参数 : ppdata
  78. *
  79. * 注意 : 一个时钟节拍为0.02s,建议优先级设为最低,高于系统空闲任务和系统统计任务。强烈引起您的重视:
  80. *             ..\ucos_51\ucos-ii\src\ucos_ii.h    
  81. *                     OS_EXT DF_IDATA volatile INT32U OSIdleCtr;
  82. *             "OSIdleCtr" 变量务必设置为 "idata" 存储类型,否则任务运行节拍变慢。             
  83. *********************************************************************************************
  84. */
  85. void PowerLed(void *ppdata) REENTRANT
  86. {
  87. #if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
  88.     OS_CPU_SR cpu_sr;
  89. #endif

  90.     ppdata=ppdata;
  91.     
  92.     for(;;)
  93.     {
  94.         OS_ENTER_CRITICAL();
  95.         WorkLedCtrl=!WorkLedCtrl; /* 保护临界资源 */
  96.         OS_EXIT_CRITICAL();

  97.         OSTimeDlyHMSM(0,0,0,200);
  98.     }
  99. }

  100. /*
  101. *********************************************************************************************
  102. * 串口收发任务
  103. *
  104. * 描述 : UartRcv任务负责从键盘接收,通过消息邮箱发送给UartSend任务处理并在终端打印。
  105. *
  106. * 参数 : ppdata
  107. *
  108. * 注意 : 多任务的并发执行,须妥善处理对临界资源的访问以及多任务之间的通信。         
  109. *********************************************************************************************
  110. */
  111. // ------------------------------------------------------------------------------------------------------
  112. void UartRcv(void *ppdata) REENTRANT
  113. {
  114.     INT8U Rxbuf;
  115.     INT8U err;

  116.     ppdata=ppdata;
  117.         
  118.     for(;;)
  119.     {
  120.         if(Getch(&Rxbuf))
  121.         {
  122.             OSMboxPost(UartMbox, (void *)&Rxbuf);
  123.             OSMboxPend(AckMbox, 0, &err);
  124.         }    
  125.         
  126.         OSTimeDlyHMSM(0,0,0,100);
  127.     }    
  128. }

  129. void UartSend(void *ppdata) REENTRANT
  130. {
  131.     INT8U *Txbuf;
  132.     INT8U err;
  133.     INT16U count=0;    

  134.     ppdata=ppdata;

  135.     for(;;)
  136.     {
  137.         Txbuf=(INT8U *)OSMboxPend(UartMbox,0,&err);

  138.         if(OS_NO_ERR==err)
  139.         {    
  140.             PrintChar(*Txbuf);

  141.             count++;
  142.             
  143.             if((ENTER == *Txbuf) || (0xFFFF == count)) count=1;
  144.         
  145.             if(!(count%69))
  146.             {
  147.                 PrintStr("\n");
  148.             }    
  149.         }
  150.         else
  151.         {
  152.             PrintStr("\n\nMboxRcv err!\n\n\n");
  153.         }

  154.         OSMboxPost(AckMbox,(void *)ACK);
  155.     }
  156. }
  157. // ------------------------------------------------------------------------------------------

源源+仿真: 复件 uCOS_51.rar   
阅读(516) | 评论(0) | 转发(0) |
0

上一篇:C/C++ 编程规范

下一篇:uCOS_51 信号量

给主人留下些什么吧!~~