Matebook更新了2个文件
Affected files: 代码/不定长结构体.md 模拟电路/RTC.md
This commit is contained in:
parent
926277efd4
commit
61fe688ec4
73
代码/不定长结构体.md
Normal file
73
代码/不定长结构体.md
Normal 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");
|
||||
}
|
||||
```
|
@ -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个多月就没电了。
|
Loading…
Reference in New Issue
Block a user