完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
我知道数据储存的起始地址%对齐字节(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个回答
|
|
好的,十分感谢你的解答,可是我不强制8各个字节对齐的话浮点任务就会出错,可是LED0与LED1的任务堆栈就不会。这是为何?
|
|
|
|
第一个问题:额,cortex内核要求栈帧尽可能是双字对齐(较早版本没有强制要求,只是建议,并且该功能在芯片上是可以配置的)。但是CPU_STK是uint32类型(默认是采用4字节对齐),所以这里显示设置。
第二个问题:因为OS_STK是uint32_t类型,编译器默认就是按照4字节对齐,不需要显示设置。 |
|
|
|
好的谢谢你的解答,按你的说法是双字(4字节),但是为何问题1中浮点数的堆栈数组要用8字节对齐,而不用4字节对齐呢?
|
|
|
|
此处针对的是32位单片机,既然是32位单片机,一个字(默认)都是4字节,双字不就是8字节嘛?难道我表达的哪里不到位?。。。
|
|
|
|
字节对齐是为了方便内部的接口处理,不存其它原因,双字对齐可能是OS某些处理机构是按双字标准设置
|
|
|
|
只有小组成员才能发言,加入小组>>
684 浏览 0 评论
1100 浏览 1 评论
2465 浏览 5 评论
2799 浏览 9 评论
移植了freeRTOS到STMf103之后显示没有定义的原因?
2638 浏览 6 评论
使用eim外接fpga可是端口一点反应都没有有没有大哥指点一下啊
648浏览 9评论
642浏览 7评论
请教大神怎样去解决iMX6Q在linux3.0.35内核上做AP失败的问题呢
774浏览 6评论
619浏览 5评论
661浏览 5评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-19 05:19 , Processed in 0.994365 second(s), Total 87, Slave 67 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号