初级会员
- 积分
- 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 对齐,就浪费了内存了。大神们,你觉得呢?是不是可以这么理解?
|
|