FreeRTOS内存管理中字节对齐的理解

本文深入探讨了FreeRTOS中内存申请函数pvPortMalloc()如何实现字节对齐,包括申请内存字节对齐和内存堆起始地址字节对齐的原理与实现方式。通过具体示例解释了portBYTE_ALIGNMENT和portBYTE_ALIGNMENT_MASK的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

FreeRTOS内存申请函数pvPortMalloc()字节对齐的语句如下

 1.申请内存数字节对齐

            xWantedSize += ( portBYTE_ALIGNMENT - ( xWantedSize & portBYTE_ALIGNMENT_MASK ) );
xWantedSize 是要申请的字节数

portBYTE_ALIGNMENT是字节对齐数

portBYTE_ALIGNMENT_MASK 是字节对齐掩码


xWantedSize 是要申请的字节数,先按照数学思维理一理思路,比如需要申请21个字节且按照8字节对齐,申请的字节数必须是8的倍数才能达到字节对齐的目的,那么被除数是21,除数是8。21除以8余5,除数8必须减去余数5再加上被除数才能被8整除(8-5=3,21+3=24),所以会申请24个字节。代码实现为xWantedSize += (portBYTE_ALIGNMENT -xWantedSize%portBYTE_ALIGNMENT)。

 

FreeRTOS加入了portBYTE_ALIGNMENT_MASK来实现字节对齐的功能。

xWantedSize += ( portBYTE_ALIGNMENT - ( xWantedSize & portBYTE_ALIGNMENT_MASK ) );
我们发现,当portBYTE_ALIGNMENT 和portBYTE_ALIGNMENT_MASK满足如下关系时,

portBYTE_ALIGNMENT

portBYTE_ALIGNMENT_MASK

8(表示以8个字节对齐)

0x0007

4(表示以4个字节对齐)

0x0003

2(表示以2个字节对齐)

0x0001

1(表示以1个字节对齐)

0x0000

xWantedSize % portBYTE_ALIGNMENT 等价于 xWantedSize & portBYTE_ALIGNMENT_MASK。xWantedSize & portBYTE_ALIGNMENT_MASK 就是被除数xWantedSize 对除数portBYTE_ALIGNMENT取余的值。

 

2.内存堆起始地址字节对齐

pucAlignedHeap = ( uint8_t * ) ( ( ( portPOINTER_SIZE_TYPE ) &ucHeap[ portBYTE_ALIGNMENT ] ) & ( ~( ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) ) );

&ucHeap[ portBYTE_ALIGNMENT ] 是编译器定义的内存堆的起始地址增加了portBYTE_ALIGNMENT ,

&ucHeap[ portBYTE_ALIGNMENT ]   &  ( ~( ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) ) 等价于&ucHeap[ portBYTE_ALIGNMENT ]  对 portBYTE_ALIGNMENT 取余,然后&ucHeap[ portBYTE_ALIGNMENT ] 减去这个余数,得到的地址正好会被portBYTE_ALIGNMENT 整除,也就实现了字节对齐。

举例:

假设,为了好理解,编译器定义ucHeap地址为3,portBYTE_ALIGNMENT 为8,portBYTE_ALIGNMENT_MASK 为0x07。ucHeap[ portBYTE_ALIGNMENT ] 地址就为11,11&(~(0x07))为8。内存地址从3变成8,实现了内存堆地址的字节对齐。

 

 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值