28-FreeRTOS內核控制-延時-臨界區

一、FreeRTOS的內核控制接口分析

1.1 函數taskYIELD

????????此函數用于進行任務切換,此函數本質上是一個宏。它允許當前任務主動放棄CPU使用權,將控制權轉移給調度器,以便調度器可以選擇另一個就緒任務運行。taskYIELD通常用于協作式多任務系統中,任務在沒有更多工作可做或需要等待某些事件時調用此函數。通過調用taskYIELD,任務可以顯式地讓出CPU資源,從而提高系統的響應性和效率。此外,taskYIELD的實現通常依賴于特定的硬件平臺和操作系統,以確保任務切換的原子性和正確性。

1.2 函數taskENTER_CRITICAL

????????進入臨界區(即共享資源區),用于任務函數中,此函數本質上是一個宏,它通過禁用中斷來確保任務在臨界區內執行時不會被其他任務或中斷打斷,從而保護共享資源的完整性和一致性。在進入臨界區后,任務可以安全地訪問和修改共享數據,而不會受到并發訪問的干擾。完成臨界區操作后,應調用taskEXIT_CRITICAL函數來恢復中斷并退出臨界區,以允許其他任務和中斷繼續執行。這種機制在多任務系統中尤為重要,尤其是在實時操作系統中,用于確保任務之間的同步和資源的正確管理。

1.3 函數taskEXIT_CRITICAL

????????退出臨界區,用于任務函數中,此函數本質上是一個宏,用于在任務執行過程中安全地退出臨界區,確保在退出臨界區時不會發生任務切換或中斷,從而保護共享資源的完整性。該宏通常會taskENTER_CRITICAL配對使用,以確保在進入和退出臨界區時的一致性。taskEXIT_CRITICAL的實現通常依賴于特定的操作系統或實時內核的底層機制,以提供高效的臨界區管理。

1.4函數taskENTER_CRITICAL_FROM_ISR

進入臨界區,用于中斷服務函數中,此函數本質上是一個宏。

1.5函數taskEXIT_CRITICAL_FROM_ISR

退出臨界區,用于中斷服務函數中,此函數本質上是一個宏。

1.6函數taskDISABLE_INTERRUPTS

關閉可屏蔽的中斷,此函數本質上是一個宏。

1.7函數taskENABLE_INTERRUPTS

打開可屏蔽的中斷,此函數本質上是一個宏。

1.8函數vTaskStartScheduler

啟動任務調度器,且會創建空閑任務。

1.9函數vTaskEndScheduler

關閉任務調度器。

1.10函數vTaskSuspendAll

掛起任務調度器,調用此函數不需要關閉可屏蔽中斷即可掛起任務調度器。

1.11?函數xTaskResumeAll

此函數用于將任務調度器從掛起狀態恢復。

臨界區指的是一個訪問共用資源(例如:共用設備或是共用存儲器)的程序片段,而這些共用資源又無法同時被多個線程訪問的特性。當有線程進入臨界區段時,其他線程或是進程必須等待(例如:bounded waiting 等待法),有一些同步的機制必須在臨界區段的進入點與離開點實現,以確保這些共用資源是被互斥獲得使用

二、睡眠延時函數

1.1 vTaskDelay(常用)

????????在UCOSIII 中延時函數OSTimeDly()可以設置為三種模式:相對模式、周期模式和絕對模式。在FreeRTOS中延時函數只有相對模式和絕對模式,在FreeRTOS中不同的模式用的函數不同,其中函數 vTaskDelay()是相對模式(相對延時函數),函數 vTaskDelayUntil()是絕對模式(絕對延時函數)。函數vTaskDelay()在文件 tasks.c中有定義,要使用此函數的話宏INCLUDE_vTaskDelay必須為1,函數代碼如下:

//xTicksToDelay:要延時的時間節拍數,該數值須大于0。void vTaskDelay( const TickType_t xTicksToDelay )

注意延時的時間為:節拍數*系統節拍時間

系統默認時間節拍:1ms(正常情況1ms請求一次任務切換)

系統已經使用配置Systick 1ms中斷一次,用于系統節拍時間,任務是基于系統節拍時間進行任務調度。

SysTick->LOAD,下圖是如何配置自己的時間節拍

系統節拍修改宏為configTICK_RATE_HZ, 系統節拍時間為:1/configTICK_RATE_HZ。系統節拍時間最好在1~10ms之間。過短,就是出現不是在切換任務就在切換任務的路上,過長,系統的實時性差。

1.2 vTaskDelayUntil(絕對延時)-了解

????????函數 vTaskDelayUntil()會阻塞任務,阻塞時間是一個絕對時間,那些需要按照一定的頻率運行的任務可以使用函數vTaskDelayUntil(),即使任務中執行的代碼逐漸添加,也能讓任務按照固定的頻率運行(要求:任務總的執行時間要小于延時時間)。


void vTaskDelayUntil( TickType_t * const pxPreviousWakeTime,const TickType_t xTimeIncrement )

代碼示例:

static void app_task1(void* pvParameters)
{for(;;){printf("app_task1 is running ...,tick count = %u\r\n",xTaskGetTickCount());/* 相對延時:任務延時2000個節拍,每個節拍為1ms,所以延時2000ms */vTaskDelay(2000);}
}   static void app_task2(void* pvParameters)
{uint32_t i=0,j=1;TickType_t xLastWakeTime;/* 初始化上次喚醒時間為當前時間 */xLastWakeTime = xTaskGetTickCount();//一次循環時間為2Sfor(;;){for(i=0; i<j*10000; i++);j+=10;printf("app_task2 is running ...,tick count = %u\r\n",xTaskGetTickCount());/* 絕對延時:任務延時2000個節拍,每個節拍為1ms,所以延時2000ms */		vTaskDelayUntil(&xLastWakeTime, 2000);}
} 

實驗效果:可知,每次延時2s(誤差可以省略)

app_task2 is running ...,tick count = 0app_task1 is running ...,tick count = 47app_task2 is running ...,tick count = 2002app_task1 is running ...,tick count = 2096app_task2 is running ...,tick count = 4005app_task1 is running ...,tick count = 4150

總結:

任務2使用絕對延時能夠給按照逼近2000個節拍頻率固定運行(當前計數值:0-2002-4005-6007-8009-10012),任務1使用相對延時每次運行相隔時間不保證固定(當前計數值:47-2096-4150-6206-8264-10326)。

1.3 相對延時與絕對延時對比

相對延時:只會延時其任務的相對時間

絕對延時:會把其他突發事件的時間也計算進來

三、自定義延時函數

2.1 微秒延時

void delay_us(uint32_t nus)
{		uint32_t ticks;uint32_t told,tnow,tcnt=0;uint32_t reload=SysTick->LOAD;	//系統定時器的重載值	    	 ticks=nus*(SystemCoreClock/1000000);//需要的節拍數 told=SysTick->VAL;        	//剛進入時的計數器值/* 掛起調度器[可選,會導致高優先級任務無法搶占當前任務,但能夠提高當前任務時間的精確性] */vTaskSuspendAll();	while(1){tnow=SysTick->VAL;if(tnow!=told){	 /* SYSTICK是一個遞減的計數器 */if(tnow<told)tcnt+=told-tnow;		else tcnt+=reload-tnow+told+1;	  told=tnow;/* 時間超過/等于要延遲的時間,則退出。*/if(tcnt>=ticks)break;			}  }/* 恢復調度器[可選] */xTaskResumeAll();
}  

使用us級延時,不要超1000us,過長時間的微秒延時會導致系統實時性。

2.2 毫秒延時

void delay_ms(uint32_t nms)
{vTaskDelay(nms);
}

延時整個項目的代碼示例:

https://download.csdn.net/download/m0_63622771/90887340

四、FreeRTOS共享資源的基本概述

1.1 基本概念

????????共享資源典型的共享資源有:全局變量、I/O設備中的寄存器、多個任務訪問的函數、緩沖區等。共享資源的可靠訪問,任務必須對數據具有獨享權變得極其重要,否則將可能導致任務間的競爭與數據損壞,進而引發系統崩潰、數據不一致、死鎖、資源泄露等問題。

????????為確保共享資源的安全訪問,通常需要采用互斥鎖、信號量、條件變量、原子操作等同步機制,以及設計合理的資源管理策略,如優先級繼承、資源分配協議等,以避免任務間的沖突并保證系統的穩定性和可靠性。

1.2 種類說明

最常用的獨占共享資源的方法有以下幾種:
  • 關中斷(就可以不會發送中斷了。所以獨占資源)
  • 禁止任務調度(給調度器上鎖,調度器停擺)
  • 使用信號量(計數型的型號量、二值信號量)
  • 使用互斥型信號量(互斥鎖)

? ? ? ?獲得獨占共享資源的方法,取決于代碼訪問共享資源的速度,即占用共享資源的時間(重點),具體使用說明如下表:

選擇題

1.以下請問使用( A )方式保護最為合適。

void T1(void *parg)
{while(1){ ...........喂狗    ...........        }
}A. 關中斷、開中斷    B.給調度器上鎖、解鎖    C.信號量    D.互斥鎖

2.以下請問使用( D )方式保護最為合適。

uint32 g=0;
void T1(void *parg)
{while(1){ ...........g++;	...........		}
}void T2(void *parg)
{uint32_t a=0;while(1){ ...........a = g;	...........		}
}A. 關中斷、開中斷    B.給調度器上鎖、解鎖    C.信號量     D.互斥鎖

3.以下請問使用( A )方式保護最為合適。

uint32 g=0;void T1(void *parg)
{while(1){ ...........g++;	...........		}
}void T2(void *parg)
{uint32_t a=0;while(1){ ...........a = g;	...........		}
}void USART1_IRQHandler(void)
{...........g = USART_ReceiveData(USART1);	...........  }A. 關中斷、開中斷    B.給調度器上鎖、解鎖    C.信號量    D.互斥鎖

4.以下請問使用( D )方式保護最為合適。

void T1(void *parg)
{while(1){ ...........printf("hello teacher.chen\r\n");	...........		}
}void T2(void *parg)
{while(1){ ...........printf("good bye teacher.chen\r\n");	...........		}
}A. 關中斷、開中斷    B.給調度器上鎖、解鎖    C.信號量    D.互斥鎖

5.以下請問使用( D )方式保護最為合適。

void T1(void *parg)
{while(1){ ...........printf("hello teacher.chen\r\n");	...........		}
}void T2(void *parg)
{while(1){ ...........printf("good bye teacher.chen\r\n");	...........		}
}void T3(void *parg)
{while(1){ ...........printf("he's teacher.chen\r\n");	...........		}
}A. 關中斷、開中斷    B.給調度器上鎖、解鎖    C.信號量    D.互斥鎖

辨析題

1.請分析以下代碼。

//高優先級
void T1(void *parg)
{while(1){ 調度器上鎖printf("hello teacher.chen\r\n");delay_ms(1000)	調度器解鎖		}
}
//低優先級
void T2(void *parg)
{while(1){ 調度器上鎖printf("good bye teacher.chen\r\n");delay_ms(1000)	調度器解鎖			}
}調度器上鎖,T1任務打印hello teacher.chen,執行delay_ms后導致停止了任務調度器,
導致兩個任務都無法執行。

2.請分析以下代碼。

void T1(void *parg)
{while(1){ 等待互斥鎖printf("hello teacher.chen\r\n");delay_ms(1000);釋放互斥鎖	}
}void T2(void *parg)
{while(1){ 等待互斥鎖printf("good bye teacher.chen\r\n");delay_ms(1000);釋放互斥鎖			}
}只有得到鎖的任務才能執行

3.請分析以下代碼。

void app_task_init(void *parg)
{創建信號量,初值為0
}void T1(void *parg)
{while(1){ 等待信號量printf("hello teacher.chen\r\n");釋放信號量		}
}void T2(void *parg)
{while(1){ 等待信號量printf("good bye teacher.chen\r\n");釋放信號量			}
}只有得到信號量的任務才能執行

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/80951.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/80951.shtml
英文地址,請注明出處:http://en.pswp.cn/web/80951.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

NtfsLookupAttributeByName函數分析之和Scb->AttributeName的關系

第一部分&#xff1a; VOID FindFirstIndexEntry ( IN PIRP_CONTEXT IrpContext, IN PSCB Scb, IN PVOID Value, IN OUT PINDEX_CONTEXT IndexContext ) { 。。。。。。 // // Lookup the attribute record from the Scb. // if (!NtfsLookupAt…

關閉 Ubuntu 20.04 的 GNOME Shell和PulseAudio

一、GNOME Shell GNOME Shell 是 Ubuntu 20.04 默認的桌面環境管理器。關閉它會失去圖形界面&#xff08;回到純終端模式&#xff09;&#xff0c;但可以節省內存和 CPU 資源。 方法 1&#xff1a;臨時關閉&#xff08;當前會話生效&#xff09; sudo systemctl stop gdm #…

Dijkstra算法——不帶負權的單源最短路徑

目錄 算法學習 算法原理 稠密圖Dijkstra模板 稀疏圖Dijkstra模板 練習 1 網絡延遲時間 2 到達最后一個房間的最少時間Ⅰ 3 到達最后一個房間的最少時間Ⅱ 4 訪問消失節點的最少時間 5 設計可以求最短路徑的圖類 6 概率最大的路徑 7 最小體力消耗路徑 8 從第一個節…

【安全攻防與漏洞?】??Heartbleed漏洞復現與修復

Heartbleed漏洞復現與修復 一、漏洞原理 Heartbleed漏洞&#xff08;CVE-2014-0160&#xff09; 是 OpenSSL 1.0.1 至 1.0.1f 版本中的一個嚴重內存泄漏漏洞。它源于 TLS 心跳擴展&#xff08;Heartbeat Extension&#xff09;協議中對請求長度字段的未校驗&#xff0c;導致攻…

力扣-最大連續一的個數

1.題目描述 2.題目鏈接 1004. 最大連續1的個數 III - 力扣&#xff08;LeetCode&#xff09; 3.代碼解答 class Solution {public int longestOnes(int[] nums, int k) {int zero0,length0;for(int left0,right0;right<nums.length;right){if(nums[right]0){zero;}while…

虛擬機Centos7:Cannot find a valid baseurl for repo: base/7/x86_64問題解決

問題 解決&#xff1a;更新yum倉庫源 # 備份現有yum配置文件 sudo cp -r /etc/yum.repos.d /etc/yum.repos.d.backup# 編輯CentOS-Base.repo文件 vi /etc/yum.repos.d/CentOS-Base.repo[base] nameCentOS-$releasever - Base baseurlhttp://mirrors.aliyun.com/centos/$relea…

Node.js 庫大全

在當今快速迭代的軟件開發領域&#xff0c;Node.js 憑借其強大的異步 I/O 處理能力和繁榮的生態系統&#xff0c;已成為全棧開發的核心技術。社區中涌現的無數實用庫&#xff0c;如同開發者手中的“瑞士軍刀”&#xff0c;能顯著提升效率、優化性能并保障安全。本文將系統梳理 …

如何評估物聯網框架的交互體驗?

物聯網&#xff08;IoT&#xff09;技術的快速發展推動了各類物聯網框架的涌現&#xff0c;但如何評估其交互體驗卻成為開發者和企業面臨的重要挑戰。交互體驗不僅涉及用戶界面&#xff08;UI&#xff09;的直觀性&#xff0c;還包括設備接入效率、協議兼容性、數據交互流暢度以…

3D個人簡歷網站 6.彈出框

3D個人簡歷網站 6.彈出框 在components下創建HomeInfo.jsx用于控制主頁彈出框信息 輸入rafce快速生成代碼塊 import React from reactconst HomeInfo () > {return (<div>HomeInfo</div>) }export default HomeInfo修改Home.jsx代碼實現彈出簡單效果 ……re…

在 ABP VNext 中集成 OpenCvSharp:構建高可用圖像灰度、壓縮與格式轉換服務

&#x1f680; 在 ABP VNext 中集成 OpenCvSharp&#xff1a;構建高可用圖像灰度、壓縮與格式轉換服務 &#x1f389; &#x1f4da; 目錄 &#x1f680; 在 ABP VNext 中集成 OpenCvSharp&#xff1a;構建高可用圖像灰度、壓縮與格式轉換服務 &#x1f389;&#x1f3af; 一、…

C++之STL--string

string 深入探索 C STL 中的 std::string一、std::string 的基本概念1. 內存管理2. 安全性 二、std::string 的構造與初始化1. 默認構造2. 從 C 風格字符串構造3. 從字符串的一部分構造4. 使用重復字符構造 三、std::string 的常用操作1. 字符串拼接2. 字符串比較3. 字符串查找…

網絡層——螞蟻和信鴿的關系VS路由原理和相關配置

前言&#xff08;&#x1f41c;??&#x1f54a;?&#xff09; 今天內容的主角是螞蟻&#xff08;動態路由&#xff09;和信鴿&#xff08;靜態路由&#xff09;&#xff0c;為什么這么說呢&#xff0c;來看一則小故事吧。 森林里&#xff0c;森林郵局要送一份重要信件&am…

在 Excel xll 自動注冊操作 中使用東方仙盟軟件2————仙盟創夢IDE

// 獲取當前工作表名稱string sheetName (string)XlCall.Excel(XlCall.xlfGetDocument, 7);// 構造動態名稱&#xff08;例如&#xff1a;Sheet1!MyNamedCell&#xff09;string fullName $"{sheetName}!MyNamedCell";// 獲取引用并設置值var namedRange (ExcelRe…

nginx日志

目錄 實驗要求&#xff1a; 實驗1&#xff1a; 1.使用vim打開/etc/nginx/nginx.conf查看內容 2.重新讀取文件并且重啟軟件 3.實時查看nginx日志 實驗2&#xff1a; 1.使用vim打開/etc/rsyslog.conf 2.配置此文件 3.保存退出后&#xff0c;將核心防護與防火墻關閉。 4.…

【高德開放平臺-注冊安全分析報告】

前言 由于網站注冊入口容易被黑客攻擊&#xff0c;存在如下安全問題&#xff1a; 暴力破解密碼&#xff0c;造成用戶信息泄露短信盜刷的安全問題&#xff0c;影響業務及導致用戶投訴帶來經濟損失&#xff0c;尤其是后付費客戶&#xff0c;風險巨大&#xff0c;造成虧損無底洞…

2024 CKA模擬系統制作 | Step-By-Step | 3、CKA考試系統的技術設置

目錄 免費獲取題庫配套 CKA_v1.31_模擬系統 一、免費提權配置 1、使用vim 編輯/etc/sudoers 二、安裝命令 1、安裝運行時接口命令 2、安裝Etcd命令 3、配置K8S命令自動補全 三、配置Kubectl 訪問集群 1、Master節點 2、Node01節點 四、SSH配置 1、Node01節點candi…

微信小程序請求扣子(coze)api的例子

1. 準備工作 在開始之前&#xff0c;確保已經完成了以下準備工作&#xff1a; 創建并發布了 Coze 智能體。獲取了個人訪問令牌&#xff08;Personal Access Token&#xff09;&#xff0c;這是用于授權的關鍵憑證。確認目標智能體的 Bot ID 和其他必要參數已準備就緒。 2. 請…

visual studio重新安裝如何修改共享組件、工具和SDK路徑方案

安裝了VsStudio后,如果自己修改了Shared路徑&#xff0c;當卸載舊版本&#xff0c;需要安裝新版本時發現&#xff0c;之前的Shared路徑無法進行修改&#xff0c;這就很坑了 但是卻遇到了路徑無法修改的問題…真讓人頭大&#xff0c;當然不修改也可以&#xff0c;有時候&#x…

【Python 算法零基礎 4.排序 ② 冒泡排序】

目錄 一、引言 二、算法思想 三、時間復雜度和空間復雜度 1.時間復雜度 2.空間復雜度 四、冒泡排序的優缺點 1.算法的優點 2.算法的缺點 五、實戰練習 88. 合并兩個有序數組 算法與思路 ① 合并數組 ② 冒泡排序 2148. 元素計數 算法與思路 ① 排序 ② 初始化計數器 ③ 遍歷數組…

Java設計模式之橋接模式:從入門到精通

文章目錄 1. 橋接模式概述1.1 定義與核心思想1.2 模式結構1.3 通俗理解2. 橋接模式詳解2.1 為什么需要橋接模式2.2 橋接模式與相關模式對比2.3 橋接模式的優缺點3. 橋接模式實現步驟3.1 實現步驟詳解3.2 代碼示例:遙控器與電視4. 橋接模式的高級應用4.1 多維度擴展4.2 與工廠模…