【STM32-学习笔记-10-】BKP备份寄存器+时间戳
文章目录
- BKP备份寄存器
- Ⅰ、BKP简介
- 1. BKP的基本功能
- 2. BKP的存储容量
- 3. BKP的访问和操作
- 4. BKP的应用场景
- 5. BKP的控制寄存器
- Ⅱ、BKP基本结构
- Ⅲ、BKP函数
- Ⅳ、BKP使用示例
- 时间戳
- 一、Unix时间戳
- 二、时间戳的转换(time.h函数介绍)
- Ⅰ、time()
- Ⅱ、mktime()
- Ⅲ、localtime()
- Ⅳ、gmtime()
- Ⅴ、asctime()
- Ⅵ、strftime()
- Ⅶ、ctime()
- Ⅷ、clock()
- Ⅸ、difftime()
BKP备份寄存器
Ⅰ、BKP简介
主要用于在系统断电或复位后保存和恢复关键数据
BKP(
Backup Registers
)备份寄存器BKP可用于存储用户应用程序数据。当
VDD
(2.0~3.6V)电源被切断,他们仍然由VBAT
(1.8~3.6V)维持供电。当系统在待机模式下被唤醒,或系统复位或电源复位时,他们也不会被复位
TAMPER
引脚产生的侵入事件将所有备份寄存器内容清除
RTC
引脚输出RTC
校准时钟、RTC闹钟脉冲或者秒脉冲存储RTC时钟校准寄存器
用户数据存储容量:
- 20字节(中容量和小容量)
- 84字节(大容量和互联型)
1. BKP的基本功能
- 数据备份:BKP可以存储用户应用程序数据。当
VDD(2.0~3.6V)
电源被切断时,BKP仍然由VBAT(1.8~3.6V)
维持供电。当系统在待机模式下被唤醒,或系统复位或电源复位时,BKP中的数据也不会被复位 - 侵入检测:TAMPER引脚可以产生侵入事件,将所有备份寄存器内容清除。这在需要防止数据被恶意获取时非常有用
- RTC校准:BKP还包含RTC时钟校准寄存器,用于存储RTC校准值。此外,RTC引脚可以输出RTC校准时钟、RTC闹钟脉冲或者秒脉冲
2. BKP的存储容量
- 中容量和小容量:20字节(10个16位寄存器)
- 大容量和互联型:84字节(42个16位寄存器)
3. BKP的访问和操作
-
使能时钟:在访问BKP寄存器之前,需要使能PWR和BKP的时钟,并解锁写保护机制
RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR | RCC_APB1Periph_BKP, ENABLE); PWR_BackupAccessCmd(ENABLE);
-
读写操作:可以使用标准库函数进行读写操作
BKP_WriteBackupRegister(BKP_DR1, 0xA5A5); // 写备份寄存器 uint16_t data = BKP_ReadBackupRegister(BKP_DR1); // 读备份寄存器
-
复位操作:可以使用
BKP_DeInit()
函数复位BKP寄存器,清除备份寄存器数据BKP_DeInit(); // 备份域复位,复位BKP寄存器,清除备份寄存器数据
4. BKP的应用场景
- 系统配置保存:保存系统的配置参数,如通信设置、用户偏好等,以便在系统重启后快速恢复
- 状态信息保存:保存关键状态信息,如设备的工作模式、传感器状态等,确保系统在重启后能够继续正常运行
- 故障恢复:在系统发生故障时,保存关键数据,以便在系统恢复后进行故障诊断和恢复
- 侵入检测:通过TAMPER引脚检测外部侵入事件,保护系统数据的安全
5. BKP的控制寄存器
- BKP_CR:备份控制寄存器,用于管理侵入检测和RTC校准功能
- BKP_DRx:备份数据寄存器,用于存储用户数据,每个寄存器为16位
Ⅱ、BKP基本结构
Ⅲ、BKP函数
// 备份寄存器(BKP)去初始化函数,用于将备份寄存器寄存器重置为默认值
void BKP_DeInit(void);// 配置备份寄存器(BKP)防篡改引脚电平(侵入检测)
void BKP_TamperPinLevelConfig(uint16_t BKP_TamperPinLevel);
// 使能或失能备份寄存器(BKP)防篡改引脚
void BKP_TamperPinCmd(FunctionalState NewState);// 使能或失能备份寄存器(BKP)中断
void BKP_ITConfig(FunctionalState NewState);// 配置备份寄存器(BKP)RTC输出源
void BKP_RTCOutputConfig(uint16_t BKP_RTCOutputSource);// 设置备份寄存器(BKP)RTC校准值
void BKP_SetRTCCalibrationValue(uint8_t CalibrationValue);// 向备份寄存器(BKP)备份寄存器写入数据
void BKP_WriteBackupRegister(uint16_t BKP_DR, uint16_t Data);
// 从备份寄存器(BKP)备份寄存器读取数据
uint16_t BKP_ReadBackupRegister(uint16_t BKP_DR);// 获取备份寄存器(BKP)标志位状态
FlagStatus BKP_GetFlagStatus(void);
// 清除备份寄存器(BKP)标志位
void BKP_ClearFlag(void);// 获取备份寄存器(BKP)中断状态
ITStatus BKP_GetITStatus(void);
// 清除备份寄存器(BKP)中断待处理位
void BKP_ClearITPendingBit(void);
Ⅳ、BKP使用示例
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "Key.h"
#include "OLED.h"uint16_t ArrayWrite[] = {0x1122, 0xAABB};//写入BKP的数据
uint16_t ArrayRead[2] = { 0 }; //从BKP中读出的数据int main(void)
{OLED_Init();Key_Init();OLED_ShowString(1,1,"W:");OLED_ShowString(2,1,"R:");char keynum;RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWR, ENABLE);//使能PWRRCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP, ENABLE);//使能BKPPWR_BackupAccessCmd(ENABLE);//备份寄存器访问使能while(1){keynum = Get_KeyNum();if(keynum == 2){BKP_WriteBackupRegister(BKP_DR1, ArrayWrite[0]);BKP_WriteBackupRegister(BKP_DR2, ArrayWrite[1]);OLED_ShowHexNum(1,3,ArrayWrite[0],4);OLED_ShowHexNum(1,8,ArrayWrite[1],4);ArrayWrite[0]++;ArrayWrite[1]++;}ArrayRead[0] = BKP_ReadBackupRegister(BKP_DR1);ArrayRead[1] = BKP_ReadBackupRegister(BKP_DR2);OLED_ShowHexNum(2,3,ArrayRead[0] ,4);OLED_ShowHexNum(2,8,ArrayRead[1] ,4); }
}
时间戳
一、Unix时间戳
时间戳是指自1970年1月1日(UTC/GMT的午夜) 以来经过的秒数(不考虑闰秒)
它是一个表示时间的数值,常用于计算机系统、数据库、网络通信等领域来记录事件发生的时间
- 时间戳存储在一个秒计数器中,秒计数器为32位/64位的整型变量
- 世界上所有时区的秒计数器相同,不同时区通过添加偏移来得到当地时间
二、时间戳的转换(time.h函数介绍)
类型 | 说明 |
---|---|
time_t | 用于表示时间的类型,通常是表示自1970年1月1日以来的秒数(时间戳) |
struct tm | 用于表示时间的结构体,包含年、月、日、时、分、秒等时间信息 |
宏 | 说明 |
---|---|
CLOCKS_PER_SEC | 每秒的时钟周期数,用于clock() 函数计算时间间隔 |
TIME_UTC | 表示 UTC 时间(C11) |
函数 | 说明 |
---|---|
time(time_t *tloc) | 获取时间戳 |
mktime(struct tm *timeptr) | struct tm 结构体—>时间戳 |
localtime(const time_t *timer) | 时间戳—>本地时间的struct tm 结构体 |
gmtime(const time_t *timer) | 将时间戳—>UTC时间的struct tm 结构体 |
asctime(const struct tm *timeptr) | 将时间结构体—>字符串,格式为“Wed Jan 01 00:00:00 1990\n” |
strftime(char *s, size_t maxsize, const char *format, const struct tm *timeptr) | 时间结构体—>字符串 |
ctime(const time_t *timer) | 时间戳—>字符串 |
clock() | 获取程序中某部分代码的执行时间,单位为时钟周期,常用于性能测试 |
difftime(time_t time1, time_t time0) | 计算两个时间戳之间的时间差,单位为秒 |
struct tm {int tm_sec; /* 秒,范围从 0 到 59 */int tm_min; /* 分,范围从 0 到 59 */int tm_hour; /* 小时,范围从 0 到 23 */int tm_mday; /* 一月中的第几天,范围从 1 到 31 */int tm_mon; /* 月份,范围从 0 到 11 (+1)*/int tm_year; /* 自1900年起的年数 (+1900)*/int tm_wday; /* 一周中的第几天,范围从 0 到 6 */int tm_yday; /* 一年中的第几天,范围从 0 到 365 */int tm_isdst; /* 夏令时标识符,1 表示夏令时,0 表示非夏令时,-1 表示自动检测 */
};
Ⅰ、time()
获取时间戳
time(time_t *tloc)
函数用于获取当前时间和日期,并将其存储为自1970年1月1日以来的秒数(时间戳)
函数原型:
time_t time(time_t *tloc);
参数:
tloc
:指向time_t
类型的指针
- 如果为
NULL
,则函数仅返回时间戳,不进行存储- 如果非空,则将时间戳存储在
tloc
指向的位置返回值:
- 成功时,返回当前时间的时间戳(自1970年1月1日以来的秒数)
- 失败时,返回
(time_t)-1
示例代码
示例1:仅获取时间戳
#include <stdio.h>#include <time.h>int main() {time_t current_time = time(NULL); // 获取当前时间的时间戳printf("当前时间的时间戳: %ld\n", current_time);return 0;}
示例中,
time(NULL)
获取当前时间的时间戳,并将其存储在current_time
变量中,然后打印出来示例2:获取时间戳并存储
#include <stdio.h>#include <time.h>int main() {time_t current_time;time(¤t_time); // 获取当前时间的时间戳并存储在current_time中// 将时间戳转换为本地时间并格式化输出struct tm *local_time = localtime(¤t_time);char buffer[80];strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", local_time);printf("本地时间:%s\n", buffer);return 0;}
在示例中,
time(¤t_time)
获取当前时间的时间戳并存储在current_time
变量中。然后使用localtime
函数将时间戳转换为本地时间的struct tm
结构体,再使用strftime
函数将本地时间格式化为字符串并打印出来
Ⅱ、mktime()
将
struct tm
结构体表示的时间转换为时间戳
mktime
函数用于将struct tm
结构体表示的本地时间转换为自1970年1月1日以来的秒数(时间戳)
该函数会自动处理时区和夏令时的转换
函数原型:
time_t mktime(struct tm *timeptr);
参数:
timeptr
:指向struct tm
结构的指针,该结构体包含年、月、日、时、分、秒等时间信息返回值:
- 成功时,返回自1970年1月1日以来的秒数
- 失败时,返回
(time_t)-1
struct tm
结构体struct tm {int tm_sec; /* 秒,范围从 0 到 59 */int tm_min; /* 分,范围从 0 到 59 */int tm_hour; /* 小时,范围从 0 到 23 */int tm_mday; /* 一月中的第几天,范围从 1 到 31 */int tm_mon; /* 月份,范围从 0 到 11 */int tm_year; /* 自1900年起的年数 */int tm_wday; /* 一周中的第几天,范围从 0 到 6 */int tm_yday; /* 一年中的第几天,范围从 0 到 365 */int tm_isdst; /* 夏令时标识符,1 表示夏令时,0 表示非夏令时,-1 表示自动检测 */ };
示例代码 示例:将特定日期和时间转换为时间戳
#include <stdio.h> #include <time.h>int main() {struct tm time_info;time_t time_as_seconds;// 设置tm结构体为2023年8月17日08:34:56time_info.tm_year = 2023 - 1900; // 年份从1900年开始time_info.tm_mon = 8 - 1; // 月份从0开始time_info.tm_mday = 17; // 日time_info.tm_hour = 8; // 小时time_info.tm_min = 34; // 分钟time_info.tm_sec = 56; // 秒time_info.tm_isdst = -1; // 让mktime()自动检测夏令时// 转换为time_t类型time_as_seconds = mktime(&time_info);if (time_as_seconds != (time_t)(-1)) {printf("时间转换为秒数成功: %ld\n", (long)time_as_seconds);} else {printf("时间转换失败\n");}return 0; }
输出结果:
时间转换为秒数成功: 1692232496
注意事项
mktime
函数会自动处理时区和夏令时的转换tm_isdst
字段可以设置为 -1,让mktime
自动检测夏令时tm_wday
和tm_yday
字段在调用mktime
时会被自动计算和更新
Ⅲ、localtime()
将时间戳转换为本地时间的
struct tm
结构体
localtime
函数用于将时间戳(time_t
类型)转换为本地时间的struct tm
结构体
该函数会自动处理时区和夏令时的转换
函数原型:
struct tm *localtime(const time_t *timer);
参数:
timer
:指向time_t
类型的指针,该类型表示自1970年1月1日00:00:00 UTC以来的秒数(时间戳)返回值:
- 成功时,返回指向
struct tm
结构体的指针,该结构体包含本地时间的信息- 失败时,返回
NULL
示例代码 示例:将时间戳转换为本地时间并格式化输出
#include <stdio.h> #include <time.h>int main() {time_t current_time;struct tm *local_time;// 获取当前时间的时间戳current_time = time(NULL);// 将时间戳转换为本地时间local_time = localtime(¤t_time);// 格式化输出本地时间char buffer[80];strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", local_time);printf("本地时间:%s\n", buffer);return 0; }
输出结果:
本地时间:2025-01-13 12:34:56
Ⅳ、gmtime()
将时间戳转换为UTC时间
gmtime
函数用于将时间戳(time_t
类型)转换为UTC(协调世界时)时间的struct tm
结构体
函数原型:
struct tm *gmtime(const time_t *timer);
参数:
timer
:指向time_t
类型的指针,该类型表示自1970年1月1日00:00:00 UTC以来的秒数(时间戳)返回值:
- 成功时,返回指向
struct tm
结构体的指针,该结构体包含UTC时间的信息- 失败时,返回
NULL
示例代码 示例:将时间戳转换为UTC时间并格式化输出
#include <stdio.h> #include <time.h>int main() {time_t current_time;struct tm *utc_time;// 获取当前时间的时间戳current_time = time(NULL);// 将时间戳转换为UTC时间utc_time = gmtime(¤t_time);// 格式化输出UTC时间char buffer[80];strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", utc_time);printf("UTC时间:%s\n", buffer);return 0; }
输出结果:
UTC时间:2025-01-13 04:34:56
Ⅴ、asctime()
将时间结构体转换为字符串,格式为
Wed Jan 01 00:00:00 1990\n
asctime
函数用于将struct tm
结构体表示的时间转换为一个标准的字符串格式
该函数不会考虑时区和夏令时,直接将时间戳转换为UTC时间
函数原型:
char *asctime(const struct tm *timeptr);
参数:
timeptr
:指向struct tm
结构的指针,该结构体包含年、月、日、时、分、秒等时间信息返回值:
- 成功时,返回指向格式化时间字符串的指针,字符串格式为
"Wed Jan 01 00:00:00 1990\n"
- 失败时,返回
NULL
示例代码 示例:将当前时间转换为字符串
#include <stdio.h> #include <time.h>int main() {time_t current_time;struct tm *local_time;// 获取当前时间的时间戳current_time = time(NULL);// 将时间戳转换为本地时间local_time = localtime(¤t_time);// 将本地时间转换为字符串char *time_string = asctime(local_time);printf("当前时间:%s", time_string);return 0; }
输出结果:
当前时间:Mon Jan 13 12:34:56 2025
Ⅵ、strftime()
按照指定格式将时间结构体格式化为字符串
strftime
函数用于将struct tm
结构体表示的时间格式化为指定格式的字符串
该函数非常灵活,可以生成各种格式的时间字符串,常用于日志记录、时间显示等场景
函数原型:
size_t strftime(char *s, size_t maxsize, const char *format, const struct tm *timeptr);
参数:
s
:指向字符数组的指针,用于存储格式化后的字符串maxsize
:指定字符数组的最大长度,以确保不会发生缓冲区溢出format
:格式化字符串,用于指定时间的输出格式timeptr
:指向struct tm
结构的指针,该结构体包含年、月、日、时、分、秒等时间信息返回值:
- 成功时,返回格式化字符串的长度(不包括终止空字符)
- 如果输出字符串的长度超过
maxsize
,则返回0,并且s
指向的数组内容未定义常见格式化字符串
%Y
:四位年份(例如 2025)%m
:月份(01 到 12)%d
:一月中的第几天(01 到 31)%H
:小时(00 到 23)%M
:分钟(00 到 59)%S
:秒(00 到 59)%a
:星期几的缩写(例如 Mon)%b
:月份的缩写(例如 Jan)%c
:本地日期和时间的表示(例如 Mon Jan 13 12:34:56 2025)%x
:本地日期的表示(例如 01/13/25)%X
:本地时间的表示(例如 12:34:56)示例代码 示例:将当前时间格式化为字符串
#include <stdio.h> #include <time.h>int main() {time_t current_time;struct tm *local_time;char buffer[80];// 获取当前时间的时间戳current_time = time(NULL);// 将时间戳转换为本地时间local_time = localtime(¤t_time);// 将本地时间格式化为字符串strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", local_time);printf("当前时间:%s\n", buffer);return 0; }
输出结果:
当前时间:2025-01-13 12:34:56
Ⅶ、ctime()
将时间戳转换为字符串
ctime
函数用于将时间戳(time_t
类型)转换为一个标准的字符串格式
该函数会将时间戳转换为本地时间,并格式化为一个固定格式的字符串,通常用于日志记录和时间显示
函数原型:
char *ctime(const time_t *timer);
参数:
timer
:指向time_t
类型的指针,该类型表示自1970年1月1日00:00:00 UTC以来的秒数(时间戳)返回值:
- 成功时,返回指向格式化时间字符串的指针,字符串格式为
"Wed Jan 01 00:00:00 1990\n"
- 失败时,返回
NULL
示例代码 示例:将当前时间的时间戳转换为字符串
#include <stdio.h> #include <time.h>int main() {time_t current_time;// 获取当前时间的时间戳current_time = time(NULL);// 将时间戳转换为字符串char *time_string = ctime(¤t_time);printf("当前时间:%s", time_string);return 0; }
输出结果:
当前时间:Mon Jan 13 12:34:56 2025
asctime()
ctime()
时间戳—>字符串 时间结构体—>字符串 Wed Jan 01 00:00:00 1990\n Wed Jan 01 00:00:00 1990\n
Ⅷ、clock()
clock
函数用于获取程序中某部分代码的执行时间,单位为时钟周期(clock ticks)。这通常用于性能测试,以测量代码段的执行时间
函数原型:
clock_t clock(void);
参数:
- 无参数
返回值:
- 返回自程序开始执行以来的时钟周期数
- 如果无法获取时钟周期数,返回
(clock_t)-1
示例代码 示例1:测量代码段的执行时间
#include <stdio.h> #include <time.h>int main() {clock_t start, end;double cpu_time_used;// 获取开始时间start = clock();// 要测量的代码段for (int i = 0; i < 1000000; i++) {// 一些计算}// 获取结束时间end = clock();// 计算执行时间cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC;printf("代码段的执行时间:%.6f 秒\n", cpu_time_used);return 0; }
输出结果:
代码段的执行时间:0.012345 秒
Ⅸ、difftime()
计算两个时间戳之间的时间差
difftime
函数用于计算两个时间戳之间的时间差,单位为秒。这通常用于测量时间间隔,例如计算代码段的执行时间或两个事件之间的时间差
函数原型:
double difftime(time_t time1, time_t time0);
参数:
time1
:结束时间的时间戳time0
:开始时间的时间戳返回值:
- 返回两个时间戳之间的时间差,单位为秒
- 如果
time1
早于time0
,返回值为负数说明:
difftime
函数计算time1
和time0
之间的时间差,单位为秒- 该函数考虑了时间戳的溢出问题,因此可以安全地用于大范围的时间计算
difftime
函数返回的是一个double
类型的值,可以提供更精确的时间差示例代码 示例1:测量代码段的执行时间
#include <stdio.h> #include <time.h>int main() {time_t start, end;double elapsed;// 获取开始时间start = time(NULL);// 要测量的代码段for (int i = 0; i < 1000000; i++) {// 一些计算}// 获取结束时间end = time(NULL);// 计算时间差elapsed = difftime(end, start);printf("代码段的执行时间:%.6f 秒\n", elapsed);return 0; }
输出结果:
代码段的执行时间:0.012345 秒
相关文章:

【STM32-学习笔记-10-】BKP备份寄存器+时间戳
文章目录 BKP备份寄存器Ⅰ、BKP简介1. BKP的基本功能2. BKP的存储容量3. BKP的访问和操作4. BKP的应用场景5. BKP的控制寄存器 Ⅱ、BKP基本结构Ⅲ、BKP函数Ⅳ、BKP使用示例 时间戳一、Unix时间戳二、时间戳的转换(time.h函数介绍)Ⅰ、time()Ⅱ、mktime()…...
React 中hooks之 React.memo 和 useMemo用法总结
1. React.memo 基础 React.memo 是一个高阶组件(HOC),用于优化函数组件的性能,通过记忆组件渲染结果来避免不必要的重新渲染。 1.1 基本用法 const MemoizedComponent React.memo(function MyComponent(props) {/* 渲染逻辑 *…...

日志收集Day001
1.ElasticSearch 作用:日志存储和检索 2.单点部署Elasticsearch与基础配置 rpm -ivh elasticsearch-7.17.5-x86_64.rpm 查看配置文件yy /etc/elasticsearch/elasticsearch.yml(这里yy做了别名,过滤掉空行和注释行) yy /etc/el…...

机器人“大脑+小脑”范式:算力魔方赋能智能自主导航
在机器人技术的发展中,“大脑小脑”的架构模式逐渐成为推动机器人智能化的关键。其中,“大脑”作为机器人的核心决策单元,承担着复杂任务规划、环境感知和决策制定的重要角色,而“小脑”则专注于运动控制和实时调整。这种分工明确…...
python程序跑起来后,然后引用的数据文件发生了更新,python读取的数据会发生变化吗
在 Python 程序运行过程中,如果引用的数据文件被更新,程序能否读取到更新后的数据,取决于以下几个因素: 1. 是否动态读取文件 如果 Python 程序在运行过程中动态读取文件(例如通过循环或定时机制反复打开文件读取&…...

VSCode最新离线插件拓展下载方式
之前在vscode商店有以下类似的download按钮,但是2025年更新之后这个按钮就不提供了,所以需要使用新的方式下载 ps:给自己的网站推广下~~(国内直连GPT/Claude) 新的下载方式1 首先打开vscode商店官网:vscode插件下载…...
算法题目总结-栈和队列
文章目录 1.有效的括号1.答案2.思路 2.最小栈1.答案2.思路 3.前 K 个高频元素1.答案2.思路 4.用栈实现队列1.答案2.思路 5.删除字符串中的所有相邻重复项1.答案2.思路 1.有效的括号 1.答案 package com.sunxiansheng.arithmetic.day10;import java.util.Stack;/*** Descripti…...

IO进程----进程
进程 什么是进程 进程和程序的区别 概念: 程序:编译好的可执行文件 存放在磁盘上的指令和数据的有序集合(文件) 程序是静态的,没有任何执行的概念 进程:一个独立的可调度的任务 执行一个程序分配资…...

【机器学习实战高阶】基于深度学习的图像分割
机器学习项目图像分割 你可能已经注意到,大脑如何快速高效地识别并分类眼睛感知到的事物。大脑以某种方式进行训练,以便能够从微观层面分析所有内容。这种能力有助于我们从一篮子橙子中分辨出一个苹果。 计算机视觉是计算机科学的一个领域,…...

「免填邀请码」赋能各类APP,提升转化率与用户体验
在当前移动互联网的高速发展下,用户获取和留存已成为各类APP成功的关键。传统的注册流程虽然能够有效识别用户来源并进行用户管理,但随着市场竞争的激烈,复杂的注册和绑定步骤往往会成为用户流失的瓶颈。免填邀请码技术,结合自研的…...

基于海思soc的智能产品开发(视频的后续开发)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 前面我们讨论了camera,也讨论了屏幕驱动,这些都是基础的部分。关键是,我们拿到了这些视频数据之后,…...

创建 pdf 合同模板
创建 pdf 合同模板 一、前言二、模板展示三、制作过程 一、前言 前段时间要求创建“pdf”模板,学会了后感觉虽然简单,但开始也折腾了好久,这里做个记录。 二、模板展示 要创建这样的模板 三、制作过程 新建一个“Word”,这里命…...

2024 年度学习总结
目录 1. 前言 2. csdn 对于我的意义 3. 写博客的初衷 3.1 现在的想法 4. 写博客的意义 5. 关于生活和博客创作 5.1 写博客较于纸质笔记的优势 6. 致 2025 1. 前言 不知不觉, 来到 csdn 已经快一年了, 在这一年中, 我通过 csdn 学习到了很多知识, 结识了很多的良师益友…...

CSS笔记基础篇02——浮动、标准流、定位、CSS精灵、字体图标
黑马程序员视频地址: 前端Web开发HTML5CSS3移动web视频教程https://www.bilibili.com/video/BV1kM4y127Li?vd_source0a2d366696f87e241adc64419bf12cab&spm_id_from333.788.videopod.episodes&p70https://www.bilibili.com/video/BV1kM4y127Li?vd_source…...

C++ 面向对象(继承)
三、继承 3.1 继承的概念 基于一个已有的类 去重新定义一个新的类,这种方式我们叫做继承 关于继承的称呼 一个类B 继承来自 类 A 我们一般称呼 A类:父类 基类 B类: 子类 派生类 B继承自A A 派生了B 示例图的语法 class vehicle // 车类 {}class …...

Top期刊算法!RIME-CNN-BiLSTM-Attention系列四模型多变量时序预测
Top期刊算法!RIME-CNN-BiLSTM-Attention系列四模型多变量时序预测 目录 Top期刊算法!RIME-CNN-BiLSTM-Attention系列四模型多变量时序预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 基于RIME-CNN-BiLSTM-Attention、CNN-BiLSTM-Attention、R…...

数据结构 数组
1. 常见的错误 这里我要特别纠正一个“错误”。我在面试的时候,常常会问数组和链表的区别,很多人都回答说,“链表适合插入、删除,时间复杂度O(1);数组适合查找,查找时间复杂度为O(1)”。 实际上ÿ…...
Kivy App开发之UX控件Bubble气泡
kivy提供了一个提示气泡的小控件Bubble,使用时可以指定气泡箭头的方向以及显示的图像,还可以作为容器添加其他小控件。 常用属性如下 属性说明orientation气泡内子项的排序方式,可设置为vertical或horizontal,默认horizontalarrow_pos箭头相对于气泡的位置,可设置为left_…...

从零到一:打造属于你的AI智能体,支持本地部署
国外卷智能体,国内也都在搞 AI Agent,2025 年也将成为 Agent 的元年。构建智能体主要两种情况,一个是工作流模式,另外一种是直接开发应用,接下来分别给大家介绍一下两种产品和构建过程。工作流模式,以 Coze…...

成就与远见:2024年技术与思维的升华
个人主页:chian-ocean 前言: 2025年1月17日,2024年博客之星年度评选——创作影响力评审的入围名单公布。我很荣幸能够跻身Top 300,虽然与顶尖博主仍有一定差距,但这也为我提供了更加明确的发展方向与指引。展望崭新的2025年&…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例
使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...

【51单片机】4. 模块化编程与LCD1602Debug
1. 什么是模块化编程 传统编程会将所有函数放在main.c中,如果使用的模块多,一个文件内会有很多代码,不利于组织和管理 模块化编程则是将各个模块的代码放在不同的.c文件里,在.h文件里提供外部可调用函数声明,其他.c文…...

高保真组件库:开关
一:制作关状态 拖入一个矩形作为关闭的底色:44 x 22,填充灰色CCCCCC,圆角23,边框宽度0,文本为”关“,右对齐,边距2,2,6,2,文本颜色白色FFFFFF。 拖拽一个椭圆,尺寸18 x 18,边框为0。3. 全选转为动态面板状态1命名为”关“。 二:制作开状态 复制关状态并命名为”开…...
[特殊字符] Spring Boot底层原理深度解析与高级面试题精析
一、Spring Boot底层原理详解 Spring Boot的核心设计哲学是约定优于配置和自动装配,通过简化传统Spring应用的初始化和配置流程,显著提升开发效率。其底层原理可拆解为以下核心机制: 自动装配(Auto-Configuration) 核…...
生成对抗网络(GAN)损失函数解读
GAN损失函数的形式: 以下是对每个部分的解读: 1. , :这个部分表示生成器(Generator)G的目标是最小化损失函数。 :判别器(Discriminator)D的目标是最大化损失函数。 GAN的训…...
EC2安装WebRTC sdk-c环境、构建、编译
1、登录新的ec2实例,证书可以跟之前的实例用一个: ssh -v -i ~/Documents/cert/qa.pem ec2-user70.xxx.165.xxx 2、按照sdk-c demo中readme的描述开始安装环境: https://github.com/awslabs/amazon-kinesis-video-streams-webrtc-sdk-c 2…...

详解ZYNQ中的 RC 和 EP
详解ZYNQ中的 RC 和 EP 一、ZYNQ FPGA 开发板基础( ZC706 ) 1. 核心特点 双核大脑 灵活积木: ZC706 集成了 ARM Cortex-A9 双核处理器(相当于电脑 CPU)和 FPGA 可编程逻辑单元(相当于可自定义的硬件积木…...

leetcode238-除自身以外数组的乘积
leetcode 238 思路 可以在不使用除法的情况下,利用前缀积和后缀积来实现解答 前缀积:对每个位置,计算当前数字左侧的所有数字的乘积后缀积:对每个位置,计算当前数字右侧的所有数字的乘积 结合这两种思想࿰…...

直角坐标系和斜角坐标系
前情概要 笛卡尔坐标系是直角坐标系和斜角坐标系的统称。为什么会有这两种坐标系呢,教材中为什么最后只用直角坐标系呢?我们这样解释: 研究一维空间中的向量时,由于一维空间中的向量有无数条,如果我们选定一条作为基…...
【知识扫盲】分布式系统架构或分布式服务中的管理面,数据面和业务面
🧩 一、三大“面”的定义与职责(以大模型推理平台为例) 层级英文名职责关键组件举例数据面Data Plane处理用户请求、模型推理、输入输出数据转换等核心任务模型服务引擎、Tokenizer/Detokenizer、推理加速器(TensorRT、ONNX Runt…...