• 1
    回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

单片机中内存对齐与寻址效率: ALIGN(n)存在的意义

      在RTOS的应用中,我们经常看到有个ALIGN(n)宏的存在,问了下度娘,得到的答案是:内存对齐,提高效率,秉着打破砂锅问到底的精神,翻了很多资料,终于搞明白了,这句答案的含义~!

      首先一般在线程/任务栈的定义时一般会用到内存对齐(注意:并不是在所有的变量定义时都需要):

这个工程文件的主控为stm32f407vet6,内核CPU为cortex-M4,标准的32位CPU。关于内存对齐重点就是CPU的位长,CPU是通过地址总线来访问内存的数据,一次可以处理多个字节,例如32位CPU,一次可以访问4个字节,因为4*8=32。其实际的寻址步长为4,那么它会对0、4、8、1000等地址寻址,而不会1、3、7、1001这些地址寻址:

      假如我的数组的起始地址为3的一个4字节数组,那么CPU需要从0先读入4字节,然后通过地址偏移来获取3的位置的数据,然后从4开始读取到6的位置的数据,然后拼接为一个完整的数据,最起码要进行两次读操作以及可能包含的计算(平白花费了很多的功夫)。这就是为什么要设置4字节对齐的原因。

      ALIGN的实现是由编译相关的宏进行解析的:这句话可以这么理解,这些宏是完成编译器相关的工作,也就是说从变量到真正的内存存储位置定义,是由编译器完成的(这一句话的信息量很大。。。)

      那为什么需要在线程栈的定义时需要字节对齐,而在其它变量定义时不需要呢?

       首先线程栈的作用是在线程切换时用于保存现场,也就是线程切换时用到,而衡量一个os的一个最主要的指标就是线程的切换速度,那么更快的读取写入线程栈,就是为了这一性能指标而存在的,到这里筒子们可能就车顶明白了ALIGN的存在意义。

全部回复(1)
正序查看
倒序查看
2022-10-22 11:01

怎么没人聊呢,我先点个赞

0
回复