历史上的今天

今天是:2024年10月21日(星期一)

正在发生

2019年10月21日 | 32位嵌入式系统的字节对齐

发布者:科技驿站 来源: 51hei关键字:32位  嵌入式系统  字节对齐 手机看文章 扫描二维码
随时随地手机看文章

32位嵌入式系统的软件开发过程中,字节对齐问题是相当重要的。我们现在就拿ARM处理器ADS1.2开发环境作为例子说明字节对齐的概念。


在此之前,我先声明几个基本的概念:


(1)、对象:在C语言中使用结构体类型、共同体类型、或内部基本类型所定义的变量或常量,就称为对象。对象占据了一块实际的存储器空间,这块空间有固定的起始地址和字节数。


(2)、引用:使用对象有两种方法:“对象名”和“引用”。当你在源代码中定义一个对象时,编译器就会为它分配一块存储器,此时你就可以使用“对象名”来操作该对象。但是对于程序运行时动态分配的某一块存储器空间(对象),你就没法使用“对象名”了,而只能使用“引用”,所以,“引用”就是指向特定类型的对象的指针。


好了,我们转入正题。


在32位嵌入式系统中,单字节对象是1字节对齐的;双字节对象是2字节对齐的;四字节对象是4字节对齐的;其它结构体或共同体对象是8字节对齐的。也就是说,当你定义一个单字节对象时,该对象的起始地址可以是任何整数;当你定义一个双字节对象时,该对象的起始地址必定是2的倍数的整数;当你定义一个四字节对象时,该对象的起始地址必定是4的倍数的整数;当你定义一个结构体或共同体对象时,该对象的起始地址必定是8的倍数的整数。以上说的对象包括“结构体或共同体对象的成员对象”。


字节对齐的故障只能出现在“引用”的使用过程中。当你使用“对象名”来操作对象时,根本不用担心字节对齐问题。


在ADS环境下,有“ALIGN” 、“__align(x)” 、“__packed”关键字用于字节对齐处理。ALIGN用于汇编语言,__align(x)用于C语言,__packed用于放弃字节对齐。


单字节对齐类型的引用可以操作任何对象,双字节对齐类型的引用可以操作双字节、四字节、八字节对齐的对象,…………。只有遵守这个规则,你的程序才可能是健壮的。


如果你确实想使用双字节对齐类型的引用来操作单字节对齐对象,那么你在定义该引用时必须使用__packed关键字!



关键字:32位  嵌入式系统  字节对齐 引用地址:32位嵌入式系统的字节对齐

上一篇:ARM处理器的节能优势
下一篇:stm32入门——跑马灯(基于stm32f103zet6)

推荐阅读

假设 系统时钟是72Mhz,TIM1 是由PCLK2 (72MHz)得到,TIM2-7是由 PCLK1 得到关键是设定 时钟预分频数,自动重装载寄存器周期的值/*每1秒发生一次更新事件(进入中断服务程序)。RCC_Configuration()的SystemInit()的RCC->CFGR |= (uint32_t)RCC_CFGR_PPRE1_DIV2表明TIM3CLK为72MHz。因此,每次进入中断服务程序间隔时间为时间=1/频率×次数((1+TIM...
2007年12月12日,国家电网公司在菲律宾国家输电公司特许经营权拍卖会上竞标成功,获得菲律宾国家电网25年的特许经营权。这是我国电网企业首次获得境外国家级大型输电网络的特许经营权,也是国家电网公司实施“走出去”战略,充分利用国内、国外“两个市场、两种资源”,促进我国能源可持续发展的重大举措。 此前,菲律宾国家输电公司经营业绩良好,...
随着5G时代的高速推进与发展,更大的智能互联场景对网络环境也提出了新的要求, Wi-Fi 6也逐渐在局域通信领域达到全面普及,作为掌握此类核心通信技术的品牌华为,更是全新推出了Wi-Fi 6 Plus路由器华为AX3 Pro,简约的设计,简单的使用方法,更低的价格让华为路由器AX3 Pro深受欢迎。我们已经对华为路由器AX3 Pro进行了拆解,接下来我们从元器件角...
谷歌今天凌晨发布了Pixel 6和Pixel 6 Pro手机新品。在推出新手机的同时,谷歌今天也为目前的Pixel手机设备正式推出了 Android 12系统。除了Material You,改良后的快速设置,以及其他一系列的 Android 12 新增功能外,它还具有10月的安全补丁。如果你的设备还没有安装,谷歌刚刚发布了官方OTA和工厂镜像。  Android 12正式版现在可以在Pi...

史海拾趣

问答坊 | AI 解惑

PCB板简介

PCB板简介 PCB基础知识 一、         PCB定义: PCB(PRINTING CIRCUIT BOARD)是指在覆鲷板上经过印刷、蚀刻、冲裁等加工手段生产出客户所要电图形的板。 二、       & ...…

查看全部问答∨

请教运放信号放大的一个问题

我现在要对经高压分压后的直流电压信号(0.1V左右,参考点不定,可能为地,也可能为悬浮高压)进行处理,我想先将其用运放进行放大后再进行A/D转换,其连接图见附件,但我觉得这样接会破坏原本的分压电路,改变分压阻值,是否需要先跟随后放大?还 ...…

查看全部问答∨

RETALLMSG(1,(TEXT(":::SPL_IOControl.\r\n")));输出函数的理解

RETALLMSG(1,(TEXT(":::SPL_IOControl.\\r\\n"))); 这样一个函数的作用是什么? 相对于单片机有输出如P1.0=1; 这样输出效果很明显 RETALLMSG(1,(TEXT(":::SPL_IOControl.\\r\\n")));这样一个函数的输出效果是这样,执行了这条语句能看到 ...…

查看全部问答∨

这是什么错误了阿 !!!

makeimg: run command: res2exe -r -c C:\\WINCE600\\OSDesigns\\2450\\2450\\RelDir\\smdk2450_ARMV4I_Release\\0409\\bthpnl.res C:\\WINCE600\\OSDesigns\\2450\\2450\\RelDir\\smdk2450_ARMV4I_Release\\bthpnl.cpl makeimg: Check for C:\\WI ...…

查看全部问答∨

wince6上弄nor分区求助!!!

最近在弄nor分区, 遇到了一些问题, 想请教一下. 具体的情况是这样的: WINCE6, 板子是pxa270, 克隆的bsp是mainstonIII, 板子上有一块stratad的nor flash, 容量是32MB, 这块板子用来存放bootloader(不到1MB)和nk(20MB左右)之后还剩下10MB左右的空 ...…

查看全部问答∨

关于交通灯程序延迟问题!!!!急!!!!!!

P控制规律如下:南北路口的绿灯、东西路口的红灯同时亮30秒;                 南北路口的黄灯闪烁5次,同时东西路口的红灯继续亮;              ...…

查看全部问答∨

如何检查一个驱动dll是否被加载?

我这里碰到的一个问题是,不知道如何确定一个dll是否被系统加载了. 我这里自己想的思路就是: 1.打印串口调试信息,信息打印出来了,就表示加载了.     这个方法相对而言比较简单,但是有的时候不太方便. 2.通过USB连接之后,通过进程查看 ...…

查看全部问答∨

C# 单片机 的问题

我是一个小公司,公司现在要开发一个煤矿管理系统,现在单片机的程序研发结束了。 单片机的数据格式,命令及命令格式,都以文档的形式给我了。 我现在想用C#与其通讯。 单片机:P89V51R 单片机接口:现用的是电话线。RS-232接口同时也在开发中 ...…

查看全部问答∨

我用超级终端调试ARM板,可是在一个进程启动后就不能结束了!

进入超级终端手工开始这个进程倒可以结束(CTRL+C),但当我把这个进程写到开机自动启动脚本后就不能用CTRL+C结束了,这个进程的左右是不断往串口发数据并读取串口回复。现在整个超级终端的界面都是布满了发送的那几个数,导致不能控制这个ARM板子了 ...…

查看全部问答∨
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved