调试模式
2025/9/8大约 2 分钟
调试模式
要先在下面的地方自己声明实现这些,要一个计时用的时钟和获取时间的状态,再调用
vTaskGetRunTimeStats(pcWriteBuffer);
printf("TaskName\tAbsTime\t\tTime%%\r\n%s\r\n", pcWriteBuffer);

指数退避算法
断网!
|
(等待 1s) ---> 尝试连接... 失败!
|
(等待 2s) ---> 尝试连接... 失败!
|
(等待 4s) ---> 尝试连接... 失败!
|
(等待 8s) ---> 尝试连接... 失败!
|
(等待 16s) --> 尝试连接... 失败!
|
(等待 32s) --> 尝试连接... 失败!
|
(等待 32s) --> 尝试连接... 成功! -> 重置 backoff_ms = 1000// 面试时能写出这个框架就满分了
void mqtt_task(void *pv) {
int retry_time = 1000; // 初始等待1秒
while(1) {
// 1. 如果没连上
if (is_connected == 0) {
// 尝试连接
if (connect_to_server() == SUCCESS) {
is_connected = 1;
retry_time = 1000; // 连上了,重置等待时间
} else {
// 没连上,触发退避算法
vTaskDelay(retry_time); // 等待
retry_time = retry_time * 2; // 时间翻倍
if (retry_time > 30000) retry_time = 30000; // 设置上限
}
}
// 2. 如果连上了
else {
// 处理业务逻辑...
if (send_heartbeat() == FAILED) {
is_connected = 0; // 掉线了,下次循环会重新连
}
}
}
}断点续传
"为什么用 256 字节定长记录?
首先,一条数据(JSON)实际只有 30-50 字节。但我选择 256 字节定长记录有几个好处:
1️⃣ 寻址简单 - 直接用 index × 256 计算地址,不需要维护索引表
2️⃣ Flash 擦除规律 - Flash 最小擦除单位是 4KB,恰好 16 条 256B 记录 = 1 个扇区,管理简单
3️⃣ 循环缓冲简化 - 不需要链表或复杂的指针运算,只需要 ++ 和 % RECORD_COUNT 就行
4️⃣ 空间浪费可接受 - 虽然每条浪费 223 字节,但 1MB Flash 能存 4000 条记录,足够 10 天的数据,对于断点续传足够了
权衡了代码简洁性和空间利用率,这是工程上的最优选

