IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> 嵌入式开发——结构体指针作为参数传递变量的值不正确 -> 正文阅读

[嵌入式]嵌入式开发——结构体指针作为参数传递变量的值不正确

问题描述

由于海思芯片紧缺,公司决定启用一款新的音视频处理芯片,我负责要将原有的算法库移植到新平台。在移植的过程中,发现调用某个图像转换函数时,得不到正确的结果,而且这个函数还是其他的库里实现的,我只是调用。于是我去查看了这个函数的实现,传参主要是通过一个结构体。我在调用这个函数前,将该结构体的成员变量的值都打印出来,发现没有问题,然后在被调用的函数里,打印接收到的变量的值,发现对不上。这就很奇怪了,明明我在调用函数前赋值都是正确的,为什么传进去就不对了,百思不得其解。简单来说,就是我在A库调用B库实现的函数时,发现通过结构体传参,传过去的变量的值不正确。

解决步骤:

1.传参是传的结构体指针,我在调用函数前打印了这个结构体指针,在被调用函数里也打印了这个结构体指针,发现指针是一样的,表明传参是没有问题的。这里存在两种出错的可能,一种是两者数据解析方式不同,毕竟传的是同一内存地址,数据都一样;还有一种可能是该内存地址处的数据被意向不到的地方给修改了,导致两次去读取该内存的数据不一样。
2.接着进一步添加打印,我把结构体里的每个成员变量的地址都打印出来,发现在调用前打印和在被调用函数里打印是不一样的,这就能解释为什么传参的值不正确了,因为两次读取的都不是同一内存地址处的数据。这让我想起来结构体的对齐,毕竟面试时候考结构体最喜欢考对齐,于是我用sizeof()函数在两个库都打印了该结构体占用的字节数,果然两个库里同一结构体占用的字节数不一样,由此推断是两个库的对齐字节数不同导致的。
3.两个库都是运行在同一芯片,默认的对齐字节数就是CPU的位宽,32位机器就是4byte,64位芯片就是8byte。肯定有地方强行修改了对齐字节数,于是我用比对软件对比两个库里同一头文件的差异,发现其中一个库用了#pragma pack(4)将对齐字节数强行修改成4字节,这才导致两个库里结构体不一样。不熟悉的可以参考博客《嵌入式开发——#pragma pack()常见用法介绍》
4.因为海思芯片是32位的,默认就是4byte对齐,所以加不加#pragma pack(4)都是4字节对齐,代码在海思芯片上运行就没有问题。现在移植到的新芯片是64位的,默认是8字节对齐,这样就导致A库是8字节对齐,B库是4字节对齐,导致结构体大小不同,成员变量的地址相对于结构体首地址的偏移量也不同,肯定不能解析出正确的数据。

总结

我遇到的这种情况,最根本的原因就是两个库的交互头文件不一致导致的,正常情况两个库里的同一头文件应该是相同的。这是个历史遗留问题,以前被掩盖了,现在移植新平台才显露出来。同时也提醒自己,修改库之间交互的头文件要慎重。

  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2021-07-10 14:41:08  更:2021-07-10 14:42:32 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/25 18:57:30-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码