当前位置:网站首页>总结嵌入式C语言难点(2部分)
总结嵌入式C语言难点(2部分)
2022-08-02 20:50:00 【an520_】
结构类型和对齐
C语言提供自定义数据类型来描述一类具有相同特征点的事务,主要支持的有结构体,枚举和联合体。其中枚举通过别名限制数据的访问,可以让数据更直观,易读,实现如下:
联合体的是能在同一个存储空间里存储不同类型数据的数据类型,对于联合体的占用空间,则是以其中占用空间最大的变量为准,如下:
联合体的用途主要通过共享内存地址的方式,实现对数据内部段的访问,这在解析某些变量时,提供了更为简便的方式,此外测试芯片的大小端模式也是联合体的常见应用,当然利用指针强制转换,也能实现该目的,实现如下:
可以看出使用联合体在某些情况下可以避免对指针的滥用。结构体则是将具有共通特征的变量组成的集合,比起C++的类来说,它没有安全访问的限制,不支持直接内部带函数,但通过自定义数据类型,函数指针,仍然能够实现很多类似于类的操作,对于大部分嵌入式项目来说,结构化处理数据对于优化整体架构以及后期维护大有便利,下面举例说明:
C语言的结构体支持指针和变量的方式访问,通过转换可以解析任意内存的数据(如我们之前提到的通过指针强制转换解析协议),另外通过将数据和函数指针打包,在通过指针传递,是实现驱动层实接口切换的重要基础,有着重要的实践意义,另外基于位域,联合体,结构体,可以实现另一种位操作,这对于封装底层硬件寄存器具有重要意义,实践如下:
通过联合体和位域操作,可以实现对数据内bit的访问,这在寄存器以及内存受限的平台,提供了简便且直观的处理方式,另外对于结构体的另一个重要知识点就是对齐了,通过对齐访问,可以大幅度提高运行效率,但是因为对齐引入的存储长度问题,也是容易出错的问题,对于对齐的理解,可以分类为如下说明:
基础数据类型:以默认的的长度对齐,如char以1字节对齐,short以2字节对齐等
数组 :按照基本数据类型对齐,第一个对齐了后面的自然也就对齐了
联合体 :按其包含的长度最大的数据类型对齐
结构体:结构体中每个数据类型都要对齐,结构体本身以内部最大数据类型长度对齐
其中union联合体的大小与内部最大的变量int一致,为4字节,根据读取的值,就知道实际内存布局和填充的位置是一致,事实上学会通过填充来理解C语言的对齐机制,是有效且快捷的方式。
预处理机制
C语言提供了丰富的预处理机制,方便了跨平台的代码的实现,此外C语言通过宏机制实现的数据和代码块替换,字符串格式化,代码段切换,对于工程应用具有重要意义,下面按照功能需求,描述在C语言运用中的常用预处理机制。
#include 包含文件命令,在C语言中,它执行的效果是将包含文件中的所有内容插入到当前位置,这不只包含头文件,一些参数文件,配置文件,也可以使用该文件插入到当前代码的指定位置。其中<>和""分别表示从标准库路径还是用户自定义路径开始检索。
#define宏定义,常见的用法包含定义常量或者代码段别名,当然某些情况下配合##格式化字符串,可以实现接口的统一化处理,实例如下:
#if..#elif...#else...#endif, #ifdef..#endif, #ifndef...#endif条件选择判断,条件选择主要用于切换代码块,这种综合性项目和跨平台项目中为了满足多种情况下的需求往往会被使用。
#undef 取消定义的参数,避免重定义问题。
#error,#warning用于用户自定义的告警信息,配合#if,#ifdef使用,可以限制错误的预定义配置。
#pragma 带参数的预定义处理,常见的#pragma pack(1), 不过使用后会导致后续的整个文件都以设置的字节对齐,配合push和pop可以解决这种问题,代码如下:
总结嵌入式C语言难点
嵌入式C语言在处理硬件物理地址,位操作,内存访问,都给予开发者了充分的自由,通过数组,指针以及强制转换的技巧,可以有效减少数据处理中的复制过程,这对于底层是必要的,也方便了整个架构的开发。
对于任何嵌入式C编程从业者,清晰的掌握这些基础的知识和必要的。
在嵌入式C编程过程中,需要不断提升的能力与技巧:
C语言支持的内联汇编
通讯间的可靠性实现
存储数据校验和完整性保证
有关异常触发后的查找和解决
溢出,越界
不同硬件平台对齐,数据宽度,大小端问题
【学习交流群164111263】
【网盘免费资料包,大家需要的自行领取】:嵌入式物联网 22个STM32项目、大赛作品,【华清远见发放资料包】http://makerschool.mikecrm.com/f4wjYBB
【下方分享一些免费教程资料,大家感兴趣的可以看一下】:
边栏推荐
猜你喜欢
随机推荐
二叉搜索树的实现
php 单引号 双引号 -> => return echo
golang 刷leetcode:统计打字方案数
【流媒体】推流与拉流简介
树形结构构造示例代码
Adobe官方清理工具Adobe Creative Cloud Cleaner Tool使用教程
ICLR 2022最佳论文:基于对比消歧的偏标签学习
如何成为一名正义黑客?你应该学习什么?
golang 刷leetcode:从栈中取出 K 个硬币的最大面值和
golang刷leetcode:到达角落需要移除障碍物的最小数目
数字孪生助力智慧城市可视化建设
YARN资源调度系统介绍
Day35 LeetCode
Packages and packages, access modifiers
2018HBCPC个人题解
解道7-编程技术4
【目标检测】YOLOv5:640与1280分辨率效果对比
信息学奥赛一本通(1258:【例9.2】数字金字塔)
Electrical diagram of power supply system
解道8-编程技术5