内存管理
CMSIS-RTOS2 API 提供了两种用户可以选择的内存管理选项。对于对象存储可以使用
为了影响内存分配方案,可以根据请求创建的所有 RTOS 对象(即具有 osXxxNew 函数的那些对象)在创建时接受可选的 osXxxAttr_t attr 参数。作为经验法则,对象属性至少有成员分配自定义控制块存储器,即 cb_mem 和 cb_size 成员。默认情况下,即 attr 为 NULL 或 cb_mem 为 NULL ,则使用自动动态分配。在 cb_mem 中提供指向用户内存的指针将切换到手动用户定义的分配。
-
注意
- 有关 RTX5 中提供的内存分配策略的详细信息,请参阅内存分配。
自动动态分配
自动分配对于许多用例是默认和可行的。此外,它可以跨 CMSIS-RTOS2 API 的不同实现完全移植。动态内存分配的共同缺点是内存碎片和内存耗尽的可能性。由于所有需要的对象都是在系统初始化时创建的,并且在运行时不会被删除,但这类运行时故障可以被阻止。
使用的实际分配策略是特定于实现的,即是使用全局堆或预分配内存池。
代码示例:
#include "cmsis_os2.h"
// implementation agnostic
osMutexId_t mutex_id;
osMutexId_t mutex2_id;
const
osMutexAttr_t Thread_Mutex_attr = {
"myThreadMutex",
// human readable mutex name
NULL,
// memory for control block (default)
0U
// size for control block (default)
};
void CreateMutex (
void) {
mutex_id =
osMutexNew(NULL);
// use default values for all attributes
mutex2_id =
osMutexNew(&Thread_Mutex_attr);
// use attributes from defined structure
:
}
本例中的互斥锁是使用自动内存分配创建的。
手动用户定义的分配
通过提供用户定义的内存,可以对内存分配进行细化控制。这种用户定义的内存的实际要求是特定于实现的。因此,需要仔细参考所用实现的大小和对齐规则,例如,对于 RTX,请参阅静态对象内存。
代码示例:
#include "rtx_os.h"
// implementation specific
osMutexId_t mutex_id;
const
osMutexAttr_t Thread_Mutex_attr = {
"myThreadMutex",
// human readable mutex name
mutex_cb,
// memory for control block (user-defined)
sizeof(mutex_cb)
// size for control block (user-defined)
};
void CreateMutex (
void) {
mutex_id =
osMutexNew(&Thread_Mutex_attr);
// use attributes from defined structure
:
}
以上示例使用用户定义的内存作为互斥锁控制块。根据所使用的实际实现,在这种情况下,需要包含特定的头文件 rtx_os.h 。