【UCOS-III】自我学习笔记→第37讲→内存管理实验

news2024/12/25 0:43:34

文章目录

    • 前言
      • 实验步骤
        • 1.复制消息队列工程,并创建OS内存区句柄和内存地址,并删除task2\task3及其相关内容
        • 2.修改task1任务函数
        • 3.查看串口现象
      • 测试代码
      • 工程文件
      • 总结

前言

无,仅作记录,不具有参考价值,所用开发板为STM32F411RET6nucleo开发板。

实验步骤

1.复制消息队列工程,并创建OS内存区句柄和内存地址,并删除task2\task3及其相关内容

在这里插入图片描述
在这里插入图片描述

2.修改task1任务函数

在这里插入图片描述

3.查看串口现象

在这里插入图片描述

测试代码

us-os3_demo.c:

/**
 ****************************************************************************************************
 * @file        uc-os3_demo.c
 * @author      ÕýµãÔ­×ÓÍŶÓ(ALIENTEK)
 * @version     V1.0
 * @date        2022-04-13
 * @brief       uC/OS-III ÒÆֲʵÑé
 * @license     Copyright (c) 2020-2032, ¹ãÖÝÊÐÐÇÒíµç×ӿƼ¼ÓÐÏÞ¹«Ë¾
 ****************************************************************************************************
 * @attention
 *
 * ʵÑéƽ̨:ÕýµãÔ­×Ó Ì½Ë÷Õß F407¿ª·¢°å
 * ÔÚÏßÊÓƵ:www.yuanzige.com
 * ¼¼ÊõÂÛ̳:www.openedv.com
 * ¹«Ë¾ÍøÖ·:www.alientek.com
 * ¹ºÂòµØÖ·:openedv.taobao.com
 *
 ****************************************************************************************************
 */

#include "uc-os3_demo.h"
#include "./MALLOC/malloc.h"
/*uC/OS-III*********************************************************************************************/
#include "os.h"
#include "cpu.h"
#include "main.h"
#include "key.h"
#include "stdio.h"
#include "interrupt.h"

extern struct keys key[4];
/******************************************************************************************************/
/*uC/OS-IIIÅäÖÃ*/

/* START_TASK ÈÎÎñ ÅäÖÃ
 * °üÀ¨: ÈÎÎñÓÅÏȼ¶ ÈÎÎñÕ»´óС ÈÎÎñ¿ØÖÆ¿é ÈÎÎñÕ» ÈÎÎñº¯Êý
 */
#define START_TASK_PRIO				5
#define START_TASK_STACK_SIZE 256
CPU_STK start_task_stack[START_TASK_STACK_SIZE];
OS_TCB start_task_tcb;

void start_task(void * p_arg);

/* TASK1 ÈÎÎñ ÅäÖÃ
 * °üÀ¨: ÈÎÎñÓÅÏȼ¶ ÈÎÎñÕ»´óС ÈÎÎñ¿ØÖÆ¿é ÈÎÎñÕ» ÈÎÎñº¯Êý
 */
#define TASK1_PRIO				4
#define TASK1_STACK_SIZE 256
CPU_STK * task1_stack;
OS_TCB task1_tcb;

void task1(void * p_arg);

OS_MEM OSmem;
static unsigned char OSmemBuffer[10][100];

/**
 * @brief       uC/OS-IIIÀý³ÌÈë¿Úº¯Êý
 * @param       ÎÞ
 * @retval      ÎÞ
 */
void uc_os3_demo(void)
{
    OS_ERR err;
    
    /* ³õʼ»¯uC/OS-III */
    OSInit(&err);
    OSTaskCreate (  (OS_TCB        *) &start_task_tcb,
                    (CPU_CHAR      *) "start_task",
                    (OS_TASK_PTR    ) start_task,
                    (void          *) 0,
                    (OS_PRIO        ) START_TASK_PRIO,
                    (CPU_STK       *) start_task_stack,
                    (CPU_STK_SIZE   ) START_TASK_STACK_SIZE / 10,
                    (CPU_STK_SIZE   ) START_TASK_STACK_SIZE,
                    (OS_MSG_QTY     ) 0,
                    (OS_TICK        ) 0,
                    (void          *) 0,
                    (OS_OPT         ) (OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
                    (OS_ERR        *) &err);
    /* ¿ªÊ¼ÈÎÎñµ÷¶È */
    OSStart(&err);
}

void start_task(void * p_arg)
{
	OS_ERR err;
	CPU_INT32U cnts = 0;
	CPU_Init();
	CPU_SR_ALLOC();
	

	cnts = HAL_RCC_GetSysClockFreq() / OS_CFG_TICK_RATE_HZ;
	OS_CPU_SysTickInit(cnts);
	/* ´´½¨Ò»¸öÄÚ´æÇø */
	OSMemCreate (&OSmem, "OSmem", OSmemBuffer, 10, 100, &err);

	CPU_CRITICAL_ENTER(); /* ½øÈëÁÙ½çÇø */
	task1_stack = mymalloc(SRAMIN, TASK1_STACK_SIZE * sizeof(CPU_STK));
	/* ´´½¨task1 */
	OSTaskCreate ((OS_TCB        *) &task1_tcb,
								(CPU_CHAR      *) "task1",
								(OS_TASK_PTR    ) task1,
								(void          *) 0,
								(OS_PRIO        ) TASK1_PRIO,
								(CPU_STK       *) task1_stack,
								(CPU_STK_SIZE   ) TASK1_STACK_SIZE / 10,
								(CPU_STK_SIZE   ) TASK1_STACK_SIZE,
								(OS_MSG_QTY     ) 0,
								(OS_TICK        ) 0,
								(void          *) 0,
								(OS_OPT         ) (OS_OPT_TASK_STK_CHK | OS_OPT_TASK_STK_CLR),
								(OS_ERR        *) &err);

		CPU_CRITICAL_EXIT(); /* Í˳öÁÙ½çÇø */
		printf("ÕýÔÚ´´½¨ÖÐ\r\n");
		OSTaskDel((OS_TCB*)0, &err); //±ðÍüÁËɾ³ýÈÎÎñStart
}

/* °´¼üÅжϣ¬KEY0¶Ì°´ÉêÇëÄÚ´æ¿é£¬³¤°´ÊÍ·ÅÄÚ´æ¿é£¬²¢´òÓ¡ÌáʾÐÅÏ¢ */
void task1(void * p_arg)
{
	OS_ERR err;
	unsigned int task1_num = 0;
	unsigned char *memBlocksGet;
	while(1)
	{
		if(key[0].single_flag)
		{
			memBlocksGet = OSMemGet(&OSmem, &err); /* ÉêÇëÄÚ´æ¿é */
			if(memBlocksGet != NULL)
			{
				printf("ÄÚ´æ¿éÉêÇë³É¹¦!!²¢ÇÒÄÚ´æ¿ìµÄÆäʵµØÖ·:0x%p\r\n", memBlocksGet);
			}
			else
			{
				printf("ÄÚ´æ¿éÉêÇëʧ°Ü!!\r\n");
			}
			key[0].single_flag = 0;
		}
		if(key[0].long_flag)
		{
			if(memBlocksGet != NULL)
			{
				OSMemPut(&OSmem, memBlocksGet, &err); /* ÊÍ·ÅÄÚ´æ¿é */
				printf("ÊÍ·ÅÄÚ´æ¿é!!\r\n");
				memBlocksGet = NULL;
			}
			key[0].long_flag = 0;
		}
		if(++task1_num % 100 == 0)
		{
			task1_num = 0;
			printf("¿ÕÏÐÄÚ´æ¿éµÄÊýÁ¿Îª:%d\r\n", OSmem.NbrFree);
		}
		OSTimeDly(10, OS_OPT_TIME_DLY, &err);
	}
}


工程文件

内存管理实验

总结

要么每申请一次就要释放一次,要么每释放一次就用一个指针存放,否则会导致内存泄漏现象产生
【正点原子】手把手教你学UCOS-III实时操作系统第37讲内存管理实验

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

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

相关文章

记一次docker-compose的坎坷安装经历

最近公司在做一个kafka项目,所以想用docker来安装kafka集群,所以安装完docker后就准备安装docker-compose,但在安装过程中确碰到了各种问题,搞了两个半天再通过翻墙工具才终于搞定。 首先看了篇文章显示安装前要对应docker版本。 …

Spring Boot 中的 @Transactional 注解是什么,原理,如何使用

Spring Boot 中的 Transactional 注解是什么,原理,如何使用 简介 在 Spring Boot 中,Transactional 注解是非常重要的一个注解,用于实现数据库事务的管理。通过使用 Transactional 注解,我们可以很方便地对事务进行控…

用Docker部署Nginx

部署步骤: 1.拉取镜像 docker pull nginx 2.创建并进入容器 docker run -d --name nginx01 -p 3344:80 nginx #注意nginx01是起的名字,3344是公网访问的端口,80是Nginx的默认端口 3.启动Nginx curl localhost:3344 4.在我的windows系统访…

OAuth2:使用Gitee第三方授权

gitee OAuth2文档 1. 配置授权页url 传入client_id(创建应用获得)、redirect_uri(需要通过第三方授权跳转的url) https://gitee.com/oauth/authorize?client_id{client_id}&redirect_uri{redirect_uri}&response_type…

ACSNet分割模型搭建

原论文:Adaptive Context Selection for Polyp Segmentation源码:https://github.com/ReaFly/ACSNet. 直接步入正题~~~ 一、基础模块 class ConvBlock(nn.Module):def __init__(self, in_channels, out_channels, kernel_size, stride, padding):supe…

linux下卸载vmware

linux下卸载vmware 一、卸载二、vmware安装及使用 &emps;如果linux下安装了vmware系列产品,需要卸载或重装的,本文介绍了详细的卸载方法: 一、卸载 一般的发行版都不会带有vmware,所以通常是下载安装包来安装。这里主要说的就…

谷歌chrome浏览器所有历史版本下载及selenium自动化控制插件资源分享

使用python selenium做网页自动化开发的小伙伴经常需要用到google chrome浏览器以及chromedriver插件。 谷歌浏览器所有历史版本下载链接: chrome历史版本,点击下载 chromedriver插件下载地址:下载链接1:点击下载下载链接2…

一文了解python中pip的使用

目录 🍒pip的作用 🍒pip的使用 🍒运行python 🍓1.终端运行 🍓2.运行python文件 🍓3.pycharm 🍒IDE的概念 🦐博客主页:大虾好吃吗的博客 🦐专栏地址&#xff1…

scGen perturbation response prediction

如何利用scGen进行扰动响应预测 scGen是什么 scGen is a generative model to predict single-cell perturbation response across cell types, studies and species (Nature Methods, 2019). scGen is implemented using the scvi-tools framework. 文章传送门 Original tut…

Axure教程——100内的随机加减

本文介绍用Axure制作随机加减数效果 效果 预览地址https://ik31ey.axshare.com 制作 一、需要的元件: 2个动态面板,2个文本框,4个矩形,1个图片 二、制作过程 1、随机加 拖入一个矩形元件,命名为“被加数”&#xff…

MQ选手终极对决:比较几个主流MQ实现分布式事务的方案

1、MQ实现分布式事务 在分布式事务的实现中,ACK消息和半消息是两种实现分布式事务的两种不同机制,它们的共同点是都使用了两阶段提交的机制,但是它们的实现细节和适用场景有所不同。具有一些区别和特点。下面是ACK消息和半消息在实现分布式事…

暑期旅游市场火热,旅游行业如何做好邮件营销

随着2023年全国高考结束,以及各大高校毕业生也将陆续告别校园,许多学生都会用一场具有庆贺、欢聚意义的毕业旅游来为自己的高中生涯或大学生涯画上完美句号。携程数据显示,6月9日至8月底,高中和大学毕业生的旅游订单逐渐增多&…

QT 5.9.9 配置使用 MYSQL5.7 数据库

目录 Mysql下载安装 QT 下载安装 编译MYSQL mingw构建方式 msvc构建方式 QT中MYSQL测试使用 因为版权问题,Qt本身不自带Mysql数据库的驱动,因此如果想要借用Qt操作Mysql数据库,需要手动进行编译。 Mysql下载安装 【Qt】 Mysql服务端安装…

抖音seo账号矩阵系统源码搭建服务器内耗量?

一、短视频账号矩阵系统视频库存量技术云端如何处理? 1.抖音SEO账号矩阵系统源码搭建服务器内耗量怎么后端处理 非常低,可以轻松应对大量用户使用。通过服务器的高效运行,系统可以提供稳定的服务,并且快速响应用户的操作。源码搭…

2023年软件测试这个行业怎么样?

今天我要从一个新的角度来论述软件测试行业怎么样。 最近热搜新闻是张雪峰最近抨击的“新闻专业不要报,建议把孩子打晕后,随便选个专业都比新闻好”,重庆大学新闻学教授发文抨击张雪峰偏激言论,眼睛雪亮的人民群众却纷纷站队张雪…

C#复制构造函数学习

通过从另一个对象复制变量或将一个对象的数据复制到另一个对象来创建对象的构造函数称为复制构造函数。 复制构造函数是一个参数化构造函数,包含相同类类型的参数。它的主要用途是将新实例初始化为现有实例的值。 using System;namespace Mytest{class User {publi…

非凸科技金牌赞助“第三届中国Rust开发者大会”

6月17-18日,由Rust中文社区主办的“第三届中国Rust开发者大会”在上海圆满举行。非凸科技作为金牌赞助商,全力协助大会顺利开展,共同为中国 Rustaceans带来一场技术交流盛宴。 本次大会演讲主题内容广泛,涉及编程语言、量化金融、…

springboot mybatis-plus慢sql输出日志,log4jdbc使用

前言 无论使用原生JDBC、mybatis还是hibernate,使用log4j等日志框架可以看到生成的SQL,但是占位符和参数总是分开打印的,不便于分析,显示如下的效果: Log4jdbc 是一个开源 SQL 日志框架,它使用代理模式实现对常用的…

C++之operator重载运算符应用(一百四十一)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…

采集发布到WordPress指定文章作者

采集的数据发布到wordpress系统网站,指定发布文章的作者设置方法教程。 目录 1. 获取用户名 2. 对接采集器指定作者 3. 随机作者 1. 获取用户名 进入Wordpress系统后台,点击控制台左侧菜单的【用户】,再点击展开列表的【所有用户】&…