FreeRTOS学习笔记(四)——延时函数,列表,软件定时器,低功耗模式,内存管理

news2024/11/21 11:36:55

FreeRTOS学习笔记(四)——延时函数,列表,软件定时器,低功耗模式,内存管理

文章目录

  • `FreeRTOS学习笔记(四)——延时函数,列表,软件定时器,低功耗模式,内存管理`
  • `FreeRTOS学习笔记系列`
    • `开胃小菜(空闲任务)`
    • `1、延时函数`
    • `2、列表(相当于链表)`
      • `跟数组相比`
      • `列表结构体`
      • `API函数`
    • `3、软件定时器`
      • `简介`
      • `状态 和 命令队列 `
      • `单次/周期定时器`
      • `注意事项`
      • `结构体`
      • `API函数`
    • `4、低功耗模式`
      • `原理`
      • `STM32低功耗模式类型`
      • `应用场景`
    • `5、内存管理`
      • `FreeRTOS 创建对象的方法`
      • `标准C库的内存管理的缺点`
      • `FreeRTOS内存管理算法`
        • **`heap_1`**
        • **`heap_2`**
        • **`heap_3`**
        • **`heap_4`**
        • **`heap_5`**
        • `PS:最适应算法 & 首次适应算法`
      • `API函数`
  • `如果对你有帮助,就点赞收藏吧!(。・ω・。)ノ♡`



FreeRTOS学习笔记系列

【FreeRTOS(MDK、STM32CUBEIDE)学习笔记(合集),超详细!!!】
【FreeRTOS学习笔记(一)—— 裸机和RTOS,Freertos移植(MDK),stm32cubeIDE使用Freertos】
【FreeRTOS学习笔记(二)—— 任务,挂起,临界区中断】
【FreeRTOS学习笔记(三)—— 消息队列,信号量,事件标志组,任务通知】
【FreeRTOS学习笔记(四)—— 延时函数,列表,软件定时器,低功耗模式,内存管理】



开胃小菜(空闲任务)

所有其它任务都阻塞或被挂起时运行


1、延时函数

相对延时:vTaskDelay()
绝对延时:xTaskDelayUntil()

注意
只由Freertos提供的这两个延时函数,才有任务调度的功能
其他自己写的延时就直接是干等着,什么都不干

相对延时
指每次延时都是从函数vTaskDelay()开始计数,直到延时指定的时间结束

绝对延时
指每次延时都是从任务开始时计数,直到延时指定的时间结束
将整个任务的运行周期看成一个整体,即整个任务运行周期就是这点时间
适用于需要按照一定频率运行的任务,比如:看门狗
假如,任务所需时间比绝对延时设置的时间要短,则任务会被拦腰斩断

相对延时 & 绝对延时 比较
同样的功能,黄线是相对延时,绿线用的是绝对延时
中间在插入1个字节写的10ms延时,最后都是延时500ms
在这里插入图片描述

微妙延时
微妙延时还是得用定时器来写,且没有调度功能
可以用 系统滴答定时器外设硬件定时器Freertos的软件定时器
详见往期文章【定时器TIM配置微妙延时函数】
详见往期文章【延时函数是怎么来的?频率和滴答计数之间的计算?(无ucos,小白向)】
参考代码

void delay_us(uint32_t nus)
{		
	uint32_t ticks;
	uint32_t told,tnow,tcnt=0;
	uint32_t reload=SysTick->LOAD;		//系统定时器的重载值	    	 
	ticks=nus*(SystemCoreClock/1000000);//需要的节拍数 
	told=SysTick->VAL;        			//刚进入时的计数器值
	/* 挂起调度器[可选,会导致高优先级任务无法抢占当前任务,但能够提高当前任务时间的精确性] */
	vTaskSuspendAll();	
	while(1)
	{
		tnow=SysTick->VAL;
		if(tnow!=told)
		{	 
			/* SYSTICK是一个递减的计数器 */
			if(tnow<told)
				tcnt+=told-tnow;		
			else 
				tcnt+=reload-tnow+told;	  
			told=tnow;
			/* 时间超过/等于要延迟的时间,则退出。*/
			if(tcnt>=ticks)
				break;			
		}  
	}
	/* 恢复调度器[可选] */
	xTaskResumeAll();
}  

void delay_ms(uint32_t nms)
{	
   	vTaskDelay(nms);	 						   	
}


2、列表(相当于链表)

列表: FreeRTOS 中的一个数据结构,用来跟踪 FreeRTOS中的任务
列表项:存放在列表中的项目


跟数组相比

数组的特点:数组成 地址是连续 的,数组在最初确定了 成员数量后期无法改变
列表的特点:列表项间的 地址非连续的 ,列表项的数目随时可以改变

在这里插入图片描述


列表结构体

在移植的文件 l i s t . c list.c list.c l i s t . h list.h list.h

/* 列表项结构体 */
struct xLIST_ITEM
{
   	listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE			/* 用于检测列表项的数据完整性 */
   	configLIST_VOLATILE TickType_t xItemValue			/* 列表项的值,多用于按升序对列表中的列表项进行排序 */
    struct xLIST_ITEM * configLIST_VOLATILE pxNext		/* 下一个列表项 */
 	struct xLIST_ITEM * configLIST_VOLATILE pxPrevious	/* 上一个列表项 */
   	void * pvOwner										/* 列表项的拥有者(通常是任务控制块) */
   	struct xLIST * configLIST_VOLATILE pxContainer; 	/* 列表项所在列表 */
  	listSECOND_LIST_ITEM_INTEGRITY_CHECK_VALUE			/* 用于检测列表项的数据完整性 */
};
typedef struct xLIST_ITEM ListItem_t; 	
/* 迷你列表项 */
/* 迷你列表项也是列表项,但迷你列表项仅用于标记列表的末尾和挂载其他插入列表中的列表项  */
struct xMINI_LIST_ITEM
{
   	listFIRST_LIST_ITEM_INTEGRITY_CHECK_VALUE 				/* 用于检测数据完整性 */
	configLIST_VOLATILE TickType_t xItemValue;				/* 列表项的值 */
   	struct xLIST_ITEM * configLIST_VOLATILE pxNext;			/* 上一个列表项 */
  	struct xLIST_ITEM * configLIST_VOLATILE pxPrevious; 	/* 下一个列表项 */
};
typedef struct xMINI_LIST_ITEM MiniListItem_t;
/* 列表结构体 */
typedef struct xLIST
{
  	listFIRST_LIST_INTEGRITY_CHECK_VALUE			/* 校验值 */
  	volatile UBaseType_t uxNumberOfItems;			/* 列表中的列表项数量(不包含 xListEnd) */
 	ListItem_t * configLIST_VOLATILE pxIndex		/* 指向列表中的某个列表项,用于遍历列表项的指针 */
  	MiniListItem_t xListEnd							/* 末尾列表项(迷你列表项) */
  	listSECOND_LIST_INTEGRITY_CHECK_VALUE			/* 校验值 */
} List_t;

/* 校验值: 是两个宏,这两个宏是确定的已知常量
 FreeRTOS通过检查这两个常量的值,来判断列表的数据在程序运行过程中,是否遭到破坏 
 该功能一般用于调试, 默认是不开启的 
 */

在这里插入图片描述


API函数

API函数描述
vListInitialise()初始化列表
vListInitialiseItem()初始化列表项
vListInsertEnd()列表末尾插入列表项
vListInsert()列表插入列表项
uxListRemove()列表移除列表项

具体原理,先去学学C语言的链表(双向循环),本文只作介绍,告知有这这样一个工具可使用



3、软件定时器

对应的宏:
使能:configUSE_TIMERS
优先级: configTIMER_TASK_PRIORITY = 31
命令队列长度:configTIMER_QUEUE_LENGTH = 5

简介

  • 定时器
    从指定时刻开始,经过指定时间,触发指定事件
  • 硬件定时器
    芯片自带的定时器模块,
    在定时时间到达之后就会自动触发中断,在中断服务函数中处理信息。
    硬件定时器的精度较高,硬件定时器数量有限
  • 软件定时器
    指具有定时功能的软件,可设置定时周期
    软件定时器精度相对较低,定时器理论上只要内存足够,就可以创建无数个
    软件定时器以系统时钟为基准,但系统时钟中断优先级是最低,容易被打断
    在时间到达后要调用回调函数(也称超时函数),在回调函数中处理信息

状态 和 命令队列

新创建的软件定时器处于休眠状态,需手动开启

  • 休眠态
    休眠态的软件定时器可以通过其句柄被引用
    但因为是休眠态,所以其定时超时回调函数不会被执行

  • 运行态
    运行态的定时器,当指定时间到达之后,它的超时回调函数会被调用

  • 软件定时器命令队列
    提供给 FreeRTOS 中的软件定时器使用的,用户是不能直接访问的。
    API 函数大多都是往定时器的队列中写入消息(发送命令)
    在这里插入图片描述


单次/周期定时器

  • 单次定时器

在这里插入图片描述
单次定时器的一旦定时超时,只会执行一次其软件定时器超时回调函数
不会自动重新开启定时,不过可以被手动重新开启。

  • 周期定时器

在这里插入图片描述
周期定时器的一旦启动,就会在执行完回调函数以后自动的重新启动
从而周期地执行其软件定时器回调函数。


注意事项

在调用函数 vTaskStartScheduler()开启任务调度器的时候
会创建一个用于管理软件定时器的【软件定时器服务任务】,叫prvTimerTask( )
【软件定时器的超时回调函数】是由 【软件定时器服务任务】调用的
【服务任务】不是专为某个定时器服务的,还要处理其他定时器
【超时回调函数】本身不是任务,要尽快实行,不能进入阻塞状态
不能调用那些会阻塞任务的 API 函数,如:vTaskDelay()
访问队列或者信号量的非零阻塞时间的 API 函数也不能调用。


结构体

typedef	struct
{
     const char * 						pcTimerName				/* 软件定时器名字(无大用) */
     ListItem_t 						xTimerListItem			/* 软件定时器列表项(软件定时器列表,溢出列表) */
     TickType_t 						xTimerPeriodInTicks;	/* 软件定时器的周期(超时时间) */     
     void * 							pvTimerID				/* 软件定时器的ID(同一个回调函数通过ID判断定时器) */
     TimerCallbackFunction_t	 		pxCallbackFunction; 	/* 软件定时器的回调函数 */
#if ( configUSE_TRACE_FACILITY == 1 )
     UBaseType_t 						uxTimerNumber			/*  软件定时器的编号,调试用  */
#endif
     uint8_t 							ucStatus;  				/*  软件定时器的状态(单次/周期)  */
} xTIMER;

API函数

函数描述
xTimerCreate()动态方式创建软件定时器
xTimerCreateStatic()静态方式创建软件定时器
xTimerStart()开启软件定时器定时
xTimerStop()停止软件定时器定时
xTimerReset()复位软件定时器定时
xTimerChangePeriod()更改软件定时器的定时超时时间
xTimerStartFromISR()在中断中开启软件定时器定时
xTimerStopFromISR()在中断中停止软件定时器定时
xTimerResetFromISR()在中断中复位软件定时器定时
xTimerChangePeriodFromISR()在中断中更改定时超时时间

4、低功耗模式

一般MCU都低功耗模式,裸机也可以使用MCU的低功耗模式。
FreeRTOS也提供了低功耗模式,叫Tickless

对应的宏:

  • configUSE_TICKLESS_IDLE
    使能低功耗Tickless模式
  • configEXPECTED_IDLE_TIME_BEFORE_SLEEP
    定义系统进入相应低功耗模式的最短时长
  • configPRE_SLEEP_PROCESSING(x)
    定义需要在系统进入低功耗模式前执行的事务,如:关闭外设时钟,以达到降低功耗的目的
  • configPOSR_SLEEP_PROCESSING(x)
    定义需要在系统退出低功耗模式后执行的事务,如:开启外设时钟,以使系统能够正常运行

原理

在空闲任务执行的期间,让MCU进入低功耗模式
当其他任务准备运行时,唤醒MCU退出低功耗模式
在这里插入图片描述
在整个系统的运行过程中,其实大部分时间是在执行空闲任务的
Tickless低功耗模式的本质:通过调用指令 WFI 实现睡眠模式


STM32低功耗模式类型

睡眠模式、停止模式、待机模式

模式名称进入唤醒对1.2V域时钟的影响对VDD域时钟的影响调压器
睡眠WFI任意中断CPU CLK关闭对其他时钟或模拟时钟源无影响开启
(立即休眠或退出是休眠)WFE唤醒事件CPU CLK关闭对其他时钟或模拟时钟源无影响开启
停止PDDS位+SLEEPDEEP位+WFI或WFE任意EXTI线(在EXTI寄存器中配置,内部线和外部线)所有1.2V域时钟都关闭HSI和HSE振荡器关闭开启或处于低功耗模式
待机PDDS位+SLEEPDEEP位+WFI或WFEWKUP引脚上升沿、RTC闹钟(闹钟A或闹钟B)RTC唤醒事件、RTC入侵事件、RTC时间戳事件、NRST引脚外部复位、IWDG复位所有1.2V域时钟都关闭HSI和HSE振荡器关闭关闭

Tickless使用的是睡眠模式

  • 进入睡眠模式
    WFI 指令:__WFI
    WFE 指令:__WFE
  • 退出睡眠模式
    任何中断 / 事件都可以唤醒睡眠模式

应用场景

很多应用场合对于功耗的要求很严格,比如可穿戴低功耗产品、物联网低功耗产品等
减少耗电,增强续航,减少发热


5、内存管理

FreeRTOS 创建对象的方法

动态方法创建
自动地从 FreeRTOS 管理的内存堆中申请创建对象所需的内存
并且在对象删除后,可将这块内存释放回FreeRTOS管理的内存堆

静态方法创建
需用户提供各种内存空间,并且使用静态方式占用的内存空间一般固定下来了
即使任务、队列等被删除后,这些被占用的内存空间一般没有其他用途

动态方式管理内存相比与静态方式,更加灵活。


标准C库的内存管理的缺点

标准的 C 库也提供了函数 malloc()和函数 free()来实现动态地申请和释放内存 。
1、占用大量的代码空间,不适合用在资源紧缺的嵌入式系统中
2、没有线程安全的相关机制
3、运行有不确定性,每次调用这些函数时花费的时间可能都不相同
4、内存碎片化
…………(总之就是,毛病一大堆)


FreeRTOS内存管理算法

FreeRTOS提供了5种动态内存管理算法,分别为: heap_1、heap_2、heap_3、heap_4、heap_5 。
具体可见本文【Freertos移植(MDK)】板块

算法优点缺点
heap_1分配简单,时间确定只允许申请内存,不允许释放内存
heap_2允许申请和释放内存不能合并相邻的空闲内存块会产生碎片、花费时间不定
heap_3直接调用C库函数malloc()和 free(),简单速度慢、花费时间不定
heap_4相邻空闲内存可合并,减少内存碎片的产生花费时间不定
heap_5能够管理多个非连续内存区域的heap_4花费时间不定
heap_1

只实现了pvPortMalloc(申请内存),没有实现vPortFree(释放内存)
最为简单,管理的内存堆是一个数组
在申请内存的时候, heap_1 内存管理算法只是简单地从数组中分出合适大小的内存

/* 定义一个大数组作为 FreeRTOS 管理的内存堆 */
static uint8_t ucHeap[ configTOTAL_HEAP_SIZE ];
heap_2

heap_2 内存管理算法使用最适应算法,并且支持申请和释放内存
但不能将相邻的空闲内存块合并成一个大的空闲内存块
heap_2 内存管理算法不可避免地会产生内存碎片
在这里插入图片描述

heap_3

标准C库
简单地包装了 C 语言的 malloc 和 free 函数,确保线程安全。

heap_4

heap_4 内存管理算法使用了首次适应算法
支持内存的申请与释放,能够将空闲且相邻的内存进行合并,减少内存碎片的现象
在这里插入图片描述

heap_5

heap_5 内存管理算法是在 heap_4 内存管理算法的基础上实现的
heap_5 内存管理算法实现了 管理多个非连续内存区域的能力
heap_5 内存管理算法默认并 没有定义内存堆
需要用户手动指定内存区域的信息,对其进行初始化。

/* 内存块结构体 */
typedef struct HeapRegion
{
	uint8_t* 	pucStartAddress; 	/* 内存区域的起始地址 */
	size_t 		xSizeInBytes; 		/* 内存区域的大小,单位:字节 */
} HeapRegion_t;


/* 内存块数组 */
Const  HeapRegion_t  xHeapRegions[] =
{
	{ (uint8_t *)0x80000000, 0x10000 }, 	/* 内存区域 1 */
	{ (uint8_t *)0x90000000, 0xA0000 }, 	/* 内存区域 2 */
	{ NULL, 0 } 							/* 数组终止标志 */
};
vPortDefineHeapRegions(xHeapRegions); 		/* 初始化定义堆内存区域的大小和数量 */

PS:最适应算法 & 首次适应算法

假设有3块已释放的内存,地址由低到高排序:5字节、50字节、25字节
现在新创建一个任务需要申请20字节的内存

第一步:
最适应算法 :找出 最小的且满足 pvPortMalloc的内存:25字节(第3块)
首次适应算法 :找出 第一个能满足 pvPortMalloc的内存:50字节(第2块)

第二步:
将内存分割出20字节内存,并返回返回这20字节的地址
剩下的字节仍然是空闲状态,留给后续的pvPortMalloc使用


API函数

函数描述
void* pvPortMalloc(size_t xWantedSize);申请内存
void vPortFree(void* pv);释放内存
size_t xPortGetFreeHeapSize(void);获取当前空闲内存的大小
/**
  * @brief  	申请内存
  * @param  	xWantedSize:申请的内存大小,以字节为单位;
  * @retval 	成功返回一个指向已分配大小的内存的指针 。失败则返回 NULL。
  */
void * pvPortMalloc( size_t  xWantedSize );

/**
  * @brief  	释放内存
  * @param  	pv:指针指向一个要释放内存的内存块;
  * @retval 	无
  */
void vPortFree(void* pv); 

/**
  * @brief  	释放内存
  * @param		无
  * @retval		返回当前剩余的空闲内存大小
  */
size_t  xPortGetFreeHeapSize( void );



┈┈┈┈▕▔╲┈┈┈┈┈┈┈ ┈┈┈┈▕▔╲┈┈┈┈┈┈┈ ┈┈┈┈▕▔╲┈┈┈┈┈┈┈┈
┈┈┈┈┈▏▕┈┈┈┈┈┈┈ ┈┈┈┈┈▏▕┈┈┈┈┈┈┈ ┈┈┈┈┈▏▕┈┈┈┈┈┈┈ ┈
┈┈┈┈┈▏ ▕▂▂▂▂▂┈┈┈┈┈┈┈▏ ▕▂▂▂▂▂┈┈┈┈┈┈┈▏ ▕▂▂▂▂▂┈┈┈
▂▂▂▂╱┈┈▕▂▂▂▂▏┈ ▂▂▂▂╱┈┈▕▂▂▂▂▏┈ ▂▂▂▂╱┈┈▕▂▂▂▂▏┈┈
▉▉▉┈┈┈┈▕▂▂▂▂▏ ┈ ▉▉▉┈┈┈┈▕▂▂▂▂▏ ┈ ▉▉▉┈┈┈┈▕▂▂▂▂▏ ┈
▉▉▉┈┈┈┈▕▂▂▂▂▏ ┈ ▉▉▉┈┈┈┈▕▂▂▂▂▏ ┈ ▉▉▉┈┈┈┈▕▂▂▂▂▏ ┈
▔▔▔▔╲▂▂▕▂▂▂▂▏┈ ▔▔▔▔╲▂▂▕▂▂▂▂▏┈ ▔▔▔▔╲▂▂▕▂▂▂▂▏┈┈

如果对你有帮助,就点赞收藏吧!(。・ω・。)ノ♡

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

尚硅谷Java面试题第四季-MySQL面试题

1.如何建立复合索引&#xff0c;一般加在哪些字段&#xff1f;建索引的理论依据或者经验 2.Innodb的行锁到底锁了什么? 结论&#xff1a; InnoDB的行锁&#xff0c;是通过锁住索引来实现的&#xff0c;如果加锁查询的时候没有使用到索引&#xff0c;会将整个聚簇索引都锁住&am…

【python报错已解决】`Traceback (most recent call last)`

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引言 你是否在运行Python程序时遇到了Traceback (most recent call last)的错误&#xff1f;这个错误通常表明你的程序中有一个…

为什么大负载通电瞬间电压跌落,前级MOS开关如何设计

文章目录 1.1 前言1.2 简单典型电路1.3 分析优劣性1.4 优化后的开关电路1.5 具体原理分析1.6 实验验证效果1.7 适用应用场景 1.1 前言 电子产品设计电路某负载需要断电省下或异常下电复位&#xff0c;这时候会考虑在负载供电前端增加一个开关对其进行供电做控制&#xff0c;典…

超声波模块HC_SR04(hal库)

超声波模块HC_SR04 原理 1.触发信号&#xff1a;拉高至少10us的高电平 2.回响信号处理&#xff1a;计算高电平时长 3.计算距离&#xff1a;时间*速度&#xff08;声速&#xff09;/2&#xff08;注意单位问题&#xff09; 代码实现 方法1.下拉输入 配置 用于延时微秒us和…

第四届机械制造与智能控制国际学术会议(ICMMIC 2024)

目录 重要信息 大会介绍 主办单位 协办单位 大会主席 主讲嘉宾 征稿主题 会议日程 参会方式 重要信息 会议时间&#xff1a;2024年9月27-29日 大会官网&#xff1a;www.icmmic.com&#xff08;点击查看&#xff0c;大会信息&#xff0c;报名&#xff0c;投稿&#x…

【数据结构初阶】单链表接口实现超详解

文章目录 1. 顺序表问题与思考2.单链表2. 1 概念与结构2.1.1 结点2.1.2 链表的性质 3. 单链表实现3. 1 单链表初始化3. 2 单链表的打印3. 3 头插3. 4 创建新节点3. 5 尾插3. 6 头删和尾删3. 7 查找3. 8 在指定位置之后插入或删除3. 9 在指定位置前面插入或删除指定位置3. 10 销…

推荐一款好用的mac解压缩软件

文章目录 介绍软件功能安装下载使用注意事项1.打开系统设置选择隐私与安全性2.点击添加扩展3.勾选访达扩展 小结 介绍 FastZip for Mac集压缩、解压、预览、加密压缩、分卷压缩、固实压缩、右键压缩解压、多线程压缩等功能于一体&#xff0c;绝佳的设计、便捷的操作&#xff0…

设计师AI神器!AnyDesign,一张照片加简单描述就可以编辑时尚图像!

在AI时代很多行业都被颠覆了&#xff0c;建议大家在业余时间也尽量多学习一些AI工具的使用&#xff0c;提高效率的同时也去探索更多好玩的应用。 今天给大家介绍一个非常好用的图像编辑方法-AnyDesign&#xff0c;适合时尚设计师以及普通用户使用的&#xff0c;可以让你能够更…

Python编程:从入门到实践书籍介绍

对于Python入门的书籍推荐&#xff0c;以下是五本详细讲解的书籍&#xff0c;它们各自具有不同的特点和适用对象&#xff1a; 1. 《Python编程:从入门到实践》 作者&#xff1a;埃里克马瑟斯&#xff08;Eric Matthes&#xff09;《Python编程:从入门到实践》是一本经典的Pyth…

C#实现数据采集系统-数据反写(1)MQTT订阅接收消息

C#实现数据采集系统-数据反写 实现步骤 MQTT订阅&#xff0c;接收消息反写内容写入通信类&#xff0c;添加到写入队列中 链接-消息内容处理和写入通信类队列实现Modbustcp通信写入 具体实现 1.MQTT订阅&#xff0c;接收消息 Mqtt实现采集数据转发 Mqtt控制类增加订阅方法…

【微信小程序】使用 npm 包 - Vant Weapp --定制主题

小程序对 npm 的支持与限制 1. 什么是 Vant Weapp 官方文档地址 &#xff1a;https://youzan.github.io/vant-weapp 2. 安装 Vant 组件库 详细的操作步骤&#xff0c;大家可以参考 Vant 官方提供的快速上手教程&#xff1a; https://youzan.github.io/vant-weapp/#/quickst…

Texio电源维修德士直流电源维修PSW-1080M160

Texio德士电源维修类型有&#xff1a;指针式小型直流电源、数字显示直流电源、多路输出直流电源、直流电源、相控电源、低噪声开关电源、宽幅电源、高电压宽幅电源、开关电源、超薄直流电源、4象限双电源、高电压直流电源 Texio电源维修常见系列如下 PSW-系列是一款单路输出、…

框架——Mybatis(!!!MyBatis 环境搭建步骤)

目录 一、Mybatis 概述 1.背景 2.简介 3.Mybatis 中文官网 二、MyBatis 环境搭建&#xff08;超全&#xff01;&#xff01;&#xff01;&#xff09; 1.创建一张表和表对应的实体类 2.导入 MyBatis jar包,mysql数据库驱动包 3.创建 MyBatis全局配置文件 4. 在接口中…

2024年4款高质量的英语翻译工具推荐!

英语作为一门应用非常广泛的语言&#xff0c;其影响力还是非常深远的。虽然现在学英语的人很多&#xff0c;但对于非英语母语的人来说&#xff0c;英语多多少少会是一个壁垒&#xff0c;所以翻译工具也变得重要了起来。这次&#xff0c;我便要跟大家分享几个很专业的英语翻译工…

连锁门店收银系统源码+电子发票

传统纸质开票模式&#xff0c;流程复杂、时间长&#xff0c;为解决商户开票难的问题&#xff0c;千呼新零售2.0上线了电子发票功能&#xff0c;开通方便&#xff0c;使用简便&#xff01;商户只需要简单配置&#xff0c;就可以实现门店实现开票自由&#xff01; 一、线下订单开…

黑马程序员|8天Python第13章面向对象

一 初识对象 1.生活中数据的组织 2.程序中数据的组织 3.使用对象组织数据 类的属性&#xff1a; 二 成员方法 1.类的定义和使用 2.成员变量和成员方法 类外面是函数&#xff0c;类里面是方法。 3.成员方法的定义语法 self 只是写在这里&#xff0c;传参的时候可以当作不存在。…

QTCreator学习

1.新建程序 2. 设置项目名称 3. Build System选择qmake,若选择cmake则只会产生CmakeLists文件&#xff0c;不会产生pro文件。 4.Base class选择QDialog,表示该类继承于QDialog类 5.套件选择MinGW 32bit,取消掉其他的。 6. 双击ui文件&#xff0c;拖动可添加工具。 7.点击左…

深信服技术服务工程师面试全过程分享

吉祥知识星球http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247485367&idx1&sn837891059c360ad60db7e9ac980a3321&chksmc0e47eebf793f7fdb8fcd7eed8ce29160cf79ba303b59858ba3a6660c6dac536774afb2a6330#rd 《网安面试指南》http://mp.weixin.qq.com/s?…

这对二婚夫妻结婚半年,一起生活才一个月,就走到了婚姻尽头!

这对二婚夫妻结婚半年&#xff0c;一起生活才一个月&#xff0c;就走到了婚姻尽头&#xff01; 这是一篇涉离婚纠纷的民事起诉状 &#xff08;范文点评&#xff09; 离 婚 起 诉 状 原告&#xff1a;韩某斌&#xff0c;男&#xff0c;现年37岁&#xff0c;汉族&#xff0c;打…

Spring Cloud Consul面试题

​ ​ 您好&#xff0c;我是程序员小羊&#xff01; 前言 Spring Cloud Consul 是微服务架构中的一个重要组件&#xff0c;用于服务发现、配置管理以及健康检查。了解 Spring Cloud Consul 的工作原理和应用场景&#xff0c;对于微服务开发者和架构师来说至关重要。以下是一些常…