当前位置: 首页 > news >正文

【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基本结构

image-20250114142038145

Ⅲ、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位的整型变量
  • 世界上所有时区的秒计数器相同,不同时区通过添加偏移来得到当地时间

image-20250113140320467

二、时间戳的转换(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)计算两个时间戳之间的时间差,单位为秒

image-20250114134252621

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(&current_time);  // 获取当前时间的时间戳并存储在current_time中// 将时间戳转换为本地时间并格式化输出struct tm *local_time = localtime(&current_time);char buffer[80];strftime(buffer, sizeof(buffer), "%Y-%m-%d %H:%M:%S", local_time);printf("本地时间:%s\n", buffer);return 0;}
      
    • 在示例中,time(&current_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_wdaytm_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(&current_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(&current_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(&current_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(&current_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(&current_time);printf("当前时间:%s", time_string);return 0;
}
  • 输出结果:

  •   当前时间:Mon Jan 13 12:34:56 2025
    
asctime()ctime()
时间戳—>字符串时间结构体—>字符串
Wed Jan 01 00:00:00 1990\nWed 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 函数计算 time1time0 之间的时间差,单位为秒
  • 该函数考虑了时间戳的溢出问题,因此可以安全地用于大范围的时间计算
  • 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时间戳二、时间戳的转换&#xff08;time.h函数介绍&#xff09;Ⅰ、time()Ⅱ、mktime()…...

React 中hooks之 React.memo 和 useMemo用法总结

1. React.memo 基础 React.memo 是一个高阶组件&#xff08;HOC&#xff09;&#xff0c;用于优化函数组件的性能&#xff0c;通过记忆组件渲染结果来避免不必要的重新渲染。 1.1 基本用法 const MemoizedComponent React.memo(function MyComponent(props) {/* 渲染逻辑 *…...

日志收集Day001

1.ElasticSearch 作用&#xff1a;日志存储和检索 2.单点部署Elasticsearch与基础配置 rpm -ivh elasticsearch-7.17.5-x86_64.rpm 查看配置文件yy /etc/elasticsearch/elasticsearch.yml&#xff08;这里yy做了别名&#xff0c;过滤掉空行和注释行&#xff09; yy /etc/el…...

机器人“大脑+小脑”范式:算力魔方赋能智能自主导航

在机器人技术的发展中&#xff0c;“大脑小脑”的架构模式逐渐成为推动机器人智能化的关键。其中&#xff0c;“大脑”作为机器人的核心决策单元&#xff0c;承担着复杂任务规划、环境感知和决策制定的重要角色&#xff0c;而“小脑”则专注于运动控制和实时调整。这种分工明确…...

python程序跑起来后,然后引用的数据文件发生了更新,python读取的数据会发生变化吗

在 Python 程序运行过程中&#xff0c;如果引用的数据文件被更新&#xff0c;程序能否读取到更新后的数据&#xff0c;取决于以下几个因素&#xff1a; 1. 是否动态读取文件 如果 Python 程序在运行过程中动态读取文件&#xff08;例如通过循环或定时机制反复打开文件读取&…...

VSCode最新离线插件拓展下载方式

之前在vscode商店有以下类似的download按钮&#xff0c;但是2025年更新之后这个按钮就不提供了&#xff0c;所以需要使用新的方式下载 ps:给自己的网站推广下~~&#xff08;国内直连GPT/Claude&#xff09; 新的下载方式1 首先打开vscode商店官网&#xff1a;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进程----进程

进程 什么是进程 进程和程序的区别 概念&#xff1a; 程序&#xff1a;编译好的可执行文件 存放在磁盘上的指令和数据的有序集合&#xff08;文件&#xff09; 程序是静态的&#xff0c;没有任何执行的概念 进程&#xff1a;一个独立的可调度的任务 执行一个程序分配资…...

【机器学习实战高阶】基于深度学习的图像分割

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

「免填邀请码」赋能各类APP,提升转化率与用户体验

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

基于海思soc的智能产品开发(视频的后续开发)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 前面我们讨论了camera&#xff0c;也讨论了屏幕驱动&#xff0c;这些都是基础的部分。关键是&#xff0c;我们拿到了这些视频数据之后&#xff0c;…...

创建 pdf 合同模板

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

2024 年度学习总结

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

CSS笔记基础篇02——浮动、标准流、定位、CSS精灵、字体图标

黑马程序员视频地址&#xff1a; 前端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 继承的概念 基于一个已有的类 去重新定义一个新的类&#xff0c;这种方式我们叫做继承 关于继承的称呼 一个类B 继承来自 类 A 我们一般称呼 A类&#xff1a;父类 基类 B类: 子类 派生类 B继承自A A 派生了B 示例图的语法 class vehicle // 车类 {}class …...

Top期刊算法!RIME-CNN-BiLSTM-Attention系列四模型多变量时序预测

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

数据结构 数组

1. 常见的错误 这里我要特别纠正一个“错误”。我在面试的时候&#xff0c;常常会问数组和链表的区别&#xff0c;很多人都回答说&#xff0c;“链表适合插入、删除&#xff0c;时间复杂度O(1)&#xff1b;数组适合查找&#xff0c;查找时间复杂度为O(1)”。 实际上&#xff…...

Kivy App开发之UX控件Bubble气泡

kivy提供了一个提示气泡的小控件Bubble,使用时可以指定气泡箭头的方向以及显示的图像,还可以作为容器添加其他小控件。 常用属性如下 属性说明orientation气泡内子项的排序方式,可设置为vertical或horizontal,默认horizontalarrow_pos箭头相对于气泡的位置,可设置为left_…...

从零到一:打造属于你的AI智能体,支持本地部署

国外卷智能体&#xff0c;国内也都在搞 AI Agent&#xff0c;2025 年也将成为 Agent 的元年。构建智能体主要两种情况&#xff0c;一个是工作流模式&#xff0c;另外一种是直接开发应用&#xff0c;接下来分别给大家介绍一下两种产品和构建过程。工作流模式&#xff0c;以 Coze…...

成就与远见:2024年技术与思维的升华

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

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

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

【51单片机】4. 模块化编程与LCD1602Debug

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

高保真组件库:开关

一:制作关状态 拖入一个矩形作为关闭的底色:44 x 22,填充灰色CCCCCC,圆角23,边框宽度0,文本为”关“,右对齐,边距2,2,6,2,文本颜色白色FFFFFF。 拖拽一个椭圆,尺寸18 x 18,边框为0。3. 全选转为动态面板状态1命名为”关“。 二:制作开状态 复制关状态并命名为”开…...

[特殊字符] Spring Boot底层原理深度解析与高级面试题精析

一、Spring Boot底层原理详解 Spring Boot的核心设计哲学是约定优于配置和自动装配&#xff0c;通过简化传统Spring应用的初始化和配置流程&#xff0c;显著提升开发效率。其底层原理可拆解为以下核心机制&#xff1a; 自动装配&#xff08;Auto-Configuration&#xff09; 核…...

生成对抗网络(GAN)损失函数解读

GAN损失函数的形式&#xff1a; 以下是对每个部分的解读&#xff1a; 1. ⁡, ​ &#xff1a;这个部分表示生成器&#xff08;Generator&#xff09;G的目标是最小化损失函数。 &#xff1a;判别器&#xff08;Discriminator&#xff09;D的目标是最大化损失函数。 GAN的训…...

EC2安装WebRTC sdk-c环境、构建、编译

1、登录新的ec2实例&#xff0c;证书可以跟之前的实例用一个&#xff1a; ssh -v -i ~/Documents/cert/qa.pem ec2-user70.xxx.165.xxx 2、按照sdk-c demo中readme的描述开始安装环境&#xff1a; https://github.com/awslabs/amazon-kinesis-video-streams-webrtc-sdk-c 2…...

详解ZYNQ中的 RC 和 EP

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

leetcode238-除自身以外数组的乘积

leetcode 238 思路 可以在不使用除法的情况下&#xff0c;利用前缀积和后缀积来实现解答 前缀积&#xff1a;对每个位置&#xff0c;计算当前数字左侧的所有数字的乘积后缀积&#xff1a;对每个位置&#xff0c;计算当前数字右侧的所有数字的乘积 结合这两种思想&#xff0…...

直角坐标系和斜角坐标系

前情概要 笛卡尔坐标系是直角坐标系和斜角坐标系的统称。为什么会有这两种坐标系呢&#xff0c;教材中为什么最后只用直角坐标系呢&#xff1f;我们这样解释&#xff1a; 研究一维空间中的向量时&#xff0c;由于一维空间中的向量有无数条&#xff0c;如果我们选定一条作为基…...

【知识扫盲】分布式系统架构或分布式服务中的管理面,数据面和业务面

&#x1f9e9; 一、三大“面”的定义与职责&#xff08;以大模型推理平台为例&#xff09; 层级英文名职责关键组件举例数据面Data Plane处理用户请求、模型推理、输入输出数据转换等核心任务模型服务引擎、Tokenizer/Detokenizer、推理加速器&#xff08;TensorRT、ONNX Runt…...