你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

基于STM32F1非对齐内存访问经验分享

[复制链接]
攻城狮Melo 发布时间:2023-3-30 18:43
简单地说非对齐内存访问就是被访问的地址不是4字节对齐的,非对齐内存访问的用处很多,有的时候可以精简不少程序,尤其是在帧数据处理的时候。例如有一个整形变量A存放在内存的0x0000 0000处,访问变量A的时候就是对齐访问,因为地址0x0000 0000是4字节对齐的,再比如又有一个整形变量B的存放地址为0x0000 0003,那么对B的访问就是非对齐内存访问了,因为地址0x0000 0003不是4的整数。
貌似没有什么问题,就像上面的例子中的变量B,我们读取变量B的时候不就是从地址0x0000 0003处开始读取4个字节到CPU的寄存器中去么?是这样,但是很多处理器设计的时候为了运算速度的考虑只允许对齐的内存访问方式,非对齐访问会出现异常中断,所以不能进行非对称内存访问。但是Cortex M3内核是支持非对齐内存访问的,在ARM Cortex M3权威指南(英文版)中有写到“The Cortex-M3 processor also supports unaligned data accesses, a feature previously available only in high-end processors.”,这段话说的很清楚,Cortex-M3处理器是支持非对齐内存访问的,这在之前只是在高端芯片上才支持的。那么基于CM3的STM32F1xx系列真的可以么?做个试验就行了。
简单写个程序进行测试:
  1. void main()
  2. {
  3.         unsigned char buff[10] = {0,0,0,0,0,0,0,0,0,0,};
  4.         int i;
  5.         for(i=0;i<10;i++)
  6.                 printf("%.2x ",buff[i]);
  7.         printf("\r\n");

  8.         *(unsigned int *)(buff + 0) = 0x11223344;
  9.         for(i=0;i<10;i++)
  10.                 printf("%.2x ",buff[i]);
  11.         printf("\r\n");
  12.        
  13.         *(unsigned int *)(buff + 3) = 0x11223344;
  14.         for(i=0;i<10;i++)
  15.                 printf("%.2x ",buff[i]);
  16.         printf("\r\n");       
  17. }
复制代码

在STM32F103上运行的结果是:
  1. 00 00 00 00 00 00 00 00 00 00
  2. 44 33 22 11 00 00 00 00 00 00
  3. 44 33 22 44 33 22 11 00 00 00
复制代码

结果很明显,进行非对齐写入的时候,没有发生异常中断,且正确进行了非对齐写入。但是需要注意的是如果程序中有非对齐的内存访问的话,程序的可移植性可能会降低,因为不是所有处理器都可以进行非对齐内存访问,例如使用Cortex-M0内核的STM32F0系列处理器就不支持非对齐内存的访问。
————————————————
版权声明:哐哐哐 Quan
如有侵权请联系删除



收藏 评论0 发布时间:2023-3-30 18:43

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版