STM32---FreeRTOS内存管理实验

devtools/2025/3/25 23:48:23/

一、简介

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.ppmy.cn/devtools/169293.html

相关文章

SpringSecurity——前后端分离登录认证

SpringSecurity——前后端分离登录认证的整个过程 前端&#xff1a; 使用Axios向后端发送请求 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>登录</title><script src"https://cdn…

我的ffmpeg爬坑之路(3)

3. 使用静态构建版本&#xff08;免安装&#xff09;‌ 从官方静态构建页面下载预编译的二进制文件&#xff0c;解压后直接使用&#xff1a; # 下载&#xff08;替换最新版本号&#xff09; wget https://johnvansickle.com/ffmpeg/releases/ffmpeg-release-amd64-static.tar…

今日春分节气,是旅游旺季的起点

许久没尽“人民体验官”的推广义务了&#xff0c;今天“人民体验官”推广“人民日报-人民微博”官方自媒体平台发表的《今日&#xff0c;春分》&#xff0c;同时科普一些相关春分的知识。 截图&#xff1a;来源人民微博 ​人民微博告诉大家&#xff1a;“春分是春季的第四个节…

区跨链密码学

1. 哈希算法&#xff08;Hash&#xff09; ❓1.1 什么是哈希算法&#xff1f;区块链中为什么需要哈希&#xff1f; 哈希算法是一种不可逆的、确定性的、固定长度的散列函数&#xff0c;用于将输入数据映射成固定长度的字符串。 在区块链中的作用&#xff1a; 数据完整性&am…

【含文档+PPT+源码】基于微信小程序农家乐美食餐厅预约推广系统

项目介绍 本课程演示的是一款基于微信小程序农家乐美食餐厅预约推广系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套系统 …

逻辑派G1 6层高速板学习

逻辑派G1 6层高速板学习 一、原理图分析二、电源分析三、网表导入四、板框导入五、PCB快捷键导入与设置六、模块抓取以及接口器件布局七、模块化布局--预布局&#xff08;先放各模块中的大器件&#xff09;1 HDMI模块布局2 MCU模块布局3 FPGA模块布局4 DDR3模块布局5 DCDC电源模…

使用pycel将Excel移植到Python

1.适用需求 有些工作可能长期适用excel来进行公式计算&#xff0c;当需要把工作流程转换为可视化界面时&#xff0c;开发人员不懂专业逻辑&#xff0c;手动摸索公式很大可能出错&#xff0c;而且费时费力 2.可用工具及缺点 pandas 方便进行数据处理&#xff0c;支持各种格…

CHM(ConcurrentHashMap)中的 sizeCtl 的作用与值变化详解

学海无涯&#xff0c;志当存远。燃心砺志&#xff0c;奋进不辍。愿诸君得此鸡汤&#xff0c;如沐春风&#xff0c;学业有成。若觉此言甚善&#xff0c;烦请赐赞一枚&#xff0c;共励学途&#xff0c;同铸辉煌 ConcurrentHashMap常简写为CHM&#xff0c;尤其是在讨论并发编程时。…