目录

  • 内存管理
    • 内存分配模型
      • 全局内存池
      • 对象专用内存池
      • 静态对象内存池
    • 小结
    • 参考资料

内存管理

在创建一个线程的时候,我们会为该线程专门分配一个栈,称之为线程栈,用于线程切换时保存相关数据。这个栈区别于微处理器本身的栈。线程栈(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, &param, &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之——内存管理相关推荐

  1. jar包部署shell脚本编写,在服务器上部署jar包,在Linux服务器上部署服务,设置编码格式,设置内存管理

    准备步骤: 1.安装java环境,知道java安装目录 2.将jar包拖放或发送至服务器中(目录自定义) 一.编写shell脚本,将以下代码放在shell脚本中,将shell脚本放在jar包同级目录下 ...

  2. 垃圾回收 内存管理 python

    20220225 https://mp.weixin.qq.com/s/94SmSNEkwmz-Eu-hBUo0Lg Python的内存管理机制 在windows 中直接在任务管理其中关掉python ...

  3. BEP 7:CUDA外部内存管理插件(下)

    BEP 7:CUDA外部内存管理插件(下) Numba依赖 向库中添加EMM插件的实现自然会使Numba成为库的依赖项,而以前可能没有.为了使依赖关系可选,如果需要的话,可以有条件地实例化并注册EMM ...

  4. BEP 7:CUDA外部内存管理插件(上)

    BEP 7:CUDA外部内存管理插件(上) 背景和目标 在CUDA阵列接口使得能够共享不同的Python之间的数据库的访问CUDA设备.但是,每个库都与其它库区别对待.例如: • Numba在内部管理 ...

  5. Objective C内存管理之理解autorelease------面试题

    Objective C内存管理之理解autorelease Autorelease实际上只是把对release的调用延迟了,对于每一个Autorelease,系统只是把该Object放入了当前的Aut ...

  6. 操作系统--内存管理方式

    "碎片的内存"描述一个系统中所有不可用的空闲内存.这些资源之所以仍然未被使用,是因为负责分配内存的分配器使这些内存无法使用.这一问题通常都会发生,原因在于空闲内存以小而不连续方式出 ...

  7. python基于值得内存_为什么说Python采用的是基于值的内存管理模式

    匿名用户 1级 2018-01-31 回答 先从较浅的层面来说,Python的内存管理机制可以从三个方面来讲 (1)垃圾回收 (2)引用计数 (3)内存池机制 一.垃圾回收: python不像C++, ...

  8. linux内核 -内存管理模块概图

    1.从进程(task)的角度来看内存管理 每个进程对应一个task_struct; 每个task_struct 里面包含指向mm_struct 的指针mm, mm_struct 里面的主要成员: a. ...

  9. linux内存管理 之 内存节点和内存分区(Zone)

    https://www.cnblogs.com/youngerchina/p/5624516.html Linux支持多种硬件体系结构,因此Linux必须采用通用的方法来描述内存,以方便对内存进行管理 ...

最新文章

  1. pdf导入ps颜色太浅_PDF 文件编辑转换难?或许你需要一个扫描全能王!
  2. java 不重启部署_编译Java类后不重启Tomcat有两种方式:热部署、热加载
  3. 用正则判断字符串是否为中文的方法
  4. 利用Gitee搭建个人图床(下)
  5. 58天 -算法 openJudge百炼 2787-凑24 - 递归
  6. 接口配置锦囊妙计之三----端口自协商
  7. python pdf转word并保持原有的格式_将PDF转换为Word文档后,格式即可解决问题
  8. 【转载】前端项目开发流程及技术选型
  9. signature=290c6e3366bfb08cc93085d7fdf78281,AMC Entertainment Inc
  10. Netplus里的基本概念
  11. win10此计算机未连接到网络,win10连接无线wifi时提示无法连接到此网络解决方法...
  12. LabVIEW控制Arduino驱动1602液晶显示屏(基础篇—10)
  13. 《数学之美》读后感与商榷
  14. 别让你20多岁的活法,毁掉你30岁后的人生
  15. 去除页眉横线快准狠的3个方法,就喜欢这么简单粗暴的操作!
  16. 重磅:Vue 官网竟然有免费的中文视频教程了
  17. 虚拟产品哪个平台引流比较好?虚拟产品有哪些平台可以引流
  18. 神经网络——最易懂最清晰的一篇文章
  19. 元器件封装生成工具LP Wizard
  20. linux系统管理及配置

热门文章

  1. 基于java和Sql Server数据库的停车场管理系统
  2. 014 SQL注入魔鬼五步走
  3. 打开Visual Studio 2017报错:未能正确加载“VSTS for Database Professionals Sql Server Data-tier Application”包
  4. android基础!靠着这份面试题跟答案,赶紧收藏!
  5. linux 压缩文件性能,Linux常见压缩格式Tar、Zip和Gz格式之不同
  6. js 图片文件的下载
  7. 视觉SLAM14讲——李群与李代数
  8. 微信公众号markdown编辑器
  9. unity 为何会穿模,碰撞无显示
  10. EFM32jg之FreeRTOS(1)-移植