基于正点原子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.mfbz.cn/a/766548.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Golang中defer和return顺序

在Golang中,defer 和 return 的执行顺序是一个重要的特性,它们的执行顺序如下: return语句不是一条单独的语句,实际上,它是由赋值和返回两部分组成的。赋值步骤会先执行,这一步会计算return语句中的表达式…

【后端面试题】【中间件】【NoSQL】MongoDB的配置服务器、复制机制、写入语义和面试准备

MongoDB的配置服务器 引入了分片机制之后,MongoDB启用了配置服务器(config server) 来存储元数据,这些元数据包括分片信息、权限控制信息,用来控制分布式锁。其中分片信息还会被负责执行查询mongos使用。 MongoDB的配置服务器有一个很大的优…

【C语言】const 关键字

在C语言中,const关键字用于定义常量,使得变量的值在其声明之后无法被修改。这可以帮助防止意外修改数据,提高代码的安全性和可读性。以下是有关const关键字的一些详细说明: 基本用法 const int max_value 100;在这个例子中&…

Zynq系列FPGA实现SDI视频编解码+图像缩放,基于GTX高速接口,提供4套工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐本博已有的 SDI 编解码方案本博已有的FPGA图像缩放方案本方案的无缩放应用本方案在Xilinx--Kintex系列FPGA上的应用 3、详细设计方案设计原理框图SDI 输入设备Gv8601a 均衡器GTX 解串与串化SMPTE SD/HD/3G SDI IP核BT1120转RGB纯V…

FastApi中的常见请求类型

FastApi中的常见请求类型 后端开发语言中,我钟情于node,高效的异步处理真是让我眼前一亮,同时,简单易懂的语法也让我非常倾心 但是但是,因为考虑要写一个深度学习算法的后端接口,所以不得不选用python作为…

容器安全:等保合规性的基石

随着云计算和微服务架构的蓬勃发展,容器技术已经成为现代IT基础设施不可或缺的一部分。在网络安全等级保护制度(等保)的框架下,容器安全的要求日益凸显,成为等保合规性的基石。本文将深入探讨容器安全在等保中的重要性…

nginx的配置文件

nginx.conf 1、全局模块 worker_processes 1; 工作进程数,设置成服务器内核数的2倍(一般不超过8个,超过8个反正会降低性能,4个 1-2个 ) 处理进程的过程必然涉及配置文件和展示页面,也就是涉及打开文件的…

让围绕数据库构建大模型应用更简单方便--DB-GPT

DB-GPT的目的是构建大模型领域的基础设施,通过开发多模型管理(SMMF)、Text2SQL效果优化、RAG框架以及优化、Multi-Agents框架协作、AWEL(智能体工作流编排)等多种技术能力,让围绕数据库构建大模型应用更简单,更方便。 1 处理流程 DB-GPT系…

问题集锦1

01.inner中使用JwtTokenUtil.getUserCode() 前端调用上传(java),上传使用加购 Overridepublic Boolean insertShoppingCart(InsertShoppingCartParamsDto dto) {// 通过userCode,itemCode和supplierCode来判断当前加购人添加到购物车的商品是…

美术馆预约小程序的设计

管理员账户功能包括:系统首页,个人中心,展品信息管理,管理员管理,用户管理,美术馆管理,基础数据管理,论坛管理 微信端账号功能包括:系统首页,美术馆&#xff…

工业路由器与家用路由器的区别

在现代网络环境中,路由器扮演着至关重要的角色。无论是在家庭网络还是在工业网络,选择合适的路由器都至关重要。本文将从多个角度,对工业路由器与家用路由器进行详细比较,帮助您更好地理解二者的区别。 1、安全性 工业路由器&…

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

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

背景图的动效,非常的炫酷,非一般的感觉。

我们都知道在一些展示型项目中,背景图加上动效后,可以立马让整个设计档次提升了,这次带来了一批背景图的动效图,大家看一下。

震惊!张宇强化36讲1200页,暑期强化高效利用指南!

特别喜欢张宇老师的讲课风格 如果你打算跟张宇老师,那么基础——>强化——>冲刺,你应该这么买书! 张宇老师25版课程大改版,其中,36讲的变动是最大的,张宇老师25版课程把以往的强化课程前移&#xff0…

基于多视点编码光场的全景三维重建方法

欢迎关注GZH《光场视觉》 摘要:在基于光场的一系列应用中,目标的三维重建是基础且关键的任务。普通光场只能重建单一视角而无法重建全景,并且在纹理特征匮乏的区域也无法生成准确的三维信息。针对以上问题,提出一种基于多视点编码…

视频字幕提取在线工具有哪些?总结5个字幕提取工具

平时在沉浸式追剧的时候,我们常常都会被影视剧中的各种金句爆梗而逗得开怀大笑~而真正要用到时候却总是一片头脑空白。其实要记住它们最好的办法便是将其提取留档下来,每次有需要的时候打开就能一下子回顾到~ 今天就来带大家盘一盘视频字幕提取的软件好…

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

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

端口聚合基础知识

一、什么是端口聚合 端口聚合是将多个物理端口捆绑在一起,形成一个逻辑链路,以实现带宽增加、提高冗余和负载均衡的技术。端口聚合,也称为以太通道(Ethernet Channel),主要用于交换机之间的连接。在具有多…

困在流量里的“平替国货”

“不是xx买不起,而是xx更有性价比。” 现在很多年轻消费者都把这句话挂在嘴边。比如,“不是羽绒服买不起,而是军大衣更有性价比”“不是洋货买不起,而是国货更有性价比”。 你可以说他们不愿意再当冤大头,偏爱价格更…

3d模型材质吸不了什么原因?怎么解决?---模大狮模型网

3D模型无法吸取材质可能有以下原因: 文件格式不支持:某些文件格式(如STL)不支持嵌入材质信息,因此在导入此类文件后,需要手动为模型添加材质。 材质链接错误:如果模型文件中嵌入了材质信息,但是链接错误&a…