Przeglądaj źródła

RTX5: extended memory block management with type identifier

Robert Rostohar 9 lat temu
rodzic
commit
d8d279c8d5

+ 1 - 1
CMSIS/RTOS2/RTX/Source/rtx_evflags.c

@@ -193,7 +193,7 @@ osEventFlagsId_t os_svcEventFlagsNew (const osEventFlagsAttr_t *attr) {
     if (os_Info.mpi.event_flags != NULL) {
       ef = os_MemoryPoolAlloc(os_Info.mpi.event_flags);
     } else {
-      ef = os_MemoryAlloc(os_Info.mem.common, sizeof(os_event_flags_t));
+      ef = os_MemoryAlloc(os_Info.mem.common, sizeof(os_event_flags_t), 1U);
     }
     if (ef == NULL) {
       return (osEventFlagsId_t)NULL;

+ 1 - 1
CMSIS/RTOS2/RTX/Source/rtx_lib.h

@@ -73,7 +73,7 @@ extern void  os_MutexOwnerRelease (os_mutex_t *mutex_list);
 
 // Memory Heap Library functions
 extern uint32_t os_MemoryInit (void *mem, uint32_t size);
-extern void    *os_MemoryAlloc(void *mem, uint32_t size);
+extern void    *os_MemoryAlloc(void *mem, uint32_t size, uint32_t type);
 extern uint32_t os_MemoryFree (void *mem, void *block);
 
 // Memory Pool Library functions

+ 17 - 13
CMSIS/RTOS2/RTX/Source/rtx_memory.c

@@ -35,9 +35,12 @@ typedef struct mem_head_s {
 //  Memory Block Header structure
 typedef struct mem_block_s {
   struct mem_block_s *next;     // Next Memory Block in list
-  uint32_t             len;     // Memory Block length
+  uint32_t            info;     // Info: length = <31:2>:'00', type = <1:0>
 } mem_block_t;
 
+#define MB_INFO_LEN_MASK        0xFFFFFFFCU
+#define MB_INFO_TYPE_MASK       0x00000003U
+
 
 //  ==== Library functions ====
 
@@ -61,7 +64,7 @@ uint32_t os_MemoryInit (void *mem, uint32_t size) {
   ptr = (mem_block_t *)((uint32_t)mem + sizeof(mem_head_t));
   ptr->next = (mem_block_t *)((uint32_t)mem + size - sizeof(mem_block_t *));
   ptr->next->next = NULL;
-  ptr->len = 0U;
+  ptr->info = 0U;
 
   return 1U;
 }
@@ -69,12 +72,13 @@ uint32_t os_MemoryInit (void *mem, uint32_t size) {
 /// Allocate a memory block from a Memory Pool.
 /// \param[in]  mem             pointer to memory pool.
 /// \param[in]  size            size of a memory block in bytes.
+/// \param[in]  type            memory block type: 0 - generic, 1 - control block
 /// \return allocated memory block or NULL in case of no memory is available.
-void *os_MemoryAlloc (void *mem, uint32_t size) {
+void *os_MemoryAlloc (void *mem, uint32_t size, uint32_t type) {
   mem_block_t *p, *p_new, *ptr;
   uint32_t     hole_size;
 
-  if ((mem == NULL) || (size == 0U)) {
+  if ((mem == NULL) || (size == 0U) || (type & ~MB_INFO_TYPE_MASK)) {
     return NULL;
   }
 
@@ -87,7 +91,7 @@ void *os_MemoryAlloc (void *mem, uint32_t size) {
   p = (mem_block_t *)((uint32_t)mem + sizeof(mem_head_t));
   for (;;) {
     hole_size  = (uint32_t)p->next - (uint32_t)p;
-    hole_size -= p->len;
+    hole_size -= p->info & MB_INFO_LEN_MASK;
     if (hole_size >= size) {
       // Hole found
       break;
@@ -101,15 +105,15 @@ void *os_MemoryAlloc (void *mem, uint32_t size) {
 
   ((mem_head_t *)mem)->used += size;
 
-  if (p->len == 0U) {
-    // No block allocated, set length of first element
-    p->len = size;
+  if (p->info == 0U) {
+    // No block allocated, set info of first element
+    p->info = size | type;
     ptr = (mem_block_t *)((uint32_t)p + sizeof(mem_block_t));
   } else {
     // Insert new element into the list
-    p_new = (mem_block_t *)((uint32_t)p + p->len);
+    p_new = (mem_block_t *)((uint32_t)p + (p->info & MB_INFO_LEN_MASK));
     p_new->next = p->next;
-    p_new->len  = size;
+    p_new->info = size | type;
     p->next = p_new;
     ptr = (mem_block_t *)((uint32_t)p_new + sizeof(mem_block_t));
   }
@@ -142,11 +146,11 @@ uint32_t os_MemoryFree (void *mem, void *block) {
     }
   }
 
-  ((mem_head_t *)mem)->used -= p->len;
+  ((mem_head_t *)mem)->used -= p->info & MB_INFO_LEN_MASK;
 
   if (p_prev == NULL) {
-    // Release first block, only set len to 0
-    p->len = 0U;
+    // Release first block, only set info to 0
+    p->info = 0U;
   } else {
     // Discard block from chained list
     p_prev->next = p->next;

+ 2 - 2
CMSIS/RTOS2/RTX/Source/rtx_mempool.c

@@ -283,7 +283,7 @@ osMemoryPoolId_t os_svcMemoryPoolNew (uint32_t block_count, uint32_t block_size,
     if (os_Info.mpi.memory_pool != NULL) {
       mp = os_MemoryPoolAlloc(os_Info.mpi.memory_pool);
     } else {
-      mp = os_MemoryAlloc(os_Info.mem.common, sizeof(os_memory_pool_t));
+      mp = os_MemoryAlloc(os_Info.mem.common, sizeof(os_memory_pool_t), 1U);
     }
     if (mp == NULL) {
       return (osMemoryPoolId_t)NULL;
@@ -295,7 +295,7 @@ osMemoryPoolId_t os_svcMemoryPoolNew (uint32_t block_count, uint32_t block_size,
 
   // Allocate data memory if not provided
   if (mp_mem == NULL) {
-    mp_mem = os_MemoryAlloc(os_Info.mem.mp_data, size);
+    mp_mem = os_MemoryAlloc(os_Info.mem.mp_data, size, 0U);
     if (mp_mem == NULL) {
       if (flags & os_FlagSystemObject) {
         if (os_Info.mpi.memory_pool != NULL) {

+ 2 - 2
CMSIS/RTOS2/RTX/Source/rtx_msgqueue.c

@@ -291,7 +291,7 @@ osMessageQueueId_t os_svcMessageQueueNew (uint32_t msg_count, uint32_t msg_size,
     if (os_Info.mpi.message_queue != NULL) {
       mq = os_MemoryPoolAlloc(os_Info.mpi.message_queue);
     } else {
-      mq = os_MemoryAlloc(os_Info.mem.common, sizeof(os_message_queue_t));
+      mq = os_MemoryAlloc(os_Info.mem.common, sizeof(os_message_queue_t), 1U);
     }
     if (mq == NULL) {
       return (osMessageQueueId_t)NULL;
@@ -303,7 +303,7 @@ osMessageQueueId_t os_svcMessageQueueNew (uint32_t msg_count, uint32_t msg_size,
 
   // Allocate data memory if not provided
   if (mq_mem == NULL) {
-    mq_mem = os_MemoryAlloc(os_Info.mem.mq_data, size);
+    mq_mem = os_MemoryAlloc(os_Info.mem.mq_data, size, 0U);
     if (mq_mem == NULL) {
       if (flags & os_FlagSystemObject) {
         if (os_Info.mpi.message_queue != NULL) {

+ 1 - 1
CMSIS/RTOS2/RTX/Source/rtx_mutex.c

@@ -102,7 +102,7 @@ osMutexId_t os_svcMutexNew (const osMutexAttr_t *attr) {
     if (os_Info.mpi.mutex != NULL) {
       mutex = os_MemoryPoolAlloc(os_Info.mpi.mutex);
     } else {
-      mutex = os_MemoryAlloc(os_Info.mem.common, sizeof(os_mutex_t));
+      mutex = os_MemoryAlloc(os_Info.mem.common, sizeof(os_mutex_t), 1U);
     }
     if (mutex == NULL) {
       return (osMutexId_t)NULL;

+ 1 - 1
CMSIS/RTOS2/RTX/Source/rtx_semaphore.c

@@ -164,7 +164,7 @@ osSemaphoreId_t os_svcSemaphoreNew (uint32_t max_count, uint32_t initial_count,
     if (os_Info.mpi.semaphore != NULL) {
       semaphore = os_MemoryPoolAlloc(os_Info.mpi.semaphore);
     } else {
-      semaphore = os_MemoryAlloc(os_Info.mem.common, sizeof(os_semaphore_t));
+      semaphore = os_MemoryAlloc(os_Info.mem.common, sizeof(os_semaphore_t), 1U);
     }
     if (semaphore == NULL) {
       return (osSemaphoreId_t)NULL;

+ 2 - 2
CMSIS/RTOS2/RTX/Source/rtx_thread.c

@@ -568,7 +568,7 @@ osThreadId_t os_svcThreadNew (os_thread_func_t func, void *argument, const osThr
     if (os_Info.mpi.thread != NULL) {
       thread = os_MemoryPoolAlloc(os_Info.mpi.thread);
     } else {
-      thread = os_MemoryAlloc(os_Info.mem.common, sizeof(os_thread_t));
+      thread = os_MemoryAlloc(os_Info.mem.common, sizeof(os_thread_t), 1U);
     }
     if (thread == NULL) {
       return (osThreadId_t)NULL;
@@ -590,7 +590,7 @@ osThreadId_t os_svcThreadNew (os_thread_func_t func, void *argument, const osThr
       }
     }
     if (stack_mem == NULL) {
-      stack_mem = os_MemoryAlloc(os_Info.mem.stack, stack_size);
+      stack_mem = os_MemoryAlloc(os_Info.mem.stack, stack_size, 0U);
     }
     if (stack_mem == NULL) {
       if (flags & os_FlagSystemObject) {

+ 1 - 1
CMSIS/RTOS2/RTX/Source/rtx_timer.c

@@ -196,7 +196,7 @@ osTimerId_t os_svcTimerNew (os_timer_func_t func, osTimerType_t type, void *argu
     if (os_Info.mpi.timer != NULL) {
       timer = os_MemoryPoolAlloc(os_Info.mpi.timer);
     } else {
-      timer = os_MemoryAlloc(os_Info.mem.common, sizeof(os_timer_t));
+      timer = os_MemoryAlloc(os_Info.mem.common, sizeof(os_timer_t), 1U);
     }
     if (timer == NULL) {
       return (osTimerId_t)NULL;