pointer _lwmem_get_next_block_internal ( /* [IN] the td whose blocks are being looked for */ TD_STRUCT_PTR td_ptr, /* [IN] the block last obtained */ pointer in_block_ptr ) { KERNEL_DATA_STRUCT_PTR kernel_data; LWMEM_POOL_STRUCT_PTR lwmem_pool_ptr; LWMEM_BLOCK_STRUCT_PTR block_ptr = in_block_ptr; LWMEM_BLOCK_STRUCT_PTR free_ptr; _GET_KERNEL_DATA(kernel_data); if (block_ptr == NULL) { // first item, start on first item in first pool lwmem_pool_ptr = kernel_data->KERNEL_LWMEM_POOL; block_ptr = lwmem_pool_ptr->POOL_ALLOC_START_PTR; } else { // continued, get lwmem pool from provided in_block_ptr block_ptr = GET_LWMEMBLOCK_PTR(in_block_ptr); lwmem_pool_ptr = block_ptr->POOL; block_ptr = (LWMEM_BLOCK_STRUCT_PTR)((uchar_ptr)block_ptr + block_ptr->BLOCKSIZE); } _int_disable(); do { free_ptr = lwmem_pool_ptr->POOL_FREE_LIST_PTR; while ((uchar_ptr)block_ptr < (uchar_ptr)lwmem_pool_ptr->POOL_ALLOC_END_PTR){ if (block_ptr->U.S.TASK_NUMBER == TASK_NUMBER_FROM_TASKID(td_ptr->TASK_ID)) { /* check for block is not free block */ while (free_ptr && free_ptr < block_ptr) { free_ptr = free_ptr->U.NEXTBLOCK; } if (free_ptr != block_ptr) { /* This block is owned by the target task and it's not free block*/ _int_enable(); return((pointer)((uchar_ptr)block_ptr + sizeof(LWMEM_BLOCK_STRUCT))); } } block_ptr = (LWMEM_BLOCK_STRUCT_PTR)((uchar_ptr)block_ptr + block_ptr->BLOCKSIZE); } // continue in next lwmem pool lwmem_pool_ptr = (LWMEM_POOL_STRUCT_PTR)(lwmem_pool_ptr->LINK.NEXT); block_ptr = lwmem_pool_ptr->POOL_ALLOC_START_PTR; } while (lwmem_pool_ptr != kernel_data->KERNEL_LWMEM_POOL); // repeat until processed lwmem pool is not first pool (pool list is circular list) _int_enable(); return(NULL); }
pointer _lwmem_get_next_block_internal ( /* [IN] the td whose blocks are being looked for */ TD_STRUCT_PTR td_ptr, /* [IN] the block last obtained */ pointer in_block_ptr ) { /* Body */ KERNEL_DATA_STRUCT_PTR kernel_data; LWMEM_POOL_STRUCT_PTR lwmem_pool_ptr; LWMEM_BLOCK_STRUCT_PTR block_ptr = in_block_ptr; LWMEM_BLOCK_STRUCT_PTR free_ptr; _GET_KERNEL_DATA(kernel_data); lwmem_pool_ptr = kernel_data->KERNEL_LWMEM_POOL; if (block_ptr == NULL) { block_ptr = lwmem_pool_ptr->POOL_ALLOC_START_PTR; /* Start CR 338 */ } else { block_ptr = GET_LWMEMBLOCK_PTR(in_block_ptr); block_ptr = (LWMEM_BLOCK_STRUCT_PTR)((uchar_ptr)block_ptr + block_ptr->BLOCKSIZE); /* End CR 338 */ } /* Endif */ _int_disable(); free_ptr = lwmem_pool_ptr->POOL_FREE_LIST_PTR; while ((uchar_ptr)block_ptr < (uchar_ptr)lwmem_pool_ptr->POOL_ALLOC_END_PTR){ if (block_ptr->U.S.TASK_NUMBER == TASK_NUMBER_FROM_TASKID(td_ptr->TASK_ID)) { /* check for block is not free block */ while (free_ptr && free_ptr < block_ptr) { free_ptr = free_ptr->U.NEXTBLOCK; } if (free_ptr != block_ptr) { /* This block is owned by the target task and it's not free block*/ _int_enable(); return((pointer)((uchar_ptr)block_ptr + sizeof(LWMEM_BLOCK_STRUCT))); } } block_ptr = (LWMEM_BLOCK_STRUCT_PTR)((uchar_ptr)block_ptr + block_ptr->BLOCKSIZE); } _int_enable(); return(NULL); }
/*! * \brief Prints intormation of memory blocks. */ void _tad_lightweight_memory_blocks ( void ) { uint32_t size, next_free; char owner[8], mem_type[MEM_TYPE_MAX_STRING_LENGTH]; LWMEM_POOL_STRUCT_PTR mem_pool_ptr = (LWMEM_POOL_STRUCT_PTR) _lwmem_get_system_pool_id(); uint32_t start_ptr = (uint32_t) mem_pool_ptr->POOL_ALLOC_START_PTR; uint32_t end_ptr = (uint32_t) mem_pool_ptr->POOL_ALLOC_END_PTR; LWMEM_BLOCK_STRUCT_PTR mem_ptr = (LWMEM_BLOCK_STRUCT_PTR) start_ptr; printf ("\nLightweight Memory Blocks:\n"); printf ("Address Size(hex) Size(dec) Owner Type\n"); while ((uint32_t) mem_ptr < end_ptr) { size = mem_ptr->BLOCKSIZE; next_free = (uint32_t)mem_ptr->U.NEXTBLOCK; if (((next_free >= start_ptr) && (next_free <= end_ptr)) || (next_free == 0)) { sprintf (owner, "Free"); mem_type[0] = 0; } else { mem_type_str (mem_type, mem_ptr->U.S.MEM_TYPE); if (mem_ptr->U.S.TASK_NUMBER == TASK_NUMBER_FROM_TASKID(MQX_DEFAULT_TASK_ID)) { sprintf (owner,"System"); } else { sprintf (owner,"0x1%04x", mem_ptr->U.S.TASK_NUMBER); } } printf ("0x%lx 0x%x %d %s %s\n", (uint32_t)mem_ptr, size, size, owner, mem_type); mem_ptr = (LWMEM_BLOCK_STRUCT_PTR)(((uint32_t)mem_ptr) + size); if (((uint32_t)mem_ptr < start_ptr) || ((uint32_t)mem_ptr > end_ptr)) { printf ("Block out of range!\n"); break; } } }