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

【Mini-F5265-OB开发板试用测评】显示RTC日历时钟

一、前言

本章节承接上期的【Mini-F5265-OB开发板试用测评】硬件SPI方式驱动LCD屏帖子上。灵动微官方提供的“LibSamples_MM32F5260_V0.10.2”SDK中包含一个RTC日历的参考例程,因此将该功能移植到上期工程中,即可达成在LCD屏上显示RTC日历时钟。
官方提供的参考示例,基本上都是采用PA2复用为串口2的TX端,方便用户外接USB转TTL调试模块打印串口输出信息,上期咱使用PA2作为控制LCD的背光输出脚,因此如果想要工程既支持串口打印RTC日历时钟信息,又能将数据同步到LCD屏上,必须将PA2改成其它通用GPIO口。

二、移植说明

参考“RTC_Calendar”例程,将“rtc_calendar.c”与“rtc_calendar.h”添加到原工程路径中,并在“mm32f5260_it.c”中添加RTC_IRQHandler()中断函数。
由于这里使用LCD做为数据显示端,因此可将printf串口打印输出替换成LCD相关显示接口函数。

三、工程源码

main.c

#include "platform.h"
#include "gpio_led_toggle.h"
#include "main.h"
#include "lcd.h"
#include "rtc_calendar.h"int main(void)
{PLATFORM_Init();GPIO_LED_Toggle_Sample();LCDInit();RTC_Configure();PLATFORM_DelayMS(200U);LcdFill(0,0,LCD_W,LCD_H,WHITE);while (1){LCDTest();}
}

rtc_calendar.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "platform.h"
#include "rtc_calendar.h"
#include "lcd.h"const uint8_t RTC_DayOfMonth[12] =
{31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
};RTC_CalendarTypeDef RTC_Calendar;uint8_t RTC_LeapYear(uint16_t Year)
{if ((((Year % 400) == 0)) ||   /* Century Leap Year */(((Year % 100) != 0) && ((Year % 4) == 0)) /* Normal  Leay Year */){return (1);}else{return (0);}
}uint8_t RTC_GetWeek(uint16_t Year, uint8_t Month, uint8_t Day)
{int w, c, y;/* Month 1 Or 2 of This Year Must Be As Last Month 13 Or 14 */if ((Month == 1) || (Month == 2)){Month += 12;Year  -= 1;}w = 0;                             /* Weekday */c = Year / 100;                    /* Century */y = Year % 100;                    /* Year    */w = y + (y / 4) + (c / 4) - (2 * c) + (26 * (Month + 1) / 10) + Day - 1;while (w < 0){w += 7;}w %= 7;return (w);
}void RTC_UpdateCalendar(void)
{static uint32_t PreTotalDay = 0;uint32_t TotalSecond = 0;uint32_t TotalDay    = 0;uint16_t Year  = 1970;uint8_t  Month = 0;TotalSecond = RTC_GetCounter();TotalDay    = TotalSecond / 86400;if (PreTotalDay != TotalDay){PreTotalDay = TotalDay;while (TotalDay >= 365){if (RTC_LeapYear(Year) == 1){if (TotalDay >= 366){TotalDay -= 366;}else{break;}}else{TotalDay -= 365;}Year++;}RTC_Calendar.year = Year;while (TotalDay >= 28){if ((Month == 1) && (RTC_LeapYear(RTC_Calendar.year) == 1)){if (TotalDay >= 29){TotalDay -= 29;}else{break;}}else{if (TotalDay >= RTC_DayOfMonth[Month]){TotalDay -= RTC_DayOfMonth[Month];}else{break;}}Month++;}RTC_Calendar.month = Month + 1;RTC_Calendar.day   = TotalDay + 1;RTC_Calendar.week  = RTC_GetWeek(RTC_Calendar.year, RTC_Calendar.month, RTC_Calendar.day);}RTC_Calendar.hour   = (TotalSecond % 86400) / 3600;RTC_Calendar.minute = ((TotalSecond % 86400) % 3600) / 60;RTC_Calendar.second = ((TotalSecond % 86400) % 3600) % 60;
}void RTC_SetDateTime(uint16_t Year, uint8_t Month, uint8_t Day, uint8_t Hour, uint8_t Minute, uint8_t Second)
{uint32_t TotalSecond = 0;uint16_t y = 0;uint8_t  m = 0;if ((Year >= 1970) && (Year <= 2099)){for (y = 1970; y < Year; y++){if (RTC_LeapYear(y) == 1){TotalSecond += 31622400; /* Total Seconds Of Leap   Year */}else{TotalSecond += 31536000; /* Total Seconds Of Normal Year */}}for (m = 0; m < (Month - 1); m++){TotalSecond += RTC_DayOfMonth[m] * 86400; /* Total Seconds Of Month */if ((RTC_LeapYear(Year) == 1) && (m == 1)){TotalSecond += 86400;}}TotalSecond += (uint32_t)(Day - 1) * 86400; /* Total Seconds Of Day    */TotalSecond += (uint32_t)Hour * 3600;       /* Total Seconds Of Hour   */TotalSecond += (uint32_t)Minute * 60;       /* Total Seconds Of Minute */TotalSecond += Second;RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWRDBG | RCC_APB1Periph_BKP, ENABLE);PWR_BackupAccessCmd(ENABLE);RTC_SetCounter(TotalSecond);RTC_WaitForLastTask();RTC_UpdateCalendar();}else{printf("\r\nError Date & Time!!!\r\n");}
}void RTC_PrintDateTime(void)
{LcdShowIntNum(8,118,RTC_Calendar.year,4,WHITE,RED,16);LcdShowString(40,118,"-",WHITE,RED,16);if(RTC_Calendar.month < 10){LcdShowIntNum(48,118,0,1,WHITE,RED,16);LcdShowIntNum(56,118,RTC_Calendar.month,1,WHITE,RED,16);}else{LcdShowIntNum(48,118,RTC_Calendar.month,2,WHITE,RED,16);}LcdShowString(64,118,"-",WHITE,RED,16);if(RTC_Calendar.day < 10){LcdShowIntNum(72,118,0,1,WHITE,RED,16);LcdShowIntNum(80,118,RTC_Calendar.day,1,WHITE,RED,16);}else{LcdShowIntNum(72,118,RTC_Calendar.day,2,WHITE,RED,16);}switch (RTC_Calendar.week){case 0:LcdShowString(88,118," SUN ",WHITE,RED,16);break;case 1:LcdShowString(88,118," MON ",WHITE,RED,16);break;case 2:LcdShowString(88,118," TUE ",WHITE,RED,16);break;case 3:LcdShowString(88,118," WED ",WHITE,RED,16);break;case 4:LcdShowString(88,118," THU ",WHITE,RED,16);break;case 5:LcdShowString(88,118," FRI ",WHITE,RED,16);break;case 6:LcdShowString(88,118," SAT ",WHITE,RED,16);break;default:break;}if(RTC_Calendar.hour < 10){LcdShowIntNum(8,140,0,1,WHITE,RED,16);LcdShowIntNum(16,140,RTC_Calendar.hour,1,WHITE,RED,16);}else{LcdShowIntNum(8,140,RTC_Calendar.hour,2,WHITE,RED,16);}LcdShowString(24,140,":",WHITE,RED,16);if(RTC_Calendar.minute < 10){LcdShowIntNum(32,140,0,1,WHITE,RED,16);LcdShowIntNum(40,140,RTC_Calendar.minute,1,WHITE,RED,16);}else{LcdShowIntNum(32,140,RTC_Calendar.minute,2,WHITE,RED,16);}LcdShowString(48,140,":",WHITE,RED,16);if(RTC_Calendar.second < 10){LcdShowIntNum(56,140,0,1,WHITE,RED,16);LcdShowIntNum(64,140,RTC_Calendar.second,1,WHITE,RED,16);}else{LcdShowIntNum(56,140,RTC_Calendar.second,2,WHITE,RED,16);}
}void RTC_LoadDefault(void)
{char    Date[20], Time[20];char    Text[6][5];uint8_t i = 0, Index = 0, Month = 0;char *MonthTable[12] ={"Jan", "Feb", "Mar", "Apr", "May", "Jun","Jul", "Aug", "Sep", "Oct", "Nov", "Dec",};char *str;memset(Date, 0, sizeof(Date));memset(Time, 0, sizeof(Time));memset(Text, 0, sizeof(Text));memcpy(Date, __DATE__, sizeof(__DATE__));memcpy(Time, __TIME__, sizeof(__TIME__));str = strtok(Date, " ");while (str != NULL){memcpy(Text[Index++], str, strlen(str));str = strtok(NULL, " ");}str = strtok(Time, ":");while (str != NULL){memcpy(Text[Index++], str, strlen(str));str = strtok(NULL, ":");}for (i = 0; i < 12; i++){if (0 == strcmp(Text[0], MonthTable[i])){Month = i + 1;}}RTC_Calendar.day    = atoi(Text[1]);RTC_Calendar.month  = Month;RTC_Calendar.year   = atoi(Text[2]);RTC_Calendar.hour   = atoi(Text[3]);RTC_Calendar.minute = atoi(Text[4]);RTC_Calendar.second = atoi(Text[5]);RTC_SetDateTime(RTC_Calendar.year, RTC_Calendar.month, RTC_Calendar.day, RTC_Calendar.hour, RTC_Calendar.minute, RTC_Calendar.second);
}void RTC_Configure(void)
{NVIC_InitTypeDef NVIC_InitStruct;RCC_APB1PeriphClockCmd(RCC_APB1Periph_PWRDBG | RCC_APB1Periph_BKP, ENABLE);PWR_BackupAccessCmd(ENABLE);BKP_DeInit();if (BKP_ReadBackupRegister(BKP_DR1) != 0x5D5D){RCC_LSEConfig(RCC_LSE_ON);while (RCC_GetFlagStatus(RCC_FLAG_LSERDY) == RESET){}RCC_RTCCLKConfig(RCC_RTCCLKSource_LSE);RCC_RTCCLKCmd(ENABLE);RTC_WaitForSynchro();RTC_WaitForLastTask();RTC_ITConfig(RTC_IT_SEC, ENABLE);RTC_WaitForLastTask();RTC_SetPrescaler(32767);RTC_WaitForLastTask();printf("\r\n%s", __FUNCTION__);BKP_WriteBackupRegister(BKP_DR1, 0x5D5D);}else{printf("\r\nNeed't to configure RTC...");RTC_WaitForSynchro();RTC_ITConfig(RTC_IT_SEC, ENABLE);RTC_WaitForLastTask();}NVIC_InitStruct.NVIC_IRQChannel = RTC_IRQn;NVIC_InitStruct.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStruct.NVIC_IRQChannelSubPriority = 1;NVIC_InitStruct.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStruct);RTC_LoadDefault();
}

函数LCDTest更改成如下:

uint8_t number = 0;
void LCDTest(void)
{LcdShowIntNum(8,10,2025,4,BLUE,GREEN,16);LcdShow16x16Hz(40,10,0, BLUE,GREEN);LcdShow16x16Hz(56,10,1, BLUE,GREEN);LcdShow16x16Hz(72,10,2, BLUE,GREEN);LcdShow16x16Hz(88,10,3, BLUE,GREEN);LcdShow16x16Hz(104,10,4,BLUE,GREEN);LcdShow16x16Hz(8,30,5,  BLUE,GREEN);LcdShow16x16Hz(24,30,6, BLUE,GREEN);LcdShowString(40,30," ",BLUE,GREEN,16);LcdShowString(44,30,"MM32F5260",BLUE, GREEN,16);LcdShow16x16Hz(8,50,7,  BLUE,GREEN);LcdShow16x16Hz(24,50,8, BLUE,GREEN);LcdShow16x16Hz(40,50,9, BLUE,GREEN);LcdShowImage(0,70, 128, 40, gImage_2);number++;if(number > 100)number = 0;LcdShowIntNum(80,140,number,3,WHITE,RED,16);
}

mm32f5260_it.c文件中增加RTC_IRQHandler()中断函数如下:

void RTC_IRQHandler(void)
{if (RESET != RTC_GetITStatus(RTC_IT_SEC)){RTC_UpdateCalendar();RTC_PrintDateTime();RTC_ClearITPendingBit(RTC_IT_SEC);RTC_WaitForLastTask();}
}

四、日历时钟显示

由上述源码可知,RTC的初始值是由工程编译时产生的Text文本时间属性所定义的,因此无需手动输入,编译完下载自动重启后便与电脑端同步时钟了。这里为了显示更标准化,将月份、日期、时、分、秒固定输出两位数字,采用24小时制,显示的效果呈现如下视频。
https://www.youku.com/video/XNjQ1MDM3OTU2NA==
在这里插入图片描述

相关文章:

【Mini-F5265-OB开发板试用测评】显示RTC日历时钟

一、前言 本章节承接上期的【Mini-F5265-OB开发板试用测评】硬件SPI方式驱动LCD屏帖子上。灵动微官方提供的“LibSamples_MM32F5260_V0.10.2”SDK中包含一个RTC日历的参考例程&#xff0c;因此将该功能移植到上期工程中&#xff0c;即可达成在LCD屏上显示RTC日历时钟。 官方提…...

【生活】程序员防猝si指南

note 一、定期体检二、均衡饮食&#xff0c;多食用对心脏有保护作用的食物三、每周运动四、减压五、保证睡眠六、戒烟限酒7、控制血压8、警惕流感攻击心脏9、关注牙齿健康10、不要抵触吃药 文章目录 note一、定期体检二、均衡饮食&#xff0c;多食用对心脏有保护作用的食物三、…...

CommandLineRunner详细教程

文章目录 1. CommandLineRunner基础概念和背景1.1 什么是CommandLineRunner&#xff1f;1.1.1 核心概念1.1.2 接口定义 1.2 为什么需要CommandLineRunner&#xff1f;1.3 CommandLineRunner的特点1.3.1 执行时机1.3.2 与ApplicationRunner的区别 2. 环境搭建和项目结构2.1 Mave…...

Github 2025-06-05 Go开源项目日报 Top10

根据Github Trendings的统计,今日(2025-06-05统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Go项目10TypeScript项目1Go编程语言:构建简单、可靠和高效的软件 创建周期:3474 天开发语言:Go协议类型:BSD 3-Clause “New” or “Revise…...

C++进阶--C++11--智能指针(重点)

文章目录 C进阶--智能指针&#xff08;重点&#xff09;智能指针使用的场景RAII和智能指针的设计思路C标准库智能指针的使用定制删除器智能指针的原理shared_ptr和weak_ptr循环引用&#xff08;容易考&#xff09;weak_ptr 其他知识扩展(类型转换)总结个人学习心得结语 很高兴和…...

CSP-38th

目录 1.正态分布 2.走马 3.信息传输 4.字符串可能性个数 5.最多访问节点个数 1.正态分布 本来是很简单的一道模拟题&#xff0c;根据 (n-u) /a 的整数位、十分位确定是在第几行&#xff0c;根据百分位确定是在第几列&#xff0c;但是我直接将 (n-u)/a 乘以100后进行 // 和…...

企业私有化部署DeepSeek实战指南:从硬件选型到安全运维——基于国产大模型的安全可控落地实践

一、部署前的战略评估与规划 私有化部署不仅是技术工程&#xff0c;更是企业数据战略的核心环节。需重点评估三方面&#xff1a; 1、业务场景适配性​ 适用场景&#xff1a;金融风控&#xff08;需实时数据处理&#xff09;、医疗诊断&#xff08;敏感病历保护&#xff09;、政…...

【西门子杯工业嵌入式-5-串口实现数据收发】

西门子杯工业嵌入式-5-串口实现数据收发 一、通信基础1.1 什么是通信1.2 嵌入式系统中的通信 二、串行通信原理2.1 串行通信简介2.2 通信参数约定 三、GD32F470 串口资源与性能3.1 串口硬件资源 四、串口通信的实现4.1 串口初始化流程4.2 串口发送函数编写4.3 使用 printf 实现…...

F(x,y)= 0 隐函数 微分法

&#x1f7e6; 一、隐函数微分法简介 ▶ 什么是隐函数&#xff1f; 显函数&#xff1a;形如 y f ( x ) y f(x) yf(x)&#xff0c;变量之间是显式关系。 隐函数&#xff1a;形如 F ( x , y ) 0 F(x, y) 0 F(x,y)0&#xff0c;变量间不是直接表达的&#xff0c;需要通过…...

深度学习登上Nature子刊!特征选择创新思路

2025深度学习发论文&模型涨点之——特征选择 特征选择作为机器学习与数据挖掘领域的核心预处理步骤&#xff0c;其重要性在当今高维数据时代日益凸显。 通过识别最具判别性的特征子集&#xff0c;特征选择算法能够有效缓解"维度灾难"、提升模型泛化能力&#x…...

面壁智能推出 MiniCPM 4.0 端侧大模型,引领端侧智能新变革

在 2025 智源大会期间&#xff0c;面壁智能重磅发布了开源模型 MiniCPM 4.0 的两个新版本&#xff08;0.5B、8B&#xff09;&#xff0c;代号「前进四」。此次发布在人工智能领域引发了广泛关注&#xff0c;标志着端侧大模型技术取得了重大突破。 卓越性能&#xff0c;树立行业…...

NLP学习路线图(三十二): 模型压缩与优化

一、 核心压缩与优化技术详解 1. 知识蒸馏:智慧的传承(Knowledge Distillation, KD) 核心思想:“师授徒业”。训练一个庞大、高性能但笨重的“教师模型”(Teacher Model),让其指导训练一个轻量级的“学生模型”(Student Model)。学生模型学习模仿教师模型的输出行为(…...

javaSE复习(7)

1.KMP算法 使用KMP算法在主串 "abaabaabcabaabc" 中搜索模式串 "abaabc"&#xff0c;到匹配成功时为止&#xff0c;请问在匹配过程中进行的单个字符间的比较次数是&#xff08;&#xff09;。 10次 用于互斥时 初值为1 在一个并发编程环境中&#xff0c…...

算法训练第十一天

150. 逆波兰表达式求值 代码&#xff1a; class Solution(object):def evalRPN(self, tokens):""":type tokens: List[str]:rtype: int"""stack []for i in tokens:if i:b int(stack.pop())a int(stack.pop())stack.append(ab)elif i-:b i…...

【联网玩具】EN 18031欧盟网络安全认证

在当今数字化时代&#xff0c;带联网功能的玩具越来越受到孩子们的喜爱&#xff0c;它们为儿童带来了前所未有的互动体验和学习机会。然而&#xff0c;随着这类玩具的普及&#xff0c;网络安全问题也日益凸显。为了保障儿童使用这类玩具时的安全与隐私&#xff0c;欧盟出台了 E…...

Linux 如何移动目录 (文件夹) (内含 Linux 重命名方法)

1-移动单个文件夹&#xff08;类似于自动剪切和粘贴&#xff09; 看看以下的例子&#xff1a; (base) schen744mgmt-4:~/code/sparseocc/data/nuScenes-Occupancy$ ls nuScenes-Occupancy-v0.1 nuScenes-Occupancy-v0.1.7z (base) schen744mgmt-4:~/code/sparseocc/data/nuS…...

WireShark相关技巧

文章目录 1 Wireshark如何设置解析SIP 1 Wireshark如何设置解析SIP 编辑->首选项->protocols->sip 选中sip 2 点击“编辑”->“首选项”->“protocol”->ESP ,按照如下红框显示&#xff0c;进行勾选&#xff0c;点击应用...

LLMs之Structured Output:vLLM 结构化输出指南—从约束生成到自动解析与高效实现

LLMs之Structured Output&#xff1a;vLLM 结构化输出指南—从约束生成到自动解析与高效实现 导读&#xff1a;随着大语言模型&#xff08;LLM&#xff09;在各类任务中的广泛应用&#xff0c;如何使其输出具备可控性、结构化与可解析性&#xff0c;成为实际部署中的关键问题。…...

DAY 45 Tensorboard使用介绍

知识点回顾&#xff1a; tensorboard的发展历史和原理tensorboard的常见操作tensorboard在cifar上的实战&#xff1a;MLP和CNN模型 作业&#xff1a;对resnet18在cifar10上采用微调策略下&#xff0c;用tensorboard监控训练过程。 PS: tensorboard和torch版本存在一定的不兼容…...

LeetCode刷题 -- 542. 01矩阵 基于 DFS 更新优化的多源最短路径实现

LeetCode刷题 – 542. 01矩阵 基于 DFS 更新优化的多源最短路径实现 题目描述简述 给定一个 m x n 的二进制矩阵 mat&#xff0c;其中&#xff1a; 每个元素为 0 或 1返回一个同样大小的矩阵 ans&#xff0c;其中 ans[i][j] 表示 mat[i][j] 到最近 0 的最短曼哈顿距离 算法思…...

TM中,return new TransactionManagerImpl(raf, fc);为什么返回是new了一个新的实例

这是一个典型的 构造器注入 封装资源的用法 &#x1f9e9; 代码片段 return new TransactionManagerImpl(raf, fc);✅ 简单解释&#xff1a; 这行代码的意思是&#xff1a; 使用已经打开的 RandomAccessFile 和 FileChannel&#xff0c;创建并返回一个新的 TransactionManag…...

将 tensorflow keras 训练数据集转换为 Yolo 训练数据集

以 https://www.kaggle.com/datasets/vipoooool/new-plant-diseases-dataset 为例 1. 图像分类数据集文件结构 (例如用于 yolov11n-cls.pt 训练) import os import csv import random from PIL import Image from sklearn.model_selection import train_test_split import s…...

(新手友好)MySQL学习笔记(6):分组查询,正则表达式

目录 分组查询 创建分组 过滤分组 分组查询练习 正则表达式 匹配单个实例 匹配多个实例 正则表达式练习 练习答案 分组查询练习答案 正则表达式练习答案 分组查询 创建分组 group by 子句&#xff1a;根据一个或多个字段对结果集进行分组&#xff0c;在分组的字段上…...

台式机电脑CPU天梯图2025年6月份更新:CPU选购指南及推荐

组装电脑选硬件的过程中,CPU的选择无疑是最关键的,因为它是最核心的硬件,关乎着一台电脑的性能好坏。对于小白来说,CPU天梯图方便直接判断两款CPU性能高低,准确的说,是多核性能。下面给大家分享一下台式机电脑CPU天梯图2025年6月版,来看看吧。 桌面CPU性能排行榜2025 台…...

【hadoop】Flink安装部署

一、单机模式 步骤&#xff1a; 1、使用XFTP将Flink安装包flink-1.13.5-bin-scala_2.11.tgz发送到master机器的主目录。 2、解压安装包&#xff1a; tar -zxvf ~/flink-1.13.5-bin-scala_2.11.tgz 3、修改文件夹的名字&#xff0c;将其改为flume&#xff0c;或者创建软连接…...

将单体架构项目拆分成微服务时的两种工程结构

一.独立Project 1.示意图 此时我们创建一个文件夹&#xff0c;在这个文件夹中&#xff0c;创建N个Project&#xff0c;每一个Project对应一个微服务&#xff0c;组成我们的最终的项目。 2.特点 适合那种超大型项目&#xff0c;比如淘宝&#xff0c;但管理负担比较重。 二.Mave…...

Unity3D 开发中的创新技术:解锁 3D 开发的新境界

在 3D 开发的广袤天地里&#xff0c;Unity3D 一直是众多开发者的得力伙伴。可如今&#xff0c;普通的开发方式似乎难以满足日益增长的创意与效率需求。你是否好奇&#xff0c;凭什么别家团队能用 Unity3D 打造出令人拍案叫绝的 3D 作品&#xff0c;自己却总感觉差了那么一点火候…...

UOS 20 Pro为国际版WPS设置中文菜单

UOS 20 Pro为国际版WPS设置中文菜单 查看UOS操作系统系统安装国际版wps并汉化方法1:下载zh_CN.tar.gz语言包方法2&#xff1a;手动从国内版wps12的包中提取中文菜单解压国内版wps的包 复制中文语言包到wps国际版目录下安装Windows字体 安装开源office 查看UOS操作系统系统 # 查…...

树莓派系统中设置固定 IP

在基于 Ubuntu 的树莓派系统中&#xff0c;设置固定 IP 地址主要有以下几种方法&#xff1a; 方法一&#xff1a;使用 Netplan 配置&#xff08;Ubuntu 18.04 及以上版本默认使用 Netplan&#xff09; 查看网络接口名称 在终端输入ip link或ip a命令&#xff0c;查看当前所使…...

单例模式与锁(死锁)

目录 线程安全的单例模式 什么是单例模式 单例模式的特点 饿汉实现方式和懒汉实现方式 饿汉⽅式实现单例模式 懒汉⽅式实现单例模式 懒汉⽅式实现单例模式(线程安全版本) 单例式线程池 ThreadPool.hpp threadpool.cc 运行结果 线程安全和重⼊问题 常⻅锁概念 死…...