梅科尔工作室-IoT-南向开发第二次培训笔记 原创

IOT元禛
发布于 2023-8-22 18:14
浏览
0收藏

梅科尔工作室-IoT-南向开发第二次培训笔记-鸿蒙开发者社区
嵌入式c

  1. 关键字
    关键字是C语言中具有特殊功能的保留标示符,按照功能可分为
    1). 数据类型(常用char, short, int, long, unsigned, float, double)
    2). 运算和表达式( =, +, -, *, while, do-while, if, goto, switch-case)
    3). 数据存储(auto, static, extern,const, register,volatile,restricted),
    4). 结构(struct, enum, union,typedef),
    5). 位操作和逻辑运算(<<, >>, &, |, ~,^, &&),
    6). 预处理(#define, #include, #error,#if…#elif…#else…#endif等),
    7). 平台扩展关键字(__asm, __inline,__syscall)
    这些关键字共同构成了嵌入式平台的C语法。
    嵌入式的应用从逻辑上可以抽象为三个部分:
    1). 数据的输入(如传感器,信号,接口输入),
    2). 数据的处理(如协议的解码和封包,AD采样值的转换等)
    3). 数据的输出(GUI的显示,输出的引脚状态,DA的输出控制电压,PWM波的占空比等),
    对于数据的管理就贯穿着整个嵌入式应用的开发,它包含数据类型,存储空间管理,位和逻辑操作,以及数据结构,C语言从语法上支撑上述功能的实现,并提供相应的优化机制,以应对嵌入式下更受限的资源环境。
    2 数据类型
    C语言支持常用的字符型,整型,浮点型变量,有些编译器如keil还扩展支持bit(位)和sfr(寄存器)等数据类型来满足特殊的地址操作。C语言只规定了每种基本数据类型的最小取值范围,因此在不同芯片平台上相同类型可能占用不同长度的存储空间,这就需要在代码实现时考虑后续移植的兼容性,而C语言提供的typedef就是用于处理这种情况的关键字,在大部分支持跨平台的软件项目中被采用
    3.内存管理和存储架构
    C语言允许程序变量在定义时就确定内存地址,通过作用域,以及关键字extern,static,实现了精细的处理机制,按照在硬件的区域不同,内存分配有三种方式(节选自C++高质量编程):
    1). 从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static 变量。
    2). 在栈上创建。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中 ,效率很高,但是分配的内存容量有限。
    3). 从堆上分配,亦称动态内存分配。程序在运行的时候用 malloc 或 new 申请任意多少的内存,程序员自己负责在何时用 free 或 delete 释放内存。动态内存的生存期由程序员决定,使用非常灵活,但同时遇到问题也最多。
  2. 指针和数组
      数组和指针往往是引起程序bug的主要原因,如数组越界,指针越界,非法地址访问,非对齐访问,这些问题背后往往都有指针和数组的影子,因此理解和掌握指针和数组,是成为合格C语言开发者的必经之路。
      数组是由相同类型元素构成,当它被声明时,编译器就根据内部元素的特性在内存中分配一段空间,另外C语言也提供多维数组,以应对特殊场景的需求,而指针则是提供使用地址的符号方法,只有指向具体的地址才有意义,C语言的指针具有最大的灵活性,在被访问前,可以指向任何地址,这大大方便了对硬件的操作,但同时也对开发者有了更高的要求
    对于数组来说,一般从0开始获取值,以length-1作为结束,通过[0, length)半开半闭区间访问,这一般不会出问题,但是某些时候,我们需要倒着读取数组时,有可能错误的将length作为起始点,从而导致访问越界,另外在操作数组时,有时为了节省空间,将访问的下标变量i定义为unsigned char类型,而C语言中unsigned char类型的范围是0~255,如果数组较大,会导致数组超过时无法截止,从而陷入死循环,这种在最初代码构建时很容易避免,但后期如果更改需求,在加大数组后,在使用数组的其它地方都会有隐患,需要特别注意。
      在前面提到过,指针占有的空间与芯片的寻址宽度有关,32位平台为4字节,64位为8字节,而指针的加减运算中的长度又与它的类型相关,如char类型为1,int类型为4,如果你仔细观察上面的代码就会发现par的值增加了8,这是因为指向指针的指针,对应的变量是指针,也就是长度就是指针类型的长度,在64位平台下为8,如果在32位平台则为4
    5.结构类型和对齐
    C语言提供自定义数据类型来描述一类具有相同特征点的事务,主要支持的有结构体,枚举和联合体。其中枚举通过别名限制数据的访问,可以让数据更直观,易读
    联合体的是能在同一个存储空间里存储不同类型数据的数据类型,对于联合体的占用空间,则是以其中占用空间最大的变量为准
    联合体的用途主要通过共享内存地址的方式,实现对数据内部段的访问,这在解析某些变量时,提供了更为简便的方式,此外测试芯片的大小端模式也是联合体的常见应用,当然利用指针强制转换,也能实现该目的
  3. 预处理机制
    C语言提供了丰富的预处理机制,方便了跨平台的代码的实现,此外C语言通过宏机制实现的数据和代码块替换,字符串格式化,代码段切换,对于工程应用具有重要意义,下面按照功能需求,描述在C语言运用中的常用预处理机制。
    #include 包含文件命令,在C语言中,它执行的效果是将包含文件中的所有内容插入到当前位置,这不只包含头文件,一些参数文件,配置文件,也可以使用该文件插入到当前代码的指定位置。其中<>和""分别表示从标准库路径还是用户自定义路径开始检索。
    #define宏定义,常见的用法包含定义常量或者代码段别名,当然某些情况下配合##格式化字符串,可以实现接口的统一化处理
    Linux
    是一种自由和开放源代码的操作系统。它是根据类 UNIX 的设计原则开发的,并且被广泛用于服务器系统和嵌入式设备。下面是一些关于 Linux 基础的重要信息:
  4. 内核(Kernel):Linux 操作系统的核心是 Linux 内核,它负责处理硬件设备、文件系统和内存管理等底层任务。
  5. 发行版(Distribution):Linux 由许多不同的发行版提供,每个发行版都有自己的特点和软件包管理系统。常见的 Linux 发行版有 Ubuntu、Debian、Fedora、CentOS 等。
  6. 命令行界面(CLI):在 Linux 中,命令行界面是与系统进行交互的主要方式。你可以使用各种命令来执行任务、管理文件和配置系统等。
  7. 文件系统:Linux 使用树状结构的文件系统,最顶层是根目录(/),其下包含各种子目录和文件。常见的文件系统如 ext4、XFS、Btrfs 等。
  8. 用户和权限管理:Linux 是一个多用户操作系统,每个用户都有自己的账户和权限。超级用户(root)拥有系统的完全控制权,其他用户则根据权限来执行不同的操作。
  9. 软件包管理:Linux 发行版使用软件包管理系统来安装、升级和卸载软件包。常见的包管理工具有 APT、DNF、YUM 等,它们能够自动处理软件依赖关系。
  10. 网络和安全:Linux 提供丰富的网络功能和安全工具,可以用于搭建 Web 服务器、防火墙和虚拟私有网络等。

©著作权归作者所有,如需转载,请注明出处,否则将追究法律责任
分类
已于2023-8-28 10:58:38修改
收藏
回复
举报
回复
    相关推荐