0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

一个跟地址对齐有关的应用异常案例

茶话MCU 来源:lq 2019-02-04 15:20 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

曾有STM32用户反馈,他发现同样代码在STM32F1系列芯片上运行好好的,而且代码跟STM32外设关联性也不大。而当代码运行在stm32L071VB单片机时,在做数据的内存拷贝时会进入硬件错误【Hard Fault】,觉得不可理解。

它定义了类似下面的数据结构,并用到预编译命令安排结构体数据成员的存放对齐原则:

#pragma pack‍ (1)

Struct Comm_Frame {

uint8_t Head;

uint16_t Data[3];

uint8_t Class;

uint16_t Tail [2];

} Stream;

#pragma pack ()

他使用到基于上面结构体定义的数据变量进行数据通信,为了让数据成员在内存中紧凑连续存放,将数据结构体的地址对齐规则指定为字节对齐,即使用#pragma pack (1)。数据在内存中像下面样子摆放:

他这样设计的话,数据结构体中的Data[]和Tail[]双字节数据会出现在奇数地址的地方。那么,当将上述Stream.Data[]数据拷贝出去的时候,在基于双字节数据类型的指针寻址访问时,会出现被访问数据的地址不遵循2倍数的原则,即出现访问地址不对齐的问题,可能导致运行出错。一般来讲,对于ARM内核的芯片,基于双字节数据宽度的寻址访问时,被访问数据的地址要求是2的倍数;基于4字节数据宽度的寻址访问时,地址要求是4的倍数。

比如:这里定义了一个数组uint16_t forcomp[3]和下面两个指针:

uint16_t *pointer1 = &forcomp[0];

uint16_t *pointer2 = &Stream.Data[0];

现将上面结构体成员Stream.Data[]的内容通过指针寻址按如下方式拷贝进‍forcomp[]‍。

上面的代码如果运行在基于M0或M0+内核的STM32芯片的话,就会出现Hard Fault错误. 客户使用的芯片stm32L071VBT6正是基于M0+内核的STM32芯片。

为什么会这样呢?这可以从Cortex M0/M0+的内核技术手册上看到相关描述:

显然,基于M0、M0+内核的芯片,它是不支持非对齐寻址访问的。

客户又说过,相同代码在STM32F1芯片上运行又没有问题,那怎么解释呢?

STM32F1系列MCU是基于ARMCortex M3内核的芯片,关于地址对齐方面跟M0/M0+有所不同。M3内核支持部分指令的非对齐地址访问,相关描述如下:

也就是说,基于CortexM3内核的芯片,它支持部分指令的非对齐访问,但非对齐访问要慢于对齐访问。即非对齐访问是需要代价的,访问效率会受到影响。所以,我们在应用中要尽量遵循地址对齐的寻址访问方式。关于地址对齐话题,在各个ARM内核技术参考手册里略有介绍。

结合本案的实际情况,碰巧用户代码先是可以正常运行于基于M3内核的STM32F1芯片,而在基于M0+内核的芯片上出现了异常。导致他觉得不好理解。

这里,指针所指数据类型为双字节类型,为了避免在M0/M0+内核芯片里寻址访问时发生非对齐而导致的异常,可以将结构体变量的内存地址对齐方式改为双字节对齐,即使用#pragma pack (2)。数据在内存中像下面这样摆放。

这样修改后,经过测试的确没有问题。结合到客户的具体情况,客户希望数据连续、紧凑存放,不希望数据间有空隙,即结构体数据成员的内存地址对齐规则不变,仍然采用pack(1)。那么,数据拷贝操作时可以将双字节数据类型的指针强转为单字节数据类型的指针,将双字节数据按字节对齐寻址方式分作两次连续读取完成。此时,用户只需将应用程序稍作调整即可。

所以,在STM32开发过程中,有些代码或许跟MCU外设没什么关系,但可能跟内核有关。STM32系列众多,涉及多个ARM内核,不同的内核在诸多方面存在些差异,这点需要注意。其实,从MCU软件开发层面来看,地址对齐问题、中断优先级安排问题、堆栈安排问题,都是些比较隐蔽的问题,出错了后果往往也很严重,我们平时可以多留意下。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • STM32
    +关注

    关注

    2305

    文章

    11121

    浏览量

    371181
  • 代码
    +关注

    关注

    30

    文章

    4941

    浏览量

    73151
  • 数据结构
    +关注

    关注

    3

    文章

    573

    浏览量

    41374

原文标题:一个跟地址对齐有关的应用异常案例

文章出处:【微信号:stmcu832,微信公众号:茶话MCU】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    Hardfult对齐异常怎么解决?

    1.使用O3编译,正常运行。 2.使用OZ编译,报UNALIGNED异常。 3.全局使用Oz编译,对ipc.c文件单独O3编译,正常运行。 00> msh >psr
    发表于 10-13 07:45

    连得上热点,但是ping baidu.com出现timeout,请问什么有关

    连得上热点,但是ping baidu.com出现了timeout, ping其他ip也是timeout,timeout什么有关系,需要怎么操作
    发表于 09-17 08:19

    CYPD5235的CC Pin功能异常,还可能会什么有关

    /VSYS/VDDD/V5V_P1的电都是正常的。 请教问题: 1。CYPD5235的CC Pin功能异常,还可能会什么有关? 2。去掉的MP8859,会影响CYPD5235的软件代码执行吗?如果会
    发表于 05-30 07:04

    Allegro Skill布局功能--器件丝印过孔对齐介绍与演示

    Allegro系统虽然提供了基本的元件对齐功能,但其适用范围较为有限。相比之下,Fanyskill 的“对齐”命令在操作体验和功能性上更具优势:其界面设计更加直观易用,并支持多种元素的对齐操作,包括
    发表于 05-14 08:59 2423次阅读
    Allegro Skill布局功能--器件丝印过孔<b class='flag-5'>对齐</b>介绍与演示

    PCB布局太乱? Altium Designer这个快捷键帮你对齐全场

    在做PCB设计的时候,你是否也遇到过这种情况: 器件摆好但总感觉歪歪扭扭? 有些元件间距不致,看着难受? 想对齐一个个拖动,累得不行? 别急!今天教你招  Altium Desi
    的头像 发表于 04-14 09:09 4276次阅读
    PCB布局太乱? Altium Designer这个快捷键帮你<b class='flag-5'>一</b>秒<b class='flag-5'>对齐</b>全场

    图解边沿对齐,中心对齐PWM(可下载)

    在说边沿对齐,中心对齐前,我们先来段铺垫,PWM 又称脉冲宽度调制,我们通过调 节脉冲的占空比,我们可以控制电压的大小(比如我们满占空比时电压为 12V,我们可以通 过调节占空比让电压变为 7V
    发表于 03-31 15:15 1次下载

    汇川西门子PLC之间通讯项目调试的笔记

    刚完成了汇川西门子PLC之间通讯项目,采集IGT-DSER智能网关,两边的PLC内都不用编程的; 支持字节顺序的调整,通讯速度是毫秒级别的,与总线无差异; 该方法也可以实现西门子PLC
    发表于 03-26 14:24

    ADS1282的数据采样率那些量有关

    哪位能告诉我ADS1282的数据采样率那些量有关吗?怎么设置?是不是CLK、SCLK有关
    发表于 02-08 08:50

    Orcad绘制原理图的元器件对齐方法

    在使用Orcad软件绘制原理图的时候,为了使原理图绘制的美观些,有时候也希望像PCB设计样,将所有的器件都进行对齐,这里我们给大家介绍下,原理图器件对齐的方法,方便大家在原理图设计
    的头像 发表于 02-07 10:33 2566次阅读
    Orcad绘制原理图的元器件<b class='flag-5'>对齐</b>方法

    如何保证电平转换前后数据的相位对齐

    请教各位TI的技术人员问题 数据经过电平转换芯片是会产生延迟的 对于多通道电平转换芯片,由于延时的存在,不同通道间的延时是不样的,那同相位的信号经过转换后不同通道的输出信号的相位可能不同,请问
    发表于 02-05 06:16

    关于tlk2201数据对齐问题求解

    syncen,让2201检测k28.5,然后对齐。 目前问题如下,希望ti的工作人员帮忙分析告知下: 1.如果我fpga端使用8b10b编码,比如前周期发的dx.y 后
    发表于 01-23 06:26

    ISP与IP地址

    才能接入互联网,与其他设备进行通信和数据传输。这是前提也是基础。   ISP通常使用DHCP来为用户提供IP地址的动态分配。当设备连接到ISP的网络时,DHCP服务器会自动从IP地址池中分配
    的头像 发表于 12-27 10:41 924次阅读

    CIDR的IP地址分配与管理

    传统IP地址分类,也就是ABC类等。但是,有种情况,“如果公司可能被分配了C类网络
    的头像 发表于 12-26 10:01 947次阅读

    IP地址数据信息和爬虫拦截的关联

    多样的数据,那么我们应该怎么利用IP地址信息来对爬虫行为进行识别呢? 访问频率异常的大概率是爬虫行为 正常用户访问:浏览网站时,操作速度会受到人类行为习惯的限制,通常会在页面上停留定时间进行阅读、思考,所以访问频率相对较低且具
    的头像 发表于 12-23 10:13 679次阅读

    MAC地址的作用范围,MAC地址怎么申请?

    物理地址(PhysicalAddress),用于在网络中唯标示网卡。以下是英利检测针对其作用范围及申请方式的详细解答:MAC地址的作用
    的头像 发表于 12-19 17:44 2605次阅读
    MAC<b class='flag-5'>地址</b>的作用范围,MAC<b class='flag-5'>地址</b>怎么申请?