FreeRTOS(5)内核控制函数及其他函数
FreeRTOS 提供了一些用于控制内核的 API 函数,这些 API 函数主要包含了进出临界区、开关中断、启停任务调度器等一系列用于控制内核的 API 函数。本章就来学习 FreeRTOS 的内
核控制函数。
内核控制函数
1. 函数 taskYIELD()
此函数用于请求切换任务, 调用后会触发任务切换。
2. 函数 taskENTER_CRITICAL()
此函数用于在任务中进入临界区。
3. 函数 taskEXIT_CRITICAL()
此函数用于在任务中退出临界区。
4. 函数 taskENTER_CRITICAL_FROM_ISR()
此函数用于在中断服务函数中进入临界区。
5. 函数 taskEXIT_CRITICAL_FROM_ISR()
此函数用于在中断服务函数中退出临界区。
6. 函数 taskDISABLE_INTERRUPTS()
此函数用于关闭受 FreeRTOS 管理的中断。
7. 函数 taskENABLE_INTERRUPTS()
此函数用于开启所有中断。
8. 函数 vTaskStartScheduler()
此函数用于开启任务调度器。
9. 函数 vTaskEndScheduler()
此函数用于关闭任务调度器。
10. 函数 vTaskSuspendAll()
此函数用于挂起任务调度器,当任务调度器被挂起后,就不能进行任务切换,直到任务调度器恢复运行。
11. 函数 xTaskResumeAll()
此函数用于恢复任务调度器运行,要注意的是,任务调度器的挂起是可递归的,因此需要使用此函数恢复任务调度器与任务调度器被挂起相同的次数,才能恢复任务调度器运行。
12. 函数 vTaskStepTick()
此函数用于设置系统时钟节拍计数器的值,可以设置系统时钟节拍计数器的值为当前值加上指定值,不过要注意的值,更新后系统时钟节拍计数器的值,不能超过下一个任务阻塞超时时间。
13. 函数 xTaskCatchUpTicks()
此函数用于修正中断后的系统时钟节拍,主要是用过更新全局变量 xPendedTicks 实现的,全局变量 xPendedTicks 用于计数系统使用节拍在任务调度器挂起时被忽略处理的次数。
其他任务相关 API
函数 uxTaskPriorityGet()
此函数用于获取指定任务的任务优先级, 若使用此函数, 需在 FreeRTOSConfig.h 文件中设置配置项 INCLUDE_uxTaskPriorityGet 为 1,此函数的函数原型如下所示:
UBaseType_t uxTaskPriorityGet(const TaskHandle_t xTask);
| 形参 | 描述 |
| xTask | 待获取优先级的任务 |
函数 uxTaskPriorityGet()的返回值,如下表所示:
| 返回值 | 描述 |
| 整数 | 指定任务的优先级 |
函数 vTaskPrioritySet()
此函数用于设置指定任务的优先级, 若使用此函数, 需在 FreeRTOSConfig.h 文件中设置配置项 INCLUDE_vTaskPrioritySet 为 1,此函数的函数原型如下所示:
void vTaskPrioritySet(TaskHandle_t xTask, UBaseType_t uxNewPriority);
| 形参 | 描述 |
| xTask | 待设置优先级的任务 |
| uxNewPriority | 任务优先级 |
函数 vTaskPrioritySet()无返回值。
函数 uxTaskGetSystemState()
此函数用于获取所有任务的状态信息, 若使用此函数, 需在 FreeRTOSConfig.h 文件中设置配置项 configUSE_TRACE_FACILITY 为 1,此函数的函数原型如下所示:
UBaseType_t uxTaskGetSystemState(TaskStatus_t * const pxTaskStatusArray,const UBaseType_t uxArraySize,configRUN_TIME_COUNTER_TYPE * const pulTotalRunTime);
| 形参 | 描述 |
| pxTaskStstusArray | 接收信息变量数组的首地址 |
| uxArraySize | 接收信息变量数组的大小 |
| pilTotalRunTime | 系统总运行时间 |
函数 uxTaskGetSystemState()的返回值,如下表所示:
| 返回值 | 描述 |
| 整型 | 获取信息的任务数量 |
函数 uxTaskGetSystemState()的形参 pxTaskStatusArray 指向变量类型为 TaskStatus_t 的变量的首地址,可以是一个数组,用来存放多个TaskStatus_t 类型的变量,函数 uxTaskGetSystemState()使用任务的状态信息,写入到该数组中,形参 uxArraySize 指示该数组的大小,其中变量类型TaskStatus_t 的定义如下所示:
typedef struct xTASK_STATUS
{TaskHandle_t xHandle; /* 任务句柄 */const char * pcTaskName; /* 任务名 */UBaseType_t xTaskNumber; /* 任务编号 */eTaskState eCurrentState; /* 任务状态 */UBaseType_t uxCurrentPriority; /* 任务优先级 */UBaseType_t uxBasePriority; /* 任务原始优先级 */configRUN_TIME_COUNTER_TYPE ulRunTimeCounter; /* 任务被分配的运行时间 */StackType_t * pxStackBase; /* 任务栈的基地址 */configSTACK_DEPTH_TYPE usStackHighWaterMark; /* 任务栈历史剩余最小值 */
} TaskStatus_t;
该结构体变量就包含了任务的一些状态信息,获取到的每个任务都有与之对应的TaskStatus_t 结构体来保存该任务的状态信息。
函数 vTaskGetInfo()
此函数用于获取指定任务的任务信息, 若使用此函数,需在 FreeRTOSConfig.h 文件中设置配置项 configUSE_TRACE_FACILITY 为 1,此函数的函数原型如下所示:
void vTaskGetInfo(TaskHandle_t xTask,TaskStatus_t * pxTaskStatus,BaseType_t xGetFreeStackSpace,eTaskState eState);
| 形参 | 描述 |
| xTask | 指定获取信息的任务 |
| pxTaskStatus | 接收任务信息的变量 |
| xGetFreeStackSpace | 任务栈历史剩余最小值 |
| eState | 任务状态 |
函数 vTaskGetInfo()无返回值。
函数 vTaskGetInfo()的形参 eState 用来表示任务的状态,其变量类型为 eTaskState,变量类型 eTaskState 的定义如下所示:
typedef enum
{eRunning = 0, /* 运行态 */eReady, /* 就绪态 */eBlocked, /* 阻塞态 */eSuspended, /* 挂起态 */eDeleted, /* 任务被删除 */eInvalid /* 非法值 */
} eTaskState;
形参 eState 用于决定形参 pxTaskStatus 结构体中成员变量 eCurrentState 的值,表示任务的状态,如果传入的 eState 为 eInvalid,那么 eCurrentState 为任务当前的状态,否则 eCurrentState
为 eState。
函数 xTaskGetApplicationTaskTag()
此函数用于获取指定任务的 Tag, 若使用此函数,需在 FreeRTOSConfig.h 文件中设置配置项 configUSE_APPLICATION_TASK_TAG 为 1,此函数的函数原型如下所示:
TaskHookFunction_t xTaskGetApplicationTaskTag(TaskHandle_t xTask);
| 形参 | 描述 |
| xTask | 待获取 Tag 的任务 |
函数 xTaskGetApplicationTaskTag()的返回值,如下表所示:
| 返回值 | 描述 |
| 函数指针 | Tag |
函数 xTaskGetCurrentHandle()
此函数用于获取当前系统正在运行的任务的任务句柄,若使用此函数,需在FreeRTOSConfig.h 文件中设置配置项 INCLUDE_xTaskGetCurrentTaskHandle 为 1,此函数的函数原型如下所示:
TaskHandle_t xTaskGetCurrentTaskHandle(void);
| 返回值 | 描述 |
| TaskHandle_t | 任务句柄 |
函数 xTaskGetHandle()
此函数用于通过任务名获取任务句柄, 若使用此函数,需在 FreeRTOSConfig.h 文件中设置配置项 INCLUDE_xTaskGetHandle 为 1,此函数的函数原型如下所示:
TaskHandle_t xTaskGetHandle(const char * pcNameToQuery);
| 形参 | 描述 |
| pcNameToQuery | 任务名 |
函数 xTaskGetHandle()的返回值,如下表所示:
| 返回值 | 描述 |
| TaskHandle_t | 任务句柄 |
函数 xTaskGetIdleTaskHandle()
此函数用于获取空闲任务的任务句柄, 若使用此函数,需在 FreeRTOSConfig.h 文件中设置配置项 INCLUDE_xTaskGetIdleTaskHandle 为 1,此函数的函数原型如下所示:
TaskHandle_t xTaskGetIdleTaskHandle(void);
| 返回值 | 描述 |
| TaskHandle_t | 空闲任务的任务句柄 |
函数 uxTaskGetStackHighWaterMark()
此函数用于获取指定任务的任务栈的历史剩余最小值,若使用此函数,需在FreeRTOSConfig.h 文件中设置配置项 INCLUDE_uxTaskGetStackHighWaterMark 为 1,此函数的函数原型如下所示:
UBaseType_t uxTaskGetStackHighWaterMark(TaskHandle_t xTask);
| 形参 | 描述 |
| xTask | 待获取任务栈历史剩余最小值的任务 |
| 返回值 | 描述 |
| 整数 | 任务栈的历史剩余最小值 |
函数 eTaskGetState()
此函数用于获取指定任务的状态, 若使用此函数,需在 FreeRTOSConfig.h 文件中设置配置项 INCLUDE_eTaskGetState 为 1,此函数的函数原型如下所示:
eTaskState eTaskGetState(TaskHandle_t xTask);
| 形参 | 描述 |
| xTask | 待获取状态的任务 |
| 返回值 | 描述 |
| eTaskState | 任务状态 |
函数 pcTaskGetName()
此函数用于获取指定任务的任务名,此函数的函数原型如下所示:
char * pcTaskGetName(TaskHandle_t xTaskToQuery);
| 形参 | 描述 |
| xTaskToQuery | 任务句柄 |
| 返回值 | 描述 |
| 字符串 | 任务名 |
函数 xTaskGetTickCount()
此函数用于获取系统时钟节拍计数器的值,此函数的函数原型如下所示:
volatile TickType_t xTaskGetTickCount(void);
| 返回值 | 描述 |
| 整型 | 系统时钟节拍计数器的值 |
函数 xTaskGetTickCountFromISR()
此函数用于在中断中获取系统时钟节拍计数器的值,此函数的函数原型如下所示:
volatile TickType_t xTaskGetTickCountFromISR(void);
| 返回值 | 描述 |
| 整型 | 系统时钟节拍计数器的值 |
函数 xTaskGetSchedulerState()
此函数用于获取任务调度器的运行状态,此函数的函数原型如下所示:
| 返回值 | 描述 |
| 整型 | 任务调度器的运行状态 |
函数 uxTaskGetNumberOfTasks()
此函数用于获取系统中任务的数量,此函数的函数原型如下所示:
UBaseType_t uxTaskGetNumberOfTasks(void);
| 返回值 | 描述 |
| 整型 | 系统中任务的数量 |
函数 vTaskList()
此函数用于以“表格”的形式获取系统中任务的信息, 若使用此函数,需在 FreeRTOSConfig.h文件中同时设置配置项configUSE_TRACE_FACILITY 和配置项configUSE_STATS_FORMATTING_FUNCTIONS 为 1,此函数的函数原型如下所示:
void vTaskList(char * pcWriteBuffer);
| 形参 | 描述 |
| pcWriteBuffer | 接收任务信息的缓存指针 |
函数 vTaskList()获取到的任务信息示例,如下图所示:

函数 vTaskGetRunTimeStats()
此函数用于获取指定任务的运行时间、 运行状态等信息, 若使用此函数,需在FreeRTOSConfig.h 文 件 中 同 时 设 置 配 置 项 configGENERATE_RUN_TIME_STATS 、
configUSE_STATS_FORMATTING_FUNCTIONS、 configSUPPORT_DYNAMIC_ALLOCATION为 1,此函数的函数原型如下所示:
void vTaskGetRunTimeStats(char * pcWriteBuffer);
| 形参 | 描述 |
| pcWriteBuffer | 接收任务运行时间和状态等信息的缓存指针 |
函数 vTaskSetApplicationTaskTag()
此函数用于设置指定任务的 Tag, 若使用此函数,需在 FreeRTOSConfig.h 文件中设置配置项 configUSE_APPLICATION_TASK_TAG 为 1,此函数的函数原型如下所示:
void vTaskSetApplicationTaskTag(TaskHandle_t xTask, TaskHookFunction_t pxTagValue);
| 形参 | 描述 |
| xTask | 待插入 Tag 的任务 |
| pxTagValue | Tag 指针 |
函数 SetThreadLocalStoragePointer()
此函数用于设置指定任务的独有数据数组指针,此函数的函数原型如下所示:
void vTaskSetThreadLocalStoragePointer(TaskHandle_t xTaskToSet, BaseType_t xIndex, void * pvValue)
| 形参 | 描述 |
| xTaskToSet | 待设置的任务 |
| xIndex | 设置的指针 |
| pvValue | 值 |
函数 GetThreadLocalStoragePointer()
此函数用于获取指定任务的独有数据数组指针,此函数的函数原型如下所示:
void *pvTaskGetThreadLocalStoragePointer(TaskHandle_t xTaskToQuery, BaseType_t xIndex);
| 形参 | 描述 |
| xTaskToQuery | 待获取的任务 |
| xIndex | 接收的指针 |
| 返回值 | 描述 |
| void* | 指针指向的值 |
任务状态与信息查询实验
TaskHandle_t xTaskHandle_1;
TaskHandle_t xTaskHandle_2;//init
xTaskCreate(vTaskFunction_1, "Task1", 8192, NULL, 1, &xTaskHandle_1 );
xTaskCreate(vTaskFunction_2, "Task2", configMINIMAL_STACK_SIZE, NULL, 1, &xTaskHandle_2 );void vTaskFunction_1(void *pvParameters)
{uint32_t TotalRunTime;UBaseType_t ArraySize,x;TaskStatus_t *StatusArray;//第一步:函数uxTaskGetSystemState()的使用printf("/********第一步:函数uxTaskGetSystemState()的使用**********/\r\n");ArraySize=uxTaskGetNumberOfTasks(); //获取系统任务数量StatusArray=pvPortMalloc(ArraySize*sizeof(TaskStatus_t));//申请内存if(StatusArray!=NULL) //内存申请成功{ArraySize=uxTaskGetSystemState((TaskStatus_t* )StatusArray, //任务信息存储数组(UBaseType_t )ArraySize, //任务信息存储数组大小(uint32_t* )&TotalRunTime);//保存系统总的运行时间printf("TaskName\t\tPriority\t\tTaskNumber\t\t\r\n");for(x=0;x<ArraySize;x++){//通过串口打印出获取到的系统任务的有关信息,比如任务名称、//任务优先级和任务编号。printf("%s\t\t%d\t\t\t%d\t\t\t\r\n", StatusArray[x].pcTaskName,(int)StatusArray[x].uxCurrentPriority,(int)StatusArray[x].xTaskNumber);}}vPortFree(StatusArray); //释放内存printf("/**************************结束***************************/\r\n");//第二步:函数vTaskGetInfo()的使用TaskHandle_t TaskHandle; TaskStatus_t TaskStatus;printf("/************第二步:函数vTaskGetInfo()的使用**************/\r\n");TaskHandle=xTaskGetHandle("Task1"); //根据任务名获取任务句柄。//获取Task1的任务信息vTaskGetInfo((TaskHandle_t )TaskHandle, //任务句柄(TaskStatus_t* )&TaskStatus, //任务信息结构体(BaseType_t )pdTRUE, //允许统计任务堆栈历史最小剩余大小(eTaskState )eInvalid); //函数自己获取任务运行壮态//通过串口打印出指定任务的有关信息。printf("任务名: %s\r\n",TaskStatus.pcTaskName);printf("任务编号: %d\r\n",(int)TaskStatus.xTaskNumber);printf("任务壮态: %d\r\n",TaskStatus.eCurrentState);printf("任务当前优先级: %d\r\n",(int)TaskStatus.uxCurrentPriority);printf("任务基优先级: %d\r\n",(int)TaskStatus.uxBasePriority);printf("任务堆栈基地址: %#x\r\n",(int)TaskStatus.pxStackBase);printf("任务堆栈历史剩余最小值:%d\r\n",TaskStatus.usStackHighWaterMark);printf("/**************************结束***************************/\r\n");//第三步:函数eTaskGetState()的使用 eTaskState TaskState;char TaskInfo[10];printf("/***********第三步:函数eTaskGetState()的使用*************/\r\n");TaskHandle=xTaskGetHandle("Task2"); //根据任务名获取任务句柄。TaskState=eTaskGetState(TaskHandle); //获取Task2任务的任务壮态memset(TaskInfo,0,10); switch((int)TaskState){case 0:sprintf(TaskInfo,"Running");break;case 1:sprintf(TaskInfo,"Ready");break;case 2:sprintf(TaskInfo,"Suspend");break;case 3:sprintf(TaskInfo,"Delete");break;case 4:sprintf(TaskInfo,"Invalid");break;}printf("任务壮态值:%d,对应的壮态为:%s\r\n",TaskState,TaskInfo);printf("/**************************结束**************************/\r\n");char InfoBuffer[1000]; //保存信息的数组//第四步:函数vTaskList()的使用 printf("/*************第三步:函数vTaskList()的使用*************/\r\n");vTaskList(InfoBuffer); //获取所有任务的信息printf("%s\r\n",InfoBuffer); //通过串口打印所有任务的信息printf("/**************************结束**************************/\r\n");while(1) {vTaskDelay(200);}
}void vTaskFunction_2(void *pvParameters)
{ while(1) {vTaskDelay(200);}
}
结果:
/********第一步:函数uxTaskGetSystemState()的使用**********/
TaskName Priority TaskNumber
Task1 1 7
IDLE1 0 5
IDLE0 0 4
main 1 3
Task2 1 8
ipc1 24 2
Tmr Svc 1 6
ipc0 24 1
/**************************结束***************************/
/************第二步:函数vTaskGetInfo()的使用**************/
任务名: Task1
任务编号: 7
任务壮态: 0
任务当前优先级: 1
任务基优先级: 1
任务堆栈基地址: 0x3fca4da4
任务堆栈历史剩余最小值:5244
/**************************结束***************************/
/***********第三步:函数eTaskGetState()的使用*************/
任务壮态值:2,对应的壮态为:Suspend
/**************************结束**************************/
/*************第三步:函数vTaskList()的使用*************/
Task1 X 1 5228 7 -1
IDLE1 R 0 804 5 1
IDLE0 R 0 1008 4 0
Task2 B 1 864 8 -1
main B 1 1916 3 0
Tmr Svc B 1 1320 6 -1
ipc0 S 24 532 1 0
ipc1 S 24 536 2 1/**************************结束**************************/
任务运行时间统计实验
在上一个实验基础上将任务2函数切换为如下代码:
void vTaskFunction_2(void *pvParameters)
{ char RunTimeInfo[400]; //保存任务运行时间信息while(1) {memset(RunTimeInfo,0,400); //信息缓冲区清零vTaskGetRunTimeStats(RunTimeInfo); //获取任务运行时间信息printf("任务名\t\t\t运行时间\t运行所占百分比\r\n");printf("%s\r\n",RunTimeInfo);vTaskDelay(1000);}
}
实验结果:
任务名 运行时间 运行所占百分比
Task2 15759389 1%
IDLE1 1081013560 99%
IDLE0 1065098667 98%
main 45752 <1%
Task1 158987 <1%
ipc1 29938 <1%
Tmr Svc 13 <1%
ipc0 29832 <1%相关文章:
FreeRTOS(5)内核控制函数及其他函数
FreeRTOS 提供了一些用于控制内核的 API 函数,这些 API 函数主要包含了进出临界区、开关中断、启停任务调度器等一系列用于控制内核的 API 函数。本章就来学习 FreeRTOS 的内 核控制函数。 内核控制函数 1. 函数 taskYIELD() 此函数用于请求切换任务, …...
网络DNS怎么更改?
访问速度慢或某些网站无法打开?改变网络DNS设置可能会帮助解决这些问题。本文将详细介绍如何更改网络DNS,包括更改的原因、具体步骤。 一、为什么要更改DNS? 更改DNS的原因有很多,以下是一些主要的考虑因素:某些公共DNS服务器的响应速度比…...
VIC模型有哪些优势?适用哪些范围?基于QGIS的VIC模型建模;未来气候变化模型预测;基于R语言VIC参数率定和优化
VIC模型是一个大尺度的半分布式水文模型,其设计之初就是为了模拟大流域的水文过程;它能够计算陆地-大气的能量通量,考虑土壤性质和土地利用的影响,自带有简化的湖泊/湿地模块,也能够将植被状况,…...
脏读、不可重复读,幻读的区别 mvcc及四种隔离级别
脏读:事务a还未提交更新事务b就可以看见 不可重复读:强调修改和删除,一个事务多次查询同一个表结果不同 幻读:强调新增,也是一个事务多次查询同一个表结果不同 mvcc是用来解决读写冲突的无锁并发控制 三个实现基础&…...
SpringAI介绍及本地模型使用方法
博客原文地址 前言 Spring在Java语言中一直稳居高位,与AI的洪流碰撞后也产生了一些有趣的”化学反应“,当然你要非要说碰撞属于物理反应也可以, 在经历了一系列复杂的反应方程后,Spring家族的新成员——SpringAI,就…...
numpy广播性质
一、核心规则 一维数组本质 shape (n,)的数组是无方向向量,既非严格行向量也非列向量 自动广播机制 在矩阵乘法(或np.dot())中,一维数组会自动调整维度: 前乘时视为行向量 shape (1,n)后乘时视为列向量 shape (n,1) 二、运算类型对比 假…...
Flutter_学习记录_实现列表上下拉加载 +实现加载html的数据
1. 效果图 2. 下拉加载的实现RefreshIndicator 在Flutter官方sdk中给我们提供了下拉刷新的组件RefreshIndicator。 // 显示内容列表Widget _showNewsListWidget() {if (_newsDataList.isNotEmpty) {// RefreshIndicator 来实现下拉加载的功能return RefreshIndicator(onRefr…...
基于PaddleNLP使用DeepSeek-R1搭建智能体
基于PaddleNLP使用DeepSeek-R1搭建智能体 最近在学习DeepSeek,找到了PaddleNLP星河社区大模型,跟着敲写了一遍。内容来源:DeepSeek实战训练营:从云端模型部署到应用开发 - 飞桨AI Studio星河社区-人工智能学习与实训社区 本项目基…...
『PostgreSQL』PGSQL备份与还原实操指南
📣读完这篇文章里你能收获到 了解逻辑备份与物理备份的区别及适用场景🔍。掌握全库、指定库、指定表备份还原的命令及参数📝。学会如何根据业务需求选择合适的备份策略📊。熟悉常见备份还原问题的排查与解决方法🔧。 …...
基于单片机的智慧农业大棚系统(论文+源码)
1系统整体设计 经过上述的方案分析,采用STM32单片机为核心,结合串口通信模块,温湿度传感器,光照传感器,土壤湿度传感器,LED灯等硬件设备来构成整个控制系统。系统可以实现环境的温湿度检测,土壤…...
【C语言】数组篇
目录 引言一维数组数组的定义数组的初始化完全初始化部分初始化省略数组长度 数组元素的访问 多维数组二维数组的定义二维数组的初始化完全初始化部分初始化省略第一维长度 二维数组元素的访问 遍历数组元素遍历一维数组遍历二维数组 数组作为函数参数一维数组作为函数参数二维…...
FreeRTOS概述
文章目录 核心文件头文件内存管理文件入口函数数据类型前缀 核心文件 最核心文件:task.c和list.c 文件作用tasks.c必需,任务操作list.c必须,列表queue.c基本必需,提供队列操作、信号量(semaphore)操作timer.c可选,so…...
C++ 使用红黑树的实现及迭代器完成对set和map的封装
一、红黑树的实现以及迭代器 #pragma once // 要实现完整的迭代器需要对红黑树进行改造,有兴趣可参考侯捷《STL源码剖析》 enum Colour {RED,BLACK };template<class T> struct RBTreeNode {RBTreeNode<T>* _left;RBTreeNode<T>* _right;RBTreeN…...
【Java从入门到起飞】面向对象编程(高级)
文章目录 1. 抽象类1.1 概述1.1.1 抽象类引入 1.2 abstract使用格式1.2.1 抽象方法1.2.2 抽象类1.2.3 抽象类的使用 1.3 抽象类的特征1.4 抽象类的细节1.5 抽象类存在的意义 2. 接口2.1 概述2.2 定义格式2.3 接口成分的特点2.3.1.抽象方法2.3.2 常量2.3.3 案例演示 2.4 基本的实…...
内网安全-横向移动PTH 哈希PTT 票据PTK 密匙Kerberos密码喷射
一.域横向pth,mimkatz,NTLM windwos server 2012 R2之前可能是NTLM和LM,之后为NTLM 1.mimkatz ptk 使用mimkatz进行横向移动 mimikatz sekurlsa::pth /user:administrator(目标本地用户名) /domain:192.168.3.32&a…...
【VMware安装Ubuntu实战分享】
在当今数字化时代,虚拟机技术已成为许多开发者、系统管理员以及技术爱好者的得力助手。VMware作为一款功能强大且广泛应用的虚拟化软件,为我们提供了便捷的环境来运行各种操作系统,而Ubuntu凭借其开源、稳定和易用性,深受广大用户…...
【推荐项目】 043-停车管理系统
043-停车管理系统 介绍 使用 springboot vuejs mysql 技术搭建框架。 智能停车管理系统描述 后端框架:采用Spring Boot与MySQL的强强联合,为系统提供稳健、高效的服务支撑。 前端框架:前端选用Vue.js,打造流畅、美观的用户交…...
【深入解析 epoll 的底层实现原理】
IO多路复用的简介select的工作原理和缺点epoll的引入和底层实现(数据结构、系统调用)epoll的优势和改进epoll的工作模式(LT和ET)在Java中的应用或相关API 需要确保每个部分逻辑清晰,逐步深入,帮助用户建立…...
Ubuntu 22.04 官方下载安装 Gradle 记录
Ubuntu 22.04 官方下载安装 Gradle 记录 Gradle 是一个强大的自动化构建工具,广泛用于 Java、Android 等项目的构建中。下面详细介绍如何在 Ubuntu 22.04 中使用官网下载安装 Gradle。 一、准备工作 首先,确保你的系统已安装 Java JDK(推荐…...
HTTPS加密原理详解
目录 HTTPS是什么 加密是什么 HTTPS的工作流程 1.使用对称加密 2.引入非对称加密 3.引入证书机制 客户端验证证书真伪的过程 签名的加密流程 整体工作流程 总结 HTTPS是什么 HTTPS协议也是一个应用程协议,是在HTTP的基础上加入了一个加密层,由…...
[特殊字符] 智能合约中的数据是如何在区块链中保持一致的?
🧠 智能合约中的数据是如何在区块链中保持一致的? 为什么所有区块链节点都能得出相同结果?合约调用这么复杂,状态真能保持一致吗?本篇带你从底层视角理解“状态一致性”的真相。 一、智能合约的数据存储在哪里…...
stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
智慧医疗能源事业线深度画像分析(上)
引言 医疗行业作为现代社会的关键基础设施,其能源消耗与环境影响正日益受到关注。随着全球"双碳"目标的推进和可持续发展理念的深入,智慧医疗能源事业线应运而生,致力于通过创新技术与管理方案,重构医疗领域的能源使用模式。这一事业线融合了能源管理、可持续发…...
【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...
无人机侦测与反制技术的进展与应用
国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机(无人驾驶飞行器,UAV)技术的快速发展,其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统,无人机的“黑飞”&…...
【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制
目录 节点的功能承载层(GATT/Adv)局限性: 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能,如 Configuration …...
区块链技术概述
区块链技术是一种去中心化、分布式账本技术,通过密码学、共识机制和智能合约等核心组件,实现数据不可篡改、透明可追溯的系统。 一、核心技术 1. 去中心化 特点:数据存储在网络中的多个节点(计算机),而非…...
数据库——redis
一、Redis 介绍 1. 概述 Redis(Remote Dictionary Server)是一个开源的、高性能的内存键值数据库系统,具有以下核心特点: 内存存储架构:数据主要存储在内存中,提供微秒级的读写响应 多数据结构支持&…...
Windows 下端口占用排查与释放全攻略
Windows 下端口占用排查与释放全攻略 在开发和运维过程中,经常会遇到端口被占用的问题(如 8080、3306 等常用端口)。本文将详细介绍如何通过命令行和图形化界面快速定位并释放被占用的端口,帮助你高效解决此类问题。 一、准…...
