初级会员 
  
	- 积分
 - 89
 
        - 金钱
 - 89 
 
       - 注册时间
 - 2015-10-2
 
      - 在线时间
 - 7 小时
 
 
 
 | 
 
我觉得这个分配内存算法还有点瑕疵。不知个人理解的对否,请各位大神给予指正。 
 
获取内存函数如下: 
void *pvPortMalloc( size_t xWantedSize ) 
{ 
void *pvReturn = NULL; 
static uint8_t *pucAlignedHeap = NULL; 
...//省略 
        { 
                if( pucAlignedHeap == NULL ) 
                { 
                        /* Ensure the heap starts on a correctly aligned boundary. */ 
                        pucAlignedHeap = ( uint8_t * ) ( ( ( portPOINTER_SIZE_TYPE ) &ucHeap[ portBYTE_ALIGNMENT ] ) & ( ~( ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) ) ); 
                } 
...//省略 
} 
这个pucAligedHeap这个是我想讨论的地方: 
pucAlignedHeap = ( uint8_t * ) ( ( ( portPOINTER_SIZE_TYPE ) &ucHeap[ portBYTE_ALIGNMENT ] ) & ( ~( ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) ) ); 
当然大家都知道这条语句的目的是为了对齐地址。 
比如:ucHeap被编译器分配的地址:0x20005001 , portBYTE_ALIGNMENT = 4 , 则portBYTE_ALIGNMENT_MASK = 0x03 
则经过这条语句执行可得到:pucAlignedHeap = (0x20005001 + 4) & (0xffff fff8) = 0x20005005 & 0xffff fffc = 0x20005004 
那么这个时候得出的就是首次分配内存时候应该返回的内存地址。也相当于 从数组ucHeap开头处向右偏移3个地址以对齐。这样理解貌似没有问题。 
但是,如果ucHeap被编译器分配的地址为:0x20005004 , portBYTE_ALIGNMENT = 4 , 则portBYTE_ALIGNMENT_MASK = 0x03 
则经过这条语句执行可得到:pucAlignedHeap = (0x20005004 + 4) & (0xffff fff8) = 0x20005004 & 0xffff fffc = 0x20005008。这样岂不是浪费了几个字节的内存。 
就是说如果本来地址就是按照portBYTE_ALIGNMENT 对齐,就浪费了内存了。大神们,你觉得呢?是不是可以这么理解? 
 
 
 
 
 
 
 
 |   
 
 
 
 |