RTX之——内存管理
目录
- 内存管理
- 内存分配模型
- 全局内存池
- 对象专用内存池
- 静态对象内存池
- 小结
- 参考资料
内存管理
在创建一个线程的时候,我们会为该线程专门分配一个栈,称之为线程栈,用于线程切换时保存相关数据。这个栈区别于微处理器本身的栈。线程栈(thread stack)是一块内存。线程栈的默认大小定义在RTOS配置文件RTX_Config.h
中,当然我们也可以在线程属性结构体中自定义线程栈的大小。
有关线程的知识,请见:☞多线程-RGB_LED灯闪烁
要自定义线程栈大小,首先得知道RTX的内存分配模型。
内存分配模型
keil RTX5通常支持三种对象内存分配模型,分别是:
Global Memory Pool
: 全局内存池,将所有对象放在一个内存池里面,对象用多少内存,就分配多少内存。优点是配置简单;缺点是在对象创建和删除的过程中,容易造成内存碎片。keil RTX5默认的对象内存分配模型是全局内存池模型。
Object-specific Memory Pools
: 对象专用内存池,即为每种对象类型分配一块固定大小的内存。由于对象的大小是固定的,所以在创建和删除的过程中不会造成内存碎片。
Static Object Memory
: 静态对象内存,需要编译期即为对象分配内存。这就要求用户在定义某个对象的时候指定其大小。
全局内存池
在全局内存池模型中,对象的创建和销毁可能会造成内存碎片的问题。全局内存池的大小定义在配置文件RTX_Config.h
中。
#define OS_DYNAMIC_MEM_SIZE 4096 // 4KB
对象专用内存池
我们也可以选择Object-specific Memory Pools
为专用对象分配内存。不过,我们需要指定专用对象类型的最大数量和其内存大小。RTOS负责为专用对象计算和保留所需的内存大小。Object-specific Memory Pools
也在配置文件RTX_Config.h
中,通过使能Object specific Memory allocation
选项即可可视化配置。
#define OS_THREAD_OBJ_MEM 1 // 1KB
#define OS_THREAD_NUM 3 // 总线程个数
#define OS_THREAD_DEF_STACK_NUM 2 // 使用默认栈大小的线程个数
#define OS_STACK_SIZE 200 // 线程栈大小
#define OS_THREAD_USER_STACK_SIZE 1024 // 用户提供的总线程栈大小
上面,总共创建了三个线程,其中两个线程使用默认栈大小 200 bytes
,另外一个线程使用自定义栈大小为1024 bytes
,如下:
// 自定义线程栈大小
static const osThreadAttr_t threadAttr_thread3 = { "thread3",NULL,NULL,NULL,NULL,1024, // stack sizeosPriorityNormal,NULL,NULL
};
静态对象内存池
我们也可以静态定义对象内存大小。首先,定义一个静态线程栈数组。
static uint64_t thread_stk[64]; //使用uint64_t 确保8字节对齐
然后定义一个RTX线程控制块,osRtxThread
类型定义在rtx_os.h
头文件中,所以要包含头文件。
#include "rtx_os.h"
static osRtxThread_t thread_tcb;
最后,配置线程属性结构体,就实现了静态配置对象内存了。
// 自定义线程栈大小
static const osThreadAttr_t threadAttr_thread4 = { "thread4",NULL,&thread_tcb, // cb memorysizeof(thread_tcb), // cb size&thread_stk[0], // stack memorysizeof(thread_stk), // stack sizeosPriorityNormal,NULL,NULL
};
官方案例
为方便大家理解,贴出官方案例。
/*----------------------------------------------------------------------------* CMSIS-RTOS 'main' function template*---------------------------------------------------------------------------*/
#include "RTE_Components.h"
#include CMSIS_device_header
#include "cmsis_os2.h"//include rtx_os.h for types of RTX objects
#include "rtx_os.h"//The thread function instanced in this example
void worker(void *arg)
{while(1) {//workosDelay(10000);}
}// Define objects that are statically allocated for worker thread 1
__attribute__((section(".bss.os.thread.cb")))
osRtxThread_t worker_thread_tcb_1;// Reserve two areas for the stacks of worker thread 1
// uint64_t makes sure the memory alignment is 8
uint64_t worker_thread_stk_1[64];// Define the attributes which are used for thread creation
// Optional const saves RAM memory and includes the values in periodic ROM tests
const osThreadAttr_t worker_attr_1 = {"wrk1",osThreadJoinable,&worker_thread_tcb_1,sizeof(worker_thread_tcb_1),&worker_thread_stk_1[0],sizeof(worker_thread_stk_1),osPriorityAboveNormal,0
};// Define ID object for thread
osThreadId_t th1;/*----------------------------------------------------------------------------* Application main thread*---------------------------------------------------------------------------*/
void app_main (void *argument) {uint32_t param = NULL;// Create an instance of the worker thread with static resources (TCB and stack)th1 = osThreadNew(worker, ¶m, &worker_attr_1);for (;;) {}
}int main (void) {// System InitializationSystemCoreClockUpdate();// ...osKernelInitialize(); // Initialize CMSIS-RTOSosThreadNew(app_main, NULL, NULL); // Create application main threadosKernelStart(); // Start thread executionfor (;;) {}
}
小结
本文主要介绍了RTX5的三大内存分配模型:
- 全局内存池
- 对象专用内存池
- 静态对象内存
了解了对象内存分配模型,才好更方便地配置我们需要的对象资源~
参考资料
想看原滋原味的英文资料?,喏~
☞Memory allocation
☞RTX5 tutorial
RTX之——内存管理相关推荐
- jar包部署shell脚本编写,在服务器上部署jar包,在Linux服务器上部署服务,设置编码格式,设置内存管理
准备步骤: 1.安装java环境,知道java安装目录 2.将jar包拖放或发送至服务器中(目录自定义) 一.编写shell脚本,将以下代码放在shell脚本中,将shell脚本放在jar包同级目录下 ...
- 垃圾回收 内存管理 python
20220225 https://mp.weixin.qq.com/s/94SmSNEkwmz-Eu-hBUo0Lg Python的内存管理机制 在windows 中直接在任务管理其中关掉python ...
- BEP 7:CUDA外部内存管理插件(下)
BEP 7:CUDA外部内存管理插件(下) Numba依赖 向库中添加EMM插件的实现自然会使Numba成为库的依赖项,而以前可能没有.为了使依赖关系可选,如果需要的话,可以有条件地实例化并注册EMM ...
- BEP 7:CUDA外部内存管理插件(上)
BEP 7:CUDA外部内存管理插件(上) 背景和目标 在CUDA阵列接口使得能够共享不同的Python之间的数据库的访问CUDA设备.但是,每个库都与其它库区别对待.例如: • Numba在内部管理 ...
- Objective C内存管理之理解autorelease------面试题
Objective C内存管理之理解autorelease Autorelease实际上只是把对release的调用延迟了,对于每一个Autorelease,系统只是把该Object放入了当前的Aut ...
- 操作系统--内存管理方式
"碎片的内存"描述一个系统中所有不可用的空闲内存.这些资源之所以仍然未被使用,是因为负责分配内存的分配器使这些内存无法使用.这一问题通常都会发生,原因在于空闲内存以小而不连续方式出 ...
- python基于值得内存_为什么说Python采用的是基于值的内存管理模式
匿名用户 1级 2018-01-31 回答 先从较浅的层面来说,Python的内存管理机制可以从三个方面来讲 (1)垃圾回收 (2)引用计数 (3)内存池机制 一.垃圾回收: python不像C++, ...
- linux内核 -内存管理模块概图
1.从进程(task)的角度来看内存管理 每个进程对应一个task_struct; 每个task_struct 里面包含指向mm_struct 的指针mm, mm_struct 里面的主要成员: a. ...
- linux内存管理 之 内存节点和内存分区(Zone)
https://www.cnblogs.com/youngerchina/p/5624516.html Linux支持多种硬件体系结构,因此Linux必须采用通用的方法来描述内存,以方便对内存进行管理 ...
最新文章
- pdf导入ps颜色太浅_PDF 文件编辑转换难?或许你需要一个扫描全能王!
- java 不重启部署_编译Java类后不重启Tomcat有两种方式:热部署、热加载
- 用正则判断字符串是否为中文的方法
- 利用Gitee搭建个人图床(下)
- 58天 -算法 openJudge百炼 2787-凑24 - 递归
- 接口配置锦囊妙计之三----端口自协商
- python pdf转word并保持原有的格式_将PDF转换为Word文档后,格式即可解决问题
- 【转载】前端项目开发流程及技术选型
- signature=290c6e3366bfb08cc93085d7fdf78281,AMC Entertainment Inc
- Netplus里的基本概念
- win10此计算机未连接到网络,win10连接无线wifi时提示无法连接到此网络解决方法...
- LabVIEW控制Arduino驱动1602液晶显示屏(基础篇—10)
- 《数学之美》读后感与商榷
- 别让你20多岁的活法,毁掉你30岁后的人生
- 去除页眉横线快准狠的3个方法,就喜欢这么简单粗暴的操作!
- 重磅:Vue 官网竟然有免费的中文视频教程了
- 虚拟产品哪个平台引流比较好?虚拟产品有哪些平台可以引流
- 神经网络——最易懂最清晰的一篇文章
- 元器件封装生成工具LP Wizard
- linux系统管理及配置
热门文章
- 基于java和Sql Server数据库的停车场管理系统
- 014 SQL注入魔鬼五步走
- 打开Visual Studio 2017报错:未能正确加载“VSTS for Database Professionals Sql Server Data-tier Application”包
- android基础!靠着这份面试题跟答案,赶紧收藏!
- linux 压缩文件性能,Linux常见压缩格式Tar、Zip和Gz格式之不同
- js 图片文件的下载
- 视觉SLAM14讲——李群与李代数
- 微信公众号markdown编辑器
- unity 为何会穿模,碰撞无显示
- EFM32jg之FreeRTOS(1)-移植