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");
|
||||||
|
}
|
||||||
|
```
|
@ -12,9 +12,10 @@ RTC电路多采用两路电源供电,一路系统电源,一路备用电源
|
|||||||
几种二极管的典型反向漏电流参数如下:
|
几种二极管的典型反向漏电流参数如下:
|
||||||
|
|
||||||
| 型号/丝印 | 25℃ | 100℃ | 类型 | 压降 |
|
| 型号/丝印 | 25℃ | 100℃ | 类型 | 压降 |
|
||||||
|:--------------:|:--------:|:----------:|:---:|:-----------:|
|
| :------------: | :--------: | :--------: | :-: | :---------: |
|
||||||
| IN4148W/**T4** | ~1uA@20V | ~10uA@20V | 开关管 | ~1V@200mA |
|
| IN4148W/**T4** | ~1uA@20V | ~10uA@20V | 开关管 | ~1V@200mA |
|
||||||
| SD103AW/**S4** | ~5uA@20V | ~100uA@20V | 肖特基 | ~0.5V@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个多月就没电了。
|
>以CR1220电池为例,容量40mAh,RTC电路耗电2uA,IN4148W可使用40/0.003/24≈555天,其它则只有238天。按年归一化,IN4148W使用一年,其它则2个多月就没电了。
|
Loading…
Reference in New Issue
Block a user