[RTX5][Memory] 使用OS自带的内存管理 osRtxMemoryAlloc() osRtxMemoryFree()

news/2024/7/20 14:49:21 标签: 单片机, RTX5, 内存管理

文章目录

  • 一、声明内存管理函数
  • 二、添加文件
    • (1) lib版本,无需添加,直接使用
    • (2)源文件版本 (旧版本需要手动添加,V5.5.3不需要)
  • 三、函数使用
    • (1)函数定义
    • (2)Demo

官方默认的RTX5是不能直接使用内存管理的,因为RTX5为了通过车规验证,所以把内存管理隐藏了

一、声明内存管理函数

// Memory Heap Library functions
extern uint32_t osRtxMemoryInit (void *mem, uint32_t size);
extern void    *osRtxMemoryAlloc(void *mem, uint32_t size, uint32_t type);
extern uint32_t osRtxMemoryFree (void *mem, void *block);

二、添加文件

(1) lib版本,无需添加,直接使用

在这里插入图片描述

(2)源文件版本 (旧版本需要手动添加,V5.5.3不需要)

在这里插入图片描述
如果没有,则手动添加:
rtx_memory.c x:\Keil_v5\Arm\Packs\ARM\CMSIS\5.8.0\CMSIS\RTOS2\RTX\Source\

三、函数使用

(1)函数定义

void* os_malloc(uint32_t size);
void* os_calloc(uint32_t size);
void os_free(void p);
mem_info_t
os_get_memory_info(void);

注:如果想使用malloc() free(),则需要重定义。
__asm(“.global __use_no_heap_region\n\t”); //声明不使用C库的堆
void* malloc(size_t size) {
return os_malloc(size);
}

void free(void* p) {
os_free§;
}

(2)Demo

//  Memory Pool Header structure
typedef struct {
  uint32_t size; // 最大内容量(Byte)
  uint32_t used; // 当前使用内存量(Byte)
} mem_info_t;

#ifdef LISUN_SDK
#include "ls_syscfg.h"
#else
#define LS_MEMORY_SIZE   (512)
#endif

// Memory Heap Library functions
extern uint32_t osRtxMemoryInit (void *mem, uint32_t size);
extern void    *osRtxMemoryAlloc(void *mem, uint32_t size, uint32_t type);
extern uint32_t osRtxMemoryFree (void *mem, void *block);

static uint64_t g_heap_size[LS_MEMORY_SIZE/8];
uint8_t g_mem_init = false;

__asm(".global __use_no_heap_region\n\t"); //声明不使用C库的堆
void* malloc(size_t size) {
    return os_malloc(size);
}

void free(void* p) {
    os_free(p);
}

os_status os_kernel_initialize(void) {
    if (osRtxMemoryInit(g_heap_size, LS_MEMORY_SIZE))
        g_mem_init = true;
    return (os_status)osKernelInitialize();
}

void* os_malloc(uint32_t size) {
    if (!g_mem_init) return NULL;
    __asm volatile ("cpsid i" : : : "memory");
    char *p = osRtxMemoryAlloc(g_heap_size, size, 0);
    __asm volatile ("cpsie i" : : : "memory");
    return p;
}

void* os_calloc(uint32_t size) {
    if (!g_mem_init) return NULL;
    __asm volatile ("cpsid i" : : : "memory");
    char *p = osRtxMemoryAlloc(g_heap_size, size, 0);
    __asm volatile ("cpsie i" : : : "memory");
    return p;
}

void os_free(void *p) {
    if (!g_mem_init) return;
    __asm volatile ("cpsid i" : : : "memory");
    osRtxMemoryFree(g_heap_size, p);
    __asm volatile ("cpsie i" : : : "memory");
}

mem_info_t* os_get_memory_info(void) {
    if (!g_mem_init) return NULL;
    return (mem_info_t*)g_heap_size;
}

http://www.niftyadmin.cn/n/100200.html

相关文章

【一天一门编程语言】Go 语言程序设计极简教程

文章目录Go 语言程序设计极简教程Go 语言程序设计极简教程第一章:Go 语言基础1.1 Go 语言简介1.2 Go 语言安装1.2.1 下载安装包1.2.2 安装 Go 语言1.3 Go 语言环境变量第二章:Go 语言基础语法2.1 Go 语言基本语法2.1.1 变量定义2.1.2 函数定义2.1.3 数据…

阿里巴巴内网 Java 面试 2000 题解析(2023 最新版)

前言 这份面试清单是今年 1 月份之后开始收集的,一方面是给公司招聘用,另一方面是想用它来挖掘在 Java 技术栈中,还有一些知识点是我还在探索的,我想找到这些技术盲点,然后修复它,以此来提高自己的技术水平…

【java基础】static和final关键字的作用及其用法详解

文章目录static关键字静态字段静态方法静态代码块静态内部类final关键字final字段final方法final类static关键字 这个关键字表示静态的,用于不同地方意思不一样 静态字段 如果我们将其作用到字段上,那么该字段为类所拥有,我们使用new关键字…

c# ini(配置文件)文件读写(简单类)

//本文列出了ini类,不考虑节(section)。//所谓ini文件是扩展名为ini的文本文件,常用于保存和读取配置文件。//如下所示://userJackMa//password123456//在等号的左边是key,右边是value,一个对应一个value.//本文中的value是字符串…

JavaEE|TCP/IP协议栈之TCP协议工作机制下

文章目录一、滑动窗口二、流量控制三、拥塞控制四、延时应答五、捎带应答六、面向字节流(了解)七、异常情况(了解)关于其他传输层协议一、滑动窗口 为什么要引入滑动窗口? 确认应答和超时重传为TCP可靠传输机制提供支持…

Python每日一练(20230226)

1. 合并列表中字典字段 如下两个列表,需要将oldList转化为newList,去掉相同字段的字典,并且去掉的参数里面的值要相加。 oldList [{0-0: 0, 0-1: 0, 0-2: 0, 0-3: 1972}, {3-3: 203, 3-2: 0, 3-1: 0, 3-0: 0}, {0-0: 0, 0-1: 0, 0-2: 0, 0…

第十三章 系统错误消息 - 一般系统错误消息 S - Z

文章目录第十三章 系统错误消息 - 一般系统错误消息 S - Z第十三章 系统错误消息 - 一般系统错误消息 S - Z 错误代码描述<SUBSCRIPT>下标值不合法或Global引用过长。<SWIZZLE FAIL>打开了一个oref&#xff0c;然后试图在另一个无法引用的相关对象中进行搅拌。这可…

ChatGPT 开发人员教程 - 38种提高工作效率10倍的方法

未来的时代&#xff0c;又将是一个“洋枪洋炮”对“大刀长矛”的时代。在过去的十年里&#xff0c;传统行业在和经过IT改造的行业竞争时&#xff0c;无一例外地败北。08年金融危机前&#xff0c;全世界市值前十的公司&#xff0c;只有微软一家是IT企业。仅仅过去了十年&#xf…