day03(单片机高级)RTOS
目录
RTOS(实时操作系统)
裸机开发模式
轮询方式
前后台(中断方式)
改进(前后台(中断))定时器
裸机进一步优化
裸机的其他问题
RTOS的概念
什么是RTOS
为什么要使用 RTOS
RTOS的应用场景
RTOS的选择
RTOS的工作原理
FreeRTOS特点
创建第一个FreeRTOS程序
搭建方法
1、官网源码下载
2、处理工程目录
3、打开编译工程
4、去掉无关代码
5、删除未定义报错内容
6、验证
串口打印实验
如何找串口仿真
命名规范
动态任务的创建
任务实验
实现
函数原型
实验
优先级
延时函数
查看延时时间验证
调度原理
抢占式调度
时间片调度
任务状态
挂起任务、恢复任务
挂起任务函数原型
恢复任务函数原型
任务删除
函数原型
空闲任务
空闲任务钩子函数用途
空闲任务钩子函数的实现限制
钩子函数的使用
使用CUBE配置FreeRTOS编写程序
1、更新安装freertos插件
2.配置FreeRTOS
3.配置基础硬件
4.最后生成工程MDK内编写程序
RTOS(实时操作系统)
裸机开发模式
轮询方式
对于简单的应用程序,轮询(无限循环)的实现比较简单,在硬件完成初始化后,顺序的完成各种 任务。在外设的基础实验中,常采用这种方式。
int main()
{ while(1){
DHT11数据采集;
读取WIFI数据;
判断数据;}
}
在实际的嵌入式系统中,存在周期性与触发型任务,每个任务的执行时间与实时响应要求不同,在采用轮询系统进行程序设计时,很难应对这些场景。
前后台(中断方式)
前后台系统是在轮询的基础上加入了中断。外部事件的记录在中断中操作,对事件的响应在轮询中 完成,中断处理过程称之为前台,main 函数中的轮询称为后台。
后台的程序顺序执行,如果产生中断,那么中断会打断后台程序的正常执行,转而去执行中断服务 程序。如果事件的处理过程比较简单,可以直接在中断服务程序中进行处理;如果事件的处理过程比较 复杂,可以在中断中对事件响应进行标记,进而返回后台程序进行处理。
int main()
{ while(1){if(DHT11==1){
DHT11数据处理;
DHT11=0;}if(wifi==1){
处理WIFI数据;
wifi=0;}}
}
void DHT11_irq()
{
DHT11=1;
}
void WIFI_irq()
{
wifi=1;
}
//中断处理的速度高了
//触发之后又成为了轮询操作
//假如DHT11优先级高,且处理时间过长 wifi的处理就不及时了
采用前后台系统进行程序时,对后台的任务需要进行设计,避免单个任务长时间占有处理器资源。 当任务的逻辑比较复杂,任务的拆分难度增加,同时,随着中断事件的增加,整个程序的设计与响应的 实时性将会降低。
改进(前后台(中断))定时器
设置3S定时器中断(DHT11采集)
设置5s定时器中断(Wifi数据处理)
裸机进一步优化
void wifi(void)
{static int key=0;switch(key){case 0:
发送AT指令();
key=1;return;case 1:
接收数据();
key=2;return;case 2:
判断数据();
key=0;return;}
}
void DHT11(void)
{static int DHT11=0;switch(DHT11){case 0:
握手();
DHT11=1;return;case 1:
接收数据();
DHT11=2;return;case 2:
判断数据完整性();
DHT11=3;return;case 3:
数据处理();
DHT11=0;return;}
}
//问题解决了,但是程序的复杂度上来了
//基于裸机架构无法完美解决复杂耗时的多个函数
裸机的其他问题
while(1)
{
DHT11;if(key){delay(100);//程序在这停止了,效率被影响了if(key){wifi();}}
}
按键消抖优化:
在按键中断服务程序开启定时器
在定时器中断服务程序执行按键操作,并关掉定时器
RTOS的概念
什么是RTOS
为什么要使用 RTOS
主要是为了满足系统在时间和资源管理上的特殊需求
使用实时内核的理由可以从多个方面来描述,包括可维护性、可扩展性、模块化、团队开发、测试、代码复用、效率、空闲时间、电源管理、中断处理以及混合处理需求。以下是对这些方面的详细解释:
- 可维护性:实时内核通常具有抽象化的时间细节,这减少了模块间的依赖关系,使软件更易于维护和演化。由于内核负责计时,应用程序的执行受底层硬件变化的影响较小,进一步提高了可维护性。
- 模块化:实时内核的每个任务通常被设计为独立的模块,具有明确的设计目的。这种模块化设计有助于团队开发,因为每个团队成员可以独立地负责一个模块的开发和维护,提高开发效率和系统稳定性。
- 可扩展性:实时内核的设计通常允许添加新的功能或模块,而不需要对现有系统进行大规模修改。这使得系统能够随着需求的变化而扩展,保持长久的生命力。
- 代码复用:实时内核的模块化设计使得代码更容易被复用。通过低耦合设计,代码可以在不同的模块之间共享和重用,提高了开发效率并降低了维护成本。
- 提升效率:实时内核通常设计为事件驱动,这意味着它仅在事件发生时才进行处理。这种设计有助于提高系统的响应速度和运行效率。
RTOS的应用场景
物联网(IoT):RTOS是专门为物联网设备设计的操作系统,它提供了实时性、高效性和可靠性,以满足物联网应用的特殊需求。RTOS通过任务调度算法管理任务的执行顺序,确保高优先级任务能够及时响应,满足物联网设备对实时性的要求。
智能家居:RTOS在智能家居系统中用于控制各种智能设备,如智能灯泡、智能插座、智能门锁等。RTOS提供了设备之间的实时通信和协同工作,使用户能够方便地通过智能手机或其他设备控制家居环境。
医疗设备:RTOS在医疗设备中发挥着重要作用,如心脏起搏器、监护仪等设备需要实时处理生理参数,确保患者的生命安全。RTOS的高可靠性和实时性使得这些设备能够在关键时刻发挥关键作用。SAFERTOS等RTOS产品特别针对医疗设备的需求,提供响应迅速、稳健、确定性的嵌入式实时操作系统,降低项目风险、开发成本,并缩短上市时间。
汽车电子:在汽车领域,RTOS的应用越来越广泛。例如,高级驾驶辅助系统(ADAS)需要实时处理大量的传感器数据,以实现自动驾驶、车辆导航等功能。RTOS能够确保这些系统的实时性和稳定性,提高驾驶安全性。
工业自动化和机器人技术:RTOS在工业自动化系统中扮演关键角色,通过精确定时和控制能力,确保生产线的稳定运行,提高生产效率和质量。在机器人技术中,RTOS能够确保机器人实时响应指令,执行复杂任务,如无人机和机器人的飞行轨迹控制、任务执行等。
航空航天:在航空航天领域,RTOS的应用至关重要。由于航空电子系统的复杂性和对实时性的极高要求,RTOS能够提供高度可靠的中断处理和任务调度机制,确保飞行控制系统、导航系统和传感器数据处理的实时性和准确性。
RTOS的选择
安全性:RTOS 是否有助于设备的安全性或损害设备的安全性?容易出现用户错误吗?
性能:RTOS 能否促进应用程序代码的开发?代码是否在所需参数内执行?
可靠性:RTOS 是否会影响设备的可靠性?
功能:RTOS 是否具备完成这项工作所需的设施?
学习RTOS的3个步骤
学会使用API
了解API实现原理
可以优化改进API
RTOS的工作原理
① RTOS相当于实现了后台的主循环,并能够处理ISR与主循环的交互
② 使得用户可以只考虑任务的设计
③ RTOS还提供了各种组件用于实现任务间交互及其他控制管理功能(e.g. 存储管理)
提供多个执行流,虽然实际只有一颗CPU,但通过"虚拟化",每个Task好像独占CPU
提供资源管理和通信组件
提供一些组件用于简化任务对资源的访问,事件的处理,以及任务之间的通信,有效降低任务之间的代码耦合
FreeRTOS特点
创建第一个FreeRTOS程序
搭建方法
- 移植文件(FreeRTOS相关文件)+时钟配置
- 官网源码下的DEMO(需要精简 去掉无关文件)+标准库
- CUBEMX直接生成就可以了
1、官网源码下载
(1)进入FreeRTOS官网
(2)点击下载FreeRTOS
2、处理工程目录
(1)下载后解压FreeRTOS文件
(2)删除多余文件(红框里的)
(3)删除"FreeRTOSv202212.01\FreeRTOS\Demo"目录下用不到的示例工程,留下common这里放了一些公共文件
(4)"FreeRTOSv202212.01\FreeRTOS\Source\portable"目录下只保留如下两个文件夹,其他全部删掉。
(5)"FreeRTOSv202212.01\FreeRTOS\Source\portable\RVDS"目录下只保留如下一个文件夹,其他全部删掉
3、打开编译工程
(1)删除后文件后,进入如下图打开工程
(2)弹出如下对话框,说明该工程是用KeilMDK4创建的。点击“Migrate to Device Pack”更新为KeilMDK5。
(3)弹出对话框,点击“确定”。
- 更新后,关闭工程再重新打开,编译。
- 工程目录介绍(System里还有一个lcd也删掉)
4、去掉无关代码
(1)Demo Files文件下只保留“serial.c和main.c”文件,其他都删掉(删完之后main里去掉一些头文件)。
(2)编译
5、删除未定义报错内容
(1)在文件STM32F10x.s中,删除如下内容。
(2)删除其他未定义的相关内容,再次编译。报错的内容均删除或者注释,直到没错为止。
6、验证
在原有任务的基础上加个i++验证
串口打印实验
1、重定向
这个fputc在main中:
int fputc( int ch, FILE *f )//重定向 修改数据传输方向
{
while(!(USART1->SR & (1<<7))){}
USART1->DR =ch;
return ch;
}
2、配置串口
初始化删除多余的东西,自己写一个串口一的初始化。
void Uart_Init(void){
GPIO_InitTypeDef GPIO_InitStructure;
USART_InitTypeDef USART_InitStructure;RCC_APB2PeriphClockCmd( RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE );//tx
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;GPIO_Init(GPIOA,&GPIO_InitStructure);//rx
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IN_FLOATING;GPIO_Init(GPIOA,&GPIO_InitStructure); USART_InitStructure.USART_BaudRate = 115200;
USART_InitStructure.USART_WordLength = USART_WordLength_8b;
USART_InitStructure.USART_StopBits = USART_StopBits_1;
USART_InitStructure.USART_Parity = USART_Parity_No ;
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;
USART_InitStructure.USART_Clock = USART_Clock_Disable;
USART_InitStructure.USART_CPOL = USART_CPOL_Low;
USART_InitStructure.USART_CPHA = USART_CPHA_2Edge;
USART_InitStructure.USART_LastBit = USART_LastBit_Disable;USART_Init( USART1, &USART_InitStructure ); USART_Cmd( USART1, ENABLE ); }
如何找串口仿真
命名规范
数据类型
命名规范
动态任务的创建
任务是什么
任务是由 C 语言函数实现的。唯一特别的地方是其函数原型,必须返回 void,并带有一个 void 指针参数。
任务的外观:一个永远不返回的函数
任务实验
实现
创建任务函数xTaskCreate:任务也不是很复杂的东西,任务也就是一个函数
xTaskCreate。简单得说,创建一个任务,你得提供它的执行函数,你得提供它的栈的大小,函数的执行空间,函数的优先级等重要的条件。因为任务在运行中,任务函数有调用关系,有局部变量,这些都保存在任务的栈里面;任务有可能被切换,有可能被暂停,这时候CPU寄存器中断现场数据都保存在栈里面。
函数原型
BaseType_t xTaskCreate( TaskFunction_t pxTaskCode,
const char * const pcName, const configSTACK_DEPTH_TYPE usStackDepth,
void * const pvParameters,
UBaseType_t uxPriority,
TaskHandle_t * const pxCreatedTask )
参数说明
pvTaskCode:指向任务函数的指针。该函数表示任务要执行的代码。
pcName:任务名称字符串。用于调试和跟踪,不影响任务功能。也可用于获取任务句柄
usStackDepth:任务栈大小(以单词为单位)。根据任务需求设定,过小可能导致栈溢出。
pvParameters:传递给任务函数的参数。可以是任意类型的指针。
uxPriority:任务优先级。数值越大,优先级越高。
pxCreatedTask:任务句柄指针。用于存储创建任务后的任务句柄,可选参数。可为NULL
返回值
如果任务创建成功,返回pdPASS。如果任务创建失败(例如内存不足),返回错误码。
任务创建成功后,系统会自动将其加入到调度队列。调度器会根据任务优先级选择合适的任务执行。
实验
优先级
结论
FreeRTOS中,优先级数越大优先级越高,两个任务同优先级时通过时间片轮转执行,如果有高优先级时,高优先级执行,一直到高优先级停止执行低优先级才能执行。
延时函数
void vTaskDelay( const TickType_t xTicksToDelay );
查看延时时间验证
声明个变量a只有任务一执行时才为1,其他时候为0,然后进入仿真使用虚拟逻辑分析仪查看变量a状态
查看方法(进入仿真使用):
调度原理
调度器是内核中负责决定在任何特定时间应执行哪些任务的部分。内核可以在任务生命周期内多次挂起并且稍后恢复一个任务。调度策略是调度器用来决定在任何时间点执行哪个任务的算法。非实时多用户系统的策略极有可能使每个任务具有"公平"比例的处理时间。
FreeRTOS 共支持三种任务调度方式,分别为抢占式调度、时间片调度和协程式调度。需要注意的是,FreeRTOS 官方对协程式调度做了特殊说明,协程式调度用于一些资源非常少的设备上,但是现在已经很少用到。虽然协程式调度的相关代码还没有被删除,FreeRTOS 官方并未计划继续开发协程式调度。因此不推荐在开发中继续使用协程式调度,我们接着理解一下抢占式调度与时间片调度的概念。
抢占式调度
抢占式调度主要时针对优先级不同的任务,每个任务都有一个优先级,优先级高的任务可以抢占优先级低的任务,只有当优先级高的任务发生阻塞或者被挂起,低优先级的任务才可以运行。
时间片调度
时间片调度主要针对优先级相同的任务,当多个任务的优先级相同时, 任务调度器会在每一次系统时钟节拍到的时候切换任务,也就是说 CPU 轮流运行优先级相同的任务,每个任务运行的时间就是一个系统时钟节拍。
在 FreeRTOS 中的任务存在四种状态,分别为运行态、就绪态、阻塞态和挂起态。在 FreeRTOS 运行时,任务的状态一定是这四种状态中的一种,下面是四种任务状态的介绍。
任务状态
同优先级的任务正在运行,所以需要等待。
运行态(Running):如果一个任务得到 CPU 的使用权,即任务被实际执行时,那么这个任务处于运行态。如果运行 FreeRTOS 的 MCU 只有一个处理器核心,那么在任务时刻,都只能有一个任务处理运行态。
就绪态:如果一个任务已经能够被执行(不处于阻塞态或挂起态),但当前还未被执行(具有相同优先级或更高优先级的任务正持有 CPU 使用权),那么这个任务就处于就绪态。
阻塞态(Blocked):如果一个任务因延时一段时间或等待外部事件发生,那么这个任务就处理阻塞态。例如任务调用了函数 vTaskDelay(),进行一段时间的延时,那么在延时超时之前,这个任务就处理阻塞态。任务也可以处于阻塞态以等待队列、信号量、事件组、通知或信号量等外部事件。通常情况下,处于阻塞态的任务都 有一个阻塞的超时时间,在任务阻塞达到或超过这个超时时间后,即使任务等待的外部事件还没有发生, 任务的阻塞态也会被解除。要注意的是,处于阻塞态的任务是无法被运行的。
挂起态(Suspended):任务一般通过函数 vTaskSuspend()和函数 vTaskResums()进入和退出挂起态与阻塞态一样,处于挂起态的任务也无法被运行。
挂起任务、恢复任务
挂起任务函数原型
vTaskSuspend( TaskHandle_t xTaskToSuspend )
参数
xTaskToSuspend:需要挂起任务的句柄
创建任务时加上句柄
句柄声明
恢复任务函数原型
void vTaskResume( TaskHandle_t xTaskToResume )
参数
TaskToResumex:需要恢复任务的句柄
任务删除
vTaskDelete()函数用于删除任务。在使用这个函数时,需要提供一个任务句柄作为参数,以便通知内核删除哪个任务。
函数原型
void vTaskDelete( TaskHandle_t xTaskToDelete )
参数:
xTaskToDelete:需要删除任务的句柄
如果写的是NULL,则自杀
空闲任务
当创建的任务大部分时间都处于阻塞状态。当任务处于阻塞状态时,它们无法运行,因此调度器无法选择它们。必须始终至少有一个任务可以进入运行状态(即使在使用 FreeRTOS 的特殊低功耗功能时也是如此,在这种情况下,如果应用程序创建的任务都无法执行,那么执行 FreeRTOS 的微控制器将被置于低功耗模式)。为了确保这种情况,当调用 vTaskStartScheduler()时,调度器会自动创建一个空闲任务。空闲任务除了在一个循环中等待之外几乎不执行其他任何操作,因此,就像第一个示例中的任务一样,它始终能够运行。
空闲任务具有尽可能低的优先级(优先级为 0),以确保它永远不会阻止更高优先级的应用程序任务进入运行状态。然而,这并不妨碍应用程序设计者根据需要创建与空闲任务共享优先级的任务。可以使用 FreeRTOSConfig.h 中的 configIDLE_SHOULD_YIELD 编译时配置常量阻止空闲任务消耗处理时间,可以更有效地分配给具有同样优先级的应用程序任务处理时间。运行在最低优先级确保了当更高优先级的任务进入就绪状态时,空闲任务会立即从运行状态转换出来。
注意:如果一个任务使用 vTaskDelete() API 函数来删除自己,那么必须确保空闲任务不会因处理时间不足而受到影响。这是因为空闲任务负责清理由已删除自身的任务所使用的内核资源。
空闲任务钩子函数用途
可以通过使用空闲钩子(或空闲回调)函数直接在空闲任务中添加应用程序的相关功能。处理一些不紧急的任务。空闲钩子函数是一种函数,它在空闲任务循环的每次迭代中自动由空闲任务调用。空闲任务钩子的常见用途包括:
- 执行低优先级、后台或连续处理功能,而无需为此目的创建应用程序任务,所带来额外的 RAM开销。
- 测量空闲处理能力(空闲任务仅在所有更高优先级的应用程序任务没有工作要执行时,空闲任务才会运行;因此,测量分配给空闲任务的处理时间,可以清楚地表明有多少处理时间是空闲的)。
- 将处理器置于低功耗模式,提供了一种简单且自动的方法,在没有应用程序处理要执行时,节省功耗。
空闲任务钩子函数的实现限制
- 空闲任务钩子函数绝对不能阻塞或挂起自己。(以任何方式阻塞空闲任务都可能导致没有任务能够进入运行态!)
- 如果一个应用程序任务使用 vTaskDelete() API 函数删除自己,那么必须在合理的时间段内将闲任务钩子返回给调用者。这是因为任务被删除后,空闲任务负责清理内核资源。如果空闲任务永久保持在空闲钩子函数中,则无法进行这种清理。
钩子函数的使用
- main函数中找到vTaskStartScheduler()并跳转
- vTaskStartScheduler()内可以找到如图的函数
- 跳转空闲任务函数找到了vApplicationIdleHook()函数就是钩子函数,但是需要configUSE_IDLE_HOOK==1
- 右键跳转configUSE_IDLE_HOOK并将configUSE_IDLE_HOOK等于1
- 编译发现报错,内容为vApplicationIdleHook未定义
- 接下来我们声明写一个vApplicationIdleHook函数并在里面写自己的任务程序就可以了
TaskHandle_t xTask1ToSuspend;
void vApplicationIdleHook( void )
{while(1){printf("我是钩子,我的优先级为0\n");}
}
void task1( void *pvParameters )
{for(;;){printf("我是任务1,我的优先级高\n");vTaskDelay(10);}
}
void task2( void *pvParameters )
{for(;;){printf("我是任务2,我的优先级低\n");vTaskDelete(xTask1ToSuspend);}
}
使用CUBE配置FreeRTOS编写程序
1、更新安装freertos插件
2.配置FreeRTOS
创建一个新的工程
3.配置基础硬件
4.最后生成工程MDK内编写程序
void StartTask02(void *argument)
{/* USER CODE BEGIN myTask02 *//* Infinite loop */for(;;){HAL_GPIO_TogglePin(GPIOC,GPIO_PIN_13);osDelay(100);}/* USER CODE END myTask02 */
}
相关文章:
day03(单片机高级)RTOS
目录 RTOS(实时操作系统) 裸机开发模式 轮询方式 前后台(中断方式) 改进(前后台(中断))定时器 裸机进一步优化 裸机的其他问题 RTOS的概念 什么是RTOS 为什么要使用 RTOS RTOS的应用场景 RTOS的…...
vue中v-if和v-show的区别
文章为本菜鸡学习过程中遇到的问题记录,不是专业的,如有问题和不足还请大佬指正 >参考文章 文章目录 前言1、v-if2、v-show3、v-if和v-show的区别 前言 问题描述: 在完成表单验证任务的学习过程中,发现在使用v-show隐藏元素后…...
MacOS通过VMware Fusion安装windows 11问题汇总
环境 虚拟机,VMware Fusion 13.6.1本地机器,ARM芯片的Mac,系统版本14.5Windows系统镜像,Window11 ARM 64 bit 安装卡在WiFi连接界面 适合我本地环境的解决步骤为: 1、系统设置网络共享 我开启的是en5,这…...
Stable Diffusion的解读(二)
Stable Diffusion的解读(二) 文章目录 Stable Diffusion的解读(二)摘要Abstract一、机器学习部分1. 算法梳理1.1 LDM采样算法1.2 U-Net结构组成 2. Stable Diffusion 官方 GitHub 仓库2.1 安装2.2 主函数2.3 DDIM采样器2.4 Unet 3…...
十五届蓝桥杯赛题-c/c++ 大学b组
握手问题 很简单,相互牵手即可,但是要注意,第一个人只能与其他49个人牵手,所以开头是加上49 #include <iostream> using namespace std; int main() {int cnt0;for(int i49;i>7;i--){cnti;//cout<<i<<&quo…...
NFS搭建
NFS搭建 单节点安装配置服务器安装配置启动并使NFS服务开机自启客户端挂载查看是否能发现服务器的共享文件夹创建挂载目录临时挂载自动挂载 双节点安装配置服务器安装配置服务端配置NFS服务端配置Keepalived编辑nfs_check.sh监控脚本安装部署RsyncInofity 客户端 单节点安装配置…...
【贪心算法第二弹——2208.将数组和减半的最小操作数】
1.题目解析 题目来源 2208.将数组和减半的最小操作数——力扣 测试用例 2.算法原理(贪心策略) 3.实战代码 class Solution { public:int halveArray(vector<int>& nums) {priority_queue<double> hash;double sum 0.0;for(auto e : nums){hash.push(e);sum …...
ByteBuffer 与 ByteBuf 的对比与优缺点分析
在 Java 网络编程和高性能 I/O 场景中,ByteBuffer 和 ByteBuf 是两种重要的缓冲区处理工具。ByteBuffer 是 Java NIO 标准库的一部分,而 ByteBuf 是由 Netty 框架提供的增强缓冲区工具。在实际开发中,选择哪一种取决于场景需求和性能目标。 …...
SpringBoot 集成 html2Pdf
一、概述: 1. springboot如何生成pdf,接口可以预览可以下载 2. vue下载通过bold如何下载 3. 一些细节:页脚、页眉、水印、每一页得样式添加 二、直接上代码【主要是一个记录下次开发更快】 模板位置 1. 导入pom包 <dependency><g…...
【IDEA】插件篇
环境:Mac M ,IDEA 2024.2.4 一、汉化 & 汉化后转回英文 1、汉化 IntelliJ IDEA -> Preferences -> Plugins -> MarketPlace,输入 chinese,点击 安装,安装完成后 重启IDE 2、汉化后转回英文 IntelliJ …...
librdns一个开源DNS解析库
原文地址:librdns一个开源DNS解析库 – 无敌牛 欢迎参观我的个人博客:无敌牛 – 技术/著作/典籍/分享等 介绍 librdns是一个开源的异步多功能插件式的解析器,用于DNS解析。 源代码地址:GitHub - vstakhov/librdns: Asynchrono…...
数据结构 【带环单链表】
在单链表中可能会存在一种情况,某一结点在经过几次转移之后回到了自己本身,这种情况就称之为带环链表。对于带环链表,我们不能轻易对其进行遍历,遍历可能会导致产生死循环。 带环链表的逻辑图如下所示:(这…...
CodiMD导出pdf失败或无中文
CodiMD导出pdf失败,弹出文件保存窗口,有个pdf文件能下载,但是保存的时候提示“网站出问题了”,实际到服务器上看会发现docker崩溃了。 解决办法: 使用最新的CodiMD镜像,如nabo.codimd.dev/hackmdio/hackmd:…...
基于Java Springboot高校教务管理系统
一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue、Element-ui 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA/eclipse 数据…...
大数据调度组件之Apache DolphinScheduler
Apache DolphinScheduler 是一个分布式易扩展的可视化 DAG 工作流任务调度系统。致力于解决数据处理流程中错综复杂的依赖关系,使调度系统在数据处理流程中开箱即用。 主要特性 易于部署,提供四种部署方式,包括Standalone、Cluster、Docker和…...
Python 快速入门(上篇)❖ Python基础知识
Python 基础知识 Python安装**运行第一个程序:基本数据类型算术运算符变量赋值操作符转义符获取用户输入综合案例:简单计算器实现Python安装** Linux安装: yum install python36 -y或者编译安装指定版本:https://www.python.org/downloads/source/ wget https://www.pyt…...
JAVA实现将PDF转换成word文档
POM.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.…...
Python学习29天
二分查找 # 定义函数冒泡排序法从大到小排列 def bbble_sort(list):# i控制排序次数for i in range(len(list) - 1):# j控制每次排序比较次数for j in range(len(list) - 1 - i):if list[j] < list[j 1]:list[j], list[j 1] list[j 1], list[j] # 定义二分查找函数 def…...
FreeSWITCH 简单图形化界面35 - 使用python脚本
FreeSWITCH 简单图形化界面35 - 使用python脚本 测试环境1、mod_python编译2、Python编写拨号规则(dialplan)测试一下不带参数带参数 3、使用Python执行freeSWITCH的API测试一下 4、Python执行session API测试一下 5、Python编写聊天规则(chatplan)测试一下 6、Python执行messa…...
基于AIRTEST和Jmeter、Postman的自动化测试框架
基于目前项目和团队技术升级,采用了UI自动化和接口自动化联动数据,进行相关测试活动,获得更好的测试质量和测试结果。...
web-03
CSS回顾 选择器 标签选择器 标签{}ID选择器 标签中定义ID属性。 #ID值{}类选择器 标签中使用class属性 .类名{}关于DIV/span div任意的大小的长方形,大小css: width, height控制。—换行 span-- 一行内 CSS常用属性 width/height 宽度/高度 定义&…...
MySQL 死锁
一、引言 在 MySQL 数据库的使用过程中,死锁问题就像一颗隐藏在暗处的 “定时炸弹”,平时可能感觉不到它的存在,但一旦触发,就可能导致数据库事务无法正常推进,严重影响系统的性能和可用性。对于开发人员和数据库管理员…...
M|大脑越狱
rating: 7.0 豆瓣: 7.6 上映时间: “2015” 类型: M悬疑 导演: 约瑟夫怀特 Joseph White 主演: 亚历山大欧文 Alexander Owen爱德华富兰克林 Edward Franklin 国家/地区: 英国 片长/分钟: 20分钟 M|大脑越狱 想法不错,但是逻辑比较一般。属于…...
CSS3_媒体查询(十一)
CSS3_响应式布局 1、媒体样式 在不同媒体上显示不同的样式。 常用阈值: 小于768px:小屏幕;768px-992px:中等屏幕;992px-1200px:大屏幕;大于1200px:超大屏幕。 <!DOCTYPE html>…...
Spring |(四)IoC/DI配置管理第三方bean
文章目录 📚数据源对象管理🐇环境准备🐇实现Druid管理🐇实现C3P0管理 📚加载properties文件🐇第三方bean属性优化🐇读取单个属性 学习来源:黑马程序员SSM框架教程_SpringSpringMVCMa…...
Qt桌面应用开发 第六天(鼠标事件 定时器事件 定时器类 事件分发器 事件过滤器)
目录 1.1鼠标进入和离开enterEvent\leaveEvent 1.2鼠标按下释放和移动mousePressEvent\mouseReleaseEvent\mouseMoveEvent 1.3定时器事件timerEvent 1.4定时器类QTimer 1.5事件分发器event 1.6事件过滤器eventFilter 1.1鼠标进入和离开enterEvent\leaveEvent 事件&#x…...
MySQL-存储过程
目录 一、存储过程定义 二、存储过程创建 1、变量的定义 2、存储过程的分支语句 2.1 双分支IF语句 2.2 多分支IF语句 3、存储过程的循环语句 三、存储过程调用 四、存储过程显示和删除 一、存储过程定义 存储过程(Stored Procedure)是一种在数…...
数据指标与标签在数据分析中的关系与应用
导读:分享数据指标体系的文章很多,但讲数据标签的文章很少。实际上,标签和指标一样,是数据分析的左膀右臂,两者同样重要。实际上,很多人分析不深入,就是因为缺少对标签的应用。今天系统的讲解下…...
LWE详细介绍
LWE问题,即学习误差问题(Learning With Errors problem),是密码学中一个重要的硬问题,尤其在后量子密码学中占有核心地位。LWE问题由Regev在2005年提出,其设计基于格理论,被认为是一个在平均情况…...
Linux系统Docker部署开源在线协作笔记Trilium Notes与远程访问详细教程
目录 ⛳️推荐 前言 1. 安装docker与docker-compose 2. 启动容器运行镜像 3. 本地访问测试 4.安装内网穿透 5. 创建公网地址 6. 创建固定公网地址 ⛳️推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下…...
【Spring MVC】初步了解Spring MVC的基本概念与如何与浏览器建立连接
前言 🌟🌟本期讲解关于SpringMVC的基础概念,以及如何实现与浏览器的连接,参数的传递~~~ 🌈感兴趣的小伙伴看一看小编主页:GGBondlctrl-CSDN博客 🔥 你的点赞就是小编不断更新的最大动力 …...
游戏AI实现-决策树
代码实现: 定义一个决策树节点 class DecisionTreeNode{public DecisionTreeNode(){} } 定义一个行为类: class Action : DecisionTreeNode{ } 定义一个决策类: class Decision : DecisionTreeNode{ } 应用: 参考书…...
9个最佳WordPress PDF插件(查看器、嵌入和下载)
在过去的几年里,我们一直在使用不同的 PDF 插件在我们的网站上创建、编辑和嵌入文档。 然而,经过多次尝试和错误,我们意识到并不是每个插件都是相同的。事实上,为您的企业或电子商务网站选择合适的 PDF 插件可能是一项艰巨的任务…...
odoo18中模型的常用字段类型
字段的公共属性: Char 字符类型,对应数据库中varchar类型,除了通用类型外接收另外两个参数: size: 字符长度,超出的长度将被截断 trim: 默认True,是否字段值应该被去空白。 Text 文本类型,对应数据库…...
VUE 指令 事件绑定,.stop阻止冒泡
1、VUE 的模板语法和指令 目的增强html的功能 所有的指令以自定义属性的方式去写 v-xxx ,指令就是vue提供给我们能够更方便将数据和页面展示出来的操作,具体就是以数据去驱动DOM ,简化DOM操作的行为。 2、内容渲染指令 ① {{}} 模板渲染(模板引擎&am…...
在Excel中处理不规范的日期格式数据并判断格式是否正确
有一个Excel表,录入的日期格式很混乱,有些看着差不多,但实际多一个空格少一个字符很难发现,希望的理想格式是 1980-01-01,10位,即:“YYYY-mm-dd”,实际上数据表中这样的格式都有 19…...
webpack基础配置
文章目录 一、默认入口和默认出口二、资源配置三、输出文件3.1 多文件入口3.2 HtmlWebpackPlugin插件 四、环境4.1 环境变量4.2 热更新 五、代码分离5.1 公共模块5.2 懒加载5.3 预获取/预加载模块 六、缓存七、Tree Shaking八、公共路径 webpack 是一个用于现代 JavaScript 应用…...
stm32利用LED配置基础寄存器+体验滴答定时器+hal库环境配置
P1 LED控制与流水灯效果实现 概述 大家好,今天我们来学习一下如何在STM32上控制LED灯,并且实现一个流水灯的效果。这不仅是一个基础的实践,也是嵌入式开发中非常常见的需求。 LED控制 1. LED初始化 首先,我们需要对LED灯对应…...
Spark RDD sortBy算子执行时进行数据 “采样”是什么意思?
一、sortBy 和 RangePartitioner sortBy 在 Spark 中会在执行排序时采用 rangePartitioner 进行分区,这会影响数据的分区方式,并且这一步骤是通过对数据进行 “采样” 来计算分区的范围。不过,重要的是,sortBy 本身仍然是一个 tr…...
Ubuntu24.04下的docker问题
按官网提示是可以安装成功的,但是curl无法使用https下载,会造成下述语句执行失败 # Add Dockers official GPG key: sudo apt-get update sudo apt-get install ca-certificates curl sudo install -m 0755 -d /etc/apt/keyrings sudo curl -fsSL https…...
Tri Mode Ethernet MAC IP核详解
本文对 Vivado 的三速 MAC IP 核(Tri Mode Ethernet MAC,TEMAC)进行介绍。 在自行实现三速以太网 MAC 控制器时,GMII/RGMII 接口可以通过 IDDR、ODDR 原语实现,然而实际使用中自己实现的模块性能不是很稳定(…...
【U盘车载音乐】某宝198的3068首车载专用音乐合集【高音质】24G
「【U盘车载音乐】某宝198的3068首车载专用音乐合集【高音质】24G」 复制下方口令,打开最新版「夸克APP」即可获取保存(防止和谐!!!) 口令: 动作懿范鉴真渡多好备用口令: /~19dc35…...
android 实现答题功能
一、效果 二、实现思路 1、界面实现 实现起来其实不难,首先我们可以看到,界面是由答题进度、题目、选项ABCD组成,现在就是要考虑实现方式,答题进度可以使用Textviewprogressbar实现,题目直接使用Textview,…...
JSONP处理跨域请求
JSONP 背景 由于浏览器存在安全策略,所以当访问的请求中的协议、域名、端口其中一个与本站不同时就会形成跨域,这里介绍一种比较简单的方案——jsonp。 原理 浏览器对 script、img这些带有src属性的的标签在发送请求时是不会触发跨域的校验ÿ…...
栈的应用,力扣394.字符串解码力扣946.验证栈序列力扣429.N叉树的层序遍历力扣103.二叉树的锯齿形层序遍历
目录 力扣394.字符串解码 力扣946.验证栈序列 力扣429.N叉树的层序遍历 力扣103.二叉树的锯齿形层序遍历 力扣394.字符串解码 看见括号,由内而外,转向用栈解决。使用两个栈处理,一个用String,一个用Integer 遇到数字:提取数字放入到数字栈…...
华为手机启用ADB无线调试功能
打开开发者模式,勾选USB调试,和“仅充电”模式下允许ADB调试 确认 设置添加adb路径到PATH变量 使用adb查看安卓设置 切换为无线模式: 查看手机IP...
HTML 元素类型介绍
目录 1. 块级元素(Block-level Elements) 2. 行级元素(Inline Elements) 3. 行内块级元素(Inline-block Elements) 4. 表格相关元素 5. 列表相关元素 6. 表单相关元素 示例代码 示例效果 编辑 …...
前端反向代理的配置和實現
反向代理是位於客戶端和服務器之間的一個中間層,它代表客戶端向伺服器發起請求,然後將伺服器的回應返回給客戶端。與傳統的正向代理不同,反向代理是由伺服器端配置的,客戶端通常不知道它的存在。在前端開發中,反向代理…...
日志分析工具
一、nginx_log_analysis工具 1、工具下载,http://linux5588.blog.51cto.com/,它是用python语言写的,只是用来分析nginx日志,它的输出比较简单,以IP为主,可以查看每个IP的访问的流量,次数&#…...
python: Serialize and Deserialize complex JSON using jsonpickle
# encoding: utf-8 # 版权所有 2024 ©涂聚文有限公司 # 许可信息查看:言語成了邀功盡責的功臣,還需要行爲每日來值班嗎 # Serialize and Deserialize complex JSON in Python # 描述:pip install jsonpickle https://github.com/jsonpi…...