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)); /* 任务栈大小,单位字节数 */
}
续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);
}
}
7.12总结 任务管理中涉及到的API是RTX的基本操作函数,初学者要熟练的掌握,另外任务栈和系统栈也要随着后面的学习搞清楚。
学习 好东西 谢谢分享
此教程是一个系列的吧,最好有个帖子罗列下不同的章节 现在不知道去哪里找第1 ,2 ,3, 4。。。等章 :P:P:P:P:P:P 今天又从阁下哪里学到了很多,谢谢 学习
thanks,:D
页:
1
[2]