C/C++有若干个版本,每个版本通常会引入或删除一些特性,嵌入式常用编译器通常至少支持C99/C++11,因此本教程低于或等于此版本的特性将不再标注版本,并且通常支持C11和C++17,因此本教程涉及的内容均以该标准为准。通常编译器不会实现标准的所有功能,因此是否实现了特定功能需要以手册为准。 编译器编译器版本支持的C版本支持的C++版本参考Arm Compiler for Embedded 66.22ISO C89, C99, C11(实际也支持GUN C90, C99, C11)ISO C+…
前言 第一章 C与C++ 从C到C++ 嵌入式厂商对C/C++的支持 C/C++不完全兼容 C++简单入门 变量与字面量 枚举 结构体、位域与联合体 初始化 预处理器 替换文本宏与有条件编译 包含其他文件 其他(错误或警告、由实现定义的行为) 弱函数 内联函数 变参数函数 类型转换 强制类型转换 隐式类型转换 C++标准库 array——数组的替代品 C/C++混合编译
包含其他文件(#include) #include用于将其他文件包含到当前这一行,即将此行替换为这个文件的全部内容,文件名使用尖括号<>或双引号""包裹,使用尖括号<>只会在标准库中查找,使用双引号""会优先查找源文件同级目录中的文件,若找不到则会按顺序查找包含路径中的文件,若依旧找不到文件时会回退到标准库中查找,一旦找到对应文件则停止查找。 例如在bsp.c中使用#include "bsp.h",则会首先在bsp.c所在的文件夹中进行查找,若没有找到则在包含路径中进行查…
预处理器用于编译前的源代码处理,替换文本宏与有条件编译经常搭配使用。 替换文本宏(#define、#undef、#、##)与有条件编译( #if、#ifdef、#ifndef、#else、#elif) 使用方法 替换文本宏系列 #define指令 替换文本宏用于定义一个标识符并通常与有条件编译搭配使用,或将标识符替换为指定替换列表,标识符通常被称为宏。替换文本宏有多种使用形式: #define 标识符 替换列表 (可选)(1)#define 标识符 (形参 )&nb…
一维离散型随机变量分布 名称 表示 定义 均值 方差 意义 0-1分布 X ∼ B ( 1 , p ) P { X = 1 } = p P { X = 0 } = 1 − p p p ( 1 − p ) 一重伯努利实验成功次数 二项分布 X ∼ B ( n , p ) P { X = k } = C n k p k ( 1 − p ) n − k n p n p ( 1 − p ) 𝑛重伯努利实验成功次数 泊松分布 X ∼ P ( λ ) P { X = k } = λ k k ! e − λ …
引子 集成电路总线(Inter-Integrated Circuit,IIC)是一种常用于单片机的同步串行通信接口规范,常见使用 I²C 的外设有EEPROM、传感器(如MPU9250中的磁力计)、时钟芯片(如DS3231)、低速ADC/ADC。相较于SPI,IIC通常速率更慢且电路更复杂,但所需接线更少。 I²C I²C一般有两条信号线:SDA(serial data line)和SCL(serial clock line)分别用于传输数据和时钟信号。一般两条数据线都需要外接上拉电阻,同时引脚…
引子 升级到QQNT后自动登录老是不成功,显示连接到网络后又跳回登录,再点一次才能正常登录,经查证,这个跟系统开了DoH有关系,关闭DoH后正常,但是我也想开DoH啊。 临时解决方案 经检查,主要问题应该是出在msfwifi.3g.qq.com这个域名上,在hosts文件中加入msfwifi.3g.qq.com的ipv4地址即可。 看了一眼日志,QQ相关的网址基本都有ipv6了,唯独这个msfwifi.3g.qq.com没有ipv6地址,这个问题很有可能与msfwifi.3g.qq.com不存在…
引子 串行外设接口(Serial Peripheral Interface Bus,SPI)是一种常用于单片机的同步串行通信接口规范,常见使用SPI的外设有Flash(如W25Qxx)、传感器(如MPU9250)、LCD。相较于IIC,SPI通信速率通常更快(IIC常见的快速模式即400kbit/s,而SPI的通信速率取决于器件),并且推挽输出能够使得SPI拥有更高的传输速率(IIC为开漏输出,线路更复杂),但线路通常更多(IIC通常仅需SCL、SDA,双工下三线SPI需要SCK、MOSI、MI…
引子 前段时间用5个HPDL-1414做了一个20字符的显示模块HPDL1414x5,理论上可以作为许多应用的外设,于是决定使用基于ESP8266的NODEMCU平台驱动HPDL1414x5做一个自动网络校时的时钟。 NODEMCU NODEMCU是一个很久远的项目了,最开始是适配ESP8266的,但是ESP8266似乎都要退市了。项目主要就是一个最小开发板和lua的固件,硬件开源在这里,固件开源在这里,和它类似的还有microPython的固件,使用的是类似于python的语法。 NODEMC…
WaveDrom可以根据特定指令生成时序/波形图(SVG/PNG),并且也可以在浏览器中运行。同时也提供了在线编辑器和教程、教程2。 信号(signal) 名称(name)和波形(wave) 绘制信号时,需要向WaveDrom传递键为signal,值为WaveLanes的数组,WaveLane一般至少需要包含两个属性:名称(name)和波形(wave),例如(在官方在线编辑器中打开): { "signal" : [{ "name": "clk", "wave": "P..........…