关于MDK下pack的定义方法

我们使用数据流的过程中经常会用到结构体来进行解析,这个时候就需要使用字节对齐这个概念。不同的编译器的处理方法不一样。

这里小结一下MDK里面常用的几种方法:

1. 最常见的一种

使用#pragma packed struct

#pragma pack(1)

typedef struct __xxx {

u8 A8;

u16 A16;

} xxx_t;

#pragma pack()

这是做常用的方法,但是对于代码的跨编译平台使用的话,可能会比较麻烦,到时候每个结构体的定义都需要修改。

2. 使用__packed struct定义结构体

在结构体的定义中使用关键字,这样实现跨编译器使用的时候会方便很多

typedef __packed struct __xxx {

u8 A8;

u16 A16;

} xxx_t;

时间: 2025-01-04 09:30:07

关于MDK下pack的定义方法的相关文章

Keil MDK下如何设置非零初始化变量(转)

源:Keil MDK下如何设置非零初始化变量 一些工控产品,当系统复位后(非上电复位),可能要求保持住复位前RAM中的数据,用来快速恢复现场,或者不至于因瞬间复位而重启现场设备.而keil mdk在默认情况下,任何形式的复位都会将RAM区的非初始化变量数据清零.如何设置非初始化数据变量不被零初始化,这是本篇文章所要探讨的. 在给出方法之前,先来了解一下代码和数据的存放规则.属性,以及复位后为何默认非初始化变量所在RAM都被初始化为零了呢. 什么是初始化数据变量,什么又是非初始化数据变量?(因为我

Matlab中函数定义方法

Matlab自定义函数的六种方法 n1.函数文件+调用函数(命令)文件:需单独定义一个自定义函数的M文件: n2.函数文件+子函数:定义一个具有多个自定义函数的M文件: n3.Inline:无需M文件,直接定义: n4.匿名函数: n5.Syms+subs:无需M文件,直接定义: n6.字符串+subs:无需M文件,直接定义. ------------ 1.函数文件+调用函数文件:定义多个M文件 % 调用函数文件:myfile.m clear clc for t=1:10 y=mylfg(t);

JavaScript 中实现继承的方式(列举3种在前一章,我们曾经讲解过创建类的最好方式是用构造函数定义属性,用原型定义方法。)

第一种:对象冒充 function ClassA(sColor) { this.color = sColor; this.sayColor = function () { alert(this.color); }; } function ClassB(sColor, sName) { this.newMethod = ClassA; this.newMethod(sColor); delete this.newMethod; this.name = sName; this.sayName = f

VS2012 update1 和 VS2012 Lang Pack 离线安装方法

原文:VS2012 update1 和 VS2012 Lang Pack 离线安装方法 最近有需要用VS2012打开ReactOS这个大项目,生成sln后打开用来导航代码什么的,但其代码都是ascii格式保存,我的win7 x64系统是中文的,这样vs2012默认代码页是936,GBK码,每次打开都提示我换编码保存,问题是这个项目目录里跟着SVN呢,我不可能以为我一个人把所有代码都用unicode(utf-8)保存一下,这样.... 网上找解决方法,可以解决单个文件保存编码,但整个大项目多少万个

关于物体 '固有类别' 与 '实际使用类别' 分离的情况,结构体定义方法

在面向接口.面向对象编程的过程中,会遇到实际物体类别与定义类别相分离的情况. 例如,我们有三种物体,他们的固有类别分别为: TYPEA,TYPEB,TYPEC.在我们实际使用过程中,我们会根据不同的情况将他们分成 2 组: Group1,Group2. 那么,我们在定义结构体和物理类别时,需要注意对 Group 进行定义.定义物体具体属性和结构体如下: #define TYPEA (0x01UL << 0) #define TYPEB (0x01UL << 1) #define T

Linux下清空缓冲区的方法

Linux下清空缓冲区的方法 C标准规定fflush()函数是用来刷新输出(stdout)缓存的.对于输入(stdin),它是没有定义的.但是有些编译器也定义了fflush( stdin )的实现,比如微软的VC.其它编译器是否也定义了fflush( stdin )的实现应当查找它的手册. GCC编译器没有定义它的实现,所以不能使用fflush(stdin)来刷新输入缓存.对于没有定义fflush(stdin)的编译器,可以使用fgets()函数来代替它(比用getchar().scanf()等

数组定义方法 数组遍历方法 全局变量和局部变量定义 赋值传值和赋值传址定义

数组的定义方法: 方式一:使用new运算符结合Array()构造函数来创建 var arr = new Array(); 方式二:创建指定长度的数组,()中只有一个整数 var arr = new Array(3); 数组的长度:arr.length,只能统计一维数组的长度. 方式三:将多个数组元素添加小括号()中,各个元素间用逗号隔开 var arr = new Array(10,20,30,40,50); 方式四:使用中括号[]来创建一个数组 var arr = [10,20,30,40];

ORACLE 11G在Linux下的标准安装方法(下)

一.相关文件夹 ORACLE_BASE是oracle的根目录,ORACLE_HOME是oracle产品的目录.ORACLE_BASE下是admin和product. ORACLE_HOME下则是ORACLE的命令.连接库.安装助手.l监听等等一系列的东西.ORACLE_HOME比ORACLE_BASE目录要更深一些.也就是说:ORACLE_HOME=$ORACLE_BASE/product/oracle_version. RACLE_SID这个环境变量全称"Oracle System Ident

下拉框联动方法封装

业务中经常需要对数据进行下拉框的联动选择操作,可以假设成省份城市 省份城市县这样的多级联动 客户那边提供的数据大多为excel,格式都属于标准一行列的 假设需要对省份城市进行联动 实现如下 1 var pcd = []; 2 pcd[0] = ['北京', '北京']; 3 pcd[1] = ['天津', '天津']; 4 pcd[2] = ['河北', '石家庄']; 5 pcd[3] = ['河北', '唐山']; 6 pcd[4] = ['山西', '太原']; 7 pcd[5] = ['