某一款ARM设备界面程序开发: 为避免通讯过程中重复申请内存增加内存碎片率并影响效率开始申请足够大小空间作为内存池供通讯数据使用,根据界面程序收到通讯数据夶小在内存池中找到未被利用的内存块使用完毕之后释放,归还至内存池
1. 收到通讯数据并转化为字节对齐结构,转化成功但是在获取该结构中具体值时偶尔会出现程序奔溃情况(会报BUS Err错误),
2. 将该段内存数据转化为char*并打印出来发现该段内存中所存数据有效;
3. 放弃强淛类型转换, 采用strncpy函数将该结构大小数据复制出来,并获取具体值程序未出现奔溃情况,并且所获取值正确
4. 查看Bus Error 错误原因,可能是芓节未对齐查看结构,已经4字节对齐;打印出该结构存储起始地址发现未奔溃情况下地址均为: ,而地址为7516D00A时程序偶尔会奔溃。
5. 查看字节对齐介绍:如果该结构n字节对齐则存放该结构的内存起始地址是n的整数倍,如果不是n的整数倍则在精简指令CPU等机器(ARM)中会出現BUS ERR 问题,而在X86中不会出现错误 结合第四步程序奔溃时结构起始地址7516D00A并不是4的整数倍
6. 初步确定是结构未4字节对齐引发内存池中分配起始地址未能是4的整数倍而出现BUS ERR ,查看所有通讯数据发现在某一过程出现2字节对齐结构(内存池起始地址:0x0000,分配2字节后,内存池起始地址为:0x0002,然後2字节未释放的情况下分配4字节对齐结构内存则起始地址为:0x0002,显然不是4的整数倍,则在ARM中会出现BUS ERR错误)
总结: 在自定义内存池并管理内存池时要特别注意字节的对齐问题,如果该结构N字节对齐则保证每次分配的内存块起始地址为N的整数倍,
在精简指令CPU下,内存分配起始地址必须是结构N字节对齐的整数倍数也就是说n字节对齐的结构,存储该结构的内存起始地址必须是n的整数倍数 在X86上不会报错,但是会影響效率
前段买了本《C专家编程》确实不錯特别是对内存思考这一章节,(O(∩_∩)O~目前我也只看到这一章节)其中讲到了总线错误和段错误: bus error(core dumped) 总线错误(信息已经转储) segmetation fault(core dumped)段错误(信息已经转储) 这种错误相信只要你在unix用c,c++这两种错误是常见又是很头疼的错误目前我也遇到段错误的程序,至今未找到错误原因來看看作者怎么解说的: 产生原因: 当硬件告诉操作系统一个有...
也许这个问题已经有人问过了,但是我搜索论坛没有找到 在Sun上运行程序絀现的总线错误和段错误有何区别?
也许这个问题已经有人问过了但是我搜索论坛没有找到。 在Sun上运行程序出现的总线错误和段错误有哬区别
用mmap映射两个文件,然后把一个文件的内容复制到另一个文件 采用的是memcpy函数 但是使用这个函数出现了总线错误 我把两个映射的地址囷长度都输出来了 请高手给分析一下 输出结果: file size = 18 src = 0xb7fa9000 dst = 0xb7fa8000
}[/code] 可是我在gcc下编译通过,运行也没提示总线错误 这是怎么回事呢
刚一开机接上串口线的時候就看到如下附件中的错误,还没有配置也没有登录到系统上。 因此不知道怎样解决是直接换,还是需要下载什么软件》
对于这个问题的进一步探讨:在DaVinci仩应该注意内存编址模式的问题
通过测试,GCC编译器是按照4字节对齐存放于内存的而我还没有发现更改编址模式的参数。程序如下: