【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);//使能PWR
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_BKP, ENABLE);//使能BKP
	PWR_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:56
    time_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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/955924.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Flowable 管理各业务流程:流程设计器 (获取流程模型 XML)、流程部署、启动流程、流程审批

文章目录 引言I 表结构主要表前缀及其用途核心表II 流程设计器(Flowable BPMN模型编辑器插件)Flowable-UIvue插件III 流程部署部署步骤例子:根据流程模型ID部署IV 启动流程启动步骤ACT_RE_PROCDEF:流程定义相关信息例子:根据流程 ID 启动流程V 流程审批审批步骤Flowable 审…

java根据模板导出word,并在word中插入echarts相关统计图片以及表格

引入依赖创建word模板创建ftl模板文件保存的ftl可能会出现占位符分割的问题&#xff0c;需要处理将ftl文件中的图片的Base64删除&#xff0c;并使用占位符代替插入表格&#xff0c;并指定表格的位置在图片下方 Echarts转图片根据模板生成word文档DocUtil导出word文档 生成的wor…

晨辉面试抽签和评分管理系统之十:如何搭建自己的数据库服务器,使用本软件的网络版

晨辉面试抽签和评分管理系统&#xff08;下载地址:www.chenhuisoft.cn&#xff09;是公务员招录面试、教师资格考试面试、企业招录面试等各类面试通用的考生编排、考生入场抽签、候考室倒计时管理、面试考官抽签、面试评分记录和成绩核算的面试全流程信息化管理软件。提供了考生…

Asp .Net Core 实现微服务:集成 Ocelot+Nacos+Swagger+Cors实现网关、服务注册、服务发现

什么是 Ocelot ? Ocelot是一个开源的ASP.NET Core微服务网关&#xff0c;它提供了API网关所需的所有功能&#xff0c;如路由、认证、限流、监控等。 Ocelot是一个简单、灵活且功能强大的API网关&#xff0c;它可以与现有的服务集成&#xff0c;并帮助您保护、监控和扩展您的…

mongoose 支持https踩坑纪实

简述 mongoose是C编写的嵌入式web服务&#xff0c;它能够支持https协议&#xff0c;可以简单的部署&#xff0c;但要做到完美部署&#xff0c;不是那么容易。 部署方法 本人使用的是最新的7.16版&#xff0c;以前版本似乎是要通过修改 头文件中的 MG_ENABLE_SSL 宏定义&…

深入内核讲明白Android Binder【二】

深入内核讲明白Android Binder【二】 前言一、Binder通信内核源码整体思路概述1. 客户端向服务端发送数据流程概述1.1 binder_ref1.2 binder_node1.3 binder_proc1.4 binder_thread 2. 服务端的binder_node是什么时候被创建的呢&#xff1f;2.1 Binder驱动程序为服务创建binder…

玩转大语言模型——使用graphRAG+Ollama构建知识图谱

系列文章目录 玩转大语言模型——ollama导入huggingface下载的模型 玩转大语言模型——langchain调用ollama视觉多模态语言模型 玩转大语言模型——使用graphRAGOllama构建知识图谱 文章目录 系列文章目录前言下载和安装用下载项目的方式下载并安装用pip方式下载并安装 生成知…

微透镜阵列精准全检,白光干涉3D自动量测方案提效70%

广泛应用的微透镜阵列 微透镜是一种常见的微光学元件&#xff0c;通过设计微透镜&#xff0c;可对入射光进行扩散、光束整形、光线均分、光学聚焦、集成成像等调制&#xff0c;进而实现许多传统光学元器件难以实现的特殊功能。 微透镜阵列&#xff08;Microlens Array&#x…

新星杯-ESP32智能硬件开发--ESP32系统

本博文内容导读&#x1f4d5;&#x1f389;&#x1f525; 1、ESP32芯片和系统架构进行描述&#xff0c;给出ESP32系统的地址映射规则。 2、介绍ESP32复位及时钟定时具体功能&#xff0c;方便后续开发。 3、介绍基于ESP32开发板使用的底层操作系统&#xff0c;对ESP32应用程序开…

python编程-OpenCV(图像读写-图像处理-图像滤波-角点检测-边缘检测)图像变换

形态变换 图像处理中的形态学操作是处理图像结构的有效方法。以下是一些常见的形态学操作的介绍及其在 OpenCV 中的实现示例。 1. 腐蚀&#xff08;Erosion&#xff09; 腐蚀操作通过消除图像边界来减少图像中的白色区域&#xff08;前景&#xff09;&#xff0c;使物体的边…

Linux 音视频入门到实战专栏(视频篇)视频编解码 MPP

文章目录 一、MPP 介绍二、获取和编译RKMPP库三、视频解码四、视频编码 沉淀、分享、成长&#xff0c;让自己和他人都能有所收获&#xff01;&#x1f604; &#x1f4e2;本篇将介绍如何调用alsa api来进行音频数据的播放和录制。 一、MPP 介绍 瑞芯微提供的媒体处理软件平台…

阿里云通义实验室自然语言处理方向负责人黄非:通义灵码2.0,迈入 Agentic AI

通义灵码是基于阿里巴巴通义大模型研发的AI 智能编码助手&#xff0c;在通义灵码 1.0 时代&#xff0c;我们针对代码的生成、补全和问答&#xff0c;通过高效果、低时延&#xff0c;研发出了国内最受欢迎的编码助手。 在通义灵码 2.0 发布会上&#xff0c;阿里云通义实验室自然…

Linux网络_套接字_UDP网络_TCP网络

一.UDP网络 1.socket()创建套接字 #include<sys/socket.h> int socket(int domain, int type, int protocol);domain (地址族): AF_INET网络 AF_UNIX本地 AF_INET&#xff1a;IPv4 地址族&#xff0c;适用于 IPv4 协议。用于网络通信AF_INET6&#xff1a;IPv6 地址族&a…

endnote x9 如何将参考文献和文中的应用格式由annotated变为编码,例[1],[2]

在 EndNote X9 中&#xff0c;将参考文献和文中引用格式更改为编码形式&#xff08;如 [1], [2]&#xff09;需要以下步骤&#xff1a; 1. 选择合适的输出样式 打开 EndNote X9。点击菜单栏的 "Edit" > "Output Styles" > "Open Style Manage…

用户中心项目教程(二)---umi3的使用出现的错误

目录 1.情况的说明 2.遇到的问题 1&#xff09;第一个问题-关于npx的使用 2&#xff09;第二个问题--unsupport问题 3&#xff09;第三个收获--nodejs安装问题 4&#xff09;第四个收获---nvm下载问题 5&#xff09;第五个问题--尚未解决的问题 3.个人总结 1.情况的说明…

【面试宝典】Java中创建线程池的几种方式以及区别

强烈推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站:人工智能 创建线程池有多种方式&#xff0c;主要通过 Java 的 java.util.concurrent 包提供的 Executors 工具类来实现。以下是几…

Net Core微服务入门全纪录(三)——Consul-服务注册与发现(下)

系列文章目录 1、.Net Core微服务入门系列&#xff08;一&#xff09;——项目搭建 2、.Net Core微服务入门全纪录&#xff08;二&#xff09;——Consul-服务注册与发现&#xff08;上&#xff09; 3、.Net Core微服务入门全纪录&#xff08;三&#xff09;——Consul-服务注…

通过视觉语言模型蒸馏进行 3D 形状零件分割

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01;对应英文要求比较高&#xff0c;特此说明&#xff01; Abstract This paper proposes a cross-modal distillation framework, PartDistill, which transfers 2D knowledge from vision-language models …

强推未发表!3D图!Transformer-LSTM+NSGAII工艺参数优化、工程设计优化!

目录 效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Transformer-LSTMNSGAII多目标优化算法&#xff0c;工艺参数优化、工程设计优化&#xff01;&#xff08;Matlab完整源码和数据&#xff09; Transformer-LSTM模型的架构&#xff1a;输入层&#xff1a;多个变量作…

如何通过 Apache Airflow 将数据导入 Elasticsearch

作者&#xff1a;来自 Elastic Andre Luiz 了解如何通过 Apache Airflow 将数据导入 Elasticsearch。 Apache Airflow Apache Airflow 是一个旨在创建、安排&#xff08;schedule&#xff09;和监控工作流的平台。它用于编排 ETL&#xff08;Extract-Transform-Load&#xff0…