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
    +关注

    关注

    2265

    文章

    10870

    浏览量

    354716
  • 代码
    +关注

    关注

    30

    文章

    4741

    浏览量

    68326
  • 数据结构
    +关注

    关注

    3

    文章

    573

    浏览量

    40088

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

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

收藏 人收藏

    评论

    相关推荐

    I2S有左对齐,右对齐标准的I2S三种格式,那么这三种格式各有什么优点呢?

    大家好,关于I2S格式,有两疑问请教下 我们知道I2S有左对齐,右对齐标准的I2S三种格式,那么这三种格式各有什么优点呢? 而且对于
    发表于 10-21 08:23

    IP地址会被黑?

    IP地址会被黑?是的,你的IP地址如果不幸被恶意分子盯上,就会被恶意利用,这会引发系列明显的异常表现。就像网络会突然变得异常缓慢,下载速度
    的头像 发表于 09-12 14:24 274次阅读

    如何获取MAC地址?MAC地址的三申请条件

    在产品设备都规范化管理的当今社会,如果您的产品设备想要投入市场,设备物理地址码MAC地址则是唯能识别设备的识别码。那么MAC地址的申请条件有哪些?接下来请看英利检测的分享。提交必要信
    的头像 发表于 09-06 17:14 349次阅读
    如何获取MAC<b class='flag-5'>地址</b>?MAC<b class='flag-5'>地址</b>的三<b class='flag-5'>个</b>申请条件

    文带你了解IP地址别名

    、什么是IP地址别名 IP地址别名是将多个IP地址网络接口关联起来的
    的头像 发表于 09-05 14:11 166次阅读

    DHCP服务异常与IP地址管理挑战

    DHCP是种计算机网络协议,主要用于自动分配IP地址、子网掩码、网关、DNS等网络参数给客户端设备。它是局域网中实现自动IP地址分配的重要协议,极大地简化了网络管理员对IP地址的管理
    的头像 发表于 08-30 14:35 901次阅读

    谷景科普电感的感值什么有关

    感值也就是我们常说的电感量,它是电感的非常重要的性能参数,衡量的是电感在电路中对电流变化的抵抗能力的物理量。那么,你知道电感值与哪些因素有关吗? 有人说电感越大它的电感值就越大的,分装尺寸大小
    的头像 发表于 08-19 10:31 271次阅读

    IP地址与网络监控

    如何识别和应对异常流量和可疑活动。 IP地址与网络监控的基础 IP地址是互联网中设备的唯标识符,它在网络通信中起着至关重要的作用。通过监控IP地址
    的头像 发表于 07-09 16:41 380次阅读

    鸿蒙ArkUI开发:【弹性布局(主轴&amp;交叉轴对齐方式)】

    通过justifyContent参数设置在主轴方向的对齐方式,和Row、Column的主轴对齐方式行为
    的头像 发表于 05-14 15:33 636次阅读
    鸿蒙ArkUI开发:【弹性布局(主轴&amp;交叉轴<b class='flag-5'>对齐</b>方式)】

    STM32关于FLASH的编程对齐错误标志位(PGAERR)的疑问求解

    大神们,我现在正在做一个应用,需要熟悉STM32F4的FLASH的任何错误标识,以用于特殊情况下的错误标识判断做相应处理,但是针对FLASH的编程对齐错误标志(PGAERR)与我理解不同。 原文
    发表于 03-22 07:59

    TC277如何指定该全局数组变量的存储地址对齐方式?

    定义全局数组变量,如何指定该全局数组变量的存储地址对齐方式
    发表于 02-19 07:37

    SPI全双工模式下数据接收异常原因

    前面给小伙伴讲过串口发送和接收异常的可能原因,今天我们讲下SPI全双工模式下数据接收异常原因。
    的头像 发表于 01-23 09:31 1253次阅读
    SPI全双工模式下数据接收<b class='flag-5'>异常</b>的<b class='flag-5'>一</b><b class='flag-5'>个</b>原因

    程序中增加变量导致异常的分析

    大家在平常的编程过程应该会碰到各种奇葩的问题吧,反正我最近是碰到了次,再此大家分享下。事情的原因是我在程序中增加了变量,然后就会导
    的头像 发表于 01-22 09:56 517次阅读
    程序中增加<b class='flag-5'>一</b><b class='flag-5'>个</b>变量导致<b class='flag-5'>异常</b>的分析

    OneLLM:对齐所有模态的框架!

    OneLLM 是第一个在单个模型中集成八种不同模态的MLLM。通过统的框架和渐进式多模态对齐pipelines,可以很容易地扩展OneLLM以包含更多数据模式。
    的头像 发表于 01-04 11:27 902次阅读
    OneLLM:<b class='flag-5'>对齐</b>所有模态的框架!

    AD9288输出不平衡Vref有关系吗?

    的参考信号1.25V,用示波器看有点纹波,1.29~1.22V,滤波电容是0.1uF的,后来增加1uF的貌似没有改善,请问这个不平衡Vref有关系吗?
    发表于 12-15 06:24

    dhcp服务异常怎么修复

    DHCP(Dynamic Host Configuration Protocol)是种网络协议,它能够自动分配 IP 地址和其他网络参数给计算机和其他网络设备。然而,有时候 DHCP 服务可能会出现异常
    的头像 发表于 11-27 14:53 9723次阅读