嵌入式学习小组
直播中

张琳

7年用户 191经验值
私信 关注

align为什么要8字节对齐?

我知道数据储存的起始地址%对齐字节(N)=0才行,但是我不明白有两点
问题1:UCOSIII的系统中的浮点数打印任务的堆栈大小要8字节对齐,float无论在32位机还是64位机中都是4字节大小,
                                  可为什么就要8字节对齐呢,而不是4字节对齐?如下程序中的__align(8) CPU_STK        FLOAT_TASK_STK[FLOAT_STK_SIZE]//任务优先级
#define FLOAT_TASK_PRIO                6
//任务堆栈大小
#define FLOAT_STK_SIZE                128
//任务控制块
OS_TCB        FloatTaskTCB;
//任务堆栈数组
__align(8) CPU_STK        FLOAT_TASK_STK[FLOAT_STK_SIZE];
//任务函数
void float_task(void *p_arg);
问题2:本身编译器都会在编译时都会对齐的,那我们什么时候需要强制对齐呢?就比如说
                                  LED0与了ED1的任务堆栈数组就没有进行强制的对其
//任务LED0堆栈
CPU_STK LED0_TASK_STK[LED1_STK_SIZE];
//任务LED1堆栈
CPU_STK LED1_TASK_STK[LED1_STK_SIZE];
   

回帖(5)

王子云

2020-4-23 08:53:06
好的,十分感谢你的解答,可是我不强制8各个字节对齐的话浮点任务就会出错,可是LED0与LED1的任务堆栈就不会。这是为何?
举报

马昱

2020-4-23 09:28:08
第一个问题:额,cortex内核要求栈帧尽可能是双字对齐(较早版本没有强制要求,只是建议,并且该功能在芯片上是可以配置的)。但是CPU_STK是uint32类型(默认是采用4字节对齐),所以这里显示设置。
第二个问题:因为OS_STK是uint32_t类型,编译器默认就是按照4字节对齐,不需要显示设置。
举报

朱虹

2020-4-23 09:44:47
好的谢谢你的解答,按你的说法是双字(4字节),但是为何问题1中浮点数的堆栈数组要用8字节对齐,而不用4字节对齐呢?
举报

陈秀珍

2020-4-23 09:50:17
此处针对的是32位单片机,既然是32位单片机,一个字(默认)都是4字节,双字不就是8字节嘛?难道我表达的哪里不到位?。。。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分