基于正点原子FreeRTOS学习笔记——时间片调度实验

目录

一、时间片调度介绍

二、实验演示

1、宏修改

1.1、滴答定时器宏

1.2、调度器宏

2、实验程序

2.1.1、任务1,任务2不加临界区程序

2.1.2 实验现象

2.2.1、任务1,任务2加临界区程序

 2.2.2 实验现象


一、时间片调度介绍

时间片:同等优先级任务轮流地享有相同的CPU时间

在FreeRTOS中,一个时间片等于SysTick中断周期。如果需要修改时间片时间长短,就要修改滴答定时器中断频率。

如果任务提前结束,直接进行下一个任务,没有用完的时间不会在使用,无论是下一个任务还是本任务再次执行都按一个时间片节拍运行。

运行过程:

1、Task1运行完一个时间片后,切换到Task2运行

2、Task2运行完一个时间片后,切换到Task3运行

3、Task3运行过程中,Task3阻塞了(系统延时或等待信号量等),此时直接切换到下一个任务

二、实验演示

1、宏修改

1.1、滴答定时器宏

#define configTICK_RATE_HZ      20      /* 定义系统时钟节拍频率, 单位: Hz, 无默认需定义 */

实验要求一个时间片是50ms,则设置为20Hz

1.2、调度器宏

#define configUSE_PREEMPTION     1     /* 1: 抢占式调度器, 0: 协程式调度器, 无默认需定义 */

#define configUSE_TIME_SLICING     1    /* 1: 使能时间片调度, 默认: 1 */

都设置为1

2、实验程序

2.1.1、任务1,任务2不加临界区程序

/******************************************************************************************************/
/*FreeRTOS配置*//* START_TASK 任务 配置* 包括: 任务句柄 任务优先级 堆栈大小 创建任务*/
#define START_TASK_STACK_SIZE 128
#define START_TASK_PRIO       1
TaskHandle_t start_task_handler;void start_task( void * pvParameters );#define TASK1_STACK_SIZE 128
#define TASK1_PRIO       2
TaskHandle_t task1_handler;
void task1( void * pvParameters );#define TASK2_STACK_SIZE 128
#define TASK2_PRIO       2
TaskHandle_t task2_handler;
void task2( void * pvParameters );
/******************************************************************************************************//*** @brief       FreeRTOS例程入口函数* @param       无* @retval      无*/
void freertos_demo(void)
{xTaskCreate( (TaskFunction_t        ) start_task,(char *                ) "start_task",(configSTACK_DEPTH_TYPE) START_TASK_STACK_SIZE,(void *                ) NULL,(UBaseType_t           ) START_TASK_PRIO,(TaskHandle_t *        ) &start_task_handler );vTaskStartScheduler();
}void start_task( void * pvParameters )
{taskENTER_CRITICAL();/*进入临界区*/xTaskCreate( (TaskFunction_t        ) task1,(char *                ) "task1",(configSTACK_DEPTH_TYPE) TASK1_STACK_SIZE,(void *                ) NULL,(UBaseType_t           ) TASK1_PRIO,(TaskHandle_t *        ) &task1_handler );xTaskCreate( (TaskFunction_t        ) task2,(char *                ) "task2",(configSTACK_DEPTH_TYPE) TASK2_STACK_SIZE,(void *                ) NULL,(UBaseType_t           ) TASK2_PRIO,(TaskHandle_t *        ) &task2_handler );						 vTaskDelete(NULL);taskEXIT_CRITICAL(); 		/*退出临界区*/				 
}void task1( void * pvParameters )
{uint32_t task1_num = 0;while(1){printf("task1运行次数:%d\r\n",++task1_num);delay_ms(10);//FreeRTOS的延迟函数会将任务挂载到阻塞列表,导致任务提前结束//而delay_ms()只会死等		}
}void task2( void * pvParameters )
{uint32_t task2_num = 0;while(1){printf("task2运行次数:%d\r\n",++task2_num);delay_ms(10);		}}

2.1.2 实验现象

打印出运行次数,但是会出现打印的不完整。因为本次任务未执行完,调度器切换到下一个任务

2.2.1、任务1,任务2加临界区程序

/******************************************************************************************************/
/*FreeRTOS配置*//* START_TASK 任务 配置* 包括: 任务句柄 任务优先级 堆栈大小 创建任务*/
#define START_TASK_STACK_SIZE 128
#define START_TASK_PRIO       1
TaskHandle_t start_task_handler;void start_task( void * pvParameters );#define TASK1_STACK_SIZE 128
#define TASK1_PRIO       2
TaskHandle_t task1_handler;
void task1( void * pvParameters );#define TASK2_STACK_SIZE 128
#define TASK2_PRIO       2
TaskHandle_t task2_handler;
void task2( void * pvParameters );
/******************************************************************************************************//*** @brief       FreeRTOS例程入口函数* @param       无* @retval      无*/
void freertos_demo(void)
{xTaskCreate( (TaskFunction_t        ) start_task,(char *                ) "start_task",(configSTACK_DEPTH_TYPE) START_TASK_STACK_SIZE,(void *                ) NULL,(UBaseType_t           ) START_TASK_PRIO,(TaskHandle_t *        ) &start_task_handler );vTaskStartScheduler();
}void start_task( void * pvParameters )
{taskENTER_CRITICAL();/*进入临界区*/xTaskCreate( (TaskFunction_t        ) task1,(char *                ) "task1",(configSTACK_DEPTH_TYPE) TASK1_STACK_SIZE,(void *                ) NULL,(UBaseType_t           ) TASK1_PRIO,(TaskHandle_t *        ) &task1_handler );xTaskCreate( (TaskFunction_t        ) task2,(char *                ) "task2",(configSTACK_DEPTH_TYPE) TASK2_STACK_SIZE,(void *                ) NULL,(UBaseType_t           ) TASK2_PRIO,(TaskHandle_t *        ) &task2_handler );						 vTaskDelete(NULL);taskEXIT_CRITICAL(); 		/*退出临界区*/				 
}void task1( void * pvParameters )
{uint32_t task1_num = 0;while(1){taskENTER_CRITICAL();/*进入临界区*/printf("task1运行次数:%d\r\n",++task1_num);delay_ms(10);//FreeRTOS的延迟函数会将任务挂载到阻塞列表,导致任务提前结束//而delay_ms()只会死等taskEXIT_CRITICAL(); 		/*退出临界区*/			}
}void task2( void * pvParameters )
{uint32_t task2_num = 0;while(1){taskENTER_CRITICAL();/*进入临界区*/printf("task2运行次数:%d\r\n",++task2_num);delay_ms(10);taskEXIT_CRITICAL(); 		/*退出临界区*/			}}

 2.2.2 实验现象

可以看到由于临界区保护,都打印出了完整的信息

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/39523.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Java集合类】ArrayList

方法 subList(int fromIndex, int toIndex) 可以看一下subList源码片段 public List<E> subList(int fromIndex, int toIndex) {subListRangeCheck(fromIndex, toIndex, size);return new SubList<>(this, fromIndex, toIndex);} private static class SubList…

Power BI可视化表格矩阵如何保持样式导出数据?

故事背景&#xff1a; 有朋友留言询问&#xff1a;自己从Power BI可视化矩阵表格中导出数据时&#xff0c;导出的表格样式会发生改变&#xff0c;需要线下再手动调整&#xff0c;重新进行透视组合成自己想要的格式。 有没有什么办法让表格导出来跟可视化一样&#xff1f; Po…

解析Kotlin中的内联函数,inline、noinline、crossinline【笔记摘要】

用编译时常量的概念&#xff0c;引出本文要讲内联函数inline&#xff1a; 1.编译时常量 Java的编译时常量 Compile-time Constant 它有四个要求&#xff1a;1.这个变量需要是 final 的  2.类型只能是字符串或者基本类型  3.这个变量需要在声明的时候就赋值  4.等号右边…

git提交实战

以新项目为例&#xff0c;如何在新项目新分支提交代码。 1.查看文件所在位置 git init 2.克隆项目到本地并完成身份配置 3.将需要新增的文件放到指定目录路径下 4.进入新克隆的文件 cd XXX 5.切换分支 git checkout XXX 6.标红者即为新提交的文件 git status 7.加入 git …

Java_多线程:线程池

1、线程池优点&#xff1a; 降低资源消耗&#xff1a;通过重复利用已创建的线程降低线程创建和销毁造成的消耗。提高响应速度&#xff1a;当任务到达时&#xff0c;任务可以不需要等到线程创建就能立即执行。提高线程的可管理性&#xff1a;线程是稀缺资源&#xff0c;如果无限…

泰雷茲具有首个通过FIPS 140-3 三级认证的HSMs

泰雷兹LunaHsm是业界首款通过FIPS140-33级认证的解决方案&#xff0c;安策引进泰雷兹HSM产品可以帮助您满足您的数据安全合规性需求&#xff0c;阻力企业提高竞争力。 安策提供泰雷茲ThalesLunaHSMs成为首个通过FIPS140-3三级认证的硬件安全模块图 我们很高兴地宣布&#xff0c…

面试题 1:阐述Python:except的用法和作用?

欢迎莅临我的博客 &#x1f49d;&#x1f49d;&#x1f49d;&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

微软关闭中国所有线下店,并不影响全球第一

​关注卢松松&#xff0c;会经常给你分享一些我的经验和观点。 微软没有被时代淘汰&#xff0c;时代也没有告别微软!中国市场对微软可有可无&#xff0c;即便没有中国市场&#xff0c;微软市值也在全球前三&#xff0c;这是事实!a 5月中旬&#xff0c;微软azure解散中国分部…

mindspore打卡机器学习正则化与优化器

机器学习正则化 这段代码实现了一个深度学习实验&#xff0c;目的是使用不同的正则化技术&#xff08;包括dropout、批量归一化、L2正则化以及早期停止策略&#xff09;来训练神经网络模型&#xff0c;以拟合一个带有噪声的余弦波形数据集。代码使用MindSpore框架进行编写&…

分享六款免费u盘数据恢复工具,U盘恢复工具集合【工具篇】

U盘里面的数据丢失了怎么找回&#xff1f;随着数字化时代的深入发展&#xff0c;U盘已成为我们日常生活中不可或缺的数据存储工具。然而&#xff0c;由于各种原因&#xff0c;如误删除、格式化、病毒攻击等&#xff0c;U盘中的数据可能会丢失&#xff0c;给用户带来极大的困扰。…

加装德国进口高精度主轴 智能手机壳「高质量高效率」钻孔铣槽

在当前高度智能化的社会背景下&#xff0c;智能手机早已成为人们生活、工作的必备品&#xff0c;智能手机壳作市场需求量巨大。智能手机壳的加工过程涉及多个环节&#xff0c;包括钻孔和铣槽等。钻孔要求精度高、孔位准确&#xff0c;而铣槽则需要保证槽位规整、深度适宜。这些…

IDEA中SpringBoot项目数据库连接加密方法

1. maven添加相应版本的依赖 这里注意&#xff0c;不能使用太新的版本&#xff0c;本人开发环境使用3.0.3版本时&#xff0c;报以下错误&#xff0c;使用2.1.2时报错消失。 *************************** APPLICATION FAILED TO START ***************************Description:…

【Ubuntu】Ubuntu系统的127.0.1.1有什么用

参考Debian参考手册,Debian/Ubuntu系统下/etc/hosts内定义的127.0.1.1 IP为本机回环地址。 对于有静态IP地址的系统,应用静态IP替代这里的127.0.1.1. Debian参考手册部分截取: 5.1.1. 主机名解析 主机名解析,目前也是由 NSS (名字服务转换 Name Service Switch) 机制来支…

Yarn Scripts自动化:高效运行JavaScript任务的指南

引言 Yarn是一个现代的包管理工具&#xff0c;它不仅提供了快速可靠的包安装机制&#xff0c;还内置了一个强大的脚本运行工具。通过Yarn的脚本功能&#xff0c;开发者可以自动化执行各种任务&#xff0c;如测试、构建、清理等。本文将详细介绍如何使用Yarn的脚本运行工具来提…

Python容器 之 字典--字典的常用操作方法

1.增加和修改 字典[键] 值 键 存在, 修改 键 不存在, 添加 # 定义非空字典, 姓名, 年龄, 身高, 性别 my_dict {"name": "小明", "age": 18, "height": 1.78, "isMen": True} print(my_dict) # {name: 小明, age: 18, h…

基于Hadoop平台的电信客服数据的处理与分析③项目开发:搭建基于Hadoop的全分布式集群---任务4:安装并配置JDK

任务描述 Hadoop 2.8需要JDK 1.6及以上版本的JDK&#xff0c;建议安装JDK 1.8&#xff0c;如果Cent OS是最小化安装&#xff0c;可能没有Open JDK&#xff0c;即使已经安装过Open JDK也可以使用JDK 1.8替换系统自带的Open JDK。 任务的内容为检查各个节点的JDK的安装情况&…

企业如何管理安全生产工作?(附模板)

总结一下在企业内管理安全中遇到的一些问题&#xff1a; 1、 管理方式落后&#xff0c;还在使用纸质记录 2、 人员信息杂乱无章&#xff0c;无人整理 3、出现问题找不到源头和负责人 我做系统管理已经7年了&#xff0c;题主说的这些问题我之前也遇到过&#xff0c;相信也有…

API接口测试/Swgger-ui未授权访问

目录 API接口 接口文档 接口测试的方法 单流程 多流程 Swgger-ui未授权访问 在之间的一次面试中面试官问到了API接口测试&#xff0c;我回答的不好&#xff0c;因为自己确实不太会&#xff0c;后面才下去学习了&#xff0c;这里复习和练习一下 API接口 API&#xff08;…

自下而上的选股与自上而下的选股

一起学习了《战胜华尔街》&#xff0c;不知道大家有没有这么一种感受&#xff1a;林奇的选股方法是典型的自下而上的选股方法。虽然这一点没有单独拎出来讨论过&#xff0c;但在《从低迷中寻找卓越》《如何通过财务指标筛选股票&#xff1f;》《边逛街边选股&#xff1f;》《好…

拓扑学习系列(6)pq环面结实与卫星结实

(p, q)-torus knots (p, q)-torus knots 是一类特殊的结实&#xff0c;它们可以通过在环面&#xff08;torus&#xff09;上进行 p 次纵向绕线和 q 次横向绕线来构造。Trichotomy 是指将 (p, q)-torus knots 分为三类&#xff1a;可解的&#xff08;solvable&#xff09;、非可…