Example #1
0
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);  
}
Example #2
0
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);  
}
Example #3
0
/*!
 * \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;
      }
   }
}