FreeRTOS的学习

1.创建函数和删除

  1. 动态创建为FreeRTOS分配的堆栈(方便),而静态创建为人为分配空间。动态应用多
  2. 任务中必须有while(1)否则只会执行一次
  3. 任务中的延时要用         vTaskDelay(500); 延时期间执行其它任务
    1. 任务中的延时使用的是软件延时,即还是让CPU等待来达到延时的效果。使用RTOS的优势就是能充分发挥CPU的性能,永远不让它闲着。任务如果需要延时,也就不能再让CPU空等来实现延时的效果。RTOS中的延时叫作阻塞延时,即任务需要延时时,会放弃CPU的使用权,CPU可以去做其他的事情,当任务延时时间到,重新获取CPU使用权,任务继续运行,这样就充分地利用了CPU的资源,而不是空等
      当任务需要延时而进入阻塞状态时,那CPU在做什么?如果没有其他任务可以运行,RTOS都会为CPU创建一个空闲任务,这个时候CPU就运行空闲任务。在FreeRTOS中,空闲任务是系统在启动调度器时创建的优先级最低的任务,空闲任务主体主要是做一些系统内存的清理工作。

  4. 任务创建后马上就执行,一个MCU能够支持多少任务,取决于RAM空间的大小。
  5. FreeRTOS支持抢占式和时间片两种方式同时运行。
  6. 进入临界区,不使用任务调度,退出临界区,开始任务调度
  7. 关于堆栈大小可以使用这个函数:
    xGetFreeStackSpace任务栈历史剩余最小值
动态创建任务
#define Led2_PRIO        1		       /* 任务优先级 */		
#define Led2_STACK_SIZE   128          /* 任务堆栈大小*/		
TaskHandle_t    Led2_task_handler;      /* 任务句柄 */		
void Led2Task(void *argument);          /* 任务函数声明 */	xTaskCreate((TaskFunction_t         )   Led2Task,				  /* 任务函数 */(char *                 )   "Led2",		              /* 任务名字 */(configSTACK_DEPTH_TYPE )   Led2_STACK_SIZE,	       /* 堆栈大小 */(void *                 )   NULL,	   				   /* 入口参数 */(UBaseType_t            )   Led2_PRIO,	               /* 任务优先级 */(TaskHandle_t *         )   &Led2_task_handler );      /* 任务句柄 */
任务函数
void Led2Task(void *argument)
{/* USER CODE BEGIN LedTask *//* Infinite loop */for(;;){LED2_ON;vTaskDelay(500);LED2_OFF;vTaskDelay(500);}/* USER CODE END LedTask */
}
创建和删除任务

       vTaskDelete(task1_handler);         //填写任务句柄

// 删除任务if(task1_handler!= NULL){printf("删除start_task任务\r\n");vTaskDelete(task1_handler);         //填写任务句柄task1_handler = ZERO;}//创建任务if(Led2_task_handler == NULL){xTaskCreate(Led2Task,"Led2",Led2_STACK_SIZE,             ZERO,Led2_PRIO,&Led2_task_handler );     }vTaskDelete(null);		            Delete your own tasks		
保护任务:
// 保护任务taskENTER_CRITICAL();               /* 进入临界区 *//* 被保护的代码 */taskEXIT_CRITICAL();                /* 退出临界区 */ 
静态创建:

        静态创建时,任务句柄作为返回值。

#define Led3_PRIO        osPriorityLow             /* 任务优先级 */		
#define Led3_STACK_SIZE   128					   /* 任务堆栈大小*/		
TaskHandle_t    Led3_task_handler;				    /* 任务句柄 */	
StackType_t     Led3_task_stack[Led3_STACK_SIZE];	/* 任务堆栈*/	
StaticTask_t    Led3_task_tcb;						/* 任务控制块*/	
void Led3Task(void *argument);					   /* 任务函数声明 */		Led3_task_handler = xTaskCreateStatic( (TaskFunction_t )   Led3Task,		  /* 任务函数 */(char *         )   "Led3",    		  /* 任务名字 */(uint32_t       )   Led3_STACK_SIZE,	  /* 堆栈大小 */(void *         )   NULL,			  /* 入口参数 */(UBaseType_t    )   Led3_PRIO,	    /* 任务优先级* /(StackType_t *  )   Led3_task_stack,	  /* 任务堆栈 */(StaticTask_t * )   &Led3_task_tcb );  /* 任务名字 */

2.任务挂起和恢复

  1. 任务优先级越大,优先程度越高,中断优先级数值越小,优先级越高。中断中优先级恢复任务中 , 中断优先级在5—15级

        vTaskSuspend(TaskHandle_t xTaskToSuspend)    //任务挂起  ——任务句柄

         vTaskResume(TaskHandle_t xTaskToResume)    //任务恢复  ——任务句柄

        xTaskResumeFromISR(TaskHandle_t xTaskToResume)   //中断中任务恢复  ——任务句柄

挂起任务与恢复任务:
vTaskSuspend(LedHandle);  vTaskResume(LedHandle);  

3.中断:

    STM32 总共有16个优先级(0—15)     

  1. 中断优先级在5—15级的中断中才能调用FreeRTOS中的函数,小于5的中断无法使用。且要使用尾部为FromISR的函数。
  2. 对 5—15 等级中断的管理
  3. vTaskDelay(500); 会打开中断
	portENABLE_INTERRUPTS();        //开启中断portDISABLE_INTERRUPTS();       //关闭中断

5.临界段代码保护:

             同一时间只能有一个人使用的资源,被称为临界资源。比如任务A、B都要使用串口来打印,串口就是临界资源。如果A、B同时使用串口,那么打印出来的信息就是A、B混杂,无法分辨。所以使用串口时,应该是这样:A用完,B再用;B用完,A再用。

什么是临界段:
        临界段,用一句话概括就是一段在执行时不能被中断的代码段。在FreeRTOS中,临界段最常出现的地方就是对全局变量的操作。全局变量就像是一个靶子,谁都可以对其开枪,但是有一人开枪,其他人就不能开枪,否则就不知道是谁命中了靶子。
那么什么情况下临界段会被打断?一个是系统调度,还有一个就是外部中断。在FreeRTOS中,系统调度最终也是产生PendSV中断,在PendSV Handler中实现任务的切换,所以还是可以归结为中断。既然这样,FreeRTOS对临界段的保护最终还是回到对中断的开和关的控制。

作用:  防止中断和任务调度的打断。

应用方面:

  1. 通信时候,IIC SPI
  2. 系统自身需求
  3. 用户需求

特点:

  1. 成对使用
  2. 主要通过关闭和开启中断实现,和开启和关闭任务调度器
  3. 被保护的代码一定要短
  4. 关闭中断,即所有中断都不能执行;而关闭任务调度器,可以任务无法抢占,而可以中断可以打断。
//开启和关闭任务调度器
vTaskSuspendAll() ;
{… …	/* 内容 */
}
xTaskResumeAll()	;// 代码中使用,关闭所有中断
taskENTER_CRITICAL() ;
{… …	/* 临界区 */
}
taskEXIT_CRITICAL()	;// 中断中使用,关闭所有中断
uint32_t  save_status;
save_status  = taskENTER_CRITICAL_FROM_ISR();
{… …	/* 临界区 */
}
taskEXIT_CRITICAL_FROM_ISR(save_status );

6.列表和列表项

  1. 列表和C语言中的链表类似
  2. 列表项为列表的子集
  3. FreeRTOS内部是一个双向环形列表
  4. 链表可以随意删除和加入成员,而且成员间地址并不是连续的,成员数字可以随意更改。
  5. 每个列表项就是一个任务

7.任务间通信

  1. 队列:
    1. 先进先出
    2. 用于传递信息
  2. 事件组:
  3. 信号量:
  4. 任务通知:
  5. 互斥量:

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

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

相关文章

postman进阶使用

前言 对于postman的基础其实很容易上手实现,也有很多教程。 对于小编我来说,也基本可以实现开发任务。 但是今年我们的高级测试,搞了一下postman,省去很多工作,让我感觉很有必要学一下 这篇文章是在 高级测试工程师ht…

01-Spring Security框架的认证和授权测试

Spring Security 介绍 认证功能与业务无关几乎是每个项目都要具备的功能,市面上有很多认证框架如Apache Shiro、CAS、Spring Security等 Spring Security是Spring家族的一份子且和Spring Cloud集成的很好,所以本项目采用Spring Security作为认证服务的技术框架 …

vue3(六)-基础入门之自定义组件与插槽、ref通信

一、全局组件 html: <div id"app"><mytemplace></mytemplace> </div>javascript: <script>const { createApp } Vueconst app createApp({})app.component(mytemplace, {template: <div><button>返回</button>…

canvas随机绘制100个五角星

canvas实例应用100 专栏提供canvas的基础知识&#xff0c;高级动画&#xff0c;相关应用扩展等信息。 canvas作为html的一部分&#xff0c;是图像图标地图可视化的一个重要的基础&#xff0c;学好了canvas&#xff0c;在其他的一些应用上将会起到非常重要的帮助。 文章目录 示例…

element-plus修改主题颜色

一、自定义scss文件 在src\css\styles\element目录下新建index.scss 代码如下 forward "element-plus/theme-chalk/src/common/var.scss" with ($colors: ("primary": ("base": #d61b1a,"color": #fff,),) );use "element-plus…

Java - 工厂设计模式

Java - 工厂设计模式 一. 简介二. 例子2.1 定义抽象类2.2 定义子类2.3 创建工厂2.4 测试 三. JDK中使用工厂模式的案例 前言 这是我在这个网站整理的笔记,有错误的地方请指出&#xff0c;关注我&#xff0c;接下来还会持续更新。 作者&#xff1a;神的孩子都在歌唱 工厂设计模式…

Day73力扣打卡

打卡记录 统计移除递增子数组的数目 II&#xff08;双指针&#xff09; 链接 class Solution:def incremovableSubarrayCount(self, a: List[int]) -> int:n len(a)i 0while i < n - 1 and a[i] < a[i 1]:i 1if i n - 1: # 每个非空子数组都可以移除return n …

普中STM32-PZ6806L开发板(STM32CubeMX创建项目并点亮LED灯)

简介 搭建一个用于驱动 STM32F103ZET6 GPIO点亮LED灯的任务;电路原理图 LED电路原理图 芯片引脚连接LED驱动引脚原理图 创建一个点亮LED灯的Keil 5项目 创建STM32CubeMX项目 New Project -> 单击 -> 芯片搜索STM32F103ZET6->双击创建 初始化时钟 调试设置 一…

双侧电源系统距离保护MATLAB仿真模型

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 系统原始数据 双侧电源系统模型如图所示&#xff1a; 仿真模型搭建 将线路AB分成Line1和Line2&#xff0c;将线路BC分成Line3和Line4&#xff0c;用三相电压电流测量模块作为系统母线&#xff0c;根据系统已…

洛谷 P1387 最大正方形 刷题笔记

P1387 最大正方形 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 找出一个 由数字1组成的最大正方形 输出该正方形的边长 &#xff1b; 思路 dp 画图模拟 可以发现 当 当前点a[i][j]1,满足构成正方形的初步条件 而当前点能构成的最大正方形长度 由它的左上角 左边和上边…

新手为什么跟着大型机构交易?fpmarkets总结理由

正所谓方向不对努力白费&#xff0c;这也就是为什么fpmarkets建议新手在刚开始的时候&#xff0c;跟着大型机构进行交易。 这些大型机构包括中央银行、巨额对冲基金、投资和保险公司等等&#xff0c;首先fpmarkets认为这些大型机构的交易量巨大&#xff0c;能够影响市场的走势。…

LeetCode刷题--- N 皇后

个人主页&#xff1a;元清加油_【C】,【C语言】,【数据结构与算法】-CSDN博客 个人专栏 力扣递归算法题 http://t.csdnimg.cn/yUl2I 【C】 http://t.csdnimg.cn/6AbpV 数据结构与算法 ​​​​​​http://t.csdnimg.cn/hKh2l 前言&#xff1a;这个专栏主要讲述递归…

ARCGIS PRO SDK 要素空间关系

一、要素与要素查询&#xff0c;返回的是bool值 1、 Touches 判断几何要素是否接触 Touches 如果 geometry1 与 geometry2 接触&#xff0c;则返回 true&#xff0c;否则 false。 touches GeometryEngine.Instance.Touches(Geometry1, Geometry2) 2、…

传感器原理与应用复习--电感式传感器

文章目录 上一篇自感式电感传感器差动变压器式传感器电涡流式传感器下一篇 上一篇 传感器原理与应用–传感器基本特性与应变式传感器 自感式电感传感器 将线圈通入电流产生磁场&#xff0c;而间隙的大小将影响磁场的大小&#xff0c;从而进行检测 变气隙式电感传感器&#xf…

2D transform 1-translate

移位&#xff1a;translate 缩放&#xff1a;scale 旋转&#xff1a;rotate 扭曲&#xff1a;skew <style>.outer {width: 200px;height: 200px;border: 2px solid black;margin-top: 100px;}.inner {width: 200px;height: 200px;background-color: pink;transform: t…

el-select多选修改默认显示一个

需求&#xff1a;超出选择框已数字展示 效果 备忘一下 代码 父组件 <template><div><div class"credit_box"><div class"credit_select_box"><div class"credit_select"><span>选择框1</span><…

C#中的Attribute详解(上)

C#中的Attribute详解&#xff08;上&#xff09; 一、Attribute是什么二、Attribute的作用三、Attribute与注释的区别四、系统Attribute范例1、如果不使用Attribute&#xff0c;为了区分这四类静态方法&#xff0c;我们只能通过注释来说明&#xff0c;但这样做会给系统带来很多…

前端文件在虚拟机,后端在本机,两个如何通信

前端文件在虚拟机&#xff0c;后端在本机&#xff0c;两个如何通信 如果前端的文件放在虚拟机里面&#xff0c;但是调用接口的后端在本地调试&#xff0c;如何做到在虚拟机中也能访问到本地的接口内容。 其实这个问题很简单&#xff0c;只要讲本地的IP和虚拟机中的IP结合就可…

unknown variable ‘authentication_policy=mysql_native_password‘

unknown variable authentication_policymysql_native_password 背景解决尝试一尝试二(解决) 总结 背景 mac上安装多个版本数据库。我是通过dmg安装的&#xff0c;先装的5.7&#xff0c;再装的5.8&#xff0c;然后5.8的能正常用&#xff0c;5.7的启动不起来。报错信息为如下 …

Python五子棋程序实现详解

Python五子棋程序实现详解 引言功能实现显示棋盘点击落子判断胜负游戏结束判断交替落子 运行结果完整代码总结 引言 五子棋是一种广泛传播的策略棋类游戏&#xff0c;两人对弈&#xff0c;通过在棋盘上落子&#xff0c;以先形成连续的相同颜色的五子棋为胜利条件。本文将介绍如…