STM32---FreeRTOS內存管理實驗

一、簡介

1、FreeRTOS內存管理簡介

2、FreeRTOS提供的內存管理算法?

1、heap_1內存管理算法?

2、heap_2內存管理算法?

?4、heap_4內存管理算法?

?5、heap_5內存管理算法??

二、FreeRTOS內存管理相關API函數介紹?

三、?FreeRTOS內存管理實驗

1、代碼

main.c?

#include "stm32f10x.h"
#include "FreeRTOS.h"
#include "task.h"
#include "freertos_demo.h"
#include "Delay.h"
#include "sys.h"
#include "usart.h"
#include "LED.h"
#include "Key.h"int main(void){	NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);//設置系統中斷優先級分組 4 uart_init(115200);	 delay_init();Key_Init();LED_Init();// 創建任務FrrrRTOS_Demo();}

freertos_dome.c

#include "FreeRTOS.h"
#include "task.h"
#include "semphr.h"
#include "LED.h"
#include "Key.h"
#include "usart.h"
#include "delay.h"/******************************************************************任務配置****************************************************/
//任務優先級
#define START_TASK_PRIO					1
//任務堆棧大小	
#define START_TASK_STACK_SIZE 	128  
//任務句柄
TaskHandle_t StartTask_Handler;
//任務函數
void start_task(void *pvParameters);//任務優先級
#define TASK1_PRIO							2
//任務堆棧大小	
#define TASK1_STACK_SIZE 				128  
//任務句柄
TaskHandle_t Task1_Handler;
//任務函數
void task1(void *pvParameters);/******************************************************************任務函數****************************************************/QueueHandle_t		semaphore_handle;					//二值信號量句柄void FrrrRTOS_Demo(void)
{semaphore_handle = xSemaphoreCreateBinary();if(semaphore_handle != NULL){printf("\r\n二值信號量創建成功\r\n");		}//創建開始任務xTaskCreate((TaskFunction_t )start_task,            			//任務函數( char*         )"start_task",          			//任務名稱(uint16_t       )START_TASK_STACK_SIZE, 			//任務堆棧大小(void*          )NULL,                  			//傳遞給任務函數的參數(UBaseType_t    )START_TASK_PRIO,       			//任務優先級(TaskHandle_t*  )&StartTask_Handler);   			//任務句柄 // 啟動任務調度vTaskStartScheduler();}void start_task(void *pvParameters)
{taskENTER_CRITICAL();           //進入臨界區//創建1任務xTaskCreate((TaskFunction_t )task1,     	(const char*    )"task1",   	(uint16_t       )TASK1_STACK_SIZE, (void*          )NULL,				(UBaseType_t    )TASK1_PRIO,	(TaskHandle_t*  )&Task1_Handler); vTaskDelete(NULL); 							//刪除開始任務taskEXIT_CRITICAL();            //退出臨界區
}//1 申請和釋放內存并顯示剩余內存信息
void task1(void *pvParameters)
{uint8_t		 key = 0;uint8_t		 t = 0;uint8_t	*	buffer = NULL;while(1){key = Key_GetNum();if(key == 2){buffer = pvPortMalloc(30);																			//申請內存if(buffer != NULL){printf("申請內存成功\r\n");}else{printf("申請內存失敗\r\n");};}else	if(key == 3){if(buffer != NULL){vPortFree(buffer);printf("釋放內存\r\n");}//釋放內存}if(t++>50){t = 0;printf("剩余內存空間大小為:%d\r\n",xPortGetFreeHeapSize());}vTaskDelay(10);}
}

key.c

#include "stm32f10x.h"                  // Device header
#include "FreeRTOS.h"
#include "task.h"
#include "usart.h"
#include "Delay.h"/*** 函    數:按鍵初始化* 參    數:無* 返 回 值:無* 按鍵:PB4/PB12/PB14*/
void Key_Init(void)
{GPIO_InitTypeDef GPIO_InitStructure;/*開啟時鐘*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);		//開啟GPIOB的時鐘/*GPIO初始化*/GPIO_InitStructure.GPIO_Mode 	= GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin 	= GPIO_Pin_4 | GPIO_Pin_12 | GPIO_Pin_14;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);						
}/*** 函    數:按鍵獲取鍵碼* 參    數:無* 返 回 值:按下按鍵的鍵碼值,范圍:0~3,返回0代表沒有按鍵按下* 注意事項:此函數是阻塞式操作,當按鍵按住不放時,函數會卡住,直到按鍵松手*/
uint8_t Key_GetNum(void)
{uint8_t KeyNum = 0;																				//定義變量,默認鍵碼值為0if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_4) == 0)			  //讀PB4輸入寄存器的狀態,如果為0,則代表按鍵1按下{KeyNum= GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_4);delay_xms(20);																					//延時消抖while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_4) == 0);	//等待按鍵松手delay_xms(20);																					//延時消抖KeyNum = 1;																							//置鍵碼為1}if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_12) == 0)			{KeyNum= GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_12);delay_xms(20);											while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_12) == 0);	delay_xms(20);									KeyNum = 2;											}if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_14) == 0)			{KeyNum= GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_14);delay_xms(20);											while (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_14) == 0);	delay_xms(20);									KeyNum = 3;											}return KeyNum;																						//返回鍵碼值,如果沒有按鍵按下,所有if都不成立,則鍵碼為默認值0
}

2、實驗解析

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

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

相關文章

常見的前端安全問題

前端安全是 Web 開發中至關重要的一環,以下是常見的前端安全問題及對應的防御措施: 1. XSS(跨站腳本攻擊) 攻擊原理 攻擊者向頁面注入惡意腳本(如 JavaScript),在用戶瀏覽器中執行,…

【VUE】ant design vue實現表格table上下拖拽排序

適合版本&#xff1a;ant design vue 1.7.8 實現效果&#xff1a; 代碼&#xff1a; <template><div class"table-container"><a-table:columns"columns":dataSource"tableData":rowKey"record > record.id":row…

深入解析ES6+新語法:復雜的迭代器與生成器

一、迭代器&#xff08;Iterator&#xff09;&#xff1a;數據遍歷的統一協議 1. 迭代器協議的本質 **迭代器協議&#xff08;Iterator Protocol&#xff09;** 是一種標準化的數據訪問接口&#xff0c;它要求對象實現一個 next() 方法&#xff0c;每次調用返回包含 { valu…

LangChain介紹(開源大語言模型LLM應用構建框架,提供完整工具和組件,使開發者能夠創建復雜、交互式且上下文感知的LLM應用)LangServe

文章目錄 LangChain&#xff1a;構建LLM應用的強大框架引言LangChain核心理念- 超越模型訓練數據的局限性- 訪問最新信息- 與外部系統交互- 執行復雜推理鏈 核心組件體系1. 模型&#xff08;Models&#xff09;- **LLMs**&#xff1a;如OpenAI、Anthropic、Cohere等提供的完成型…

微軟 System Center Configuration Manager(SCCM)的組件文件

微軟 System Center Configuration Manager(SCCM) 或 Microsoft Endpoint Configuration Manager(MECM) 的組件文件,屬于企業級設備管理工具的一部分。以下是具體說明: C:\Windows\CCM\smsswd.exe C:\Windows\CCM\tsmanager.exe smsswd.exe 和 tsmanager.exe 是 Micros…

Java設計模式建模語言面向對象設計原則

設計模式 設計模式的概念 設計模式最初用于建筑領域的設計中。 軟件的設計模式&#xff0c;又稱設計模式&#xff0c;是一套被反復使用&#xff0c;多數人知道的&#xff0c;經過分類編目的&#xff0c;代碼設計經驗的總結。 它描述了在軟件設計過程中的一些不斷重復發生的…

uniapp 實現微信小程序電影選座功能

拖動代碼 /*** 獲取點擊或觸摸事件對應的座位位置* 通過事件對象獲取座位的行列信息* param {Event|TouchEvent} event - 點擊或觸摸事件對象* returns {Object} 返回座位位置對象&#xff0c;包含行(row)和列(col)信息&#xff0c;若未找到有效位置則返回 {row: -1, col: -1}*…

Docker - 切換源 (Linux / macOS)

文章目錄 Linux 系統macOS 系統 Linux 系統 修改配置文件&#xff1a;/etc/docker/daemon.json "registry-mirrors": ["https://docker.mirrors.ustc.edu.cn","https://hub-mirror.c.163.com"]驗證是否修改成功&#xff1a; docker info重啟 …

RocketMQ的安裝及配置(windows)

1. 環境準備 JDK需要先安裝好。 1. RocketMQ是用Java語言寫的&#xff0c;所以需要JDK的支持。2. 下載RocketMQ 建議下載這個低版本的 https://rocketmq.apache.org/release-notes/2020/12/21/4.8.0/ 下載之后解壓即可&#xff0c;目錄結構如下&#xff1a; 3. 配置RocketM…

【運維自動化-標準運維】如何實現一個最簡單的流程編排

流程編排是標準運維最核心的功能&#xff0c;通過將不同功能的原子插件在畫布上可視化的拖拽編排&#xff0c;可以實現各種不同場景的跨系統工作流。標準運維流程 根據實際運維操作場景梳理出來的操作步驟&#xff0c;通過不同的流轉邏輯&#xff08;并行、分支、條件并行&…

性能測試之grafana展示jmeter測試指標與主機監控

性能測試之grafana展示jmeter測試指標與主機監控 背景 ? 公司新的項目準備開展性能測試,之前性能監控主要使用的jmeter的插件jpgc-Transactions per Second 與 jpgc- Response Times Over Time 與 jpgc - Active Threads Over Time等等插件監控性能指標結果,PerfMon Metrics…

1~2 課程簡介+ESP32-IDF環境搭建(虛擬機Linux環境下)

嗶站“宸芯IOT”視頻鏈接 一、課程內容介紹 1.什么是ESP32 ESP32是集成2.4GHz Wi-Fi和藍牙雙模的單芯片方案&#xff0c;具有超高的射頻性能、穩定性、通用性和可靠性&#xff0c;以及超低的功耗&#xff0c;滿足不同的功耗需求&#xff0c;適用于各種應用場景。ESP32是ESP8…

Vue3一個組件綁定多個 v-model,自定義 prop 和 event 名稱

Vue3一個組件綁定多個 v-model&#xff0c;自定義 prop 和 event 名稱 Vue3中v-model默認使用modelValue作為prop&#xff0c;update:modelValue作為事件&#xff0c;而Vue2使用的是value和input。此外&#xff0c;Vue3允許通過參數的方式為組件添加多個v-model綁定&#xff0…

YOLOv11小白的進擊之路(九)創新YOLO11損失函數之NWD損失函數源碼解讀

之前的博客也有對YOLO11的損失函數進行過源碼分析&#xff0c;可以參考&#xff1a;YOLOv11小白的進擊之路&#xff08;六&#xff09;創新YOLO的iou及損失函數時的源碼分析_yolov11的損失函數是什么-CSDN博客最近在做小目標檢測的時候注意到了NWD損失函數&#xff0c;這里對其…

VLN 論文精讀(四)Dynamic Path Navigation for Motion Agents with LLM Reasoning

這篇筆記用來描述2025年發表在arxiv上的一篇有關VLN領域的論文&#xff0c;由港科大和達特茅斯大學聯合發布&#xff0c;其核心思想有以下幾點&#xff1a; 將3D環境轉化為2D平面&#xff1b;2D平面中障礙物分布、機器人起點與終點信息用稀疏矩陣形式進行描述&#xff1b;與LL…

vue3之寫一個aichat ----vite.config.js

vite.config.js的CSS配置 postcss-pxtorem 開發響應式網頁的時候需要用到postcss-pxtorem amfe-flexible amfe-flexible是由阿里團隊開發的一個庫&#xff0c;它可以根據設備的屏幕寬度去動態調整HTML根元素()的字體大小&#xff0c;這意味著無論用戶使用什么尺寸的設備訪問你…

寶石PDF,全新 PC 版本,全部免費

寶石PDF已經運行 3 年時間&#xff0c;有客戶端&#xff0c;小程序&#xff0c;一直未上 PC 版本&#xff0c;隨著客戶端功能升級的不及時&#xff0c;很多用戶建議上 PC 版本。但是飛哥一直忙&#xff0c;這不終于給上了。 同時系統的名稱也從 “PDF云轉換”改為“寶石PDF”&…

.NET8使用EF Core連接SQLite

使用框架 .NET8 在nuget中&#xff0c;需要安裝包&#xff1a; SQLitePCLRaw.bundle_e_sqlite3&#xff0c;版本 2.1.10 Microsoft.EntityFrameworkCore.Sqlite.Core&#xff0c;版本 9.0.0 using Microsoft.Data.Sqlite; using Microsoft.EntityFrameworkCore; using Microso…

HTML課后實踐

實驗一 【實驗原理】 在搜索引擎的文本分析中&#xff0c;標題的信息權重要比正文的大&#xff0c;所以標題的樣式非常重要。本實驗通過把標題標記和常規文本進行對比輸出&#xff0c;掌握標題標簽的用法。在網頁中&#xff0c;有時需要為文字設置粗體、斜體或下劃線效果&#…

【紫光同創FPGA開發常用工具】FPGACPLD的下載與固化

文檔內容適配技術問題說明&#xff08;非正文&#xff09;&#xff1a; 1、FPGA&CPLD如何下載位流文件&#xff1b; 2、FPGA外部flash如何固化位流文件&#xff1b; 3、PDS軟件燒錄界面如何新增用戶flash&#xff1b; 4、CPLD內部flash如何固化位流文件&#xff1b; F…