2727
2828/* dynamic pool magic and mask */
2929#define RT_MEMHEAP_MAGIC 0x1ea01ea0
30- #define RT_MEMHEAP_MASK 0xfffffffe
30+ #define RT_MEMHEAP_MASK 0xFFFFFFFE
3131#define RT_MEMHEAP_USED 0x01
3232#define RT_MEMHEAP_FREED 0x00
3333
3838#define MEMITEM_SIZE (item ) ((rt_ubase_t)item->next - (rt_ubase_t)item - RT_MEMHEAP_SIZE)
3939#define MEMITEM (ptr ) (struct rt_memheap_item*)((rt_uint8_t*)ptr - RT_MEMHEAP_SIZE)
4040
41+ static void _remove_next_ptr (struct rt_memheap_item * next_ptr )
42+ {
43+ /* Fix the crash problem after opening Oz optimization on ac6 */
44+ /* Fix IAR compiler warning */
45+ next_ptr -> next_free -> prev_free = next_ptr -> prev_free ;
46+ next_ptr -> prev_free -> next_free = next_ptr -> next_free ;
47+ next_ptr -> next -> prev = next_ptr -> prev ;
48+ next_ptr -> prev -> next = next_ptr -> next ;
49+ }
50+
4151/**
4252 * @brief This function initializes a piece of memory called memheap.
4353 *
@@ -173,7 +183,7 @@ RTM_EXPORT(rt_memheap_detach);
173183void * rt_memheap_alloc (struct rt_memheap * heap , rt_size_t size )
174184{
175185 rt_err_t result ;
176- rt_uint32_t free_size ;
186+ rt_size_t free_size ;
177187 struct rt_memheap_item * header_ptr ;
178188
179189 RT_ASSERT (heap != RT_NULL );
@@ -382,8 +392,7 @@ void *rt_memheap_realloc(struct rt_memheap *heap, void *ptr, rt_size_t newsize)
382392 if (newsize > oldsize )
383393 {
384394 void * new_ptr ;
385- /* Fix the crash problem after opening Oz optimization on ac6 */
386- volatile struct rt_memheap_item * next_ptr ;
395+ struct rt_memheap_item * next_ptr ;
387396
388397 if (heap -> locked == RT_FALSE )
389398 {
@@ -432,10 +441,7 @@ void *rt_memheap_realloc(struct rt_memheap *heap, void *ptr, rt_size_t newsize)
432441 next_ptr -> next_free ,
433442 next_ptr -> prev_free ));
434443
435- next_ptr -> next_free -> prev_free = next_ptr -> prev_free ;
436- next_ptr -> prev_free -> next_free = next_ptr -> next_free ;
437- next_ptr -> next -> prev = next_ptr -> prev ;
438- next_ptr -> prev -> next = next_ptr -> next ;
444+ _remove_next_ptr (next_ptr );
439445
440446 /* build a new one on the right place */
441447 next_ptr = (struct rt_memheap_item * )((char * )ptr + newsize );
@@ -593,13 +599,13 @@ void rt_memheap_free(void *ptr)
593599 rt_err_t result ;
594600 struct rt_memheap * heap ;
595601 struct rt_memheap_item * header_ptr , * new_ptr ;
596- rt_uint32_t insert_header ;
602+ rt_bool_t insert_header ;
597603
598604 /* NULL check */
599605 if (ptr == RT_NULL ) return ;
600606
601607 /* set initial status as OK */
602- insert_header = 1 ;
608+ insert_header = RT_TRUE ;
603609 new_ptr = RT_NULL ;
604610 header_ptr = (struct rt_memheap_item * )
605611 ((rt_uint8_t * )ptr - RT_MEMHEAP_SIZE );
@@ -657,7 +663,7 @@ void rt_memheap_free(void *ptr)
657663 /* move header pointer to previous. */
658664 header_ptr = header_ptr -> prev ;
659665 /* don't insert header to free list */
660- insert_header = 0 ;
666+ insert_header = RT_FALSE ;
661667 }
662668
663669 /* determine if the block can be merged with the next neighbor. */
@@ -685,10 +691,10 @@ void rt_memheap_free(void *ptr)
685691 {
686692 struct rt_memheap_item * n = heap -> free_list -> next_free ;;
687693#if defined(RT_MEMHEAP_BSET_MODE )
688- rt_uint32_t blk_size = MEMITEM_SIZE (header_ptr );
694+ rt_size_t blk_size = MEMITEM_SIZE (header_ptr );
689695 for (;n != heap -> free_list ; n = n -> next_free )
690696 {
691- rt_uint32_t m = MEMITEM_SIZE (n );
697+ rt_size_t m = MEMITEM_SIZE (n );
692698 if (blk_size <= m )
693699 {
694700 break ;
@@ -732,9 +738,9 @@ RTM_EXPORT(rt_memheap_free);
732738* @param max_used is a pointer to get the maximum memory used.
733739*/
734740void rt_memheap_info (struct rt_memheap * heap ,
735- rt_uint32_t * total ,
736- rt_uint32_t * used ,
737- rt_uint32_t * max_used )
741+ rt_size_t * total ,
742+ rt_size_t * used ,
743+ rt_size_t * max_used )
738744{
739745 rt_err_t result ;
740746
@@ -898,10 +904,10 @@ int memheapcheck(int argc, char *argv[])
898904 break ;
899905 }
900906 /* check next and prev */
901- if (!((rt_uint32_t )item -> next <= (rt_uint32_t )((rt_uint32_t )heap -> start_addr + heap -> pool_size ) &&
902- (rt_uint32_t )item -> prev >= (rt_uint32_t )heap -> start_addr ) &&
903- (rt_uint32_t )item -> next == RT_ALIGN ((rt_uint32_t )item -> next , RT_ALIGN_SIZE ) &&
904- (rt_uint32_t )item -> prev == RT_ALIGN ((rt_uint32_t )item -> prev , RT_ALIGN_SIZE ))
907+ if (!((rt_ubase_t )item -> next <= (rt_ubase_t )((rt_ubase_t )heap -> start_addr + heap -> pool_size ) &&
908+ (rt_ubase_t )item -> prev >= (rt_ubase_t )heap -> start_addr ) &&
909+ (rt_ubase_t )item -> next == RT_ALIGN ((rt_ubase_t )item -> next , RT_ALIGN_SIZE ) &&
910+ (rt_ubase_t )item -> prev == RT_ALIGN ((rt_ubase_t )item -> prev , RT_ALIGN_SIZE ))
905911 {
906912 has_bad = RT_TRUE ;
907913 break ;
@@ -919,7 +925,7 @@ int memheapcheck(int argc, char *argv[])
919925 {
920926 rt_kprintf ("Memory block wrong:\n" );
921927 rt_kprintf ("name: %s\n" , heap -> parent .name );
922- rt_kprintf ("item: 0x%08x \n" , item );
928+ rt_kprintf ("item: 0x%p \n" , item );
923929 }
924930 return 0 ;
925931}
@@ -948,7 +954,7 @@ int memheaptrace(int argc, char *argv[])
948954 /* memheap dump */
949955 rt_kprintf ("\nmemory heap address:\n" );
950956 rt_kprintf ("name : %s\n" , mh -> parent .name );
951- rt_kprintf ("heap_ptr: 0x%08x \n" , mh -> start_addr );
957+ rt_kprintf ("heap_ptr: 0x%p \n" , mh -> start_addr );
952958 rt_kprintf ("free : 0x%08x\n" , mh -> available_size );
953959 rt_kprintf ("max_used: 0x%08x\n" , mh -> max_used_size );
954960 rt_kprintf ("size : 0x%08x\n" , mh -> pool_size );
@@ -960,7 +966,7 @@ int memheaptrace(int argc, char *argv[])
960966 {
961967 if ((header_ptr -> magic & RT_MEMHEAP_MASK ) != RT_MEMHEAP_MAGIC )
962968 {
963- rt_kprintf ("[0x%08x - incorrect magic: 0x%08x\n" ,
969+ rt_kprintf ("[0x%p - incorrect magic: 0x%08x\n" ,
964970 header_ptr , header_ptr -> magic );
965971 break ;
966972 }
@@ -969,7 +975,7 @@ int memheaptrace(int argc, char *argv[])
969975 if (block_size < 0 )
970976 break ;
971977
972- rt_kprintf ("[0x%08x - " , header_ptr );
978+ rt_kprintf ("[0x%p - " , header_ptr );
973979 if (block_size < 1024 )
974980 rt_kprintf ("%5d" , block_size );
975981 else if (block_size < 1024 * 1024 )
0 commit comments