海外版tiktok免费入口/久久seo综合查询

海外版tiktok免费入口,久久seo综合查询,电商网站建设与运营方向就业前景,wordpress 页面路由2.3 RTOS下的任务管理(***) RTOS的任务管理主要是进行哪些功能? RTOS的任务管理的多任务管理是怎样进行与实现的? 任务管理中FreeRTOS如何给每个任务分配CPU时间? 文章目录 2.3 RTOS下的任务管理(***)2.3.0 任务概述2.3.1任务的创建与删除2.3…

2.3 RTOS下的任务管理(***)

RTOS的任务管理主要是进行哪些功能?

RTOS的任务管理的多任务管理是怎样进行与实现的?

任务管理中FreeRTOS如何给每个任务分配CPU时间?

文章目录

      • 2.3 RTOS下的任务管理(***)
        • 2.3.0 任务概述
        • 2.3.1任务的创建与删除
        • 2.3.2 任务的优先级和Tick
        • 2.3.4 任务状态
        • 2.3.5 任务相关的Delay函数
        • 2.3.6 调度算法(**)

2.3.0 任务概述

​ 任务管理算是FreeRTOS中核心以及重点内容。简而言之,后续代码移植嫁接便是在任务管理的基础上进行的。对于任务管理的重中之重则是在于多任务管理。任务具有一系列状态以及优先级(Priority)等相关属性。任务的一系列相关数据是在栈中保存的,多个任务之间的协作处理[^231]称之为任务调度(即CPU按照某种算法策略进行不同任务间的切换)

​ 任务即需要完成的一件件功能,也称之为“线程(thread)”,需要注意的RTOS中一个完整的任务由任务栈(Stack)+任务控制块(TCB)组成。

任务的几大相关状态:

  • 运行态
  • 非运行态:
    • 就绪态(ready)
    • 阻塞(blocked)
    • 挂起(suspended)
2.3.1任务的创建与删除

RTOS任务相关的函数有哪些?怎样创建任务

​ 在RTOS中任务的本质即一个函数,其这个函数不能有返回,一个任务式的函数通常如下:

  • 其传递的形参通常为指针类型
  • 各自任务存在各自栈的备份(副本)
void ATaskFunction( void *pvParameters )
{/* 对于不同的任务,局部变量放在任务的栈里,有各自的副本 */int32_t lVariableExample = 0;/* 任务函数通常实现为一个无限循环 */for( ;; ){/* 任务的代码 */}/* 如果程序从循环中退出,一定要使用vTaskDelete删除自己* NULL表示删除的是自己*/vTaskDelete( NULL );/* 程序不会执行到这里, 如果执行到这里就出错了 */
}

​ RTOS进行任务创建时主要有两种函数:

  • 动态分配内存创建相关结构体

    /**
    *@return:成功则返回相关pass
    */
    BaseType_t xTaskCreate(	/*函数指针,也就是任务体*/TaskFunction_t pxTaskCode,/*任务名*/const char * const pcName,/*设置任务栈大小,单位为word(字),一个字占4个字节,大多时候估计方法,精确值的话看反汇编*/const configSTACK_DEPTH_TYPE usStackDepth,/*调用pvTaskCode(任务函数)是用到的参数 ,并将相关参数传送到对应的任务函数指针中*/void * const pvParameters,/*任务优先级,越小优先级越高*/UBaseType_t uxPriority,/*用于保存任务创建后的返回结构体 task handle(句柄),可用于后续的任务属性相关修改,或是进行任务删除相关*/TaskHandle_t * const pxCreatedTask )
    
  • 静态分配(手动分配)内存创建

    /**
    * @return: 创建成功则返回任务句柄
    */
    TaskHandle_t xTaskCreateStatic (   TaskFunction_t pxTaskCode, // 函数指针, 任务函数const char * const pcName, // 任务的名字const uint32_t ulStackDepth, // 栈大小,单位为word,10表示40字节void * const pvParameters, // 调用任务函数时传入的参数UBaseType_t uxPriority, // 优先级,数值越大优先级越高StackType_t * const puxStackBuffer, // 静态分配的栈内存大小,就是一个bufferStaticTask_t * const pxTaskBuffer // 静态分配的任务结构体的指针,用它来操作这个任务,
    );
    

创建时相关代码(freertos.c):

/*LED的任务创建的句柄*/
static  TaskHandle_t  xLightTaskHandle;
static  StackType_t   g_pucStackOfLightTask[128];
static  StaticTask_t  g_TCBofLightTask;void MX_FREERTOS_Init(void) {/* USER CODE BEGIN Init */TaskHandle_t xTaskHandle;BaseType_t  ret;/* USER CODE END Init */defaultTaskHandle = osThreadNew(StartDefaultTask, NULL, &defaultTask_attributes);//动态内存创建任务ret = xTaskCreate(Led_Test, "LEDTask", 128, NULL, osPriorityNormal, &xLightTaskHandle);//静态内存创建任务xLightTaskHandle = xTaskCreateStatic(Led_Test, "LEDTask2", 128, NULL, osPriorityNormal, g_pucStackOfLightTask, &g_TCBofLightTask);/* USER CODE BEGIN RTOS_EVENTS *//* add events, ... *//* USER CODE END RTOS_EVENTS */}

LED相关代码

#include "driver_led.h"
#include "gpio.h"/*** @brief: LED引脚初始化* @param: NULL* @date: 2024年12月10日14:58:42
*/
int Led_init(void)
{GPIO_InitTypeDef GPIO_InitStruct = {0};__HAL_RCC_GPIOC_CLK_ENABLE();/*Configure GPIO pin : PC13 */GPIO_InitStruct.Pin = GPIO_PIN_13;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);return 0;
}/*** @brief:控制LED的亮灭* @param:on-状态  1亮 0灭* @return: 0-成功  其他值-失败
*/
int Led_Control(int on)
{if(on)HAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, RESET);elseHAL_GPIO_WritePin(GPIOC, GPIO_PIN_13, SET);return 0;
}/*** @brief:LED1的亮灭相关测试* @return:NULL
*/
void Led_Test(void)
{Led_init();while (1){/* code */Led_Control(1);HAL_Delay(300);Led_Control(0);HAL_Delay(300);}}

使用任务参数创建多任务

这里可能出现明明创建了多个任务,但最终却只执行一个任务的情况是怎么回事?

​ 这里使用的是动态分配内存方式创建相同任务体的多任务,其中各自任务的相关参数g_Task1Info会被传入到任务体中,这里的if (g_OLEDCanUse) 及其函数体内部g_OLEDCanUse变量改变主要是用于防范多任务时,出现的当前显示任务未完成就去下个显示任务,最终造成的逻辑混乱,这里也可以将OLED显示资源视作公共资源,而该操作就是简单的一种同步机制(但效果有限)。

void OledPrintTask(void *params)
{struct TaskPrintInfo *pInfo = params;uint32_t count = 0;//uint8_t len;while (1){/* code */if (g_OLEDCanUse){/* code */g_OLEDCanUse = 0;OLED_ShowString(pInfo->x, pInfo->y, pInfo->name);//OLED_ShowString(1, 1, "Task1:");OLED_ShowNum(pInfo->x, pInfo->y+6, count++, 4);g_OLEDCanUse = 1;}HAL_Delay(300);}}
/******************/
//最后一个参数则是用于设置句柄
xTaskCreate(OledPrintTask, "task1", 128,&g_Task1Info, osPriorityNormal, NULL);
xTaskCreate(OledPrintTask, "task2", 128,&g_Task2Info, osPriorityNormal, NULL);
xTaskCreate(OledPrintTask, "task3", 128,&g_Task3Info, osPriorityNormal, NULL);

​ 需要说明的是若不加HAL_Delay(300);,则显示器上只会出现Task3相关信息,原因在于CPU多任务时间调度太短,也就是说Task3第一次执行完后第二次还在OLED_ShowString时发送调度去执行Task1或2直接便导致if判断失败进而回到Task3然后继续执行并再次发生调度而CPU下次发生调度时也是循环执行到task3中红线框选区域,进而导致task1和2永远无法显示,简单解决办法是加入的延时超过整体的调度时间。

2.3.2 任务的优先级和Tick

Tick是什么?有什么用?

与优先级相关的函数有哪些,分别有些什么作用?

​ 任务优先级的数值越高,优先级越高。FreeRTOS确保高优先级的先运行,对于同优先级则轮流执行。需要注意的是同级的轮流执行就运用到了Tick(时钟节拍)。Tick之与单片机,就犹如人心脏一般,且与中断息息相关,而两次中断之间的间隔时间称之为时间片。FreeRTOS中的Tick由configTICK_RATE_HZ设置。

​ 关于同级的任务切换过程:1.触发中断后切换到别的同级任务 2.别的任务时间片用完触发中断切换下一同级运行。

相关函数

​ 除创建任务时的优先级属性设置,还有

获取任务优先级

UBaseType_t uxTaskPriorityGet( const TaskHandle_t xTask );

设置任务优先级

void vTaskPrioritySet( TaskHandle_t xTask, UBaseType_t uxNewPriority );
2.3.4 任务状态

FreeRTOS中任务状态有哪几种?

阻塞态与挂起等待态的区别是什么?

怎样才能让阻塞态变为就绪态?

​ 简而言之,常见任务状态有以下几种,:

  • 运行态
  • 非运行态:
    • 就绪态(Ready) : 随时可以运行,只是当前时间片还未到该任务
    • 阻塞态(Blocked) :因某种资源未能满足需求而导致一直不能运行的状态,主要由于被动原因造成等待,这里的等待可以是资源的等待,也可以是同步事件的来源等待
    • 等待态(Suspended):主动去暂停某项任务,只能通过唯一函数void vTaskSuspend( TaskHandle_t xTaskToSuspend );进行,退出的话也只能主动去退出(vTaskResume( TaskHandle_t xTaskToSuspend ))。实际开发中暂停等待态用得并不多。

需要说明的是,阻塞态的本质对事情的“等待”,只有当等待的事情满足后才能转为就绪态,而这里等待的事情主要有两大种类:

  • 基于时间的等待事件:就像设置了超时时间一般,达到某个时间点后即转换后就绪态,属于一种低级的阻塞。
  • 基于同步的等待事件:这里是指某个阻塞的任务需要等待其他任务或是中断程序给它”发送消息“,发送消息的方法包括但不限于

​ 任务通知(task notification)、队列(queue)、信号量(semaphoe)、互斥量(mutex)。

2.3.5 任务相关的Delay函数

任务相关的两大Delay函数是什么,各自使用方法是怎样的?

  • void vTaskDelay( const TickType_t n ) : 等待n个时间片(这里的时间片时间与设置频率有关)中断(需要注意的是这里只是等待中断,而不能达到精确的等待时间)。

  • BaseType_t vTaskDelayUntil( TickType_t * const pxPreviousWakeTime,const TickType_t xTimeIncrement );

2.3.6 调度算法(**)

调度算法的定义是什么?

FreeRTOS调度算法是怎么进行设置的?

​ 调度算法是指存在多个任务的系统中,某一时刻指定给某一任务获得处理器资源的算法。调度器用于都是挑选最高优先级的就绪态任务并让其进入运行状态。

​ 需要注意的是,目前多任务执行时的CPU均是在内核态上进行执行的,而只有当CPU空闲时(无事可做),才会执行用户态相关程序任务。RTOS中的调度思想满足:高优先级的抢占,同优先级的时间片轮转(具体的时间片又和频率相关)。其设置在FreeRTOS.hFreeRTOSConfig.h两个头文件中。

#define configUSE_PREEMPTION                     1 //可抢占式运行
//同级轮流调度
#define configUSE_TIME_SLICING  1
//CPU空闲时允许用户态介入
#define configIDLE_SHOULD_YIELD		1

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

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

相关文章

深度学习——神经网络中前向传播、反向传播与梯度计算原理

一、前向传播 1.1 概念 神经网络的前向传播(Forward Propagation)就像是一个数据处理的流水线。从输入层开始,按照网络的层次结构,每一层的神经元接收上一层神经元的输出作为自己的输入,经过线性变换(加权…

【初阶数据结构与算法】八大排序算法之归并排序与非比较排序(计数排序)

文章目录 一、归并排序二、非比较排序之计数排序三、归并排序和计数排序的性能测试 一、归并排序 归并排序(MERGE-SORT)是建⽴在归并操作上的⼀种有效的排序算法,该算法是采⽤分治法(Divide andConquer)的⼀个⾮常典型的应⽤   …

window安装TradingView

目录 下载安装包 修改文件后缀,解压 将K线换成国内涨红跌绿样式 下载安装包 https://www.tradingview.com/desktop/ 下载完成后是.msix格式文件 (我在win10和win11的系统中尝试运行msix都没有成功,所以放弃直接双击运行msix&#xff…

FPGA多路MIPI转FPD-Link视频缩放拼接显示,基于IMX327+FPD953架构,提供2套工程源码和技术支持

目录 1、前言工程概述免责声明 2、相关方案推荐本博主所有FPGA工程项目-->汇总目录我这里已有的 MIPI 编解码方案我这里已有的FPGA图像缩放方案本博已有的已有的FPGA视频拼接叠加融合方案 3、本 MIPI CSI-RX IP 介绍4、详细设计方案设计原理框图IMX327 及其配置FPD-Link视频…

React+Vite从零搭建项目及配置详解

相信很多React初学者第一次搭建自己的项目,搭建时会无从下手,本篇适合快速实现功能,熟悉React项目搭建流程。 目录 一、创建项目react-item 二、调整项目目录结构 三、使用scss预处理器 四、组件库Ant Design 五、配置基础路由 六、配置…

Unity复刻胡闹厨房复盘 模块一 新输入系统订阅链与重绑定

本文仅作学习交流,不做任何商业用途 郑重感谢siki老师的汉化教程与代码猴的免费教程以及搬运烤肉的小伙伴 版本:Unity6 模板:3D 核心 渲染管线:URP ------------------------------…

从零开始的编程-java篇1.6.1 万变不离其宗,hello word

前言: 通过实践而发现真理,又通过实践而证实真理和发展真理。从感性认识而能动地发展到理性认识,又从理性认识而能动地指导革命实践,改造主观世界和客观世界。实践、认识、再实践、再认识,这种形式,循环往…

【漏洞复现】CVE-2021-45788 SQL Injection

漏洞信息 NVD - cve-2021-45788 Time-based SQL Injection vulnerabilities were found in Metersphere v1.15.4 via the “orders” parameter. Authenticated users can control the parameters in the “order by” statement, which causing SQL injection. API: /test…

Mac系统下 idea运行maven项目中存在的问题BeanDefinitionStoreException

1.在进行 注解XML 方式整合三层架构事出现此问题 org.springframework.beans.factory.BeanDefinitionStoreException: Failed to read candidate component class: file [/Volumes/PS2000/Java/SpringProject/micro-shop/spring-annotation-practice-03/target/classes/com/ja…

shiro注入filter内存马(绕过长度限制)

shiro环境 https://github.com/yyhuni/shiroMemshell(实验环境) 这里用的 Client_memshell.java package com.example.demo;import javassist.ClassPool; import javassist.CtClass; import org.apache.shiro.crypto.AesCipherService; import org.ap…

c语言大一期末复习

l例1&#xff1a;输入一行字符&#xff0c;统计其中空格的个数 #include<stdio.h> int main( ) { char ch; int count0; while((chgetchar())!\n) { if(ch ) { count1; } } printf("%d\n",coun…

心血管疾病中医怎么调理

心血管疾病在中医范畴内属于胸痹&#xff0c;中医会根据不同的证候&#xff0c;如心血瘀阻证、寒凝心脉证、痰浊闭阻证、心肾阴虚证、气阴两虚证等&#xff0c;采取不同的调理方法。以下是一些中医调理心血管疾病的常用手段&#xff1a; 一、中药调理 ‌心血瘀阻证‌&#xf…

群晖利用acme.sh自动申请证书并且自动重载证书的问题解决

前言 21年的时候写了一个在群晖&#xff08;黑群晖&#xff09;下利用acme.sh自动申请Let‘s Encrypt的脚本工具 群晖使用acme自动申请Let‘s Encrypt证书脚本&#xff0c;自动申请虽然解决了&#xff0c;但是自动重载一直是一个问题&#xff0c;本人也懒&#xff0c;一想到去…

raid 状态查看 storcli64

场景 当磁盘报错的时候使用该命令排查 fdisk -l /dev/sdb fdisk: cannot open /dev/sdb: Input/output error进一步使用 smartctl 排查 smartctl -a /dev/sdb 输出 smartctl 7.1 2019-12-30 r5022 [x86_64-linux-5.4.0-144-generic] (local build) Copyright (C) 2002-19, B…

《探索PyTorch计算机视觉:原理、应用与实践》

一、PyTorch 与计算机视觉的奇妙相遇 在当今数字化的时代&#xff0c;计算机视觉作为一门能够赋予机器 “看” 的能力的技术&#xff0c;正以前所未有的速度蓬勃发展&#xff0c;深刻地改变着我们的生活和众多行业的运作模式。从智能手机中的人脸识别解锁&#xff0c;到安防监控…

使用VSCode Debugger 调试 React项目

一般我们调试代码时&#xff0c;用的最多的应该就是console.log方式了&#xff0c;还有的是使用Chrome DevTools 通过在对应的 sourcemap代码位置打断点进行调试&#xff0c;除了上面两种方式外还有一种更好用的调试方式&#xff1a; VSCode Debugger。 VSCode Debugger可以直…

mapbox基础,加载mapbox官方地图

&#x1f468;‍⚕️ 主页&#xff1a; gis分享者 &#x1f468;‍⚕️ 感谢各位大佬 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍⚕️ 收录于专栏&#xff1a;mapbox 从入门到精通 文章目录 一、&#x1f340;前言1.1 ☘️mapboxgl.Map 地图对象…

汽车IVI中控开发入门及进阶(三十八):手机投屏HiCar开发

手机投屏轻松实现手机与汽车的无缝连接,导航、音乐、通话等功能应有尽有,还支持更多第三方应用,让车载互联生活更加丰富多彩。 HiCar在兼容性和开放性上更具优势。 手机投屏可以说是车机的杀手级应用,大大拓宽了车机的可用性范围。其中华为推出的HiCar就是非常好用的一种。…

Elasticsearch:确保业务规则与语义搜索无缝协作

作者&#xff1a;来自 Elastic Kathleen DeRusso 利用查询规则与语义搜索和重新排序相结合的强大功能。 更多阅读&#xff1a; Elasticsearch 8.10 中引入查询规则 - query rules Elasticsearch 查询规则现已正式发布 - query rules 你是否知道查询规则&#xff08;query ru…

把riscv32位系统弄懂1:riscv32 CPU指令学习

Riscv手册 首先下载手册&#xff1a;文件下载----中国开放指令生态(RISC-V)联盟 从这个页面下载riscv-spec-v2.1中文版 也可以下载中科大的这本&#xff1a;RISC-V手册 Riscv32指令集包括基础指令集和一些扩展指令集&#xff0c;比如在ESP32C3技术手册中&#xff0c;写到E…