你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

【安富莱】【RTX操作系统教程】第7章 任务管理

[复制链接]
baiyongbin2009 提问时间:2016-1-21 15:32 /
阅读主题, 点击返回1楼
收藏 2 评论17 发布时间:2016-1-21 15:32
17个回答
baiyongbin2009 回答时间:2016-1-21 17:29:43
7.11  实验例程说明

7.11.1     STM32F103开发板实验
配套例子:
    V4-402_RTX实验_任务创建和删除
实验目的:
    1. 学习RTX的任务创建和删除。
实验内容:
           1. K1按键按下,串口打印。
           2. K2按键按下,删除任务AppTaskLED。
           3. K3按键按下,重新创建任务AppTaskLED。
           4. 各个任务实现的功能如下:
                    AppTaskUserIF任务   :按键消息处理。
                    AppTaskLED任务     :LED闪烁。
                    AppTaskMsgPro任务 :消息处理,这里是用作LED闪烁。
                   AppTaskStart任务    :启动任务,也是最高优先级任务,这里实现按键扫描。
RTX配置:
    RTX配置向导详情如下:
7.19.png
                              
Task Configuration
1.  Number of concurrent running tasks
     允许创建4个任务,实际创建了如下四个任务
                     AppTaskUserIF任务   :按键消息处理。
                      AppTaskLED任务     :LED闪烁。
                      AppTaskMsgPro任务 :消息处理,这里是用作LED闪烁。
                      AppTaskStart任务    :启动任务,也是最高优先级任务,这里实现按键扫描。
2.   Number of tasks with user-provided stack
    创建的4个任务都是采用自定义堆栈方式。
RTX任务调试信息:
7.20.png
程序设计:
任务栈大小分配:
    staticuint64_t AppTaskUserIFStk[512/8];   /* 任务栈 */
    staticuint64_t AppTaskLEDStk[256/8];      /* 任务栈 */
    staticuint64_t AppTaskMsgProStk[512/8];  /* 任务栈 */
    staticuint64_t AppTaskStartStk[512/8];     /* 任务栈 */
      将任务栈定义成uint64_t类型可以保证任务栈是8字节对齐的,8字节对齐的含义就是数组的首地址对8求余等于0。如果不做8字节对齐的话,部分C语言库函数,浮点运算和uint64_t类型数据运算会出问题。
系统栈大小分配:
7.21.png
RTX初始化:
  1. /*
  2. *********************************************************************************************************
  3. *    函 数 名: main
  4. *    功能说明: 标准c程序入口。
  5. *    形    参: 无
  6. *    返 回 值: 无
  7. *********************************************************************************************************
  8. */
  9. int main (void)
  10. {   
  11.      /* 初始化外设 */
  12.      bsp_Init();
  13.    
  14.      /* 创建启动任务 */
  15.      os_sys_init_user (AppTaskStart,             /* 任务函数 */
  16.                        4,                        /* 任务优先级 */
  17.                        &AppTaskStartStk,         /* 任务栈 */
  18.                        sizeof(AppTaskStartStk)); /* 任务栈大小,单位字节数 */
  19.      while(1);
  20. }
复制代码

RTX任务创建:
  1. /*
  2. *********************************************************************************************************
  3. *    函 数 名: AppTaskCreate
  4. *    功能说明: 创建应用任务
  5. *    形    参: 无
  6. *    返 回 值: 无
  7. *********************************************************************************************************
  8. */
  9. static void AppTaskCreate (void)
  10. {
  11.      HandleTaskUserIF = os_tsk_create_user(AppTaskUserIF,             /* 任务函数 */
  12.                                            1,                         /* 任务优先级 */
  13.                                            &AppTaskUserIFStk,         /* 任务栈 */
  14.                                            sizeof(AppTaskUserIFStk)); /* 任务栈大小,单位字节数 */
  15.    
  16.      HandleTaskLED = os_tsk_create_user(AppTaskLED,              /* 任务函数 */
  17.                                         2,                       /* 任务优先级 */
  18.                                         &AppTaskLEDStk,          /* 任务栈 */
  19.                                         sizeof(AppTaskLEDStk));  /* 任务栈大小,单位字节数 */
  20.    
  21.      HandleTaskMsgPro = os_tsk_create_user(AppTaskMsgPro,             /* 任务函数 */
  22.                                            3,                         /* 任务优先级 */
  23.                                            &AppTaskMsgProStk,         /* 任务栈 */
  24.                                            sizeof(AppTaskMsgProStk)); /* 任务栈大小,单位字节数 */
  25. }
复制代码

四个RTX任务的实现:
  1. /*
  2. *********************************************************************************************************
  3. *    函 数 名: AppTaskUserIF
  4. *    功能说明: 按键消息处理     
  5. *    形    参: 无
  6. *    返 回 值: 无
  7. *   优 先 级: 1  (数值越小优先级越低,这个跟uCOS相反)
  8. *********************************************************************************************************
  9. */
  10. __task void AppTaskUserIF(void)
  11. {
  12.      uint8_t ucKeyCode;

  13.     while(1)
  14.     {
  15.          ucKeyCode = bsp_GetKey();
  16.         
  17.          if (ucKeyCode != KEY_NONE)
  18.          {
  19.               switch (ucKeyCode)
  20.               {
  21.                    /* K1键按下,打印调试说明 */
  22.                    case KEY_DOWN_K1:
  23.                        printf("K1键按下,使用MDK中自带的RTX调试组件,请务必使用MDK4.74版本进行调试\r\n");
  24.                        break;
  25.                   
  26.                    /* K2键按下,删除任务AppTaskLED */
  27.                    case KEY_DOWN_K2:
  28.                        printf("K2键按下,删除任务HandleTaskLED\r\n");
  29.                        if(HandleTaskLED != NULL)
  30.                        {
  31.                             if(os_tsk_delete(HandleTaskLED) == OS_R_OK)
  32.                             {
  33.                                  HandleTaskLED = NULL;
  34.                                  printf("任务AppTaskLED删除成功\r\n");
  35.                             }
  36.                             else
  37.                             {
  38.                                  printf("任务AppTaskLED删除失败\r\n");                     
  39.                             }
  40.                        }
  41.                        break;                     
  42.                   
  43.                    /* K3键按下,重新创建任务AppTaskLED */
  44.                    case KEY_DOWN_K3:
  45.                        printf("K3键按下,重新创建任务AppTaskLED\r\n");
  46.                        if(HandleTaskLED == NULL)
  47.                        {
  48.                        HandleTaskLED = os_tsk_create_user(AppTaskLED,          /* 任务函数 */
  49.                                                            2,                  /* 任务优先级 */
  50.                                                            &AppTaskLEDStk,     /* 任务栈 */
  51.                                                         sizeof(AppTaskLEDStk));/* 任务栈大小,单位字节数 */
  52.                        }
  53.                        break;
  54.                   
  55.                    /* 其他的键值不处理 */
  56.                    default:                    
  57.                        break;
  58.               }
  59.          }
  60.         
  61.          os_dly_wait(20);
  62.      }
  63. }

  64. /*
  65. *********************************************************************************************************
  66. *    函 数 名: AppTaskLED
  67. *    功能说明: LED闪烁
  68. *    形    参: 无
  69. *    返 回 值: 无
  70. *   优 先 级: 2
  71. *********************************************************************************************************
  72. */
  73. __task void AppTaskLED(void)
  74. {
  75.     while(1)
  76.     {
  77.          bsp_LedToggle(2);
  78.          bsp_LedToggle(3);
  79.         os_dly_wait(200);
  80.     }
  81. }

  82. /*
  83. *********************************************************************************************************
  84. *    函 数 名: AppTaskMsgPro
  85. *    功能说明: 消息处理,这里是用作LED闪烁   
  86. *    形    参: 无
  87. *    返 回 值: 无
  88. *   优 先 级: 3
  89. *********************************************************************************************************
  90. */
  91. __task void AppTaskMsgPro(void)
  92. {
  93.     while(1)
  94.     {
  95.          bsp_LedToggle(1);
  96.          bsp_LedToggle(4);
  97.         os_dly_wait(100);
  98.     }
  99. }

  100. /*
  101. *********************************************************************************************************
  102. *    函 数 名: AppTaskStart
  103. *    功能说明: 启动任务,也就是最高优先级任务。
  104. *    形    参: 无
  105. *    返 回 值: 无
  106. *   优 先 级: 4
  107. *********************************************************************************************************
  108. */
  109. __task void AppTaskStart(void)
  110. {
  111.      AppTaskCreate();
  112.    
  113.     while(1)
  114.     {
  115.          /* 按键扫描 */
  116.          bsp_KeyScan();
  117.         os_dly_wait(10);
  118.     }
  119. }
复制代码



7.11.2     STM32F407开发板实验
配套例子:
V5-402_RTX实验_任务创建和删除
实验目的:
1. 学习RTX的任务创建和删除。
实验内容:
       1. K1按键按下,串口打印。
       2. K2按键按下,删除任务AppTaskLED。
       3. K3按键按下,重新创建任务AppTaskLED。
       4. 各个任务实现的功能如下:
              AppTaskUserIF任务   :按键消息处理。
              AppTaskLED任务     :LED闪烁。
              AppTaskMsgPro任务 :消息处理,这里是用作LED闪烁。
              AppTaskStart任务    :启动任务,也是最高优先级任务,这里实现按键扫描。
RTX配置:
RTX配置向导详情如下:
7.22.png
Task Configuration
1.  Number of concurrent running tasks
    允许创建4个任务,实际创建了如下四个任务
                      AppTaskUserIF任务   :按键消息处理。
                      AppTaskLED任务     :LED闪烁。
                      AppTaskMsgPro任务 :消息处理,这里是用作LED闪烁。
                      AppTaskStart任务    :启动任务,也是最高优先级任务,这里实现按键扫描。
2.   Number of tasks with user-provided stack
    创建的4个任务都是采用自定义堆栈方式。
RTX任务调试信息:
7.23.png
程序设计:
任务栈大小分配:
    staticuint64_t AppTaskUserIFStk[512/8];   /* 任务栈 */
    staticuint64_t AppTaskLEDStk[256/8];      /* 任务栈 */
    staticuint64_t AppTaskMsgProStk[512/8];  /* 任务栈 */
    staticuint64_t AppTaskStartStk[512/8];     /* 任务栈 */
       将任务栈定义成uint64_t类型可以保证任务栈是8字节对齐的,8字节对齐的含义就是数组的首地址对8求余等于0。如果不做8字节对齐的话,部分C语言库函数,浮点运算和uint64_t类型数据运算会出问题。
系统栈大小分配:
7.24.png
RTX初始化:
  1. /*
  2. *********************************************************************************************************
  3. *    函 数 名: main
  4. *    功能说明: 标准c程序入口。
  5. *    形    参: 无
  6. *    返 回 值: 无
  7. *********************************************************************************************************
  8. */
  9. int main (void)
  10. {   
  11.      /* 初始化外设 */
  12.      bsp_Init();
  13.    
  14.      /* 创建启动任务 */
  15.      os_sys_init_user (AppTaskStart,             /* 任务函数 */
  16.                        4,                        /* 任务优先级 */
  17.                        &AppTaskStartStk,         /* 任务栈 */
  18.                        sizeof(AppTaskStartStk)); /* 任务栈大小,单位字节数 */
  19.      while(1);
  20. }
复制代码

RTX任务创建:
  1. /*
  2. *********************************************************************************************************
  3. *    函 数 名: AppTaskCreate
  4. *    功能说明: 创建应用任务
  5. *    形    参: 无
  6. *    返 回 值: 无
  7. *********************************************************************************************************
  8. */
  9. static void AppTaskCreate (void)
  10. {
  11.      HandleTaskUserIF = os_tsk_create_user(AppTaskUserIF,             /* 任务函数 */
  12.                                            1,                         /* 任务优先级 */
  13.                                            &AppTaskUserIFStk,         /* 任务栈 */
  14.                                            sizeof(AppTaskUserIFStk)); /* 任务栈大小,单位字节数 */
  15.    
  16.      HandleTaskLED = os_tsk_create_user(AppTaskLED,              /* 任务函数 */
  17.                                         2,                       /* 任务优先级 */
  18.                                         &AppTaskLEDStk,          /* 任务栈 */
  19.                                         sizeof(AppTaskLEDStk));  /* 任务栈大小,单位字节数 */
  20.    
  21.      HandleTaskMsgPro = os_tsk_create_user(AppTaskMsgPro,             /* 任务函数 */
  22.                                            3,                         /* 任务优先级 */
  23.                                            &AppTaskMsgProStk,         /* 任务栈 */
  24.                                            sizeof(AppTaskMsgProStk)); /* 任务栈大小,单位字节数 */
  25. }
复制代码




baiyongbin2009 回答时间:2016-1-21 17:30:29

续7.11.2
四个RTX任务的实现:
  1. /*
  2. *********************************************************************************************************
  3. * 函 数 名: AppTaskUserIF
  4. * 功能说明: 按键消息处理
  5. * 形 参: 无
  6. * 返 回 值: 无
  7. * 优 先 级: 1 (数值越小优先级越低,这个跟uCOS相反)
  8. *********************************************************************************************************
  9. */
  10. __task void AppTaskUserIF(void)
  11. {
  12. uint8_t ucKeyCode;

  13. while(1)
  14. {
  15. ucKeyCode = bsp_GetKey();

  16. if (ucKeyCode != KEY_NONE)
  17. {
  18. switch (ucKeyCode)
  19. {
  20. /* K1键按下,打印调试说明 */
  21. case KEY_DOWN_K1:
  22. printf("K1键按下,使用MDK中自带的RTX调试组件,请务必使用MDK4.74版本进行调试\r\n");
  23. break;

  24. /* K2键按下,删除任务AppTaskLED */
  25. case KEY_DOWN_K2:
  26. printf("K2键按下,删除任务HandleTaskLED\r\n");
  27. if(HandleTaskLED != NULL)
  28. {
  29. if(os_tsk_delete(HandleTaskLED) == OS_R_OK)
  30. {
  31. HandleTaskLED = NULL;
  32. printf("任务AppTaskLED删除成功\r\n");
  33. }
  34. else
  35. {
  36. printf("任务AppTaskLED删除失败\r\n");
  37. }
  38. }
  39. break;

  40. /* K3键按下,重新创建任务AppTaskLED */
  41. case KEY_DOWN_K3:
  42. printf("K3键按下,重新创建任务AppTaskLED\r\n");
  43. if(HandleTaskLED == NULL)
  44. {
  45. HandleTaskLED = os_tsk_create_user(AppTaskLED, /* 任务函数 */
  46. 2, /* 任务优先级 */
  47. &AppTaskLEDStk, /* 任务栈 */
  48. sizeof(AppTaskLEDStk));/* 任务栈大小,单位字节数 */

  49. }
  50. break;

  51. /* 其他的键值不处理 */
  52. default:
  53. break;
  54. }
  55. }

  56. os_dly_wait(20);
  57. }
  58. }

  59. /*
  60. *********************************************************************************************************
  61. * 函 数 名: AppTaskLED
  62. * 功能说明: LED闪烁
  63. * 形 参: 无
  64. * 返 回 值: 无
  65. * 优 先 级: 2
  66. *********************************************************************************************************
  67. */
  68. __task void AppTaskLED(void)
  69. {
  70. while(1)
  71. {
  72. bsp_LedToggle(2);
  73. bsp_LedToggle(3);
  74. os_dly_wait(200);
  75. }
  76. }

  77. /*
  78. *********************************************************************************************************
  79. * 函 数 名: AppTaskMsgPro
  80. * 功能说明: 消息处理,这里是用作LED闪烁
  81. * 形 参: 无
  82. * 返 回 值: 无
  83. * 优 先 级: 3
  84. *********************************************************************************************************
  85. */
  86. __task void AppTaskMsgPro(void)
  87. {
  88. while(1)
  89. {
  90. bsp_LedToggle(1);
  91. bsp_LedToggle(4);
  92. os_dly_wait(100);
  93. }
  94. }

  95. /*
  96. *********************************************************************************************************
  97. * 函 数 名: AppTaskStart
  98. * 功能说明: 启动任务,也就是最高优先级任务。
  99. * 形 参: 无
  100. * 返 回 值: 无
  101. * 优 先 级: 4
  102. *********************************************************************************************************
  103. */
  104. __task void AppTaskStart(void)
  105. {
  106. AppTaskCreate();

  107. while(1)
  108. {
  109. /* 按键扫描 */
  110. bsp_KeyScan();
  111. os_dly_wait(10);
  112. }
  113. }
复制代码

baiyongbin2009 回答时间:2016-1-21 17:31:04
7.12  总结
    任务管理中涉及到的API是RTX的基本操作函数,初学者要熟练的掌握,另外任务栈和系统栈也要随着后面的学习搞清楚。

dsjsjf 回答时间:2016-1-21 19:04:46
学习            
湉湉 回答时间:2016-1-23 13:45:29
好东西 谢谢分享
此教程是一个系列的吧,最好有个帖子罗列下不同的章节   现在不知道去哪里找第1 ,2 ,3, 4。。。等章
电子技术2014 回答时间:2016-1-23 13:49:58
watershade 回答时间:2016-2-18 17:36:40
今天又从阁下哪里学到了很多,谢谢
0830arthur 回答时间:2018-3-14 11:06:37
学习
thanks,  
12

所属标签

相似问题

关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
st-img 微信公众号
st-img 手机版