gcc packeted and aligned的作用

2024-06-03 15:58
文章标签 作用 gcc aligned packeted

本文主要是介绍gcc packeted and aligned的作用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在shared memory的驱动中看到一个诡异的现象,从AP侧看BP的写指针有时会变小,例如:

read/write = 0x44f0, 但write忽然会变为0x4400,正常情况下是write增加,read在后面跟随。这样就会出现异常。

后来发现,读写操作不是按照预想的一次完成,而是按字节多次进行的。

假设AP 读却写指针(BP维护),当AP读第一个字节后,BP发生了变化,又更改了第一个字节,但是AP不知道,这样组合出来的4字节就有问题。

【简单的说就是两者没有同步】

虽然看上去是细节,但影响还是很严重的。

为什么执行的代码是按字节访问的哪?

其实原因很简单,数据结构的定义使用packeted进行了修饰。

__attrubte__ ((packed)) 的作用就是告诉编译器取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐。

如果packeted只是简单的理解为编译器不要填充字节,那么生成的代码也不会按字节操作啊?应该是编译器还会按照字节的方式进行处理。

typedef struct smd_tx_stream_tag
{
    unsigned int write;
    const unsigned int read;
    unsigned int size; /*The buffer size, must be the power of 2*/
    const unsigned char res[20];
    unsigned char   buffer[SMD_BUFFER_SIZE];
    const unsigned char   protection[32];
} __attribute__ ((packeted)) T_SMD_TX_STREAM;


unsigned int smd_stream_write_avail(T_SMD_STREAM_CHANNEL *ch)
{
    T_SMD_TX_STREAM *stream=&ch->tx_stream;
    return (stream->size - stream->write + stream->read);
}
crash> dis smd_stream_write_avail
0xc024219c <smd_stream_write_avail>:    mov     r12, sp
0xc02421a0 <smd_stream_write_avail+4>:  push    {r4, r5, r6, r11, r12, lr, pc}
0xc02421a4 <smd_stream_write_avail+8>:  sub     r11, r12, #4
0xc02421a8 <smd_stream_write_avail+12>: ldrb    r12, [r0, #37]  ; 0x25
0xc02421ac <smd_stream_write_avail+16>: ldrb    r3, [r0, #36]   ; 0x24
0xc02421b0 <smd_stream_write_avail+20>: ldrb    r1, [r0, #41]   ; 0x29
0xc02421b4 <smd_stream_write_avail+24>: ldrb    r2, [r0, #40]   ; 0x28
0xc02421b8 <smd_stream_write_avail+28>: orr     r12, r3, r12, lsl #8
0xc02421bc <smd_stream_write_avail+32>: ldrb    r4, [r0, #38]   ; 0x26
0xc02421c0 <smd_stream_write_avail+36>: ldrb    r3, [r0, #42]   ; 0x2a
0xc02421c4 <smd_stream_write_avail+40>: orr     r1, r2, r1, lsl #8
0xc02421c8 <smd_stream_write_avail+44>: ldrb    r2, [r0, #39]   ; 0x27
0xc02421cc <smd_stream_write_avail+48>: ldrb    r6, [r0, #33]   ; 0x21
0xc02421d0 <smd_stream_write_avail+52>: orr     r12, r12, r4, lsl #16
0xc02421d4 <smd_stream_write_avail+56>: ldrb    r5, [r0, #43]   ; 0x2b
0xc02421d8 <smd_stream_write_avail+60>: orr     r1, r1, r3, lsl #16
0xc02421dc <smd_stream_write_avail+64>: ldrb    r4, [r0, #34]   ; 0x22
0xc02421e0 <smd_stream_write_avail+68>: orr     r12, r12, r2, lsl #24
0xc02421e4 <smd_stream_write_avail+72>: ldrb    r3, [r0, #32]
0xc02421e8 <smd_stream_write_avail+76>: ldrb    r2, [r0, #35]   ; 0x23
0xc02421ec <smd_stream_write_avail+80>: orr     r1, r1, r5, lsl #24
0xc02421f0 <smd_stream_write_avail+84>: orr     r3, r3, r6, lsl #8
0xc02421f4 <smd_stream_write_avail+88>: add     r0, r12, r1
0xc02421f8 <smd_stream_write_avail+92>: orr     r3, r3, r4, lsl #16
0xc02421fc <smd_stream_write_avail+96>: orr     r3, r3, r2, lsl #24
0xc0242200 <smd_stream_write_avail+100>:        rsb     r0, r3, r0
0xc0242204 <smd_stream_write_avail+104>:        ldm     sp, {r4, r5, r6, r11, sp, pc}


怎样使用字的方式访问?

aligned什么用途?这里不用aligned也可以,它本身就是在4的边界上。可以从生成的vmlinux验证

在编译目录下:

arm-none-linux-gnueabi-objdump -D vmlinux | less
然后查找即可。

aligned ( alignment )
This attribute specifies a minimum alignment (in bytes) for variablesof the specified type. For example, the declarations:
          struct S { short f[3]; } __attribute__ ((aligned (8)));typedef int more_aligned_int __attribute__ ((aligned (8)));

force the compiler to insure (as far as it can) that each variable whosetype is struct S or more_aligned_int will be allocated andaligned at least on a 8-byte boundary.

typedef struct smd_tx_stream_tag

{
    unsigned int write;
    const unsigned int read;
    unsigned int size; /*The buffer size, must be the power of 2*/
    const unsigned char res[20];
    unsigned char   buffer[SMD_BUFFER_SIZE];
    const unsigned char   protection[32];
} __attribute__ ((aligned(4))) T_SMD_TX_STREAM;


unsigned int smd_stream_write_avail(T_SMD_STREAM_CHANNEL *ch)
{
    T_SMD_TX_STREAM *stream=&ch->tx_stream;
    return (stream->size - stream->write + stream->read);
}

c029b054 <smd_stream_write_avail>:
c029b054:       e1a0c00d        mov     ip, sp
c029b058:       e92dd800        push    {fp, ip, lr, pc}
c029b05c:       e24cb004        sub     fp, ip, #4
c029b060:       e92d4000        push    {lr}
c029b064:       ebf5ccf7        bl      c000e448 <__gnu_mcount_nc>
c029b068:       e5901024        ldr     r1, [r0, #36]   ; 0x24
c029b06c:       e5902028        ldr     r2, [r0, #40]   ; 0x28
c029b070:       e5903020        ldr     r3, [r0, #32]
c029b074:       e0810002        add     r0, r1, r2
c029b078:       e0630000        rsb     r0, r3, r0
c029b07c:       e89da800        ldm     sp, {fp, sp, pc}


这篇关于gcc packeted and aligned的作用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1027444

相关文章

Android fill_parent、match_parent、wrap_content三者的作用及区别

这三个属性都是用来适应视图的水平或者垂直大小,以视图的内容或尺寸为基础的布局,比精确的指定视图的范围更加方便。 1、fill_parent 设置一个视图的布局为fill_parent将强制性的使视图扩展至它父元素的大小 2、match_parent 和fill_parent一样,从字面上的意思match_parent更贴切一些,于是从2.2开始,两个属性都可以使用,但2.3版本以后的建议使

maven发布项目到私服-snapshot快照库和release发布库的区别和作用及maven常用命令

maven发布项目到私服-snapshot快照库和release发布库的区别和作用及maven常用命令 在日常的工作中由于各种原因,会出现这样一种情况,某些项目并没有打包至mvnrepository。如果采用原始直接打包放到lib目录的方式进行处理,便对项目的管理带来一些不必要的麻烦。例如版本升级后需要重新打包并,替换原有jar包等等一些额外的工作量和麻烦。为了避免这些不必要的麻烦,通常我们

未来工作趋势:零工小程序在共享经济中的作用

经济在不断发展的同时,科技也在飞速发展。零工经济作为一种新兴的工作模式,正在全球范围内迅速崛起。特别是在中国,随着数字经济的蓬勃发展和共享经济模式的深入推广,零工小程序在促进就业、提升资源利用效率方面显示出了巨大的潜力和价值。 一、零工经济的定义及现状 零工经济是指通过临时性、自由职业或项目制的工作形式,利用互联网平台快速匹配供需双方的新型经济模式。这种模式打破了传统全职工作的界限,为劳动

Science|癌症中三级淋巴结构的免疫调节作用与治疗潜力|顶刊精析·24-09-08

小罗碎碎念 Science文献精析 今天精析的这一篇综述,于2022-01-07发表于Science,主要讨论了癌症中的三级淋巴结构(Tertiary Lymphoid Structures, TLS)及其在肿瘤免疫反应中的作用。 作者类型作者姓名单位名称(中文)通讯作者介绍第一作者Ton N. Schumacher荷兰癌症研究所通讯作者之一通讯作者Daniela S. Thomm

j2EE通用jar包的作用

原文:http://blog.sina.com.cn/s/blog_610901710101kx37.html IKIKAnalyzer3.2.8.jar // 分词器 ant-junit4.jar // ant junit antlr-2.7.6.jar // 没有此包,hibernate不会执行hql语句。并且会报NoClassDefFoundError: antlr

【vue3|第28期】 Vue3 + Vue Router:探索路由重定向的使用与作用

日期:2024年9月8日 作者:Commas 签名:(ง •_•)ง 积跬步以致千里,积小流以成江海…… 注释:如果您觉在这里插入代码片得有所帮助,帮忙点个赞,也可以关注我,我们一起成长;如果有不对的地方,还望各位大佬不吝赐教,谢谢^ - ^ 1.01365 = 37.7834;0.99365 = 0.0255 1.02365 = 1377.4083;0.98365 = 0.0006 说

bash: arm-linux-gcc: No such file or directory

ubuntu出故障重装了系统,一直用着的gcc使用不了,提示bash: arm-linux-gcc: No such file or directorywhich找到的命令所在的目录 在google上翻了一阵发现此类问题的帖子不多,后来在Freescale的的LTIB环境配置文档中发现有这么一段:     # Packages required for 64-bit Ubuntu

编译linux内核出现 arm-eabi-gcc: error: : No such file or directory

external/e2fsprogs/lib/ext2fs/tdb.c:673:29: warning: comparison between : In function 'max2165_set_params': -。。。。。。。。。。。。。。。。。。 。。。。。。。。。。。。。 。。。。。。。。 host asm: libdvm <= dalvik/vm/mterp/out/Inte

请解释Java Web应用中的前后端分离是什么?它有哪些好处?什么是Java Web中的Servlet过滤器?它有什么作用?

请解释Java Web应用中的前后端分离是什么?它有哪些好处? Java Web应用中的前后端分离 在Java Web应用中,前后端分离是一种开发模式,它将传统Web开发中紧密耦合的前端(用户界面)和后端(服务器端逻辑)代码进行分离,使得它们能够独立开发、测试、部署和维护。在这种模式下,前端通常通过HTTP请求与后端进行数据交换,后端则负责业务逻辑处理、数据库交互以及向前端提供RESTful

【linux学习指南】Linux编译器 gcc和g++使用

文章目录 📝前言🌠 gcc如何完成🌉预处理(进行宏替换) 🌠编译(生成汇编)🌉汇编(生成机器可识别代码) 🌠链接(生成可执行文件或库文件)🌉函数库 🌠gcc选项🚩总结 📝前言 预处理(进行宏替换)编译(生成汇编)汇编(生成机器可识别代码)连接(生成可执行文件或库文件) 🌠 gcc如何完成 格式 :gcc [选项] 要编译的文件 [选项] [目标文