HAL库源码移植与使用之RTC时钟
实时时钟(Real Time Clock,RTC),本质是一个计数器,计数频率常为秒,专门用来记录时间。
普通定时器无法掉电运行!但RTC可由VBAT备用电源供电,断电不断时
这里讲F1系列的RTC

可以产生三个中断信号,秒 闹钟 溢出信号
其中闹钟可以唤醒wwdg和iwdg
后备寄存器:
后备寄存器不仅有存数据的地方还有存状态,存配置rtc等后备外设的配置寄存器的存在,这些寄存器全部都复位不重置,所以可以在有备用电池的状态下做点文章
 
因为rcc内有状态位在不断电情况下可以知道上次复位是因为什么造成的

标准库还有用后备寄存器存数据的  temper引脚防破解  校准时钟输出等实验
,正点原子hal教学没有,得自己探索
 


你选时钟源的时候如果32.768khz坏了,也可以选择rc振荡器40khz和高速内部rc振荡器但不推荐,因为他俩很容易受外部影响

你可以获取分频器的分频计数值来更加精确的处理得出时间 
 

函数解析:


下面的函数是正点原子自己写的,专门用于处理时间戳的函数,你也可以自己用time.h跟标准库那时候一样

rtc.c
#include "./BSP/RTC/rtc.h"
#include "./BSP/LED/led.h"
#include "./SYSTEM/usart/usart.h"
#include "./SYSTEM/delay/delay.h"RTC_HandleTypeDef g_rtc_handle; /* RTC控制句柄 */
_calendar_obj calendar;         /* 时间结构体 *//*** @brief       RTC写入后备区域SRAM* @param       bkrx : 后备区寄存器编号,范围:0~41对应 RTC_BKP_DR1~RTC_BKP_DR42* @param       data : 要写入的数据,16位长度* @retval      无*/
void rtc_write_bkr(uint32_t bkrx, uint16_t data)
{HAL_PWR_EnableBkUpAccess(); /* 取消备份区写保护 */HAL_RTCEx_BKUPWrite(&g_rtc_handle, bkrx + 1, data);
}/*** @brief       RTC读取后备区域SRAM* @param       bkrx : 后备区寄存器编号,范围:0~41对应 RTC_BKP_DR1~RTC_BKP_DR42* @retval      读取到的值*/
uint16_t rtc_read_bkr(uint32_t bkrx)
{uint32_t temp = 0;temp = HAL_RTCEx_BKUPRead(&g_rtc_handle, bkrx + 1);return (uint16_t)temp; /* 返回读取到的值 */
}/*** @brief       RTC初始化*   @note*              默认尝试使用LSE,当LSE启动失败后,切换为LSI.*              通过BKP寄存器0的值,可以判断RTC使用的是LSE/LSI:*              当BKP0==0X5050时,使用的是LSE*              当BKP0==0X5051时,使用的是LSI*              注意:切换LSI/LSE将导致时间/日期丢失,切换后需重新设置.** @param       无* @retval      0,成功*              1,进入初始化模式失败*/
uint8_t rtc_init(void)
{/* 检查是不是第一次配置时钟 */uint16_t bkpflag = 0;__HAL_RCC_PWR_CLK_ENABLE(); /* 使能PWR电源时钟 */__HAL_RCC_BKP_CLK_ENABLE(); /* 使能BKP备份时钟 */HAL_PWR_EnableBkUpAccess(); /* 取消备份区写保护 */g_rtc_handle.Instance = RTC;g_rtc_handle.Init.AsynchPrediv = 32767;     /* 时钟周期设置,理论值:32767, 这里也可以用 RTC_AUTO_1_SECOND */g_rtc_handle.Init.OutPut = RTC_OUTPUTSOURCE_NONE;if (HAL_RTC_Init(&g_rtc_handle) != HAL_OK)  /* 初始化RTC */{return 1;}bkpflag = rtc_read_bkr(0);  /* 读取BKP0的值 */if ((bkpflag != 0X5050) && (bkpflag != 0x5051))         /* 之前未初始化过,重新配置 */{rtc_set_time(2020, 4, 25, 20, 25, 35);              /* 设置时间 */}__HAL_RTC_ALARM_ENABLE_IT(&g_rtc_handle, RTC_IT_SEC);   /* 允许秒中断 */__HAL_RTC_ALARM_ENABLE_IT(&g_rtc_handle, RTC_IT_ALRA);  /* 允许闹钟中断 */HAL_NVIC_SetPriority(RTC_IRQn, 0x2, 0);                 /* 设置RTC中断 */HAL_NVIC_EnableIRQ(RTC_IRQn);                           /* 使能中断 */rtc_get_time(); /* 更新时间 */return 0;
}/*** @brief       RTC初始化*   @note*              RTC底层驱动,时钟配置,此函数会被HAL_RTC_Init()调用* @param       hrtc:RTC句柄* @retval      无*/
void HAL_RTC_MspInit(RTC_HandleTypeDef *hrtc)
{uint16_t retry = 200;__HAL_RCC_RTC_ENABLE();     /* RTC时钟使能 */RCC_OscInitTypeDef rcc_oscinitstruct;RCC_PeriphCLKInitTypeDef rcc_periphclkinitstruct;/* 使用寄存器的方式去检测LSE是否可以正常工作 */RCC->BDCR |= 1 << 0;    /* 开启外部低速振荡器LSE */while (retry && ((RCC->BDCR & 0X02) == 0))  /* 等待LSE准备好 */{retry--;delay_ms(5);}if (retry == 0)     /* LSE起振失败 使用LSI */{rcc_oscinitstruct.OscillatorType = RCC_OSCILLATORTYPE_LSI;  /* 选择要配置的振荡器 */rcc_oscinitstruct.LSIState = RCC_LSI_ON;                    /* LSI状态:开启 */rcc_oscinitstruct.PLL.PLLState = RCC_PLL_NONE;              /* PLL无配置 */HAL_RCC_OscConfig(&rcc_oscinitstruct);                      /* 配置设置的rcc_oscinitstruct */rcc_periphclkinitstruct.PeriphClockSelection = RCC_PERIPHCLK_RTC;   /* 选择要配置的外设 RTC */rcc_periphclkinitstruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSI;   /* RTC时钟源选择 LSI */HAL_RCCEx_PeriphCLKConfig(&rcc_periphclkinitstruct);                /* 配置设置的rcc_periphClkInitStruct */rtc_write_bkr(0, 0X5051);}else{rcc_oscinitstruct.OscillatorType = RCC_OSCILLATORTYPE_LSE ; /* 选择要配置的振荡器 */rcc_oscinitstruct.LSEState = RCC_LSE_ON;                    /* LSE状态:开启 */rcc_oscinitstruct.PLL.PLLState = RCC_PLL_NONE;              /* PLL不配置 */HAL_RCC_OscConfig(&rcc_oscinitstruct);                      /* 配置设置的rcc_oscinitstruct */rcc_periphclkinitstruct.PeriphClockSelection = RCC_PERIPHCLK_RTC;   /* 选择要配置外设 RTC */rcc_periphclkinitstruct.RTCClockSelection = RCC_RTCCLKSOURCE_LSE;   /* RTC时钟源选择LSE */HAL_RCCEx_PeriphCLKConfig(&rcc_periphclkinitstruct);                /* 配置设置的rcc_periphclkinitstruct */rtc_write_bkr(0, 0X5055);}
}/*** @brief       RTC时钟中断*   @note      秒钟中断 / 闹钟中断 共用同一个中断服务函数*              根据RTC_CRL寄存器的 SECF 和 ALRF 位区分是哪个中断* @param       无* @retval      无*/
void RTC_IRQHandler(void)
{if (__HAL_RTC_ALARM_GET_FLAG(&g_rtc_handle, RTC_FLAG_SEC) != RESET)     /* 秒中断 */{rtc_get_time();     /* 更新时间 */__HAL_RTC_ALARM_CLEAR_FLAG(&g_rtc_handle, RTC_FLAG_SEC);            /* 清除秒中断 *///printf("sec:%d\r\n", calendar.sec);   /* 打印秒钟 */}if (__HAL_RTC_ALARM_GET_FLAG(&g_rtc_handle, RTC_FLAG_ALRAF) != RESET)   /* 闹钟中断 */{__HAL_RTC_ALARM_CLEAR_FLAG(&g_rtc_handle, RTC_FLAG_ALRAF);          /* 清除闹钟中断 */printf("Alarm Time:%d-%d-%d %d:%d:%d\n", calendar.year, calendar.month, calendar.date, calendar.hour, calendar.min, calendar.sec);}__HAL_RTC_ALARM_CLEAR_FLAG(&g_rtc_handle, RTC_FLAG_OW);                 /* 清除溢出中断标志 */while (!__HAL_RTC_ALARM_GET_FLAG(&g_rtc_handle, RTC_FLAG_RTOFF));       /* 等待RTC寄存器操作完成, 即等待RTOFF == 1 */
}/*** @brief       判断年份是否是闰年*   @note      月份天数表:*              月份   1  2  3  4  5  6  7  8  9  10 11 12*              闰年   31 29 31 30 31 30 31 31 30 31 30 31*              非闰年 31 28 31 30 31 30 31 31 30 31 30 31* @param       year : 年份* @retval      0, 非闰年; 1, 是闰年;*/
static uint8_t rtc_is_leap_year(uint16_t year)
{/* 闰年规则: 四年闰百年不闰,四百年又闰 */if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)){return 1;}else{return 0;}
}/*** @brief       设置时间, 包括年月日时分秒*   @note      以1970年1月1日为基准, 往后累加时间*              合法年份范围为: 1970 ~ 2105年HAL默认为年份起点为2000年* @param       syear : 年份* @param       smon  : 月份* @param       sday  : 日期* @param       hour  : 小时* @param       min   : 分钟* @param       sec   : 秒钟* @retval      0, 成功; 1, 失败;*/
uint8_t rtc_set_time(uint16_t syear, uint8_t smon, uint8_t sday, uint8_t hour, uint8_t min, uint8_t sec)
{uint32_t seccount = 0;seccount = rtc_date2sec(syear, smon, sday, hour, min, sec); /* 将年月日时分秒转换成总秒钟数 */__HAL_RCC_PWR_CLK_ENABLE(); /* 使能电源时钟 */__HAL_RCC_BKP_CLK_ENABLE(); /* 使能备份域时钟 */HAL_PWR_EnableBkUpAccess(); /* 取消备份域写保护 *//* 上面三步是必须的! */RTC->CRL |= 1 << 4;         /* 进入配置模式 */RTC->CNTL = seccount & 0xffff;RTC->CNTH = seccount >> 16;RTC->CRL &= ~(1 << 4);      /* 退出配置模式 */while (!__HAL_RTC_ALARM_GET_FLAG(&g_rtc_handle, RTC_FLAG_RTOFF));       /* 等待RTC寄存器操作完成, 即等待RTOFF == 1 */return 0;
}/*** @brief       设置闹钟, 具体到年月日时分秒*   @note      以1970年1月1日为基准, 往后累加时间*              合法年份范围为: 1970 ~ 2105年* @param       syear : 年份* @param       smon  : 月份* @param       sday  : 日期* @param       hour  : 小时* @param       min   : 分钟* @param       sec   : 秒钟* @retval      0, 成功; 1, 失败;*/
uint8_t rtc_set_alarm(uint16_t syear, uint8_t smon, uint8_t sday, uint8_t hour, uint8_t min, uint8_t sec)
{uint32_t seccount = 0;seccount = rtc_date2sec(syear, smon, sday, hour, min, sec); /* 将年月日时分秒转换成总秒钟数 */__HAL_RCC_PWR_CLK_ENABLE(); /* 使能电源时钟 */__HAL_RCC_BKP_CLK_ENABLE(); /* 使能备份域时钟 */HAL_PWR_EnableBkUpAccess(); /* 取消备份域写保护 *//* 上面三步是必须的! */RTC->CRL |= 1 << 4;         /* 进入配置模式 */RTC->ALRL = seccount & 0xffff;RTC->ALRH = seccount >> 16;RTC->CRL &= ~(1 << 4);      /* 退出配置模式 */while (!__HAL_RTC_ALARM_GET_FLAG(&g_rtc_handle, RTC_FLAG_RTOFF));       /* 等待RTC寄存器操作完成, 即等待RTOFF == 1 */return 0;
}/*** @brief       得到当前的时间*   @note      该函数不直接返回时间, 时间数据保存在calendar结构体里面* @param       无* @retval      无*/
void rtc_get_time(void)
{static uint16_t daycnt = 0;uint32_t seccount = 0;uint32_t temp = 0;uint16_t temp1 = 0;const uint8_t month_table[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; /* 平年的月份日期表 */seccount = RTC->CNTH; /* 得到计数器中的值(秒钟数) */seccount <<= 16;seccount += RTC->CNTL;temp = seccount / 86400; /* 得到天数(秒钟数对应的) */if (daycnt != temp) /* 超过一天了 */{daycnt = temp;temp1 = 1970;   /* 从1970年开始 */while (temp >= 365){if (rtc_is_leap_year(temp1)) /* 是闰年 */{if (temp >= 366){temp -= 366;    /* 闰年的秒钟数 */}else{break;}}else{temp -= 365;        /* 平年 */}temp1++;}calendar.year = temp1;      /* 得到年份 */temp1 = 0;while (temp >= 28)      /* 超过了一个月 */{if (rtc_is_leap_year(calendar.year) && temp1 == 1) /* 当年是不是闰年/2月份 */{if (temp >= 29){temp -= 29; /* 闰年的秒钟数 */}else{break;}}else{if (temp >= month_table[temp1]){temp -= month_table[temp1]; /* 平年 */}else{break;}}temp1++;}calendar.month = temp1 + 1; /* 得到月份 */calendar.date = temp + 1;   /* 得到日期 */}temp = seccount % 86400;                                                    /* 得到秒钟数 */calendar.hour = temp / 3600;                                                /* 小时 */calendar.min = (temp % 3600) / 60;                                          /* 分钟 */calendar.sec = (temp % 3600) % 60;                                          /* 秒钟 */calendar.week = rtc_get_week(calendar.year, calendar.month, calendar.date); /* 获取星期 */
}/*** @brief       将年月日时分秒转换成秒钟数*   @note      输入公历日期得到星期(起始时间为: 公元0年3月1日开始, 输入往后的任何日期, 都可以获取正确的星期)*              使用 基姆拉尔森计算公式 计算, 原理说明见此贴:*              https://www.cnblogs.com/fengbohello/p/3264300.html* @param       syear : 年份* @param       smon  : 月份* @param       sday  : 日期* @retval      0, 星期天; 1 ~ 6: 星期一 ~ 星期六*/
uint8_t rtc_get_week(uint16_t year, uint8_t month, uint8_t day)
{uint8_t week = 0;if (month < 3){month += 12;--year;}week = (day + 1 + 2 * month + 3 * (month + 1) / 5 + year + (year >> 2) - year / 100 + year / 400) % 7;return week;
}/*** @brief       将年月日时分秒转换成秒钟数*   @note      以1970年1月1日为基准, 1970年1月1日, 0时0分0秒, 表示第0秒钟*              最大表示到2105年, 因为uint32_t最大表示136年的秒钟数(不包括闰年)!*              本代码参考只linux mktime函数, 原理说明见此贴:*              http://www.openedv.com/thread-63389-1-1.html* @param       syear : 年份* @param       smon  : 月份* @param       sday  : 日期* @param       hour  : 小时* @param       min   : 分钟* @param       sec   : 秒钟* @retval      转换后的秒钟数*/
static long rtc_date2sec(uint16_t syear, uint8_t smon, uint8_t sday, uint8_t hour, uint8_t min, uint8_t sec)
{uint32_t Y, M, D, X, T;signed char monx = smon;    /* 将月份转换成带符号的值, 方便后面运算 */if (0 >= (monx -= 2))       /* 1..12 -> 11,12,1..10 */{monx += 12; /* Puts Feb last since it has leap day */syear -= 1;}Y = (syear - 1) * 365 + syear / 4 - syear / 100 + syear / 400; /* 公元元年1到现在的闰年数 */M = 367 * monx / 12 - 30 + 59;D = sday - 1;X = Y + M + D - 719162;                      /* 减去公元元年到1970年的天数 */T = ((X * 24 + hour) * 60 + min) * 60 + sec; /* 总秒钟数 */return T;
}
 
rtc.h
#ifndef __RTC_H
#define __RTC_H#include "./SYSTEM/sys/sys.h"/* 时间结构体, 包括年月日周时分秒等信息 */
typedef struct
{uint8_t hour;       /* 时 */uint8_t min;        /* 分 */uint8_t sec;        /* 秒 *//* 公历年月日周 */uint16_t year;      /* 年 */uint8_t  month;     /* 月 */uint8_t  date;      /* 日 */uint8_t  week;      /* 周 */
} _calendar_obj;extern _calendar_obj calendar;                      /* 时间结构体 *//* 静态函数 */
static uint8_t rtc_is_leap_year(uint16_t year);     /* 判断当前年份是不是闰年 */
static long rtc_date2sec(uint16_t syear, uint8_t smon, uint8_t sday, uint8_t hour, uint8_t min, uint8_t sec);   /* 将年月日时分秒转换成秒钟数 *//* 接口函数 */
uint8_t rtc_init(void);                             /* 初始化RTC */
void rtc_get_time(void);                            /* 获取RTC时间信息 */
uint16_t rtc_read_bkr(uint32_t bkrx);               /* 读取后备寄存器 */
void rtc_write_bkr(uint32_t bkrx, uint16_t data);   /* 写后备寄存器 */ 
uint8_t rtc_get_week(uint16_t year, uint8_t month, uint8_t day);    /* 根据年月日获取星期几 */
uint8_t rtc_set_time(uint16_t syear, uint8_t smon, uint8_t sday, uint8_t hour, uint8_t min, uint8_t sec);   /* 设置时间 */
uint8_t rtc_set_alarm(uint16_t syear, uint8_t smon, uint8_t sday, uint8_t hour, uint8_t min, uint8_t sec);  /* 设置闹钟时间 */#endif 
相关文章:
HAL库源码移植与使用之RTC时钟
实时时钟(Real Time Clock,RTC),本质是一个计数器,计数频率常为秒,专门用来记录时间。 普通定时器无法掉电运行!但RTC可由VBAT备用电源供电,断电不断时 这里讲F1系列的RTC 可以产生三个中断信号ÿ…...
GIT命令学习 一
📑打牌 : da pai ge的个人主页 🌤️个人专栏 : da pai ge的博客专栏 ☁️宝剑锋从磨砺出,梅花香自苦寒来 ☁️运维工程师的职责:监…...
VS+QT 打包可执行文件.exe
切换成release版本,同时更改项目属性中release配置下的各个属性,确保匹配 重新生成解决方案,将生成的.exe复制到一个空白文件夹中 执行: cd D:\QT\5.12.10\msvc2015_64\binwindeployqt C:\Users\DELL\Desktop\serials\MainWind…...
Android笔试面试题AI答之Activity(2)
答案仅供参考,大部分为文心一言AI作答 目录 1. 请介绍一下Activity 生命周期?1. 完全生命周期2. 可见生命周期3. 前台生命周期4. 配置更改5. 特殊场景 2. 请介绍一下横竖屏切换时Activity的生命周期变化?1.默认行为(未设置androi…...
来自Transformers的双向编码器表示(BERT) 通俗解释
来自Transformers的双向编码器表示(BERT) 目录 1. 从上下文无关到上下文敏感2. 从特定于任务到不可知任务3. BERT:把两个最好的结合起来4. BERT的输入表示5. 掩蔽语言模型(Masked Language Modeling)6. 下一句预测&am…...
代码随想录第十六天|贪心算法(2)
目录 LeetCode 134. 加油站 LeetCode 135. 分发糖果 LeetCode 860. 柠檬水找零 LeetCode 406. 根据身高重建队列 LeetCode 452. 用最少数量的箭引爆气球 LeetCode 435. 无重叠区间 LeetCode 763. 划分字母区间 LeetCode 56. 合并区间 LeetCode 738. 单调递增的数字 总…...
花几千上万学习Java,真没必要!(二十二)
1、final关键字: 测试代码1: package finaltest.com;public class FinalBasicDemo {public static void main(String[] args) {// final修饰基本数据类型变量final int number 5;// 尝试修改number的值,这将导致编译错误// number 10; // …...
在RK3568上如何烧录MAC?
这里我们用RKDevInfoWriteTool 1.1.4版本 下载地址:https://pan.baidu.com/s/1Y5uNhkyn7D_CjdT98GrlWA?pwdhm30 提 取 码:hm30 烧录过程: 1. 解压RKDevInfoWriteTool_Setup_V1.4_210527.7z 进入解压目录,双击运行RKDevInfo…...
1.30、基于卷积神经网络的手写数字旋转角度预测(matlab)
1、卷积神经网络的手写数字旋转角度预测原理及流程 基于卷积神经网络的手写数字旋转角度预测是一个常见的计算机视觉问题。在这种情况下,我们可以通过构建一个卷积神经网络(Convolutional Neural Network,CNN)来实现该任务。以下…...
Windows如何使用Python的sphinx
在Windows上使用Python的Sphinx进行文档渲染和呈现,可以遵循以下步骤进行操作: 安装Python:首先,确保你的Windows系统上已经安装了Python。你可以从Python的官方网站下载并安装适合你系统(32位或64位&…...
C++ STL nth_element 用法
一:功能 将一个序列分为两组,前一组元素都小于*nth,后一组元素都大于*nth, 并且确保第 nth 个位置就是排序之后所处的位置。即该位置的元素是该序列中第nth小的数。 二:用法 #include <vector> #include <a…...
【PostgreSQL教程】PostgreSQL 选择数据库
博主介绍:✌全网粉丝20W+,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物联网、机器学习等设计与开发。 感兴趣的可…...
C# —— HashTable
集合collections命名空间,专门进行一系列的数据存储和检索的类,主要包含了:堆栈、和队列、list、ArrayList、数组 HashTable 字典 storeList 排序列表等类 Array 数组 长度固定, 类型固定 通过索引值来进行访问 ArrayList动态数组,…...
LeetCode 第407场周赛个人题解
目录 100372. 使两个整数相等的位更改次数 原题链接 思路分析 AC代码 100335. 字符串元音游戏 原题链接 思路分析 AC代码 100360. 将 1 移动到末尾的最大操作次数 原题链接 思路分析 AC代码 100329. 使数组等于目标数组所需的最少操作次数 原题链接 思路分析 A…...
使用Django框架实现音频上传功能
数据库设计(models.py) class Music(models.Model):""" 音乐 """name models.CharField(verbose_name"音乐名字", max_length32)singer models.CharField(verbose_name"歌手", max_length32)# 本质…...
[路由器]IP-MAC的绑定与取消
背景:当公司的网络不想与外部人员进行共享,可以在路由器页面配置IP-MAC的绑定,让公司内部人员的手机和电脑的mac,才能接入到公司。第一步:在ARP防护中,启动IP-MAC绑定选项,必须启动仅允许IP-MAC…...
Idea配置远程开发
Idea配置远程开发 本篇博客介绍使用idea通过ssh连接ubuntu服务器进行开发 目录 Idea配置远程开发1.idae上点击file->Remote Development2.点击New Connection3.填写相关信息4.输入密码5.选择IDE版本和项目路径5.1 点击open an SSH terminal打开控制台5.2 依次执行命令 6.成…...
lua 实现 函数 判断两个时间戳是否在同一天
函数用于判断两个时间戳是否在同一天。下面是对代码的详细解释: ### 函数参数 - stampA 和 stampB:两个时间戳,用于比较。- resetInfo:一个可选参数,包含小时、分钟和秒数,用于调整时间戳。 ### 函数实现…...
工作纪实53-log4j日志打印文件隔离
在项目中,我有一堆业务日志需要打印,另一部分的日志,是没有格式的,需要被云平台离线解析并收集到kafka或者hdfs、hive等,需要将日志隔离打印到不同的文件 正常的log4j配置是下面这样的,配合Sl4j直接使用默认…...
7月21日,贪心练习
大家好呀,今天带来一些贪心算法的应用解题、 一,柠檬水找零 . - 力扣(LeetCode) 解析: 本题的贪心体现在对于20美元的处理上,我们总是优先把功能较少的10元作为找零,这样可以让5元用处更大 …...
利用ngx_stream_return_module构建简易 TCP/UDP 响应网关
一、模块概述 ngx_stream_return_module 提供了一个极简的指令: return <value>;在收到客户端连接后,立即将 <value> 写回并关闭连接。<value> 支持内嵌文本和内置变量(如 $time_iso8601、$remote_addr 等)&a…...
基于Flask实现的医疗保险欺诈识别监测模型
基于Flask实现的医疗保险欺诈识别监测模型 项目截图 项目简介 社会医疗保险是国家通过立法形式强制实施,由雇主和个人按一定比例缴纳保险费,建立社会医疗保险基金,支付雇员医疗费用的一种医疗保险制度, 它是促进社会文明和进步的…...
(二)TensorRT-LLM | 模型导出(v0.20.0rc3)
0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述,后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作,其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...
苍穹外卖--缓存菜品
1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得,如果用户端访问量比较大,数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据,减少数据库查询操作。 缓存逻辑分析: ①每个分类下的菜品保持一份缓存数据…...
uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...
分布式增量爬虫实现方案
之前我们在讨论的是分布式爬虫如何实现增量爬取。增量爬虫的目标是只爬取新产生或发生变化的页面,避免重复抓取,以节省资源和时间。 在分布式环境下,增量爬虫的实现需要考虑多个爬虫节点之间的协调和去重。 另一种思路:将增量判…...
AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...
怎么让Comfyui导出的图像不包含工作流信息,
为了数据安全,让Comfyui导出的图像不包含工作流信息,导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo(推荐) 在 save_images 方法中,删除或注释掉所有与 metadata …...
