完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
转rtx操作系统本章教程为大家将介绍RTX操作系统支持的任务调度方式,抢占式,时间片和合作式,这部分算是RTX操作系统的核心了。对于初学者来说,要一下子就能够理解这些比较困难些,需要多花些时间把这些基本概念搞清楚,然后阅读下源码,深入理解实现方法。
本章教程配套的例子含Cortex-M3内核的STM32F103和Cortex-M4内核的STM32F407。 10.1 RTX支持的调度方式 10.2 什么是调度器 10.3 抢占式调度器 10.4 时间片调度器 10.5 合作式调度器 10.6 时间片调度器实验例程说明 10.7 合作式调度器实验例程说明 10.8 总结 10.1 RTX支持的调度方式 RTX操作系统支持三种调度方式: u 抢占式调度 每个任务都有不同的优先级,任务会一直运行直到被高优先级任务抢占或者遇到阻塞式的API函数,比如os_dly_wait。 u 时间片调度 每个任务都有相同的优先级,任务会运行固定的时间片个数直到遇到系统阻塞式的API函数,比如os_dly_wait。 u 合作式调度 每个任务都有相同的优先级,而且时间片调度要被禁止。任务会一直的运行直到遇到阻塞式的API函数,比如os_dly_wait或者用户调用函数os_tsk_pass。 对于RTX操作系统而言,实际应用主要是抢占式调度和时间片调度,合作式调度用到的很少。 |
|
|
相关推荐
|
|
|
10.6.2 STM32F407开发板实验
配套例子: V5-405_RTX实验_时间片调度 实验目的: 1. 本实验主要学习RTX的时间片调度 实验内容: 1. K1按键按下,串口打印。 2. 本实验将任务AppTaskLED和AppTaskMsgPro的优先级都设置为2,同优先级的任务才会用到时间片调度。 3. 时间片调度的使能和每个任务时间片的大小在文件RTX_Conf_CM.c文件里面 #define OS_ROBIN 1 //使能时间片调度 #define OS_ROBINTOUT 5 //设置每个同优先级任务的时间片大小。 4. 各个任务实现的功能如下: AppTaskUserIF任务 :按键消息处理。 AppTaskLED任务 :LED闪烁。 AppTaskMsgPro任务 :消息处理,这里用作LED闪烁。 AppTaskStart任务 :启动任务,也是最高优先级任务,这里实现按键扫描。 |
|
|
|
|
|
|
|
|
RTX配置:
RTX配置向导详情如下: u Task Configuration l Number of concurrent running tasks 允许创建4个任务,实际创建了如下四个任务 AppTaskUserIF任务 :按键消息处理。 AppTaskLED任务 :LED闪烁。 AppTaskMsgPro任务 :消息处理,这里是用作LED闪烁。 AppTaskStart任务 :启动任务,也是最高优先级任务,这里实现按键扫描。 l Number of tasks with user-provided stack 创建的4个任务都是采用自定义堆栈方式。 l Round-Robin Task switching 使能时间片调度 l Round-Robin Timeout [ticks] 范围1 – 1000。 设置同优先级任务的时间片是5个系统时间节拍。 |
|
|
|
|
|
|
|
|
程序设计:
u 任务栈大小分配: 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类型数据运算会出问题。 u 系统栈大小分配: |
|
|
|
|
|
|
|
|
RTX初始化:
复制代码 /* ********************************************************************************************************* * 函 数 名: main * 功能说明: 标准c程序入口。 * 形 参: 无 * 返 回 值: 无 ********************************************************************************************************* */ int main (void) { /* 初始化外设 */ bsp_Init(); /* 创建启动任务 */ os_sys_init_user (AppTaskStart, /* 任务函数 */ 4, /* 任务优先级 */ &AppTaskStartStk, /* 任务栈 */ sizeof(AppTaskStartStk)); /* 任务栈大小,单位字节数 */ while(1); } |
|
|
|
|
|
|
|
|
10.7 合作式调度器实验例程说明
10.7.1 STM32F103开发板实验 配套例子: V4-406_RTX实验_合作式调度 实验目的: 1. 本实验主要学习RTX的合作式调度 实验内容: 1. K1按键按下,串口打印。 2. 本实验将任务AppTaskLED和AppTaskMsgPro的优先级都设置为2,同优先级的任务才会用到合作式调度。 3. 使用合作式调度的话,用户必须在RTX操作系统的配置向导文件RTX_Conf_CM.c中禁止时间片调度: #define OS_ROBIN 0 //禁止时间片调度 4. 各个任务实现的功能如下: AppTaskUserIF任务 :按键消息处理。 AppTaskLED任务 :LED闪烁。 AppTaskMsgPro任务 :消息处理,这里用作LED闪烁。 AppTaskStart任务 :启动任务,也是最高优先级任务,这里实现按键扫描。 |
|
|
|
|
|
|
|
|
RTX配置:
RTX配置向导详情如下: u Task Configuration l Number of concurrent running tasks 允许创建4个任务,实际创建了如下四个任务 AppTaskUserIF任务 :按键消息处理。 AppTaskLED任务 :LED闪烁。 AppTaskMsgPro任务 :消息处理,这里是用作LED闪烁。 AppTaskStart任务 :启动任务,也是最高优先级任务,这里实现按键扫描。 l Number of tasks with user-provided stack 创建的4个任务都是采用自定义堆栈方式。 l Round-Robin Task switching 使用合作式调度必须禁止时间片调度,切记。 |
|
|
|
|
|
|
|
|
程序设计:
u 任务栈大小分配: 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类型数据运算会出问题。 u 系统栈大小分配: |
|
|
|
|
|
|
|
|
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, /* 任务函数 */ 2, /* 任务优先级 */ &AppTaskMsgProStk, /* 任务栈 */ sizeof(AppTaskMsgProStk)); /* 任务栈大小,单位字节数 */ } |
|
|
|
|
|
|
|
|
10.7.2 STM32F407开发板实验
配套例子: V5-406_RTX实验_合作式调度 实验目的: 1. 本实验主要学习RTX的合作式调度 实验内容: 1. K1按键按下,串口打印。 2. 本实验将任务AppTaskLED和AppTaskMsgPro的优先级都设置为2,同优先级的任务才会用到合作式调度。 3. 使用合作式调度的话,用户必须在RTX操作系统的配置向导文件RTX_Conf_CM.c中禁止时间片调度: #define OS_ROBIN 0 //禁止时间片调度 4. 各个任务实现的功能如下: AppTaskUserIF任务 :按键消息处理。 AppTaskLED任务 :LED闪烁。 AppTaskMsgPro任务 :消息处理,这里用作LED闪烁。 AppTaskStart任务 :启动任务,也是最高优先级任务,这里实现按键扫描。 |
|
|
|
|
|
|
|
|
RTX配置:
RTX配置向导详情如下: u Task Configuration l Number of concurrent running tasks 允许创建4个任务,实际创建了如下四个任务 AppTaskUserIF任务 :按键消息处理。 AppTaskLED任务 :LED闪烁。 AppTaskMsgPro任务 :消息处理,这里是用作LED闪烁。 AppTaskStart任务 :启动任务,也是最高优先级任务,这里实现按键扫描。 l Number of tasks with user-provided stack 创建的4个任务都是采用自定义堆栈方式。 l Round-Robin Task switching 使用合作式调度必须禁止时间片调度,切记。 |
|
|
|
|
|
|
|
|
程序设计:
u 任务栈大小分配: 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类型数据运算会出问题。 u 系统栈大小分配: |
|
|
|
|
|
|
|
|
RTX初始化:
复制代码 /* ********************************************************************************************************* * 函 数 名: main * 功能说明: 标准c程序入口。 * 形 参: 无 * 返 回 值: 无 ********************************************************************************************************* */ int main (void) { /* 初始化外设 */ bsp_Init(); /* 创建启动任务 */ os_sys_init_user (AppTaskStart, /* 任务函数 */ 4, /* 任务优先级 */ &AppTaskStartStk, /* 任务栈 */ sizeof(AppTaskStartStk)); /* 任务栈大小,单位字节数 */ while(1); } |
|
|
|
|
|
|
|
|
10.8 总结
本章节是RTX操作系统的核心,初学者要深入理解的话要多花些时间。当然,如果有其它RTOS的基础的话,这个学起来也是很快的。 |
|
|
|
|
|
|
|
265 浏览 0 评论
【原创】【RA4M2-SENSOR开发板评测】低功耗+USB综合测试
789 浏览 0 评论
1306 浏览 2 评论
787 浏览 0 评论
【RA4M2-SENSOR开发板评测】Analogue+Timers综合测试
1587 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
16899 浏览 31 评论
/9
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2025-12-1 19:29 , Processed in 0.953684 second(s), Total 73, Slave 64 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191

淘帖