当前位置:首页 > 问答

【海尔总线数据调乱了怎么办】通过例子了解公交车错误,不要踩坑。

你好,我是杂汤君。

最近踩了公交车错误的坑,简单总结了一下,再分享一下。

什么是公交车错误?

平时开发过程中,我们经常遇到的导致流程崩溃的错误大部分是分段错误。段错误是指访问超出系统提供的内存空间的内存,包括空指针操作、数组超出范围等。

与段错误一样,总线错误(Bus Error)是因为对未排序地址的访问导致CPU读数据违反了特定的总线规则。

出于性能考虑,当需要访问数据时,CPU必须对地址进行排序。如果不是地址排序访问,SIGBUS信号将发送到进程,进程将生成核心dump。

总线错误与CPU体系结构相关,某些体系结构中的CPU支持支持无序访问。下面我们通过例子分析一下。

总线错误示例

# include

# include

#pragma pack(1)

Struct struct_x

{

CHAR A;

float b;

CHAR C;

}

#pragma pack()

int main(void)

{

struct struct _ x test={ 0 };

printf(' sizeof(struct struct _ x)=% LD \ n ',size of(测试));

=1;

=2.0;

=3;

char * a=;

float * b=;

char * c=;

Printf('*a=%d,addr=%p\n ',*a,a);

Printf('*b=%f,addr=%p\n ',*b,b);

Printf('*c=%d,addr=%p\n ',*c,c);

return 0;

}#pragma pack编译器排序可以更改。

#pragma pack(n) /*指定以n字节对齐*/

#pragma pack() /*取消对齐自定义字节*/在PC端正常工作。

X86/x64系列CPU都支持非对齐访问,因此还提供了禁用此机制的开关。如果X86/x64体系结构不需要排序访问,则会产生性能成本。

但是,在arm主板上测试以下内容:

发生总线错误,因为核心变量test的成员B的地址是未排序的地址。CPU访问地址要求是4字节对齐,访问*(addr0x001)导致异常。

此时,请在struct_x的成员a、b之前添加占3个字节的成员d,以查看是否报告了错误。

Struct struct_x

{

CHAR A;

茶d[3];

float b;

CHAR C;

}

此时,成员b可以正常访问,因为b的地址在4字节对齐地址中。

上述公交车错误无疑是由于对齐问题造成的。

但是这里有一个疑问。将成员B的类型更改为int类型是否会导致总线错误?

# include

# include

#pragma pack(1)

Struct struct_x

{

CHAR A;

int b;

CHAR C;

}

#pragma pack()

int main(void)

{

struct struct _ x test={ 0 };

printf(' sizeof(struct struct _ x)=% LD \ n ',size of(测试));

=1;

=2;

=3;

char * a=;

int * b=;

char * c=;

Printf ('sizeof (float)=% d,sizeof (int)=% d \ n ',sizeof (float),sizeof (int)

Printf('*a=%d,addr=%p\n ',*a,a);

Printf('*b=%d,addr=%p\n ',*b,b);

Printf('*c=%d,addr=%p\n ',*c,c);

return 0;

}

其中,int类型的b成员可以正常访问。其中,成员B的地址与上面发生总线错误的成员B的地址(float类型)完全相同。float类型和int类型也占用4个字节,但int类型B成员可能支持未排序的访问。

现在,暂时认为CPU是这样设计的。能说明这个问题的朋友欢迎评论讨论。感谢大家。

摘要

上述int类型的B成员可以正常访问,但在实际编程中,必须小心修改排序。如有必要,请尝试使修改后的排序的代码范围尽可能小。例如,只关注结构体,很清楚有这样的事情,所以在后面添加代码时要非常小心。

以上是这次分享。如果你认为文章有帮助,请转达,谢谢。(大卫亚设)。

我想你喜欢:

共享好的嵌入式数据摘要贴纸。

1024G嵌入式资源广播!包括但不限于C/C、单片机、Linux等。私信回复1024,可以免费收到!

1.《【海尔总线数据调乱了怎么办】通过例子了解公交车错误,不要踩坑。》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。

2.《【海尔总线数据调乱了怎么办】通过例子了解公交车错误,不要踩坑。》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。

3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/why/3089348.html

上一篇

【半自动洗衣机三个孔螺丝怎么卸】传染病是通过在家清洁洗衣机来学习的。太简单了

【海尔总线数据调乱了怎么办】海尔线控制器故障确认、参数确认和锁定

【海尔总线数据调乱了怎么办】海尔线控制器故障确认、参数确认和锁定

海尔总线数据调乱了怎么办相关介绍,海尔线控制器故障排除: 海尔中央空调坏了,电线控制面板上会显示带有感叹号的三角形。故障排除方法是(例如)将计时键长按5 ~ 10秒,左上角的数字闪烁,等待切换到错误代码1E(十六进制数,1为16,e为...

【海尔总线数据调乱了怎么办】Can总线分析工具的工作流示例

【海尔总线数据调乱了怎么办】Can总线分析工具的工作流示例

海尔总线数据调乱了怎么办相关介绍,今天以活动错误分析为例,总线诊断功能区显示活动错误、错误警告和总线数据错误,如下图所示。 诊断分析:此时,设备由于CAN通信传输速率不一致、电缆连接错误、终端电阻错误等原因,是CAN数据传输错误。请注...

【海尔总线数据调乱了怎么办】Modbus的通信参数存在于flash中。如果感到困惑,该怎么办

  • 【海尔总线数据调乱了怎么办】Modbus的通信参数存在于flash中。如果感到困惑,该怎么办
  • 【海尔总线数据调乱了怎么办】Modbus的通信参数存在于flash中。如果感到困惑,该怎么办
  • 【海尔总线数据调乱了怎么办】Modbus的通信参数存在于flash中。如果感到困惑,该怎么办
【海尔总线数据调乱了怎么办】海尔XQG65-HB1286变频辊显示EARu通信故障维修。

【海尔总线数据调乱了怎么办】海尔XQG65-HB1286变频辊显示EARu通信故障维修。

海尔总线数据调乱了怎么办相关介绍,海尔XQG65-HB1286变频滚筒洗衣机。2011年购买,洗衣机坏了,维修过程记录如下。对大家都有参考的用途。这台洗衣机的工作控制和电机驱动分别由工作显示控制、变频电机驱动板两个仪表板控制。 变频驱...

【海尔总线数据调乱了怎么办】总结液晶电视进入公共汽车的方法,希望对机械师有用

【海尔总线数据调乱了怎么办】总结液晶电视进入公共汽车的方法,希望对机械师有用

海尔总线数据调乱了怎么办相关介绍,LCD电视主板如何进入公交车,如果你知道更多朋友,欢迎添加。 海神:从菜单中选择“平衡音量”,然后按1969键 昌红:把音量降低到0,按静音,按菜单按钮,然后按0816 音乐视频:信号源2580 江歌...

【海尔总线数据调乱了怎么办】总结的几种液晶电视进入公交车的方法。

【海尔总线数据调乱了怎么办】总结的几种液晶电视进入公交车的方法。

海尔总线数据调乱了怎么办相关介绍,LCD电视主板如何进入公交车,如果你知道更多朋友,欢迎添加。 海神:从菜单中选择“平衡音量”,然后按1969键 昌红:把音量降低到0,按静音,按菜单按钮,然后按0816 音乐视频:信号源2580 江歌...

【海尔总线数据调乱了怎么办】十大品牌液晶电视总线的进入方法与调整

【海尔总线数据调乱了怎么办】十大品牌液晶电视总线的进入方法与调整

海尔总线数据调乱了怎么办相关介绍,十大品牌液晶电视总线的进入方法与调整 1、海信电视进入工程模式方法 用遥控器选择,菜单-在声音设置中选择平衡,输入0532即可进入工程模式。海信电视都是这样的。 这个输入。 2、LG等离子体工程模式输...

【海尔总线数据调乱了怎么办】海尔LCD电视LE42A520不开灯,也不修理——食物,真是可惜。

【海尔总线数据调乱了怎么办】海尔LCD电视LE42A520不开灯,也不修理——食物,真是可惜。

海尔总线数据调乱了怎么办相关介绍,电话维修海尔LCD TV LE42A520开机灯也不亮,现场测试电源5V、12V、24V正常,板上穿孔,无法维修,X宝买了板子,开门滑稽表情。(屏幕参数不对,公交车也找不到调试项目,公交车方法Me 先...