FreeRTOS的学习

news2025/3/17 1:31:50

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. 进入临界区,不使用任务调度,退出临界区,开始任务调度
  6. 关于堆栈大小可以使用这个函数:
    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.临界段代码保护:

什么是临界段:
        临界段,用一句话概括就是一段在执行时不能被中断的代码段。在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.列表和列表项

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

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

相关文章

Qt Creator可视化交互界面exe快速入门2

上一期介绍的通过代码的方式实现一个简单界面,需要敲小几十行代码,显然是效率低的,这期就介绍下Qt Creator的作用。 Qt Creator的使用: 首先打开我们的Qt Creator 然后点击创建项目,在项目Application里面选择Qt Wid…

网站在线客服系统推荐:提升客户体验与满意度

精致的前端页面可以提供访客的用户体验感,连接响应迅速可以帮助客服人员及时联系到访客帮助其解决问题,访客来源明细可以帮助客服人员更加清楚的了解用户需求以展开更有针对性的营销,操作方便有助于公司迅速培训员工,同时也方便客…

Appium如何实现移动端UI自动化测试呢?

Appium是一个开源跨平台移动应用自动化测试框架。 既然只是想学习下Appium如何入门,那么我们就直奔主题。文章结构如下: 为什么要使用Appium?如何搭建Appium工具环境?(超详细)通过demo演示Appium的使用Appium如何实现移动端UI自…

一文速览字节最新分布式操作系统KubeWharf

一文速览字节最新分布式操作系统KubeWharf KubeWharf 是字节跳动基础架构团队在对 Kubernetes 进行了大规模应用和不断优化增强之后的技术结晶。 这是一套以 Kubernetes 为基础构建的分布式操作系统,由一组云原生组件构成,专注于提高系统的可扩展性、功…

绝地反击,不做背锅侠!

那么作为运维人员,如何摆脱以上背黑锅的尴尬局面呢?堡垒机当然是破解此局面的绝杀大招。 1.统一登录入口 提供统一入口,集中管理和分配账户密码、所有运维人员只能登录堡垒机才能访问服务器,梳理“人与服务器”之间的关系&#…

案例169:基于微信小程序的小区疫情防控系统

文末获取源码 开发语言:Java 框架:SSM JDK版本:JDK1.8 数据库:mysql 5.7 开发软件:eclipse/myeclipse/idea Maven包:Maven3.5.4 小程序框架:uniapp 小程序开发软件:HBuilder X 小程序…

各种不同的安科瑞电力物联网仪表实现互联互通

安科瑞 崔丽洁 电力物联网是物联网在智能电网中的应用,是有效整合通信基础设施资源和电力基础设施资源,提高电力系统信息化水平,改善电力系统现有基础设施利用效率的重要举措。 电力物联网仪表为终端感知设备,该系列产品将我们多年…

2015年第四届数学建模国际赛小美赛B题南极洲的平均温度解题全过程文档及程序

2015年第四届数学建模国际赛小美赛 B题 南极洲的平均温度 原题再现: 地表平均温度是反映气候变化和全球变暖的重要指标。然而,在以前的估计中,在如何界定土地平均数方面存在一些方法上的差异。为简单起见,我们只考虑南极洲。请建…

掌握ElasticSearch(一):Elasticsearch安装与配置、Kibana安装

文章目录 〇、简介1.Elasticsearch简介2.典型业务场景3.数据采集工具4.名词解释 一、安装1.使用docker(1)创建虚拟网络(2)Elasticsearch安装步骤 2.使用压缩包 二、配置1.目录介绍2.配置文件介绍3.elasticsearch.yml节点配置4.jvm.options堆配置 二、可视化工具Kibana1.介绍2.安…

C++图论之强连通图

1. 连通性 什么是连通性? 连通,字面而言,类似于自来水管道中的水流,如果水能从某一个地点畅通流到另一个地点,说明两点之间是连通的。也说明水管具有连通性,图中即如此。 无向图和有向图的连通概念稍有差…

RFID技术在汽车制造:提高生产效率、优化物流管理和增强安全性

RFID技术在汽车制造:提高生产效率、优化物流管理和增强安全性 随着科技的进步,物联网技术已经深入到各个领域,尤其在制造业中,RFID技术以其独特的优势,如高精度追踪、实时数据收集和自动化操作,正在改变传统的生产方式…

数字人直播一比一克隆:实现虚拟与现实的完美融合

数字人直播一比一克隆技术作为当今科技领域的一项重要突破,将虚拟与现实完美融合,引发了广泛的关注和讨论。这项技术不仅能够创造一个以数字人为基础的虚拟世界,同时也能够将真实人物复制到数字化的平台上进行直播,让观众在屏幕前…

轻量级开源服务器Tomcat本地部署并将网页发布到公网远程访问

目录 1.前言 2.本地Tomcat网页搭建 2.1 Tomcat安装 2.2 配置环境变量 2.3 环境配置 2.4 Tomcat运行测试 2.5 Cpolar安装和注册 3.本地网页发布 3.1.Cpolar云端设置 3.2 Cpolar本地设置 4.公网访问测试 5.结语 前些天发现了一个巨牛的人工智能学习网站,通…

UILabel布局解决文本右边对不齐的问题

来看示例: 文本右边会出现明显的间距,文字无法对齐。 解决方法: 给段落设置样式,为字符串对象设置NSTextAlignmentJustified值 NSTextAlignmentJustified:保持文字左右对齐,最后一行保持做对齐 NSString *str “xxxxxxxxxxxx…

树莓派,mediapipe,Picamera2利用舵机云台追踪人手(PID控制)

一、项目目标 追踪人手大拇指指尖: 当人手移动时,摄像头通过控制两个伺服电机(分别是偏航和俯仰)把大拇指指尖放到视界的中心位置,本文采用了PID控制伺服电机 Mediapipe Hand简介 MediaPipe 手部标志任务可检测图像…

状态管理概述

ArkTS UI的状态管理到这里就叙述完了,现在做一个概述,也可以认为是一个总结。 在声明式UI编程框架中,UI是程序状态的运行结果,用户构建了一个UI模型,其中应用的运行时的状态是参数。当参数改变时,UI作为返回…

向华为学习:IPD运作-PDP产品开发流程-开发阶段的关键活动

前面几天,华研荟为您分享了IPD体系中产品开发流程(严格来说是PDP流程,也是狭义的IPD流程)前两个阶段:概念阶段和计划阶段的主要内容和关键活动。 今天我们继续来介绍PDP流程的第三个阶段:开发阶段的主要内容…

鸿蒙原生应用/元服务开发-Stage模型能力接口(十)上

ohos.app.form.FormExtensionAbility (FormExtensionAbility) FormExtensionAbility为卡片扩展模块,提供卡片创建、销毁、刷新等生命周期回调。 本模块首批接口从API version 9开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。本模块接…

ArkUI动画概述

目录 1、按照页面分类 2、按照功能分类 3、显示动画 4、属性动画 动画的原理是在一个时间段内,多次改变UI外观,由于人眼会产生视觉暂留,所以最终看到的就是一个“连续”的动画。UI的一次改变称为一个动画帧,对应一次屏幕刷新&a…

C#实现串口通讯

1、官网下载Launch Virtual Serial Port Driver Virtual Serial Port Driver - create and emulate virtual COM port,开个虚拟串口: Pair模式(一对,成双成对的意思,就是COM1向COM2传或者COM2向COM1,好比两台机器的CO…