From 61fe688ec4b298f30eb801111453b3b697b56780 Mon Sep 17 00:00:00 2001 From: murmur Date: Wed, 31 Jul 2024 22:27:50 +0800 Subject: [PATCH] =?UTF-8?q?Matebook=E6=9B=B4=E6=96=B0=E4=BA=862=E4=B8=AA?= =?UTF-8?q?=E6=96=87=E4=BB=B6?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Affected files: 代码/不定长结构体.md 模拟电路/RTC.md --- 代码/不定长结构体.md | 73 ++++++++++++++++++++++++++++++++++++++++++++ 模拟电路/RTC.md | 9 +++--- 2 files changed, 78 insertions(+), 4 deletions(-) create mode 100644 代码/不定长结构体.md diff --git a/代码/不定长结构体.md b/代码/不定长结构体.md new file mode 100644 index 0000000..eb70579 --- /dev/null +++ b/代码/不定长结构体.md @@ -0,0 +1,73 @@ +--- +tags: + - 不定长 + - 代码块 + - 源码 + - 结构体 +--- +定长结构体容易初始化和使用,容易转换为单一字节数组,后者交互方便,如发送`send(uint8 data, uint8 len)` +在C语言中,可以使用结构体和柔性数组(flexible array member)来表示不定长帧格式的数组。这种技术通常用于动态分配内存,以便存储不定长度的数据。 +使用柔性数组可以方便对数据按指定帧格式进行编码,指定长度后即可理解为成为了定长结构体。 +**将一个包含柔性数组成员的结构体转换为一个单一的字节数组**是可行的,但需要考虑如何处理每个成员的字节对齐和大小问题。以下是一个示例: +```c +#include +#include +#include + +// 定义结构体 +struct Frame { + int id; // 其它成员 + float value; // 其它成员 + int length; // 帧的长度 + char data[]; // 柔性数组成员,用来存储帧的数据 +}; + +// 函数声明:将结构体数据以字节数组的形式输出 +void printFrameAsBytes(struct Frame *frame); + +int main() { + int frameLength = 10; // 假设帧的长度为10 + struct Frame *myFrame; + + // 分配内存,包括柔性数组部分 + myFrame = malloc(sizeof(struct Frame) + frameLength * sizeof(char)); + if (myFrame == NULL) { + perror("Memory allocation failed"); + return 1; + } + + // 设置结构体的成员 + myFrame->id = 1234; + myFrame->value = 56.78; + myFrame->length = frameLength; + + // 向帧中存入数据 + for (int i = 0; i < frameLength; i++) { + myFrame->data[i] = 'A' + i; // 示例数据 + } + + // 调用函数打印结构体数据的字节表示 + printFrameAsBytes(myFrame); + + // 释放动态分配的内存 + free(myFrame); + + return 0; +} + +// 定义函数:将结构体数据以字节数组的形式输出 +void printFrameAsBytes(struct Frame *frame) { + // 计算整个结构体的大小 + size_t totalSize = sizeof(struct Frame) + frame->length * sizeof(char); + + // 将结构体转换为字节数组 + unsigned char *byteArray = (unsigned char *)frame; + + // 输出字节数组 + printf("Frame as bytes:\n"); + for (size_t i = 0; i < totalSize; i++) { + printf("0x%02x ", byteArray[i]); + } + printf("\n"); +} +``` \ No newline at end of file diff --git a/模拟电路/RTC.md b/模拟电路/RTC.md index fc6f7a8..b9da494 100644 --- a/模拟电路/RTC.md +++ b/模拟电路/RTC.md @@ -11,10 +11,11 @@ RTC电路多采用两路电源供电,一路系统电源,一路备用电源 由于电池容量低,作为供电工作时,二极管的反向漏电流将消耗电池电量,会直接影响值机时常。 几种二极管的典型反向漏电流参数如下: -| 型号/丝印 | 25℃ | 100℃ | 类型 | 压降 | -|:--------------:|:--------:|:----------:|:---:|:-----------:| -| IN4148W/**T4** | ~1uA@20V | ~10uA@20V | 开关管 | ~1V@200mA | -| SD103AW/**S4** | ~5uA@20V | ~100uA@20V | 肖特基 | ~0.5V@200mA | +| 型号/丝印 | 25℃ | 100℃ | 类型 | 压降 | +| :------------: | :--------: | :--------: | :-: | :---------: | +| IN4148W/**T4** | ~1uA@20V | ~10uA@20V | 开关管 | ~1V@200mA | +| SD103AW/**S4** | ~5uA@20V | ~100uA@20V | 肖特基 | ~0.5V@200mA | +| BAT54C/WW1 | ~1.5uA@20V | ~300uA@20V | | | 表中所列均为最大值,实际值不同厂家差异较大,但可看出不同类型的二极管可能存在数倍的差异,这会直接造成很大值机时长的差异。如果系统工作的环境温度较高,则可能是数量级的差异。 >以CR1220电池为例,容量40mAh,RTC电路耗电2uA,IN4148W可使用40/0.003/24≈555天,其它则只有238天。按年归一化,IN4148W使用一年,其它则2个多月就没电了。 \ No newline at end of file