找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2610|回复: 0
打印 上一主题 下一主题
收起左侧

STM32 UOSII系统任务调度源码

[复制链接]
跳转到指定楼层
楼主
ID:389262 发表于 2018-8-23 15:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
UCOSII系统建立了两个优先级不同的任务
通过设置任务间的延时实时调度任务
寄存器版程序验证OK
例如优先级别为64
系统空闲任务为最低优先级64-1
统计任务优先级为64-2
任务堆栈
堆栈为后进先出,先进后出
任务创建时应该依据处理堆栈的生长方向(向上生长【低地址在下】和向下生长【低地址在上】)
M3的栈生长方向为高地址向低地址增长即向上增长的
栈的地址是从顶端开始传递的

优先级使用
0 1 2 3 OS_LOWEST_PRIO-3 OS_LOWEST_PRIO-2 OS_LOWEST_PRIO-1 OS_LOWEST_PRIO

开发者:h

stm32单片机源程序如下:
  1. #include "sys.h"
  2. #include "usart.h"               
  3. #include "delay.h"        
  4. #include "led.h"
  5. #include "includes.h"
  6.          


  7. /////////////////////////UCOSII任务设置///////////////////////////////////
  8. //START 任务
  9. //设置任务优先级
  10. #define START_TASK_PRIO                              10 //开始任务的优先级设置为最低
  11. //设置任务堆栈大小
  12. #define START_STK_SIZE                                  64
  13. //任务堆栈        
  14. OS_STK START_TASK_STK[START_STK_SIZE];
  15. //任务函数
  16. void start_task(void *pdata);        
  17.                            
  18. //LED0任务
  19. //设置任务优先级
  20. #define LED0_TASK_PRIO                               6
  21. //设置任务堆栈大小
  22. #define LED0_STK_SIZE                                      64
  23. //任务堆栈        
  24. OS_STK LED0_TASK_STK[LED0_STK_SIZE];
  25. //任务函数
  26. void led0_task(void *pdata);


  27. //LED1任务
  28. //设置任务优先级
  29. #define LED1_TASK_PRIO                               7
  30. //设置任务堆栈大小
  31. #define LED1_STK_SIZE                                          64
  32. //任务堆栈
  33. OS_STK LED1_TASK_STK[LED1_STK_SIZE];
  34. //任务函数
  35. void led1_task(void *pdata);

  36. //LED2任务
  37. //设置任务优先级
  38. #define LED2_TASK_PRIO                               8
  39. //设置任务堆栈大小
  40. #define LED2_STK_SIZE                                          64
  41. //任务堆栈
  42. OS_STK LED2_TASK_STK[LED2_STK_SIZE];
  43. //任务函数
  44. void led2_task(void *pdata);

  45. //LED3任务
  46. //设置任务优先级
  47. #define LED3_TASK_PRIO                               9
  48. //设置任务堆栈大小
  49. #define LED3_STK_SIZE                                          64
  50. //任务堆栈
  51. OS_STK LED3_TASK_STK[LED3_STK_SIZE];
  52. //任务函数
  53. void led3_task(void *pdata);



  54. //任务函数解析
  55. //OSTimeTick() 系统服务函数         时钟节拍函数
  56. //OSTimeTickHook() 时钟节拍外连函数
  57. //OSTimeDly()  OSTimeDlyHMSM() 任务延时函数
  58. //OSTaskStat() 统计时间运行任务 用来计算CPU使用率
  59. //OSStatInit() 系统统计初始化函数
  60. //OS_TaskIdle()         空闲任务
  61. //OS_TaskStat()         统计任务
  62. //TickTask()     时钟节拍任务
  63. //OSTickISR()   时钟节拍中断服务函数
  64. //OSVersion()   获取UCOS的版本号
  65. //OSTaskDel(OS_PRIO_SELF)  任务删除
  66. //OSTaskCreateExt 任务创建扩展函数
  67. //OSTaskStkChk()  堆栈检验函数

  68. int main(void)
  69. {                                   
  70.         Stm32_Clock_Init(9); //系统时钟设置
  71.         delay_init(72);             //延时初始化        
  72.         uart_init(72,9600);         //初始化串口
  73. //        LED_Init();                        
  74.         LED_Init();                           //初始化与LED连接的硬件接口
  75.         OSInit();   
  76.          OSTaskCreate(start_task,(void *)0,(OS_STK *)&START_TASK_STK[START_STK_SIZE-1],START_TASK_PRIO );//创建起始任务
  77.         OSStart();                  
  78. }

  79.          
  80. //开始任务
  81. void start_task(void *pdata)
  82. {
  83.     OS_CPU_SR cpu_sr=0;
  84.         pdata = pdata;
  85.         OSSysTickInit();

  86.           OS_ENTER_CRITICAL();                        //进入临界区(无法被中断打断)   
  87.          OSTaskCreate(led0_task,(void *)0,(OS_STK*)&LED0_TASK_STK[LED0_STK_SIZE-1],LED0_TASK_PRIO);                                                   
  88.          OSTaskCreate(led1_task,(void *)0,(OS_STK*)&LED1_TASK_STK[LED1_STK_SIZE-1],LED1_TASK_PRIO);
  89.         OSTaskCreate(led2_task,(void *)0,(OS_STK*)&LED2_TASK_STK[LED2_STK_SIZE-1],LED2_TASK_PRIO);
  90.         OSTaskCreate(led3_task,(void *)0,(OS_STK*)&LED3_TASK_STK[LED3_STK_SIZE-1],LED3_TASK_PRIO);                                                   
  91.         OSTaskSuspend(START_TASK_PRIO);        //挂起起始任务.
  92.         OS_EXIT_CRITICAL();                                //退出临界区(可以被中断打断)
  93. }
  94. /***************************************/
  95. void delay(u16 tt)
  96. {
  97. u16 kk;
  98. while(tt--)
  99. {
  100.   for(kk=0;kk<8000;kk++)
  101.   ;
  102. }
  103. }
  104. //LED0任务
  105. void led0_task(void *pdata)
  106. {                 
  107.         while(1)
  108.         {
  109.             OSTimeDly(2);//自身延时函数 OSTimeDlyHMSM()表示等待状态
  110.         /*        LED0=0;
  111.                 delay_ms(80);
  112.                 LED0=1;
  113.                 delay_ms(920);
  114.                 printf("按键1已经按下\r\n"); */
  115.                 if(KEY22==0)
  116.                 {
  117.                  delay_ms(10);
  118.                  if(KEY22==0)
  119.                  {
  120.                   while(KEY22==0);
  121.                   delay_ms(10);
  122.                   while(KEY22==0);
  123.                   Uart1_PutString("按键1已经按下\r\n");
  124.                  }        
  125.                 }
  126.         };
  127. }

  128. //LED1任务
  129. void led1_task(void *pdata)
  130. {         
  131.         while(1)
  132.         {
  133.             OSTimeDly(2);
  134.                 switch(FLAG_YY)
  135.                 {
  136.                  case 1:printf("任务2成功实现\r\n");FLAG_YY=0;break;
  137.                  case 2:printf("22任务成功实现\r\n");FLAG_YY=0;break;
  138.                  case 3:printf("33任务成功实现\r\n");FLAG_YY=0;break;
  139.                  default:break;
  140.                 }
  141. /*                LED1=0;
  142.                 delay_ms(300);
  143.                 LED1=1;
  144.                 printf("按键已经按下\r\n");
  145.                 delay_ms(300); */
  146. /*        if(KEY_K==0)
  147.                 {
  148.                  delay_ms(10);
  149.                  if(KEY_K==0)
  150.                  {
  151.                   while(KEY_K==0);
  152.                   delay_ms(10);
  153.                   while(KEY_K==0);
  154.                   printf("按键2已经按下\r\n");
  155.                  }        
  156.                 }  */
  157.         };
  158. }
  159. //LED2任务
  160. void led2_task(void *pdata)
  161. {         
  162.         while(1)
  163.         {
  164.             OSTimeDly(2);
  165.            if(KEY_K==0)
  166.            {
  167.              delay_ms(10);
  168.                  if(KEY_K==0)
  169.                  {
  170.                   while(KEY_K==0);
  171.                   delay_ms(10);
  172.                   while(KEY_K==0);
  173.                   printf("led 状态反转\r\n");
  174.                  }
  175.            }
  176. /*                LED1=0;
  177.                 delay_ms(300);
  178.                 LED1=1;
  179.                 printf("按键已经按下\r\n");
  180.                 delay_ms(300); */
  181. /*        if(KEY_K==0)
  182.                 {
  183.                  delay_ms(10);
  184.                  if(KEY_K==0)
  185.                  {
  186.                   while(KEY_K==0);
  187.                   delay_ms(10);
  188.                   while(KEY_K==0);
  189.                   printf("按键2已经按下\r\n");
  190.                  }        
  191.                 }  */
  192.         };
  193. }
  194. //LED3任务
  195. void led3_task(void *pdata)
  196. {         
  197.         while(1)
  198.         {
  199.             OSTimeDly(2);
  200.            if(KEY11==0)
  201.            {
  202.              delay_ms(10);
  203.                  if(KEY11==0)
  204.                  {
  205.                   while(KEY11==0);
  206.                   delay_ms(10);
  207.                   while(KEY11==0);
  208.                   printf("led1 状态反转\r\n");
  209.                  }
  210.            }
  211. /*                LED1=0;
  212.                 delay_ms(300);
  213.                 LED1=1;
  214.                 printf("按键已经按下\r\n");
  215.                 delay_ms(300); */
  216. /*        if(KEY_K==0)
  217.                 {
  218.                  delay_ms(10);
  219.                  if(KEY_K==0)
  220.                  {
  221.                   while(KEY_K==0);
  222.                   delay_ms(10);
  223.                   while(KEY_K==0);
  224.                   printf("按键2已经按下\r\n");
  225.                  }        
  226.                 }  */
  227.         };
  228. }
复制代码

所有资料51hei提供下载:
STM32UCOSII 任务调度.rar (402.17 KB, 下载次数: 13)



评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表