OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 3700|回复: 6

align对齐问题

[复制链接]

8

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2016-8-26
在线时间
9 小时
发表于 2017-9-15 13:36:17 | 显示全部楼层 |阅读模式
我知道数据储存的起始地址%对齐字节(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];


   
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

8

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2016-8-26
在线时间
9 小时
 楼主| 发表于 2017-9-15 19:08:31 | 显示全部楼层
liuchang 发表于 2017-9-15 18:13
此处针对的是32位单片机,既然是32位单片机,一个字(默认)都是4字节,双字不就是8字节嘛?难道我表达的 ...

好的,十分感谢你的解答,可是我不强制8各个字节对齐的话浮点任务就会出错,可是LED0与LED1的任务堆栈就不会。这是为何?
回复 支持 1 反对 0

使用道具 举报

3

主题

178

帖子

0

精华

高级会员

Rank: 4

积分
524
金钱
524
注册时间
2016-12-31
在线时间
195 小时
发表于 2017-9-15 14:15:32 来自手机 | 显示全部楼层
顶!!!
回复 支持 反对

使用道具 举报

119

主题

439

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1185
金钱
1185
注册时间
2015-9-18
在线时间
422 小时
发表于 2017-9-15 15:10:16 | 显示全部楼层
第一个问题:额,cortex内核要求栈帧尽可能是双字对齐(较早版本没有强制要求,只是建议,并且该功能在芯片上是可以配置的)。但是CPU_STK是uint32类型(默认是采用4字节对齐),所以这里显示设置。

第二个问题:因为OS_STK是uint32_t类型,编译器默认就是按照4字节对齐,不需要显示设置。
电子爱好者
回复 支持 反对

使用道具 举报

8

主题

19

帖子

0

精华

初级会员

Rank: 2

积分
78
金钱
78
注册时间
2016-8-26
在线时间
9 小时
 楼主| 发表于 2017-9-15 15:49:07 | 显示全部楼层
liuchang 发表于 2017-9-15 15:10
第一个问题:额,cortex内核要求栈帧尽可能是双字对齐(较早版本没有强制要求,只是建议,并且该功能在芯片 ...

好的谢谢你的解答,按你的说法是双字(4字节),但是为何问题1中浮点数的堆栈数组要用8字节对齐,而不用4字节对齐呢?
回复 支持 反对

使用道具 举报

119

主题

439

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1185
金钱
1185
注册时间
2015-9-18
在线时间
422 小时
发表于 2017-9-15 18:13:36 | 显示全部楼层
Ian22L 发表于 2017-9-15 15:49
好的谢谢你的解答,按你的说法是双字(4字节),但是为何问题1中浮点数的堆栈数组要用8字节对齐,而不用4 ...

此处针对的是32位单片机,既然是32位单片机,一个字(默认)都是4字节,双字不就是8字节嘛?难道我表达的哪里不到位?。。。
电子爱好者
回复 支持 反对

使用道具 举报

16

主题

339

帖子

0

精华

高级会员

Rank: 4

积分
826
金钱
826
注册时间
2017-6-18
在线时间
163 小时
发表于 2018-4-12 16:26:05 来自手机 | 显示全部楼层
本帖最后由 wlq19911021 于 2018-4-12 16:42 编辑

字节对齐是为了方便内部的接口处理,不存其它原因,双字对齐可能是OS某些处理机构是按双字标准设置
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2024-11-23 09:53

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表