FreeRTOS学习笔记-基于stm32(6)时间片调度实验

1、什么是时间片调度

        在任务优先级相同的时候,CPU会轮流使用相同的时间去执行它,即时间片调度。这个相同的时间就是时间片。而时间片的大小就是SysTick的中断周期(SysTick的中断周期可以修改)

        比如有三个相同优先级的任务在运行,时间片大小为10ms。那么CPU前10ms执行task1,然后用10ms执行task2,再花10ms执行task3,再回到task1执行10ms,这样的轮流执行被称之为时间片流转。如果期间有一个任务执行到一半被挂载了,那么CPU就会立马抛弃这个任务执行下一个任务。

2、时间片调度实验

        代码内容为:将时间片设置为50ms,然后创建task1和task2来不断在串口打印他们的运行次数。

步骤1:

        要想使用时间片必须先将这两个宏置1,这两个宏在 FreeRTOSConfig.h 中;

#define configUSE_PREEMPTION		1           //1使用抢占式内核,0使用协程
#define configUSE_TIME_SLICING		1			//1使能时间片调度(默认式使能的)

步骤2:

        在 FreeRTOSConfig.h 中找到此宏,修改1000为20;因为1000hz对应的 SysTick 中断周期即时间片大小是1ms。我们要改为50ms,就应该将1000hz / 50 = 20hz;

#define configTICK_RATE_HZ	   	(20)      //时钟节拍频率,这里设置为1000,周期就是1ms

步骤3:

        创建任务:

        需要注意的是:

        1、我们使用的是delay_ms(10)而不是vTaskDelay(10),因为后者会挂载当前任务转而执行另一个任务,这样就起不到50ms流转的效果了。而10ms的延时会让CPU停止工作。所以我们每50ms进行一次任务切换,然后每执行一次任务会延时10ms,所以每次任务中按理应该执行5遍while循环。又因为 printf 比较耗时,再加上其他代码的执行,实际每次任务while循环会执行4~5次

        2、因为实际每次任务while循环会执行4~5次,所以有时候在串口打印数据打印一半就可能会产生任务切换执行另一个任务,然后导致串口打印出现问题。所以我们在每次串口打印的时候加上临界段保护

/*START_TASK任务配置*/
#define START_TASK_PRIO         1
#define START_TASK_STACK_SIZE   128     //128字=128*4字节
TaskHandle_t start_task_handler;
void start_task( void * pvParameters );

/*TASK1任务配置*/
#define TASK1_PRIO         2
#define TASK1_STACK_SIZE   128     //128字=128*4字节
TaskHandle_t task1_handler;
void task1( void * pvParameters );

/*TASK2任务配置*/
#define TASK2_PRIO         2
#define TASK2_STACK_SIZE   128     //128字=128*4字节
TaskHandle_t task2_handler;
void task2( void * pvParameters );

/*入口函数*/
void freertos_demo(void)
{
    xTaskCreate(	(TaskFunction_t )    start_task,                //任务函数
                    (char *         )    "start_task",              //任务名称
                    (uint16_t       )    START_TASK_STACK_SIZE,     //任务堆栈大小
                    (void *         )    NULL,                      //传递给任务函数的参数
                    (UBaseType_t    )    START_TASK_PRIO,           //任务优先级
                    (TaskHandle_t * )    &start_task_handler );     //任务句柄 
    vTaskStartScheduler();         //开启任务调度器
}

void start_task( void * pvParameters )
{
    taskENTER_CRITICAL();       //进入临界区
    printf("start_task正在运行\r\n");
    xTaskCreate(	(TaskFunction_t )    task1,                //任务函数
                    (char *         )    "task1",              //任务名称
                    (uint16_t       )    TASK1_STACK_SIZE,     //任务堆栈大小
                    (void *         )    NULL,                 //传递给任务函数的参数
                    (UBaseType_t    )    TASK1_PRIO,           //任务优先级
                    (TaskHandle_t * )    &task1_handler );     //任务句柄
                    
    xTaskCreate(	(TaskFunction_t )    task2,                //任务函数
                    (char *         )    "task2",              //任务名称
                    (uint16_t       )    TASK2_STACK_SIZE,     //任务堆栈大小
                    (void *         )    NULL,                 //传递给任务函数的参数
                    (UBaseType_t    )    TASK2_PRIO,           //任务优先级
                    (TaskHandle_t * )    &task2_handler );     //任务句柄
    vTaskDelete(NULL);      //vTaskDelete(start_task_handler);
    taskEXIT_CRITICAL();        //退出临界区
}

void task1( void * pvParameters )
{
	uint32_t task1_num=0;
    while(1)
    {
		taskENTER_CRITICAL();       //进入临界区
		printf("task1的运行次数 = %d\r\n",++task1_num);
		taskEXIT_CRITICAL();        //退出临界区
        delay_ms(10);
    }
}

void task2( void * pvParameters )
{
	uint32_t task2_num=0;
    while(1)
    {
		taskENTER_CRITICAL();       //进入临界区
		printf("task2的运行次数 = %d\r\n",++task2_num);
		taskEXIT_CRITICAL();        //退出临界区
        delay_ms(10);
    }
}

3、运行结果

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

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

相关文章

一张贴纸50万,炒房炒币的怎么都来炒CSGO皮肤了

一张贴纸50万,为什么炒房炒币的都来炒CSGO饰品了? 一张贴纸50万,炒房炒币的怎么都来炒CSGO皮肤了? 经常有人问我,天天看你们买卖装备,买卖皮肤,说到底这都是虚拟产品,看得见摸不着的…

ue引擎游戏开发笔记(35)——为射击添加轨道,并显示落点

1.需求分析: 我们只添加了开枪特效,事实上并没有实际的效果产生例如弹痕,落点等等。所以逐步实现射击的完整化,先从实现落点开始。 2.操作实现: 1.思路:可以这样理解,每次射击的过程是一次由摄…

二层交换机与防火墙连通上网实验

防火墙是一种网络安全设备,用于监控和控制网络流量。它可以帮助防止未经授权的访问,保护网络免受攻击和恶意软件感染。防火墙可以根据预定义的规则过滤流量,例如允许或阻止特定IP地址或端口的流量。它也可以检测和阻止恶意软件、病毒和其他威…

Ansible-playbook剧本

目录 一、Ansible playbook简介 2.1 playbook格式 2.2 playbook组成部分 二、playbook示例 2.1 yaml文件编写 2.2 运行playbook 2.3 定义、引用变量 2.4 指定远程主机sudo切换用户 2.5 when条件判断 2.6 迭代 三、总结 Ansible中使用playbook脚本的作用和好处 一、A…

5月8日学习记录

_[FBCTF2019]RCEService(preg_match函数的绕过) 涉及知识点:preg_match函数绕过,json的格式,正则回溯 打开环境,要求用json的格式输入 搜索学习一下json的语法规则 数组(Array)用方括…

OpenMV 图像串口传输示例

注意:本程序根据 OpenMV采集图片通过串口发送,PC接收并保存为图片 更改。 一、例程说明 这个例程主要实现了以下功能: 1. OpenMV 端采集图像:使用OpenMV开发板上的摄像头采集实时图像数据。 2. 通过串口传输图像数据:将采集到的图像数据打包成字节流,…

智慧工地的5大系统是什么?SaaS化大型微服务架构(智慧工地云平台源码)可多端展示登录

智慧工地解决方案依托计算机技术、物联网、云计算、大数据、人工智能、VR&AR等技术相结合,为工程项目管理提供先进技术手段,构建工地现场智能监控和控制体系,弥补传统方法在监管中的缺陷,最终实现项目对人、机、料、法、环的全…

外企接受大龄程序员吗?

本人知乎账号同公众号:老胡聊Java,欢迎留言并咨询 亲身体会外企经历所见所闻,外企能接受大龄程序员。 1 大概是10年的时候,进一家知名外企,和我一起进的一位manager,后来听下来,年龄35&#xf…

html的标签

基础标签 标签描述<h1>-<h6>定义标题&#xff0c;h1最大&#xff0c;h6最小<font>定义文本的字体&#xff0c;字体尺寸&#xff0c;字体颜色<b>定义粗体文本<i>定义斜体文本<u>定义文本下划线<center>定义文本居中<p>定义段落…

俄罗斯国际消费类电子电器展ICEE:人潮如织,盛况空前

近日&#xff0c;备受全球瞩目的俄罗斯国际消费类电子电器展ICEE在莫斯科盛大落幕。本次展会为期四天&#xff0c;真的攒足了眼球&#xff0c;不仅俄罗斯这边的很多媒体和自媒体有报道&#xff0c;展会第一天&#xff0c;很多参展商通过短视频平台将展会的盛况传到了国内&#…

Ubuntu22.04下安装kafka_2.11-0.10.1.0并运行简单实例

目录 一、版本信息 二、安装Kafka 1.将Kafka安装包移到下载目录中 2.下载Spark并确保hadoop用户对Spark目录有操作权限 三、启动Kafka并测试Kafka是否正常工作 1.启动Kafka 2.测试Kafka是否正常工作 一、版本信息 虚拟机产品&#xff1a;VMware Workstation 17 Pro 虚…

AI PC,到底谁的梦想、谁的红利?

世界上第一台通用计算机是1946年诞生的埃尼阿克&#xff0c;世界上第一台便携电脑是1981年诞生的“奥斯本1号”&#xff0c;世界上第一部智能手机是1993年诞生的IBM Simon。 它们之间看起来毫无关系&#xff0c;但却暗含一种关于创新的微妙潜规则——随着时间推移&#xff0c;…

MM模块学习一(供应商创建,物料类型的定义及功能)

物料管理流程&#xff1a; 源头&#xff1a;采购需求->采购申请 MRP&#xff1a;物料需求计划。运行物料需求计划的结果&#xff0c;根据物料的性质来判断是外购&#xff08;采购申请&#xff09;或者是生产&#xff08;计划订单->生产订单&#xff09;。 采购申请&am…

acwing算法提高之数据结构--平衡树Treap

目录 1 介绍2 训练 1 介绍 本博客用来记录使用平衡树求解的题目。 插入、删除、查询操作的时间复杂度都是O(logN)。 动态维护一个有序序列。 2 训练 题目1&#xff1a;253普通平衡树 C代码如下&#xff0c; #include <cstdio> #include <cstring> #include …

Postgresql源码(128)深入分析JIT中的函数内联llvm_inline

相关 《Postgresql源码&#xff08;127&#xff09;投影ExecProject的表达式执行分析》 《LLVM的ThinLTO编译优化技术在Postgresql中的应用》 《LLVM&#xff08;5&#xff09;ORC实例分析》 1 JIT优化效果 create table t1(i int primary key, j int, k int); insert into t1…

嵌入式开发三:STM32初体验

本节主要向大家介绍如何开发过程中的基本操作&#xff0c;如编译、串口下载、仿真器下载、仿真调试程序&#xff0c;体验一下 STM32 的开发流程&#xff0c;并介绍 MDK5 的一些使用技巧&#xff0c;通过本节的学习&#xff0c;将对 STM32 的开发流程和 MDK5 使用有个大概了解&a…

Windows安全加固-账号与口令管理

在当今日益增长的网络安全威胁中&#xff0c;Windows系统的安全加固显得尤为重要。其中&#xff0c;账号与口令管理作为系统安全的第一道防线&#xff0c;其重要性不言而喻。本文将深入探讨Windows安全加固中的账号与口令管理策略&#xff0c;以确保系统的安全性和稳定性。 账…

认识大模型提示词

一、写作助理 &#x1f4a5;最常使用的 prompt&#xff0c;用于优化文本的语法、清晰度和简洁度&#xff0c;提高可读性。 输入&#xff1a;作为一名写作改进助理&#xff0c;你的任务是改进所提供文本的拼写、语法、清晰、简洁和整体可读性&#xff0c;同时分解长句&#xff…

运行SpringBoot项目失败?异常显示Can‘t load IA 32-bit .dll on a AMD 64-bit platform,让我来看看~

原因是&#xff0c;我放入jdk的bin文件夹下的tcnative-1.dll文件是32位的&#xff0c;那么肯定是无法在AMD 64位平台上加载IA 32位.dll。但是网站上给出的都是32位呀&#xff0c;没有64位怎么办&#xff1a; 其实当我们把“tomcat-native-1.2.34-openssl-1.1.1o-win32-bin.zip”…

项目管理-项目资源管理2/2

项目管理&#xff1a;每天进步一点点~ 活到老&#xff0c;学到老 ヾ(◍∇◍)&#xff89;&#xff9e; 何时学习都不晚&#xff0c;加油 资源管理&#xff1a;6个过程“硅谷火箭管控” ①规划资源管理&#xff1a; 写计划 ②估算活动资源&#xff1a;估算团队资源&…
最新文章