惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
The GitHub Blog
The GitHub Blog
J
Java Code Geeks
Engineering at Meta
Engineering at Meta
N
Netflix TechBlog - Medium
A
About on SuperTechFans
博客园 - 三生石上(FineUI控件)
罗磊的独立博客
MongoDB | Blog
MongoDB | Blog
B
Blog RSS Feed
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
有赞技术团队
有赞技术团队
T
Tailwind CSS Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
Vercel News
Vercel News
腾讯CDC
博客园 - 聂微东
The Cloudflare Blog
F
Fortinet All Blogs
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
V
Visual Studio Blog
Last Week in AI
Last Week in AI
B
Blog

博客园 - xlander

跟实际生活相关的饭否应用 5个跟实际生活相关的Twitter应用 Google Code上两个LPC21XX开源项目 Router牌音箱 基于ARM的网络收音机 博客程序换成了Z-Blog的 音箱?储钱罐? 显式指针转换的教训 使用结构体中成员变量指针的教训 C语言的跨编译器编译 日本某商场里的智能瀑布 ADS下C语言中局部变量的存储位置分配 救活TrackBack的偏方 近期几个开源的嵌入式产品 几个自制心电图的网络资源 哇哦级的贴片焊接教学视频 自动五线谱识别及音乐合成装置 简易指纹识别授权访问系统 PIC18F2550实现的基于HID的USB示波器
结构体中位段、字节对齐并用的教训
xlander · 2008-08-31 · via 博客园 - xlander

解决了C语言的跨编译器编译,写代码省了不少事儿,今天增加了一条新通讯协议,代码很快就写完了,嗷嗷的爽,只是测试的时候,费了些力气,嗷嗷的郁闷。

为了“省事儿”,我定义了一个结构体,结构体中使用了位段。这个结构体经过宏展开,在ADS下,是这样的:

__packed struct _tag_SwitchConfig
{
uint32 bEnable:1;
uint32 nSignalType:3;
uint32 nTriggerMode:3;
uint32 nThreshold:16;
};

在VC下,是这样的:

#pragma pack(push)
#pragma pack(1)
struct _tag_SwitchConfig
{
uint32 bEnable:1;
uint32 nSignalType:3;
uint32 nTriggerMode:3;
uint32 nThreshold:16;
};
#pragma pack(pop)

结构体定义部分是一模一样的,不同的是有关字节对齐的编译器指令。所以,写这段代码的时候,我没觉得有什么问题。开始测试的时候,我也没觉得有什么问题。但是,测试的结果,却总是不正确。反复检查各个流程的代码,包括数据打包、解包、界面显示,折腾了足足一个多小时,万般无奈之下,分别在两个平台下,执行n=sizeof(struct _tag_SwitchConfig),问题才算露出水面。

居然.......ADS下,n=3,而VC下,n=4。

从编译器的帮助文档里看,__packed以及#pragma pack(1)的意思都是将结构体按1字节对齐。但是__packed正如字面含义一样,可能还有压缩的意思。

我现在的解决办法是增加一个9位的nReserved字段来“充数”,保证两个平台编译结果一致。这个办法的不完美是确定一定以及肯定的了,但是除了位段,还有什么呢?如果你有更好的,不要错过助人为乐的机会:P。

我现在的工作算是沾到跨平台开发的边缘了,需要补充点知识,才能多快好省的完成[请使用文明用语]交给的伟大任务。看了编写跨平台的软件入门--有关字节对齐关于C结构体bit field的跨平台的教训,尽管收获颇丰,但都没提到我现在的问题。

Copyright © 2008

继续阅读《结构体中位段、字节对齐并用的教训》的全文内容...

分类: 软件开发 | Tags: ARM  C  结构体  位段  字节对齐   | 添加评论(0)

相关文章: