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的基础上加入了一个加密层,由…...

无公网IP也能远程控制Windows:Linux rdesktop内网穿透实战
文章目录 前言1. Windows 开启远程桌面2. Linux安装rdesktop工具3. Win安装Cpolar工具4. 配置远程桌面地址5. 远程桌面连接测试6. 设置固定远程地址7. 固定地址连接测试 前言 如今远程办公已经从一种选择变成了许多企业和个人的必修课,而如何在Linux系统上高效地访…...

Unity入门学习笔记(Day01)
一.认识unity工作面板 1.1.project window(项目面板) 显示当前项目中的所有文件和目录,包含了项目里面所有的资源文件 1.2.console window(输出面板) 显示当前游戏开发中生成的警告错误 1.3.hierarchy window&…...

HTML中的块元素与行内元素
1.块级标签 块级元素会独占一行,通常用于构建页面的结构。常见的块级元素包括: <div>:通用的块级容器。没有任何语意。可以创建网页的不同部分,导航栏侧边栏等。 <body><div class"nav"><a hre…...

postgreSQL window function高级用法
正常使用:相当于对每个row做一次子查询 SELECT depname, empno, salary, avg(salary) OVER (PARTITION BY depname) FROM empsalary;order by 区别window frame and partition 没有order by, window function是对整个partition起作用, part…...

当中国“智算心跳”与全球共振:九章云极DataCanvas首秀MWC 2025
3月3日,西班牙巴塞罗那,全球通信与科技领域的盛会“2025世界移动通信大会(MWC 2025)”正式拉开帷幕。中国人工智能基础设施领军企业九章云极DataCanvas公司以全球化战略视野与硬核技术实力,全方位、多维度地展示了在智…...

机器视觉检测显卡与工控机选型指南
在机器视觉检测项目中,深度学习显卡和工控机的选择直接影响算法性能、系统稳定性和长期维护成本。以下是关键注意事项及建议: 一、深度学习显卡选择 核心需求分析 任务类型:检测任务复杂度(如YOLO、ResNet等模型的参数量)决定显存需求。 高分辨率图像(如4K以上)需大显存…...

配置安全网站
配置网站 确定是Debian系统 更新索引:apt update 安装包:apt upgrade -y 查看nginx状态:systemctl status nginx 安装:nginx:apt install nginx 启动:systemctl start nginx 在/var/www/里面创建一个…...

ds回答 什么是数据召回
数据召回(Data Recall)在不同领域有不同的具体含义,但核心都指向“从大量信息中筛选出相关数据”的过程。以下是其在不同场景下的定义和关键要点: 一、技术领域的定义(信息检索与推荐系统) 1. 基本概念 数…...

复现无人机的项目,项目名称为Evidential Detection and Tracking Collaboration
项目名称为Evidential Detection and Tracking Collaboration,主要用于强大的反无人机系统,涉及新问题、基准和算法研究。下面介绍项目的复现步骤: 安装环境:使用Anaconda创建并激活名为edtc的虚拟环境,Python版本为3…...

mac本地部署Qwq-32b记录
导语 昨天看到阿里开源了Qwq-32b,号称性能可以媲美Deepseek-R1。今天晚上有空就在Mac上折腾了一下,使用ollma进行了部署,效果感觉还不错,特此记录。 环境 硬件 型号:Macbook M1 Pro 14寸内存:512G 环境…...