你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。
chrome
firefox
safari
ie8及以上
ST
官网
STM32
中文官网
ST
全球论坛
登录/注册
首页
技术问答
话题
资源
创客秀
视频
标签
每日签到
STM32团队2
论坛吐槽优化专区
升级测试
【安富莱】【RTX操作系统教程】第7章 任务管理
[复制链接]
baiyongbin2009
提问时间:2016-1-21 15:32 /
阅读主题, 点击返回1楼
赞
0
收藏
2
评论
17
分享
发布时间:2016-1-21 15:32
请先
登录
后回复
17个回答
baiyongbin2009
回答时间:2016-1-21 17:29:43
a0a.1 32b0c
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 Configuration
1. 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[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类型数据运算会出问题。
系统栈大小分配:
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 Configuration
1.
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[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类型数据运算会出问题。
系统栈大小分配:
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)); /* 任务栈大小,单位字节数 */
}
复制代码
赞
0
评论
回复
支持
反对
baiyongbin2009
回答时间:2016-1-21 17:30:29
a0a.1 32b0c
续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);
}
}
复制代码
赞
1
评论
回复
支持
1
反对
0
baiyongbin2009
回答时间:2016-1-21 17:31:04
a0a.1 32b0c
7.12 总结
任务管理中涉及到的API是RTX的基本操作函数,初学者要熟练的掌握,另外任务栈和系统栈也要随着后面的学习搞清楚。
赞
0
评论
回复
支持
反对
dsjsjf
回答时间:2016-1-21 19:04:46
a0a.1 32b0c
学习
赞
0
评论
回复
支持
反对
湉湉
回答时间:2016-1-23 13:45:29
a0a.1 32b0c
好东西 谢谢分享
此教程是一个系列的吧,最好有个帖子罗列下不同的章节 现在不知道去哪里找第1 ,2 ,3, 4。。。等章
赞
0
评论
回复
支持
反对
电子技术2014
回答时间:2016-1-23 13:49:58
a1024a.1 32b0c
赞
0
评论
回复
支持
反对
watershade
回答时间:2016-2-18 17:36:40
a0a.1 32b0c
今天又从阁下哪里学到了很多,谢谢
赞
0
评论
回复
支持
反对
0830arthur
回答时间:2018-3-14 11:06:37
a0a.1 32b0c
学习
thanks,
赞
0
评论
回复
支持
反对
1
2
/ 2 页
所属标签
相似问题
关于意法半导体
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
招聘信息
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
关注我们
微信公众号
手机版
快速回复
返回顶部
返回列表
7.11.1 STM32F103开发板实验
7.11.2 STM32F407开发板实验
续7.11.2
此教程是一个系列的吧,最好有个帖子罗列下不同的章节 现在不知道去哪里找第1 ,2 ,3, 4。。。等章
thanks,