jicheng0622

【技术分享】【原创】IAR环境下更改ARM大小端存储模式

1
阅读(9710)

    马上就要放假走人了,本来是颇有些舍不得的,不过这几天是真被济南的PM2.5吓怕了(汗啊,济南的PM2.5都全国第一了,我表示压力很大),帝都跟我们一比都不好意思了,心想终于有一点可以比得过帝都了(呵呵,有点心虚,当然,这不是济南的污染问题,济南的地势是四面环山,排不出去)。为了我的身心健康,还是早点回东北老家“避避风头”吧,呵呵,所以今天就抓紧扫扫尾,把该做的都做了吧,走着~

    关于ARM的大小端问题我本来早就想着说一说来着,结果前段时间一直在写DIY调试器的那点事就一直拖到现在,心想如果再不写出来2.5把我熏忘了就不好办了,哈哈。大小端这个概念对于我们这些搞嵌入式的人来说应该不陌生,只不过我们平时很多情况下不用考虑它罢了,可能也因此造成一些已经跨入嵌入式行业好多年的人只知道个概念却不知道其具体的含义。下面我们就细说说,当作普及知识了,呵呵:

    在计算机系统中,我们是一般是以字节为单位存储数据的,每个地址单元都对应着一个字节,一个字节为8bit。在C语言中,可能会有各个类型的变量,8位、16位、32位或者64位,那么对这些变量的存储则必然存在着一个多字节安排的问题,由此就导致了大端存储模式和小端存储模式。通常我们对大端和小端的定义为:

(1)大端,Big-Endian,即高位字节排放在内存的低地址端,低位字节排放在内存的高地址端;

(2)小端,Little-Endian,即低位字节排放在内存的低地址端,高位字节排放在内存的高地址端。

上面说的是概念,如果对应到实际CPU上来说,我们常用的X86架构是小端模式(Intel靠它统治了PC行业,心里响起那熟悉的旋律,灯。。。等灯等灯,哈哈),KEIL C51、PowerPC等则为大端模式(也是Intel最开始开发出来的架构,后来卖给各个半导体厂商了,要不说Intel真是NB),而我们现在常用的ARM处理器则既可以工作在大端模式下也可以工作在小端模式下,默认是工作在小端模式下的,那么我们怎么选择呢,这里我就以IAR环境下为例简单说说更改ARM大小端存储模式的方法:

    首先打开IAR环境,新建一个ARM工程,然后右键工程选择“options”,进入到“General Options”选项卡,我们以ARM Cortex-M4核为例,选择目标芯片内核为Cortex-M4,存储模式先选择默认的小端模式,如下图:

image

然后选择Debugger为“simulator”即模拟模式,接着在主程序里编写代码如下:

unsigned short int a ;//定义16位变量

int main()
{
  a=0x0001;
  while(1)
  {
  }
  return 0;
}

点击下载调试按钮,然后运行,从memory窗口可以找到变量a的地址,观察如下:

image

然后我们再回到开始,选择大端模式即image ,然后重新编译下载调试,运行之后查看变量a的地址,观察如下:

image

从上面两图可以清楚直观的看到ARM关于变量的大小端存储方式,是不是很有意思,呵呵,其实大小端不同是个很麻烦的事,在许多代码的跨平台移植上就需要考虑到这个问题,这个俺就不细说了。

好了,本篇内容有点少,权且当作一篇经验笔记或者知识普及篇吧,希望大家能有所收获,呵呵,不早了,得走了,未完待续~