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配置向导详情如下:                              Task Configuration1.Number of concurrent running tasks   允许创建4个任务,实际创建了如下四个任务                     AppTaskUserIF任务   :按键消息处理。                      AppTaskLED任务   :LED闪烁。                      AppTaskMsgPro任务 :消息处理,这里是用作LED闪烁。                      AppTaskStart任务    :启动任务,也是最高优先级任务,这里实现按键扫描。2.   Number of tasks with user-provided stack    创建的4个任务都是采用自定义堆栈方式。RTX任务调试信息: 程序设计:任务栈大小分配:    staticuint64_t AppTaskUserIFStk;   /* 任务栈 */    staticuint64_t AppTaskLEDStk;      /* 任务栈 */    staticuint64_t AppTaskMsgProStk;/* 任务栈 */    staticuint64_t AppTaskStartStk;   /* 任务栈 */      将任务栈定义成uint64_t类型可以保证任务栈是8字节对齐的,8字节对齐的含义就是数组的首地址对8求余等于0。如果不做8字节对齐的话,部分C语言库函数,浮点运算和uint64_t类型数据运算会出问题。系统栈大小分配: RTX初始化:/*
*********************************************************************************************************
*    函 数 名: main
*    功能说明: 标准c程序入口。
*    形    参: 无
*    返 回 值: 无
*********************************************************************************************************
*/
int main (void)
{   
   /* 初始化外设 */
   bsp_Init();
   
   /* 创建启动任务 */
   os_sys_init_user (AppTaskStart,             /* 任务函数 */
                     4,                        /* 任务优先级 */
                     &AppTaskStartStk,         /* 任务栈 */
                     sizeof(AppTaskStartStk)); /* 任务栈大小,单位字节数 */
   while(1);
}
RTX任务创建:/*
*********************************************************************************************************
*    函 数 名: AppTaskCreate
*    功能说明: 创建应用任务
*    形    参: 无
*    返 回 值: 无
*********************************************************************************************************
*/
static void AppTaskCreate (void)
{
   HandleTaskUserIF = os_tsk_create_user(AppTaskUserIF,             /* 任务函数 */
                                           1,                         /* 任务优先级 */
                                           &AppTaskUserIFStk,         /* 任务栈 */
                                           sizeof(AppTaskUserIFStk)); /* 任务栈大小,单位字节数 */
   
   HandleTaskLED = os_tsk_create_user(AppTaskLED,            /* 任务函数 */
                                        2,                     /* 任务优先级 */
                                        &AppTaskLEDStk,          /* 任务栈 */
                                        sizeof(AppTaskLEDStk));/* 任务栈大小,单位字节数 */
   
   HandleTaskMsgPro = os_tsk_create_user(AppTaskMsgPro,             /* 任务函数 */
                                           3,                         /* 任务优先级 */
                                           &AppTaskMsgProStk,         /* 任务栈 */
                                           sizeof(AppTaskMsgProStk)); /* 任务栈大小,单位字节数 */
}
四个RTX任务的实现:/*
*********************************************************************************************************
*    函 数 名: AppTaskUserIF
*    功能说明: 按键消息处理   
*    形    参: 无
*    返 回 值: 无
*   优 先 级: 1(数值越小优先级越低,这个跟uCOS相反)
*********************************************************************************************************
*/
__task void AppTaskUserIF(void)
{
   uint8_t ucKeyCode;

    while(1)
    {
         ucKeyCode = bsp_GetKey();
      
         if (ucKeyCode != KEY_NONE)
         {
            switch (ucKeyCode)
            {
                   /* K1键按下,打印调试说明 */
                   case KEY_DOWN_K1:
                     printf("K1键按下,使用MDK中自带的RTX调试组件,请务必使用MDK4.74版本进行调试\r\n");
                     break;
                  
                   /* K2键按下,删除任务AppTaskLED */
                   case KEY_DOWN_K2:
                     printf("K2键按下,删除任务HandleTaskLED\r\n");
                     if(HandleTaskLED != NULL)
                     {
                            if(os_tsk_delete(HandleTaskLED) == OS_R_OK)
                            {
                                 HandleTaskLED = NULL;
                                 printf("任务AppTaskLED删除成功\r\n");
                            }
                            else
                            {
                                 printf("任务AppTaskLED删除失败\r\n");                     
                            }
                     }
                     break;                     
                  
                   /* K3键按下,重新创建任务AppTaskLED */
                   case KEY_DOWN_K3:
                     printf("K3键按下,重新创建任务AppTaskLED\r\n");
                     if(HandleTaskLED == NULL)
                     {
                     HandleTaskLED = os_tsk_create_user(AppTaskLED,          /* 任务函数 */
                                                         2,                  /* 任务优先级 */
                                                         &AppTaskLEDStk,   /* 任务栈 */
                                                      sizeof(AppTaskLEDStk));/* 任务栈大小,单位字节数 */
                     }
                     break;
                  
                   /* 其他的键值不处理 */
                   default:                  
                     break;
            }
         }
      
         os_dly_wait(20);
   }
}

/*
*********************************************************************************************************
*    函 数 名: AppTaskLED
*    功能说明: LED闪烁
*    形    参: 无
*    返 回 值: 无
*   优 先 级: 2
*********************************************************************************************************
*/
__task void AppTaskLED(void)
{
    while(1)
    {
         bsp_LedToggle(2);
         bsp_LedToggle(3);
      os_dly_wait(200);
    }
}

/*
*********************************************************************************************************
*    函 数 名: AppTaskMsgPro
*    功能说明: 消息处理,这里是用作LED闪烁   
*    形    参: 无
*    返 回 值: 无
*   优 先 级: 3
*********************************************************************************************************
*/
__task void AppTaskMsgPro(void)
{
    while(1)
    {
         bsp_LedToggle(1);
         bsp_LedToggle(4);
      os_dly_wait(100);
    }
}

/*
*********************************************************************************************************
*    函 数 名: AppTaskStart
*    功能说明: 启动任务,也就是最高优先级任务。
*    形    参: 无
*    返 回 值: 无
*   优 先 级: 4
*********************************************************************************************************
*/
__task void AppTaskStart(void)
{
   AppTaskCreate();
   
    while(1)
    {
         /* 按键扫描 */
         bsp_KeyScan();
      os_dly_wait(10);
    }
}


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配置向导详情如下: Task Configuration1.Number of concurrent running tasks    允许创建4个任务,实际创建了如下四个任务                      AppTaskUserIF任务   :按键消息处理。                      AppTaskLED任务   :LED闪烁。                      AppTaskMsgPro任务 :消息处理,这里是用作LED闪烁。                      AppTaskStart任务    :启动任务,也是最高优先级任务,这里实现按键扫描。2.   Number of tasks with user-provided stack    创建的4个任务都是采用自定义堆栈方式。RTX任务调试信息: 程序设计:任务栈大小分配:    staticuint64_t AppTaskUserIFStk;   /* 任务栈 */    staticuint64_t AppTaskLEDStk;      /* 任务栈 */    staticuint64_t AppTaskMsgProStk;/* 任务栈 */    staticuint64_t AppTaskStartStk;   /* 任务栈 */       将任务栈定义成uint64_t类型可以保证任务栈是8字节对齐的,8字节对齐的含义就是数组的首地址对8求余等于0。如果不做8字节对齐的话,部分C语言库函数,浮点运算和uint64_t类型数据运算会出问题。系统栈大小分配: RTX初始化:/*
*********************************************************************************************************
*    函 数 名: main
*    功能说明: 标准c程序入口。
*    形    参: 无
*    返 回 值: 无
*********************************************************************************************************
*/
int main (void)
{   
   /* 初始化外设 */
   bsp_Init();
   
   /* 创建启动任务 */
   os_sys_init_user (AppTaskStart,             /* 任务函数 */
                     4,                        /* 任务优先级 */
                     &AppTaskStartStk,         /* 任务栈 */
                     sizeof(AppTaskStartStk)); /* 任务栈大小,单位字节数 */
   while(1);
}
RTX任务创建:/*
*********************************************************************************************************
*    函 数 名: AppTaskCreate
*    功能说明: 创建应用任务
*    形    参: 无
*    返 回 值: 无
*********************************************************************************************************
*/
static void AppTaskCreate (void)
{
   HandleTaskUserIF = os_tsk_create_user(AppTaskUserIF,             /* 任务函数 */
                                           1,                         /* 任务优先级 */
                                           &AppTaskUserIFStk,         /* 任务栈 */
                                           sizeof(AppTaskUserIFStk)); /* 任务栈大小,单位字节数 */
   
   HandleTaskLED = os_tsk_create_user(AppTaskLED,            /* 任务函数 */
                                        2,                     /* 任务优先级 */
                                        &AppTaskLEDStk,          /* 任务栈 */
                                        sizeof(AppTaskLEDStk));/* 任务栈大小,单位字节数 */
   
   HandleTaskMsgPro = os_tsk_create_user(AppTaskMsgPro,             /* 任务函数 */
                                           3,                         /* 任务优先级 */
                                           &AppTaskMsgProStk,         /* 任务栈 */
                                           sizeof(AppTaskMsgProStk)); /* 任务栈大小,单位字节数 */
}



baiyongbin2009 发表于 2016-1-21 17:30:29


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

while(1)
{
ucKeyCode = bsp_GetKey();

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

/* K2键按下,删除任务AppTaskLED */
case KEY_DOWN_K2:
printf("K2键按下,删除任务HandleTaskLED\r\n");
if(HandleTaskLED != NULL)
{
if(os_tsk_delete(HandleTaskLED) == OS_R_OK)
{
HandleTaskLED = NULL;
printf("任务AppTaskLED删除成功\r\n");
}
else
{
printf("任务AppTaskLED删除失败\r\n");
}
}
break;

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

}
break;

/* 其他的键值不处理 */
default:
break;
}
}

os_dly_wait(20);
}
}

/*
*********************************************************************************************************
* 函 数 名: AppTaskLED
* 功能说明: LED闪烁
* 形 参: 无
* 返 回 值: 无
* 优 先 级: 2
*********************************************************************************************************
*/
__task void AppTaskLED(void)
{
while(1)
{
bsp_LedToggle(2);
bsp_LedToggle(3);
os_dly_wait(200);
}
}

/*
*********************************************************************************************************
* 函 数 名: AppTaskMsgPro
* 功能说明: 消息处理,这里是用作LED闪烁
* 形 参: 无
* 返 回 值: 无
* 优 先 级: 3
*********************************************************************************************************
*/
__task void AppTaskMsgPro(void)
{
while(1)
{
bsp_LedToggle(1);
bsp_LedToggle(4);
os_dly_wait(100);
}
}

/*
*********************************************************************************************************
* 函 数 名: AppTaskStart
* 功能说明: 启动任务,也就是最高优先级任务。
* 形 参: 无
* 返 回 值: 无
* 优 先 级: 4
*********************************************************************************************************
*/
__task void AppTaskStart(void)
{
AppTaskCreate();

while(1)
{
/* 按键扫描 */
bsp_KeyScan();
os_dly_wait(10);
}
}

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

:P:P:P:P:P:P

watershade 发表于 2016-2-18 17:36:40

今天又从阁下哪里学到了很多,谢谢

0830arthur 发表于 2018-3-14 11:06:37

学习
thanks,:D
页: 1 [2]
查看完整版本: 【安富莱】【RTX操作系统教程】第7章 任务管理