FreeRTOS学习总结 (二)

2023-05-16

FreeRTOS学习总结

四、软件定时器

软件计时器由FreeRTOS内核实现,并在其控制之下。它们不需要硬件支持,也与硬件计时器或硬件计数器无关。软件计时器功能是可选的。要使用软件计时器功能:
1、构建FreeRTOS源文件 FreeRTOS/Source/timers.c作为项目的一部分。
2、在FreeRTOSConfig.h中将configUSE_TIMERS设置为1。
软件定时器的回调函数模型如下:

//Listing 72. The software timer callback function prototype
void ATimerCallback( TimerHandle_t xTimer );

软件计时器回调函数从开始执行到结束尾执行,并以正常方式退出。它们应保持短小,并且不能进入阻塞状态。

软件定时器的回调函数,是在一个FreeRTOS调度器启动时,自动创建的任务上下文中执行。因此该回调函数不能调用FreeRTOS的API函数,否则将导致该任务进入阻塞状态。
只有当函数的xTicksToWait参数(指定函数的块时间)设置为0的时候,可以调用函数如xQueueReceive()。调用像vTaskDelay()这样的函数是不允许的,因为调用vTaskDelay()总是会将调用任务置于阻塞状态。

有两种计时器:
1、一次性计时器
2、自动重载计时器

软件计时器的两种状态:
1、休眠
2、运行
在这里插入图片描述

RTOS守护进程(计时器服务)任务

软件定时器的回调函数是在FreeRTOS的守护任务的上下文中执行的。它的优先级和栈大小分别由configTIMER_TASK_PRIORITY和configTIMER_TASK_STACK_DEPTH编译时配置常量设置。这两个常量都是在FreeRTOSConfig.h中定义的。
回调函数绝对不能调用任何会导致守护任务进入阻塞状态的FreeRTOS的API函数。

软件计时器API函数将命令通过一个名为“计时器命令队列”的队列,从函数的调用任务发送到守护任务。
计时器命令队列是一个标准的FreeRTOS队列,它在调度程序启动时自动创建。计时器命令队列的长度是由FreeRTOSConfig.h中的configTIMER_QUEUE_LENGTH编译时配置常量设置的。

在这里插入图片描述
注意:软件计时器将的时间是从“启动计时器”命令发送到计时器命令队列开始计算的——它不是从守护进程任务从计时器命令队列收到“启动计时器”命令开始计算的。例如,如果发送一个“启动计时器”命令来启动一个周期为10个tick的计时器,则时间戳用于确保这10个tick是应用程序从发送命令开始,而不是在守护进程任务处理命令后开始的的第10个tick。

软件计时器相关API

创建计时器:

TimerHandle_t xTimerCreate( const char * const pcTimerName,
 							TickType_t xTimerPeriodInTicks,
 							UBaseType_t uxAutoReload,
 							void * pvTimerID,
 							TimerCallbackFunction_t pxCallbackFunction );

启动计时器:

BaseType_t xTimerStart ( TimerHandle_t xTimer, TickType_t xTicksToWait );

设置和获取计时器ID:

void vTimerSetTimerID( const TimerHandle_t xTimer, void *pvNewID );
void *pvTimerGetTimerID( TimerHandle_t xTimer );

更改计时器周期:
对于运行状态中的计时器,重新计算的过期时间相对于调用xTimerChangePeriod()的时间,而不是相对于计时器最初启动的时间。
对于休眠状态中的计时器,则只改变计时器周期,不会启动计时器。

BaseType_t xTimerChangePeriod( TimerHandle_t xTimer, TickType_t NewTimerPeriodInTicks,TickType_t xTicksToWait );

重置计时器:
该函数也可以用来启动一个处于休眠状态的计时器。

BaseType_t xTimerReset( TimerHandle_t xTimer, TickType_t xTicksToWait );

五、中断管理

从中断函数中调用FreeRTOS的API,需要调用带FromISR尾缀的版本。

xHigherPriorityTaskWoken参数

如果在中断中调用了FromISR()的API函数,并且该API函数可能造成任务的切换,那么这种切换并不会在中断服务程序中自动的发生。而是需要通过FromISR()函数的xHigherPriorityTaskWoken参数,通知调度器执行任务的上下文切换。
使用xHigherPriorityTaskWoken参数是可选的。如果不需要,则将参数设置为NULL。

portYIELD_FROM_ISR()和portEND_SWITCHING_ISR()宏

这两个宏是taskYEILD()的ISR安全版本,他们的使用方式相同,并且做同样的事情。一些FreeRTOS分支只提供这两个宏中的一个。较新的FreeRTOS分支提供了这两个宏。
xHigherPriorityTaskWoken参数传递给这两个宏,如果为pdTRUE,则会请求一个上下文切换。
注意:中断将始终返回到处于运行状态下的任务,即使在中断执行时,处于运行状态下的任务已经变了。

延迟中断处理

中断的ISR程序应尽量短小,因此和中断相关的其他处理,如数据处理,都可以延迟到任务中执行,从而保证ISR尽快退出。
如果延迟处理任务的优先级高于任何其他任务,那么中断独处后将立即被执行。就像在ISR本身中执行一样。
在这里插入图片描述
中断延时被立即处理的条件:
1、二进制信号量通知任务进入就绪状态
2、延时任务的优先级是当前最高。
3、ISR程序的末尾调用portYIELD_FROM_ISR(xHigherPriorityTaskWoken)中参数为pdTRUE。

二进制信号量相关API

创建:

SemaphoreHandle_t xSemaphoreCreateBinary( void );

take:

BaseType_t xSemaphoreTake( SemaphoreHandle_t xSemaphore, TickType_t xTicksToWait );

give:

BaseType_t xSemaphoreGiveFromISR( SemaphoreHandle_t xSemaphore,  BaseType_t *pxHigherPriorityTaskWoken );
计数信号量

使用计数信号量需要在FreeRTOSConfig.h中设置configUSE_COUNTING_SEMAPHORES必须在为1。
计数信号量通常用于两件事:
1、计数事件,初始值为0,每个事件give一个信号量,计数增加。
2、资源管理,初始值为资源总数,每个任务take一个资源,计数减少。

创建计数信号量函数,需要设置初始值和最大值:

SemaphoreHandle_t xSemaphoreCreateCounting( UBaseType_t uxMaxCount, UBaseType_t uxInitialCount );
中断延时到守护任务

可以使用xTimerPendFunctionCallFromISR()API函数来将中断处理延迟到RTOS守护进程任务,不需要为每个中断创建一个单独的任务。将中断处理延迟到守护进程任务称为“集中式延迟中断处理”。
被延时的任务模型:

void vPendableFunction( void *pvParameter1, uint32_t ulParameter2 );

延时函数:

BaseType_t xTimerPendFunctionCallFromISR( PendedFunction_t vPendableFunction, void *pvParameter1, uint32_t ulParameter2, BaseType_t *pxHigherPriorityTaskWoken );

BaseType_t xTimerPendFunctionCall( PendedFunction_t vPendableFunction, void *pvParameter1, uint32_t ulParameter2 );
在中断服务程序中使用队列

二进制信号量和计数信号量都是用于通知事件的产生。而队列则用于通知事件的产生并传输数据。

BaseType_t xQueueSendToBackFromISR( QueueHandle_t xQueue, void *pvItemToQueue, BaseType_t *pxHigherPriorityTaskWoken );
BaseType_t xQueueSendToFrontFromISR( QueueHandle_t xQueue, void *pvItemToQueue, BaseType_t *pxHigherPriorityTaskWoken );

使用队列从中断传递数据到任务,简单方便,但如果数据到达的频率较高,则不适合,如UART接口不断有字符传入时。此时可以:
1、使用DMA传递数据,使用任务通知来把任务解除阻塞。
2、把所有接收到的数据复制到一个线程安全的RAM缓冲区,再使用任务通知。
3、在ISR中直接处理数据,把处理后的结果(而不是原始数据)使用队列发送给任务。

中断嵌套

支持中断嵌套的分支需要在FreeRTOSConfig.h中定义表39中详细说明的一个或两个常量。configMAX_SYSCALL_INTERRUPT_PRIORITY和configMAX_API_CALL_INTERRUPT_PRIORITY都定义了相同的属性。旧的FreeRTOS端口使用configMAX_SYSCALL_INTERRUPT_PRIORITY,而更新的FreeRTOS端口使用configMAX_API_CALL_INTERRUPT_PRIORITY。
在这里插入图片描述
注意数字优先级和逻辑优先级的区别,通过将configMAX_SYSCALL_INTERRUPT_PRIORITY设置为比configKERNEL_INTERRUPT_PRIORITY更高的逻辑中断优先级来创建一个完整的中断嵌套模型。例如:

  • 该处理器有七个独特的中断优先级。
  • 分配的数字优先级为7的中断比分配的数字优先级为1的中断具有更高的逻辑优先级。
  • configKERNEL_INTERRUPT_PRIORITY被设置为1。
  • configMAX_SYSCALL_INTERRUPT_PRIORITY被设置为3。

在这里插入图片描述

  • 当内核或应用程序处于关键部分内时,使用优先级1到3的中断会被阻止执行。在这些优先级上运行的ISR可以使用中断安全的FreeRTOS API函数。
  • 使用优先级4或以上的中断不受关键部分的影响,因此调度程序所做的任何事情都不会阻止这些中断立即执行——在硬件本身的限制范围内。在这些优先级上执行的ISR不能使用任何FreeRTOS API函数。
  • 通常,需要非常严格的定时精度的功能(例如,电机控制)将使用高于configMAX_SYSCALL_INTERRUPT_PRIORITY的优先级,以确保调度器不会在中断响应时间中引入抖动。

六、资源管理

基本的关键部分,是被宏taskENTER_CRITICAL()和taskEXIT_CRITICAL()所包围的代码区域。这两个宏不接受参数,也不返回值。例如:

void vPrintString( const char *pcString )
{
 	/* Write the string to stdout, using a critical section as a crude method of  mutual exclusion. */
 	taskENTER_CRITICAL();
 	{
 		printf( "%s", pcString );
 		fflush( stdout );
 	}
 	taskEXIT_CRITICAL();
 }
  • 它们通过禁用中断来工作,要么完全禁用,要么禁用中断优先级
    configmax_syscall_interrupt_priority -取决于FreeRTOS分支。
  • 基本的关键部分必须保持非常短,否则它们将对中断响应时间并产生不利影响。
  • 且taskENTER_CRITICAL()和taskEXIT_CRITICAL()必须成对出现。
  • 关键部分嵌套是安全的,因为内核会计算嵌套深度。只有当嵌套深度返回到零时,关键部分才会退出。
  • 调用taskENTER_CRITICAL()和taskEXIT_CRITICAL()是一个任务改变运行FreeRTOS的处理器的中断启用状态的唯一合法方式。通过任何其他方式改变中断启用状态都将使宏的嵌套计数无效。
  • taskENTER_CRITICAL_FROM_ISR()和taskEXIT_CRITICAL_FROM_ISR()是中断安全版本。中断安全版本只提供给允许中断嵌套的FreeRTOS分支,在不允许中断嵌套的分支中将会废弃。
暂停(或锁定)调度器
  • 基本关键部分保护代码区域不受其他任务和中断的访问。
  • 暂停调度程序而实现的关键部分只保护一个代码区域不被其他任务访问,因为中断仍然处于启用状态。
  • 如果通过简单地禁用中断来实现的关键部分太长,而可以通过挂起调度器来实现。但是,在暂停调度程序时,中断活动可能使调度程序恢复(或“取消暂停”)成为一个相对较长的操作,因此必须考虑在每种情况下使用哪一种是最佳方法。
//Listing 119. The implementation of vPrintString()
void vPrintString( const char *pcString )
{
 	/* Write the string to stdout, suspending the scheduler as a method of mutual
 exclusion. */
 	vTaskSuspendScheduler();
 	{
 		printf( "%s", pcString );
 		fflush( stdout );
 	}
 	xTaskResumeScheduler();
}
互斥锁

互斥锁是一种特殊类型的二进制信号量,必须在FreeRTOSConfig.h中设置configUSE_MUTEXES为1,才能可用。

  • 用于互斥的信号量,要访问资源前,必须先申请"take"锁,使用完了要释放"give"锁。
  • 用于同步的信号量,发送事件时直接"give",不需要先"take";接收事件"take"后不需要"give"释放。

互斥锁相关函数:
创建:

SemaphoreHandle_t xSemaphoreCreateMutex( void );

take和give使用与二进制信号量相同的API

BaseType_t xSemaphoreTake( SemaphoreHandle_t xMutex, TickType_t xTicksToWait );
BaseType_t xSemaphoreGive(SemaphoreHandle_t xMutex );

使用互斥锁硬注意一下几个问题:
1、优先级翻转
2、死锁:多个任务间死锁,自己和自己死锁
3、多个具有相同优先级的任务间抢锁,可能导致锁一直被一个任务抢到。

守门员任务

将资源仅交给守门员任务,它是资源的唯一拥有者和访问者。其他任务或中断都可以将信息和数据通过队列等手段传递给守门员任务,然后由守门员任务统一处理给对应资源。

七、事件组

事件组用于处理多任务和多个事件之间的关系。它可以同步多个任务、向多个任务广播事件、允许任务在Blocked状态下等待一组事件中的任何一个发生,以及允许任务在Blocked状态下等待多个操作完成。
相关API函数:
创建:

EventGroupHandle_t xEventGroupCreate( void );

SET和WAIT

EventBits_t xEventGroupSetBits( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet );
BaseType_t xEventGroupSetBitsFromISR( EventGroupHandle_t xEventGroup, const EventBits_t uxBitsToSet, BaseType_t *pxHigherPriorityTaskWoken );

EventBits_t xEventGroupWaitBits( const EventGroupHandle_t xEventGroup,
 								 const EventBits_t uxBitsToWaitFor,
 								 const BaseType_t xClearOnExit,
 								 const BaseType_t xWaitForAllBits,
 								 TickType_t xTicksToWait );
多个任务间同步

假设:
1、任务A,B,C使用一个事件组进行同步。
2、任务A和任务B已经到达同步点,所以它们的事件位在事件组中被设置,并且它们处于阻塞状态,等待任务C的事件位也被设置。
3、任务C到达同步点,并使用xEventGroupSetBits()来设置其在事件组中的位。一旦设置了任务C的位,任务A和任务B就会离开阻塞状态,并清除所有三个事件位。
4、然后任务C调用xEventGroupWaitBits()等待所有三个事件位被设置,但此时,所有三个事件位已经被清除,任务A和任务B已经离开各自的同步点,因此同步失败。
事件同步API函数

EventBits_t xEventGroupSync( EventGroupHandle_t xEventGroup,
							 const EventBits_t uxBitsToSet,
							 const EventBits_t uxBitsToWaitFor,
							 TickType_t xTicksToWait );

八、任务通知

在FreeRTOSConfig.h中将configUSE_TASK_NOTIFICATIONS设置为1启用任务通知。
当启用任务通知时,每个任务都有一个“通知状态”,可以是“挂起”或“非挂起”,还有一个“通知值”,这是一个32位的无符号整数。当任务收到通知时,其通知状态被设置为挂起。当任务读取其通知值时,其通知状态被设置为不挂起。任务可以在一个超时时间段内阻塞状态等待,使其通知状态挂起。
1、任务通知比通信对象更快,使用更少的RAM。
2、任务通知可用于将事件和数据从ISR发送到任务,但它们不能用于将事件或数据从任务发送到ISR。
3、任务通知被直接发送到接收任务,因此只能由被通知的任务进行处理。
4、一个任务的通知值一次只能保存一个值。
5、如果接收任务已经有一个通知没有处理而处于挂起状态,则发送任务不会阻塞而等待它取消挂起。

简化的任务通知相关API函数
BaseType_t xTaskNotifyGive( TaskHandle_t xTaskToNotify );
void vTaskNotifyGiveFromISR( TaskHandle_t xTaskToNotify, BaseType_t *pxHigherPriorityTaskWoken );

uint32_t ulTaskNotifyTake( BaseType_t xClearCountOnExit, TickType_t xTicksToWait );

give会将接收任务的增加通知值(+1)。
take的参数xClearCountOnExit,如果被设置成pdTRUE,则ulTaskNotifyTake返回前,会把接受任务的通知值清0;类似于二进制信号量
如果设置成pdFALSE,则减少通知值(-1),不会清0。类似于计数信号量

更复杂强大的任务通知API函数

发送通知函数:

BaseType_t xTaskNotify( TaskHandle_t xTaskToNotify, 
 						uint32_t ulValue, 
 						eNotifyAction eAction );

BaseType_t xTaskNotifyFromISR( TaskHandle_t xTaskToNotify, 
 							   uint32_t ulValue, 
 							   eNotifyAction eAction,
 							   BaseType_t *pxHigherPriorityTaskWoken );

1、增加(+1)接收任务的通知值,在这种情况下xTaskNotify()等效于xTaskNotifyGive()。
2、在接收任务的通知值中设置一个或多个位。类似于事件组。
3、将一个全新的数字写入接收任务的通知值,但前提是接收任务自上次更新以来已读取其通知值。类似于长度为1的队列。
4、将一个全新的数字写入接收任务的通知值,即使接收任务自上次更新后还没有读取其通知值。类似于邮箱的xQueueOverwrite() API函数。
5、参数ulValue的作用取决于参数eActon的设置。具体如下表:

eAction值效果
eNoAction提供类似于二进制信号量的功能,ulValue不使用
eSetBits提供类似于事件组的功能,ulValue为事件组的各个位
eIncrement提供类似于计数信号量的功能,ulValue不使用
eSetValueWithoutOverwrite提供类似于长度为1的队列功能,ulValue为传递的值
eSetValueWithOverwrite提供类似于邮箱的功能,ulValue为传递的值

接收任务通知函数:

BaseType_t xTaskNotifyWait( uint32_t ulBitsToClearOnEntry,
 							uint32_t ulBitsToClearOnExit,
							uint32_t *pulNotificationValue,
 							TickType_t xTicksToWait );
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

FreeRTOS学习总结 (二) 的相关文章

  • 深入理解 MySQL 底层实现

    本文来自作者 默默 在 GitChat 上分享 深入理解 MySQL 底层实现 xff0c 阅读原文 查看交流实录 文末高能 编辑 哈比 MySQL 的常用引擎 1 InnoDB InnoDB 的存储文件有两个 xff0c 后缀名分别是 f
  • 修改订单金额!?0.01 元购买 iPhoneX?| Web谈逻辑漏洞

    本文来自作者 肖志华 在 GitChat 上分享 Web 安全恩仇录 xff1a 再谈逻辑漏洞 xff0c 阅读原文 查看交流实录 文末高能 编辑 哈比 Web 漏洞里有 SQL 注入 XSS 等漏洞 xff0c 但是逻辑漏洞等问题也是一个
  • 如何开发一款游戏:游戏开发流程及所需工具

    本文来自作者 goto先生 在 GitChat 上分享 如何开发一款游戏 xff1a 游戏开发流程及所需工具 编辑 哈比 游戏作为娱乐生活的一个方面 xff0c 参与其中的人越来越多 xff0c 而大部分参与其中的人都是以玩家的身份 他们热
  • 如何用 Python 做自动化测试

    本文来自作者 Vant 在 GitChat 上分享 如何用 Python 做自动化测试 编辑 哈比 一 Selenium 环境部署 1 window 环境部署 1 1 当前环境 Win10 64 位系统 xff1b Python3 6 2
  • 我真的要做一辈子的程序员吗?

    本文来自作者 王鹏 在 GitChat 上分享 程序员跳槽时 xff0c 如何正确做好职业规划 xff1f 阅读原文 查看交流实录 编辑 贝吉塔 经常听一些同学说 xff1a 不知道下一份工作该去哪类公司做些什么 xff0c 我的职场人际一
  • 20万到100万年薪的算法工程师有什么区别?

    公元七世纪 xff0c 在车迟国国家气象局组织的一次求雨活动中 xff0c 虎力 鹿力 羊力三位大仙成功地祈下甘霖 xff0c 救黎民于水火中 老国王虽然不明就里 xff0c 却从此尊他们为国师 xff0c 奉道教为圭臬 本世纪 xff0c
  • 在win7下安装ubuntu

    安装VMware 从官网下载VMware workstation full 10 0 4 2249910 exe文件 xff0c 一直点击下一步 xff0c 直到安装成功 安装成功的界面如图所示 xff1a 安装Ubuntu 1 获取发行版
  • 带参数的宏定义 #define

    main c C语言学习 include lt stdio h gt 求和函数 int sum int v1 int v2 return v1 43 v2 宏定义 define 代表要定义一个宏 SUM 宏的名称 v1 v2 参数 xff0
  • 串口编程项目— PX4FLOW 传感器数据接收处理(英文paper直接贴过来)

    写在前面 xff1a 七月份初 xff0c 结束交流生项目 xff0c 向导师申请了个项目 xff0c 关于PX4FLOW传感器的 xff0c serial programming 的java编程 xff0c 下午刚刚提交完paper 写个
  • 电路城(www.cirmall.com)-基于HS1101LF和TC1047A 温湿度传感器模块(硬件+源码+设计说明等)

    电路城 xff08 www cirmall com xff09 本次分享的温湿度传感器模块采用瑞萨电子生产的 R7F0C802 单片机作为控制单元 xff0c 采集温度传感器 TC1047A 输出的电压信号和湿度传感器HS1101LF 电路
  • 服务器后端开发,学什么编程语言?

    服务器后端开发 xff0c 学什么编程语言 xff1f 技术 后台开发 xff0c 目前主流的编程语言是Java xff0c Go语言 xff0c C 43 43 xff0c python 以及php 个人建议学Java xff0c 主流中
  • ROS基础:功能包的创建与编译

    创建 如果你使用的是catkin编译系统 xff0c 那么可以很容易地创建一个功能包 首先进入你的工作空间的src目录下 xff1a cd catkin ws src 然后运行catkin create pkg命令 xff1a catkin
  • 关于TF转换信息(Transforms)的理解

    本文主要内容参考自ROS wiki tf Overview Transformations xff0c 在加入了自己的一些理解的同时 xff0c 我也对原文进行了适当的修改 原文使用Creative Commons Attribution
  • RealSense SDK 开发笔记(一)环境配置

    转载请注明出处 2017 以后的SDK结构必然趋于稳定 xff0c 也就会多一些新特性和新设备的支持 xff0c 配置流程不再变化 2016 2 xff1a 目前SDK版本是2016R1 xff0c 配置过程一模一样 xff0c SDK主要
  • 闭包方法的学习

    相关链接 swift中使用 64 noescape的正确姿势 文档闭包 闭包可以捕获和存储其在上下文中任意常量和变量的引用 被称为包裹常量和变量 Swift会为你管理在捕获过程中涉及到的所有内存操作 在函数章节中介绍的全局和嵌套函数也是特殊
  • CMakeLists常用方法

    我们在编译一个C C 43 43 项目时有时候是需要我们阅读编译脚本来确定编译时的参数 CMakeLists txt是比较常见的编译脚本 xff0c 这里简单介绍几个常用的函数 cmake minimum required 设置cmake的
  • halcon中Image的像素类型

    在学习halcon算子sub image ImageMinuend ImageSubtrahend ImageSub Mult Add 时 xff0c 在样例中遇到了一个操作 This example demonstrates how to
  • GitHub Action构建并推送DockerHub

    前言 偶尔会构建一些自己用的容器 xff0c 之前一直用的是Docker提供的构建服务 xff0c 然而Docker开始收费了 xff0c 那只能另寻他法 之所以不本地构建推送 xff0c 是因为构建的时候经常因为网络问题 xff0c 访问
  • BIO与NIO的方式实现文件拷贝

    面试题 编程实现文件拷贝 xff08 这个题目在笔试的时候经常出现 xff0c 下面的代码给出了两种实现方案 xff09 span class hljs keyword import span java io FileInputStream
  • 一路(16)走来,一起(17)依然同行

    来个自我介绍吧 xff0c 我叫 xff0c 计算机科学与技术专业 xff0c 本科 xff0c 这句话应该是16年整整一年说过最多的 那么我去年整整一年我又有那些收获呢 xff0c so xff0c 我也来个年终总结 xff0c 年初展望

随机推荐

  • 电路城(www.cirmall.com)-学习IoT,BLE编程绝佳平台,nRF52832 BLE(蓝牙低能耗)开发板

    该nRF52832 BLE xff08 蓝牙低能耗 xff09 开发板是一款具有温度 xff0c 湿度 xff0c 环境光和加速度传感器的蓝牙低能耗开发板 该蓝牙开发板具有ARM Cortex M4F CPU的nRF52832 BLE So
  • Linux上jmeter-server启动失败

    贴个广告 楼主的博客已全部搬迁至自己的博客 xff0c 感兴趣的小伙伴请移步haifeiWu与他朋友们的博客专栏 Jmeter server启动失败 xff1a Cannot start Unable to get local host I
  • Mysql的七种join

    对于SQL的Join xff0c 在学习起来可能是比较乱的 我们知道 xff0c SQL的Join语法有很多inner的 xff0c 有outer的 xff0c 有left的 xff0c 有时候 xff0c 对于Select出来的结果集是什
  • shell脚本实现自动保留最近n次备份记录

    贴个广告 楼主的博客已全部搬迁至自己的博客 xff0c 感兴趣的小伙伴请移步haifeiWu与他朋友们的博客专栏 项目中出现的问题 某天上午服务器出现卡顿特别严重 xff0c 页面加载速度奇慢 xff0c 并且某些页面刷新出现404的问题
  • Java实现终止线程池中正在运行的定时任务

    贴个广告 楼主的博客已全部搬迁至自己的博客 xff0c 感兴趣的小伙伴请移步haifeiWu与他朋友们的博客专栏 源于开发 最近项目中遇到了一个新的需求 xff0c 就是实现一个可以动态添加定时任务的功能 说到这里 xff0c 有人可能会说
  • TCP 粘包问题浅析及其解决方案

    最近一直在做中间件相关的东西 xff0c 所以接触到的各种协议比较多 xff0c 总的来说有TCP xff0c UDP xff0c HTTP等各种网络传输协议 xff0c 因此楼主想先从协议最基本的TCP粘包问题搞起 xff0c 把计算机网
  • Redis协议规范(译文)

    原文地址 xff1a haifeiWu的博客 博客地址 xff1a www hchstudio cn 欢迎转载 xff0c 转载请注明作者及出处 xff0c 谢谢 xff01 Redis客户端使用名为RESP xff08 Redis序列化协
  • Netty 源码中对 Redis 协议的实现

    原文地址 xff1a haifeiWu的博客 博客地址 xff1a www hchstudio cn 欢迎转载 xff0c 转载请注明作者及出处 xff0c 谢谢 xff01 近期一直在做网络协议相关的工作 xff0c 所以博客也就与之相关
  • 高性能无锁队列 Disruptor 初体验

    原文地址 xff1a haifeiWu和他朋友们的博客 博客地址 xff1a www hchstudio cn 欢迎转载 xff0c 转载请注明作者及出处 xff0c 谢谢 xff01 最近一直在研究队列的一些问题 xff0c 今天楼主要分
  • Vultr(云服务器)安装GUI图形化界面(已解决)

    服务器 xff1a Vultr OS xff1a Ubuntu 14 04 步骤 xff1a 1 远程登陆到服务器 2 确保所有的包和依赖关系是最新的 apt span class hljs keyword get span update
  • WorkerMan客户端连接失败

    workerman客户端连接失败 今天访问客服聊天功能发现不能发送信息 xff0c 然后看到是因为 WebSocket 连接失败 xff0c 图如下 xff1a 根据字面意思已经了解了问题是因为连接拒绝 xff0c 那么为什么会拒绝呢 xf
  • 2020计算机技术类,部分人工智能与软件工程SCI一区期刊列表(基于letpub数据)

    网上找了很久将计算机技术作为独立大区的期刊列表 xff0c 还是没有找到 所以我决定根据letpub的数据 xff0c 自己整理下 xff0c 方便以后查看 注 xff1a 由于2020与2019年的数据存在一些冲突 xff0c 部分数据可
  • IoT -- 解读物联网四层架构

    本文以物联网四层架构为基础 xff0c 从物联网产品设计的角度来解读每层架构的功能以及主要内容 xff0c 旨在为物联网产品设计以及实现思路感兴趣的物联网产品或研发人员有些帮助 通过互联网 xff0c 人和人之间可以传递和交流信息 物联网
  • 【putty无法连接Linux-centos7】

    一 二 1 vmware中打开虚拟机 xff0c 选择网络适配器 xff0c 选择模式 选择桥接模式 xff0c 则跟电脑主机一样使用以太网 xff0c 可以联网 xff0c 也可以ping通其他主机 xff0c 选择vmnet8 NAT模
  • 我的视觉SLAM学习的小小入门---Ubuntu18配置VINS-MONO

    前言 作为一名才接触视觉SLAM的菜鸟 xff0c 除了捧着高翔老师的书看着那晦涩难懂的代码与理论 xff0c 就是跟着高翔老师的课程囫囵吞枣地学着 但是似乎总不见成效 xff0c 时常想象着何时可以像大佬们一样建图 Vins mono可算
  • 关于Ubuntu(Debian)软件源报错问题及解决

    问题 xff1a 在执行sudo apt get update时出现以下报错 xff0c 查询得知是因为换源以后 xff0c 新的下载源没有公钥 W GPG error http mirrors aliyun com debian bust
  • Cmake常用指令

    1 SET SET lt variable gt lt value gt CACHE lt type gt lt docstring gt FORCE 将缓存条目variable设置为值 lt value gt xff0c 除非用户进行设置
  • [LeetCode] Two Sum 两数之和 java实现 C++实现

    LeetCode Two Sum 两数之和 java实现 C 43 43 实现 Given an array of integers return indices of the two numbers such that they add
  • FreeRTOS学习总结 (一)

    FreeRTOS学习总结 一 移植 上图是从FreeRTOS官网下载的源文件目录 xff0c 移植所需要的文件都在Source文件夹下 如上图 xff0c 在工程文件夹下创建FreeRTOS文件夹 xff0c 子文件夹和相应文件 xff0c
  • FreeRTOS学习总结 (二)

    FreeRTOS学习总结 四 软件定时器 软件计时器由FreeRTOS内核实现 xff0c 并在其控制之下 它们不需要硬件支持 xff0c 也与硬件计时器或硬件计数器无关 软件计时器功能是可选的 要使用软件计时器功能 xff1a 1 构建F