Matebook更新了2个文件

Affected files:
代码/不定长结构体.md
模拟电路/RTC.md
This commit is contained in:
murmur 2024-07-31 22:27:50 +08:00
parent 926277efd4
commit 61fe688ec4
2 changed files with 78 additions and 4 deletions

View File

@ -0,0 +1,73 @@
---
tags:
- 不定长
- 代码块
- 源码
- 结构体
---
定长结构体容易初始化和使用,容易转换为单一字节数组,后者交互方便,如发送`send(uint8 data, uint8 len)`
在C语言中可以使用结构体和柔性数组flexible array member来表示不定长帧格式的数组。这种技术通常用于动态分配内存以便存储不定长度的数据。
使用柔性数组可以方便对数据按指定帧格式进行编码,指定长度后即可理解为成为了定长结构体。
**将一个包含柔性数组成员的结构体转换为一个单一的字节数组**是可行的,但需要考虑如何处理每个成员的字节对齐和大小问题。以下是一个示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 定义结构体
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");
}
```

View File

@ -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电池为例容量40mAhRTC电路耗电2uAIN4148W可使用40/0.003/24≈555天其它则只有238天。按年归一化IN4148W使用一年其它则2个多月就没电了。