今天发现了一个挺奇怪的问题,就是在430的RAM中,想给连续的内存地址分配一个char型和一个int型变量时,两个变量之间的地址会跳一个。具体情况看下图。
从上图可以看到,第一根红线表面一个unsigned char型变量的值为108,地址为0x472A,占一个字节;紧接着下一个为unsigned char型变量,其值为2,地址为0x472C,占两个字节。那0x472B这个地址哪儿去了呢?我们可以看到,在存一个char型变量,后面接一个int型变量时,中间会有一个地址被跳过去;
类似的情况还出现在char型变量后面存一个long int型变量时,但是int型变量和long int型变量连续存,或者单独的char型变量连续存,以及单独的int或long int连续存时,均不存在这个问题。
这个挺奇怪的……这对于SD卡参数的解析会有很大影响。可能是跟编译器有关,这里我用的是CCS V5.4。等找到解决方案之后,再在后文补上。
**********************************************************
晚上请教了znFAT群里的“少数派”大哥之后,获得了问题的答案,很开心~这里与大家分享一下。
出现这个问题的原因是结构体的对齐问题。简单地说,就是char型变量的地址是任意的;但是int型变量由于要占2个字节,为了提高CPU的访问速度,所以其首地址必须要为偶数;long int型占4个字节,其首地址必须要为4的倍数。
关于这个问题再具体的讲解,我摘录了david0421的博文“单片机结构体内存的分配 ”中的一段话,他博文的原始地址在http://bibber.blog.sohu.com/230549556.html。
博文如下:
什么是字节对齐
一个变量占用 n 个字节,则该变量的起始地址必须能够被 n 整除,即: 存放起始地址 % n = 0, 对于结构体而言,这个 n 取其成员种的数据类型占空间的值最大的那个。
为什么要字节对齐
内存空间是按照字节来划分的,从理论上说对内存空间的访问可以从任何地址开始,但是在实际上不同架构的CPU为了提高访问内存的速度,就规定了对于某些类型的数据只能从特定的起始位置开始访问。这样就决定了各种数据类型只能按照相应的规则在内存空间中存放,而不能一个接一个的顺序排列。
举个例子,比如有些平台访问内存地址都从偶数地址开始,对于一个int型(假设32位系统),如果从偶数地址开始的地方存放,这样一个读周期就可以读出这个int数据,但是如果从奇数地址开始的地址存放,就需要两个读周期,并对两次读出的结果的高低字节进行拼凑才能得到这个int数据,这样明显降低了读取的效率。
根据这个原理,我利用CCS在MSP430F6638上做了一个简单的测试。
首先定义了两个char型变量和一个int型变量,其内存分配如下如所示。我们可以看到,此时int型变量的首地址为偶数,内存分配是连续的。
然后我只定义一个char型变量和一个int型变量,其内存分配如下图所示,我们可以看到,不连续了。因为int型变量的首地址必须问偶数,所以跳了一个字节。
感谢“少数派”大哥的点拨~
关键字:MSP430 内存分配 不连续
引用地址:
MSP430中内存分配不连续的问题
推荐阅读最新更新时间:2024-03-16 13:49
MSP430学习篇——汇编指令
MSP430指令系统按指令性质可分为:内核指令和仿真指令,其中内核指令27条,仿真指令24条(带*),共51条指令。 内核指令是CPU解码生成的独一无二的操作码。 仿真指令使指令更容易读和写。但是自己没有操作码,由内核指令生成。 三种核心指令格式: 1、双操作数指令(12条) 2、单操作数指令(7条) 3、JUMP(8条) MSP430指令系统按功能可分为: 数据传送类指令 数据传送是单片机在工作中最基本也是最重要的一种操作,它包括将操作数从源地址送到目的地址单元中,或目的地址中的操作数进行高低字节交换或者将目的地址操作数更新或清为“0”都属于数据传送指令。 MOV ;MOV.Bsrc, d
[单片机]
基于MSP430的车载防醉驾安全系统设计
1 系统设计方案 本设计的工作原理是当司机发动汽车时,指示灯亮提示用户装置启动,提示司机必须首先对酒精传感器呼气,该气体经传感器、检波放大和AD转换等处理后,输入到主控 芯片中进行判断,如果超过阈值电压,则蜂鸣器发声则无法启动步进电机,也就意味汽车发动机无法点火,此时语音报警电路会启动报警。反之,如果测试酒精含量没有超标,则显示器提示酒精浓度正常,汽车可正常打火启动。如图1所示为该系统的总体原理框图。 2 硬件电路的设计 系统的核心控制模块是美国TI公司的MSP430F149,该芯片的亮点在于低功耗,片上外围模块丰富,系统工作稳定,符合现代环保的理念;特别是该芯片自带10位和12位ADC转换,使用方便,完全满足现实生活中驾
[单片机]
msp430几种不同开发平台的对比
TinyOS (moteiv & mica) 编辑器 没有特定的编辑器,记事本类似的都行,保证所编辑的源文件是 .nc 结尾的nesC程序。 工程管理 一个目录即为一个工程,包括一个makefile檔和一个或多个 components ,组件有两种: 1. 配件(configuration):描述不同组件之间的关系; 2. 模块:(module):描述组件提供的接口中的函数功能的实验过程。 开发环境 在windows下安装cygwin环境,并在cygwin下安装TinyOS的开发工具包,其中包括 avr-binutils, 二进制代码工具 avr-gcc,
[单片机]
水表智能化需求加速,TI推出超声波单芯片测量芯片
“美国有80%的水务公司已经开始投入或者计划更新水务计量基础设施,从而提高运营效率和减少管网水损失,在中国TI也看到有同样的趋势。”德州仪器中国区MSP微控制器业务拓展经理刁勇表示。根据资料显示,2015年我国水表产量7000万台,其中智能水表1500万台,出口水表约1000万台。 刁勇解释道,目前整个水测量系统和计量系统不完整或准确度不高,导致从自来水公司出来再分布到各个用户的家庭水损失非常高,达到了30%,其中很大一部分的原因是水表计量的问题造成的,所以把水表做得更精致、更智能化是水务公司的迫切需求。 根据市场分析显示,智能水表的市场规模将从2016年的26亿美金规模增长到2025年的72亿美金规模。 而根据国内报
[工业控制]
基于MSP430的光电微损法血糖监测系统设计
WHO在2007年报告中指出,目前全世界有糖尿病(DM)患者1.7亿,预测到2025年将剧增至2.99亿,糖尿病已成为世界第五位死亡原因 。我国DM患者占3.3%。胰岛素疗法是所有胰岛素依赖型糖尿病人的主要治疗方法。而胰岛素剂量确定的基础是严密监察血糖的控制情况。在常用的评估病情的手段中,静脉血糖与毛细血管血糖测定是目前最直接的评估血糖控制的方法,后者更是适合家庭和病人自我血糖监护的方法。研究证明,长期严格的血糖监测,可预防或延缓糖尿病并发症的发生和发展 。因此,本文设计了适合糖尿病患者在家庭中实现血糖自我监护的监测系统。 1 设计原理 1.1 测量原理 将血样滴在含有氧化葡萄糖的氧化酶(GOD)的试纸上,血样中的葡
[单片机]
采用MSP430FR5739 实现应用至物联网的连接
大家不仅可以了解 MSP430FR5739 如何满足大家的能耗预算需求,而且还能了解到其如何借助便捷的 Wi-Fi 实施来支持物联网。 现如今,几乎任何家用电器都可冠以“智能”二字作为前缀。试想一下:智能冰箱能在门没有关紧时向您发送文本消息;自动调温器可以在您有事外出期间自动调节温度;而干衣机则可在小猫咪钻进温暖的衣服堆里时发出警告。看来我们需要随时与我们所有的电器保持通畅连接,若能无线相连就更好了:)。 如果您的应用还不能实现上述功能,也许是时候让它变得更加聪明了! MSP430FR5739 能处理用户所有应用的常规事务,同时还能与TI Simple Link Wi-FiCC3000控制器等主机 Wi-Fi 控制器实
[单片机]
MSP430G2553定时器中断实验
/////////////////////////////////////////////////////////////////// // msp430G2553的定时器中断控制LED每秒钟进行亮熄变化 /////////////////////////////////////////////////////////////////// #include void led_init(); void timer_init(); void delay(int); //---------------------------------- void led_init() { P1DIR|=(1 6); //P1.6为LED }
[单片机]
基于MSP430的智能安防系统电路设计 —电路图天天读(50)
以单片机MSP430F149 为主控芯片,设计出一款高精度、高集成度、超低功耗的智能火灾安防报警系统。以环境温度、烟雾浓度作为判断火灾的依据,完成了对火灾的预警。主要由单片机控制模块、时钟模块、烟雾浓度测量模块、DS18B20 温度测量模块、声光报警模块、1602液晶显示模块和电源构成。并且该系统以MSP430F149 为下位机,完成数据采集、预处理以及对现场装置的控制,以 PC 机为上位机,完成各种复杂的数据处理和对单片机的控制。设计的智能火灾报警系统具有较高的可靠性、稳定性、准确度高,对不同类型的火灾都具有较高的灵敏度,达到了降低误报率的目的。 温度测量模块设计 设计中采用支持“一线总线”接口、抗干扰性强、外部
[单片机]