FreeRTOS学习第5篇--任务优先级

目录

  • FreeRTOS学习第5篇--任务优先级
    • 任务优先级
    • 设计实验
    • 任务一StartDefaultTask任务相关代码片段
    • 任务二ColorLED_Test任务相关代码片段
    • 任务三IRReceiver_Task相关代码片段
    • 实验现象
    • 本文中使用的测试工程

FreeRTOS学习第5篇–任务优先级

本文目标:学习与使用FreeRTOS中的任务优先级。

按照本文的描述,应该可以跑通实验并举一反三。

本文实验条件:拥有C语言基础,装有编译和集成的开发环境,比如:Keil uVision5

任务优先级

每个任务都有一个优先级,用来决定哪些任务可以被执行。在FreeRTOS中任务优先级数值越小,任务优先级越低。不过有时也记不住,直接看封装层的信息比较好,在文件cmsis_os2.h中定义了相关的优先级,看英文意思就是越往后优先级就越高的。

/// Priority values.
typedef enum {osPriorityNone          =  0,         ///< No priority (not initialized).osPriorityIdle          =  1,         ///< Reserved for Idle thread.osPriorityLow           =  8,         ///< Priority: lowosPriorityLow1          =  8+1,       ///< Priority: low + 1osPriorityLow2          =  8+2,       ///< Priority: low + 2osPriorityLow3          =  8+3,       ///< Priority: low + 3osPriorityLow4          =  8+4,       ///< Priority: low + 4osPriorityLow5          =  8+5,       ///< Priority: low + 5osPriorityLow6          =  8+6,       ///< Priority: low + 6osPriorityLow7          =  8+7,       ///< Priority: low + 7osPriorityBelowNormal   = 16,         ///< Priority: below normalosPriorityBelowNormal1  = 16+1,       ///< Priority: below normal + 1osPriorityBelowNormal2  = 16+2,       ///< Priority: below normal + 2osPriorityBelowNormal3  = 16+3,       ///< Priority: below normal + 3osPriorityBelowNormal4  = 16+4,       ///< Priority: below normal + 4osPriorityBelowNormal5  = 16+5,       ///< Priority: below normal + 5osPriorityBelowNormal6  = 16+6,       ///< Priority: below normal + 6osPriorityBelowNormal7  = 16+7,       ///< Priority: below normal + 7osPriorityNormal        = 24,         ///< Priority: normalosPriorityNormal1       = 24+1,       ///< Priority: normal + 1osPriorityNormal2       = 24+2,       ///< Priority: normal + 2osPriorityNormal3       = 24+3,       ///< Priority: normal + 3osPriorityNormal4       = 24+4,       ///< Priority: normal + 4osPriorityNormal5       = 24+5,       ///< Priority: normal + 5osPriorityNormal6       = 24+6,       ///< Priority: normal + 6osPriorityNormal7       = 24+7,       ///< Priority: normal + 7osPriorityAboveNormal   = 32,         ///< Priority: above normalosPriorityAboveNormal1  = 32+1,       ///< Priority: above normal + 1osPriorityAboveNormal2  = 32+2,       ///< Priority: above normal + 2osPriorityAboveNormal3  = 32+3,       ///< Priority: above normal + 3osPriorityAboveNormal4  = 32+4,       ///< Priority: above normal + 4osPriorityAboveNormal5  = 32+5,       ///< Priority: above normal + 5osPriorityAboveNormal6  = 32+6,       ///< Priority: above normal + 6osPriorityAboveNormal7  = 32+7,       ///< Priority: above normal + 7osPriorityHigh          = 40,         ///< Priority: highosPriorityHigh1         = 40+1,       ///< Priority: high + 1osPriorityHigh2         = 40+2,       ///< Priority: high + 2osPriorityHigh3         = 40+3,       ///< Priority: high + 3osPriorityHigh4         = 40+4,       ///< Priority: high + 4osPriorityHigh5         = 40+5,       ///< Priority: high + 5osPriorityHigh6         = 40+6,       ///< Priority: high + 6osPriorityHigh7         = 40+7,       ///< Priority: high + 7osPriorityRealtime      = 48,         ///< Priority: realtimeosPriorityRealtime1     = 48+1,       ///< Priority: realtime + 1osPriorityRealtime2     = 48+2,       ///< Priority: realtime + 2osPriorityRealtime3     = 48+3,       ///< Priority: realtime + 3osPriorityRealtime4     = 48+4,       ///< Priority: realtime + 4osPriorityRealtime5     = 48+5,       ///< Priority: realtime + 5osPriorityRealtime6     = 48+6,       ///< Priority: realtime + 6osPriorityRealtime7     = 48+7,       ///< Priority: realtime + 7osPriorityISR           = 56,         ///< Reserved for ISR deferred thread.osPriorityError         = -1,         ///< System cannot determine priority or illegal priority.osPriorityReserved      = 0x7FFFFFFF  ///< Prevents enum down-size compiler optimization.
} osPriority_t;

FreeRTOS 中任务的最高优先级是通过 FreeRTOSConfig.h 文件中的 configMAX_PRIORITIES 进行

配置的,用户实际可以使用的优先级范围是 0 到 configMAX_PRIORITIES – 1。这是我工程中优先级的宏定义,用户可以使用的优先级号是 0,1,2,3,4 …55,不包含 55

在这里插入图片描述

设计实验

基于以上信息的了解,我在我的硬件操作平台来设计一些实验来看一下相关的实验现象,创建3个优先级相同的任务,过一段时间后,我在我其中一个任务中设置一个更高的优先级,直接霸占cpu资源,让另两个任务没办法继续执行。基于这个设想,下面是相关代码片段。

任务一StartDefaultTask任务相关代码片段

osThreadId_t defaultTaskHandle;
const osThreadAttr_t defaultTask_attributes = {.name = "defaultTask",.stack_size = 128 * 4,.priority = (osPriority_t) osPriorityNormal,
};
void StartDefaultTask(void *argument)
{/* USER CODE BEGIN StartDefaultTask *//* Infinite loop */for(;;){HAL_GPIO_TogglePin(LED1_GPIO_Port,LED1_Pin);HAL_GPIO_TogglePin(LED2_GPIO_Port,LED2_Pin);HAL_GPIO_TogglePin(LED3_GPIO_Port,LED3_Pin);mdelay(100);}/* USER CODE END StartDefaultTask */
}
/* creation of defaultTask */defaultTaskHandle = osThreadNew(StartDefaultTask, NULL, &defaultTask_attributes);

任务二ColorLED_Test任务相关代码片段

static StackType_t g_pucStackOfColorTask[75];
static StaticTask_t g_TCBofColorTask;
static TaskHandle_t xColorTaskHandle;
void ColorLED_Test(void * pvParameters)
{uint32_t color = 0;ColorLED_Init();while (1){//LCD_PrintString(0, 0, "Show Color: ");//LCD_PrintHex(0, 2, color, 1);ColorLED_Set(color);color += 200000;color &= 0x00ffffff;mdelay(1000);}    
}
/* 创建任务: 色 */xColorTaskHandle = xTaskCreateStatic(ColorLED_Test, "ColorTask", 75, NULL, osPriorityNormal, g_pucStackOfColorTask, &g_TCBofColorTask);

任务三IRReceiver_Task相关代码片段

void IRReceiver_Task(void * pvParameters)
{uint8_t dev, data;OLED_Init();IRReceiver_Init();while(1){OLED_ShowString(0,0,"IR Receiver: ",16);OLED_ShowString(0,16,"Device  Data",16);if (!IRReceiver_Read(&dev, &data)){OLED_ShowString(0, 32, "                ",16);OLED_ShowNum(0,32,dev,4,16);OLED_ShowNum(64,32,data,4,16);OLED_ShowString(0, 48, "                ",16);OLED_ShowString(0,48,"Key name: ",16);OLED_ShowString(80,48,(u8 *)IRReceiver_CodeToString(data),16);// 某个按键值if(data == 48){// 设置优先级vTaskPrioritySet(defaultTaskHandle, osPriorityAboveNormal2);}// 某个按键 if(data == 24){// 设置优先级vTaskPrioritySet(xColorTaskHandle, osPriorityAboveNormal1);}}OLED_Refresh(); // 刷新屏幕}}
xTaskCreate( IRReceiver_Task, "IRReceiver_Task", configMINIMAL_STACK_SIZE, NULL, osPriorityNormal, NULL );

其中要使用vTaskPrioritySet的函数,则需要在配置文件中配置相应的宏,默认是打开的。

在这里插入图片描述

实验现象

下载代码到板子上,一开始时,这三个任务的优先级都是osPriorityNormal级别的,都在按部就班的运行各自的功能函数,但是当我在IRReceiver_Task任务中按下相应的按键时,把对应的优先级任务提高之后,这三个任务中就只有一个高优先级的任务在执行了,直接霸占了cpu资源,让另两个任务都没法得到执行,连IRReceiver_Task后续也不执行了。为此本次实验设计成功。

本文中使用的测试工程

https://download.csdn.net/download/weixin_44317448/88666471

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

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

相关文章

使用css实现 Typora markdown 标题自动编号

第一&#xff0c;找到主题文件夹 第二&#xff0c;复制下面代码放入 AutoNumber.css文件中 body {counter-reset: h1; }#write h1, .markdown-section h1 {counter-reset: h2; }#write h2, .markdown-section h2 {counter-reset: h3; }#write h3, .markdown-section h3 {counte…

红队打靶练习:SAR: 1

目录 信息收集 1、arp 2、netdiscover 3、nmap 4、nikto 5、whatweb 小结 目录探测 1、gobuster 2、dirsearch WEB CMS 1、cms漏洞探索 2、RCE漏洞利用 提权 get user.txt 本地提权 信息收集 1、arp ┌──(root㉿ru)-[~/kali] └─# arp-scan -l Interface:…

tp5+workman(GatewayWorker) 安装及使用

一、安装thinkphp5 1、宝塔删除php禁用函数putenv、pcntl_signal_dispatch、pcntl_wai、pcntl_signal、pcntl_alarm、pcntl_fork&#xff0c;执行安装命令。 composer create-project topthink/think5.0.* tp5 --prefer-dist 2、配置好站点之后&#xff0c;浏览器打开访问成…

自动化网络故障修复管理

什么是故障管理 故障管理是网络管理的组成部分&#xff0c;涉及检测、隔离和解决问题。如果实施得当&#xff0c;网络故障管理可以使连接、应用程序和服务保持在最佳水平&#xff0c;提供容错能力并最大限度地减少停机时间。专门为此目的设计的平台或工具称为故障管理系统。 …

springboot基于Java的小区物业管理系统设计与实现

springboot基于Java的小区物业管理系统设计与实现 源码获取&#xff1a; https://docs.qq.com/doc/DUXdsVlhIdVlsemdX

初始SpringBoot:详解特性和结构

&#x1f3e1;浩泽学编程&#xff1a;个人主页 &#x1f525; 推荐专栏&#xff1a;《深入浅出SpringBoot》《java项目分享》 《RabbitMQ》《Spring》《SpringMVC》 &#x1f6f8;学无止境&#xff0c;不骄不躁&#xff0c;知行合一 文章目录 前言一、SpringBoot…

Android集成OpenSSL实现加解密-集成

导入so 将编译生成的 OpenSSL 动态库文件&#xff08;.so 文件&#xff09;复制到你的 Android 项目的 libs 目录中 导入头文件 将编译生成的include文件夹导入到项目中 build.gradle添加配置 defaultConfig {……testInstrumentationRunner "androidx.test.runner…

20231231_小米音箱接入GPT

参考资料&#xff1a; GitHub - yihong0618/xiaogpt: Play ChatGPT and other LLM with Xiaomi AI Speaker *.设置运行脚本权限 Set-ExecutionPolicy -ExecutionPolicy RemoteSigned *.配置小米音箱 ()pip install miservice_fork -i https://pypi.tuna.tsinghua.edu.cn/sim…

TikTok真题第11天 | 1249.移除无效的括号、23.合并K个升序链表、773.滑动谜题

今天开始整hard题&#xff0c;果然费时。 1249.移除无效的括号 题目链接&#xff1a;1249.minimum-remove-to-make-valid-parentheses 解法&#xff1a; 这个题用栈来处理&#xff0c;用栈来记录左括号的位置&#xff0c;同时用一个向量来记录左括号和右括号是否有效&#x…

Navicat里修改表名和字段名的方法

一 修改表名 如图右键点击表名&#xff0c;选择“重命名”&#xff0c;输入新表名后&#xff0c;再敲回车键就可以保存。注意&#xff1a;新表名不能与已经有的表名重复。 二 修改字段名字及类型 第一步 如图右键点击表名&#xff0c;选择“设计表” 第二步 点击字段名字就可…

二叉堆的简单板子+理解+例题

首先&#xff0c;我们先要了解堆是什么&#xff1f; 堆&#xff1a;是一种高级树状数据结构&#xff0c;是一种完全二叉树。 &#xff08;完全二叉树指的是&#xff0c;除了叶子节点&#xff0c;每个节点均有左右两个子节点的树状结构&#xff09; 而&#xff0c;二叉堆是堆的最…

古有华山论剑,今有流程之争|谁在误导人?

有意思&#xff0c;今天被人怼了&#xff0c;说我误导人。 起因是我前些天写过两篇文章&#xff0c;第一篇是&#xff1a;Nextflow生物信息流程&#xff08;一&#xff09;&#xff1a;简介 一个入门帖子&#xff0c;反响平平。我原本也是打算好好学习一下 Nextflow 来着&#…