专业的信息化与通信融合产品选型平台及垂直门户
注册 登陆 设为首页 加入收藏
首页 企业新闻 招标信息 行业应用 厂商专区 活动 商城 中标信息

资讯
中心

新闻中心 人物观点
厂商专区 市场分析
行业
应用
政府机构 能源产业 金融机构
教育科研 医疗卫生 交通运输
应用
分类
统一协作 呼叫客服 IP语音 视频会议 智能管理 数据库
数字监控 信息安全 IP储存 移动应用 云计算 物联网

TOP

嵌入式编程:平台大小端存储差异解决办法
2019-01-04 17:02:17 来源:电子工程网 作者:【
关键词:存储
 
关于差异的处理,前文提到的全部采用uint8_t类型进行设计,比较保险稳妥,但数据量大、项目需求复杂的时候,未必就能满足,所以还是需要正面应对这些硬性问题。

  常用处理差异办法

  关于差异的处理,前文提到的全部采用uint8_t类型进行设计,比较保险稳妥,但数据量大、项目需求复杂的时候,未必就能满足,所以还是需要正面应对这些硬性问题。

  这里整理出几个简单转换的过程。

  1. 多个uint8_t转uint16_t/uint32_t

  这个转换很容易可以实现,信手拈来:

  val_u16 = (val_u8_tmp1<<8) |val_u8_tmp2;

  这里的转基本都是把两个uint8_t类型“组合”成uint16_t或者uint32_t,而实际项目工程中,多是对uint8_t类型的数据流进行转换,并且是转换部分数据,因此这里直接写成宏定义,便于开发移植:

  小端模式转成uint16_t/uint32_t

  大端模式转成uint16_t/uint32_t

  分析小端模式转成uint16_t类型的数据,首先将这一长串的宏拆分然后逐步去理解:

  实际是((uint16_t)*(volatile uint8_t*)((ptr)+1)<<8)和(uint16_t)*(volatile uint8_t*)(ptr)两个数据进行位或的运算。

  1.右半边 (volatileuint8_t*)(ptr)是将ptr所指地址强转为volatile uint8_t*类型;

  2.然后是使用*(volatileuint8_t*)(ptr)根据地址从内存中取出该字节;

  3.紧接着将取出的一字节数据使用(uint16_t)强制类型转换成uint16_t类型。

  同样的原理,

  1.左半边(volatileuint8_t*)((ptr)+1)是将prt所指地址的下一个内存单元强转为volatile uint8_t*类型;

  2.然后是使用*(volatileuint8_t*)((ptr)+1) 根据地址从内存中取出该字节;

  3.紧接着将取出的一字节数据使用(uint16_t)强制类型转换成uint16_t类型,再左移8位处理。

  最后将两个结果做位或运算,即实现了“组合”,返回uint16_t类型结果。

  以上过程分析的比较啰嗦,并且其中做的一些强转和volatile修饰也是很有必要的,因为设计的宏要想可靠,还考虑到在有中断、有事件处理的系统里,对数据操作还是需要谨慎些!

  2.单个uint16_t/uint32_t转uint8_t

  单个字/双字转成字节,使用场景比较少,最简单方式直接利用位与(&)和移位运算。

  取低字节:

  val_u8_tmp = val_u16&0xFF;

  取高字节:

  val_u8_tmp =(val_u16>>8)&0xFF;

  3.对uint16_t/uint32_t类型进行字/双字内自转

  其原理一样是操作内存地址的方式,写成宏定义,方便使用。

  其转换的结果是将原数据翻转成相反的端模式。

  总结,项目的开发细节问题弄清楚了,对后续的开发工作也是磨刀不误砍柴工,并且在有通信需求时,尤其有必要做好通信协议的沟通协调,设计一套双方通用的协议结构,对后续开发有着规范可循,对解决Bug也可以快速定位问题!

      

责任编辑:admin
免责声明:以上内容转载互联网平台或企业单位自行提供,对内容的真实性、准确性和合法性不负责,Voipchina网对此不承担任何法律责任。

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部

上一篇IDC:2018年存储市场增长态势基本..
下一篇研究人员在DNA上存储计算机操作系..

热门文章

图片主题

最新文章

相关文章

广告位

Copyright@2003-2009 网络通信中国(原VoIP中国) 版权所有
联系方式:503927495@qq.com
  京ICP备05067673号-1 京公网安1101111101259

《合作通告》

本站因快速发展需要,有共赢合作、战略创投意向的个人或机构,请联系咨询:
(电话)010-69397252、13911442656(v)
(邮箱)503927495@qq.com
我知道了