【FreeRTOS 】任務通知

FreeRTOS 任務通知

  • 任務通知簡介
  • 一 、發送通知
    • 1.1 xTaskNotify()
    • 1.2 xTaskNotifyFromISR()
    • 1.3 xTaskNotifyGive()
    • 1.4 xTaskNotifyAndQuery()
    • 1.5 xTaskNotifyAndQueryFromISR()
  • 二、接收通知
    • 2.1 ulTaskNotifyTake()
    • 2.2 xTaskNotifyWait()
  • 三、清除通知狀態和值
    • 3.1 xTaskNotifyStateClear()
    • 3.2 ulTaskNotifyValueClear()
  • 四、eAction 值和相關操作

FreeRTOS 中的任務通知 (Task Notifications) 是一種極其高效、輕量級的任務間通信 (IPC) 和同步機制。它允許一個任務或中斷服務程序 (ISR) 直接向另一個任務發送事件通知,并可選地附帶一個 32 位的值。相比于傳統的隊列、信號量、事件組等機制,任務通知通常更快占用更少的內存,因為它利用了任務控制塊 (TCB) 中已有的字段。

大多數任務間通信方法借助中間對象,如隊列、信號量 或 事件組。發送任務寫入通信對象,而接收任務從 通信對象中讀取。使用直接任務通知時,顧名思義,發送 任務直接向接收任務發送通知,無需借助中間對象, 使用 FreeRTOS 任務通知替代信號量方案, RAM占用更小且速度快了高達 45%。

Each RTOS task has an array of task notifications. Each task notification has a notification state that can be either ‘pending’ or ‘not pending’, and a 32-bit notification value.

每個 RTOS 任務都有一組任務通知,每個任務通知都有一個 通知狀態,可以是“待處理”或“未待處理”,以及一個 32 位 通知值

任務通知簡介

  1. 每個任務擁有一個通知值: 每個任務都有一個 32 位的 ulNotifiedValue 字段(在 TCB 中)。
  2. 通知狀態: 每個任務還有一個通知狀態字段 (ucNotifyState),可以是:
    • taskNOT_WAITING_NOTIFICATION: 任務沒有在等待通知。
    • taskWAITING_NOTIFICATION: 任務正在阻塞等待通知 (ulTaskNotifyTakexTaskNotifyWait)。
    • taskNOTIFICATION_RECEIVED: 任務收到了一個通知(通知值已更新),但任務尚未取走它(對于某些 API 模式)。
  3. 發送者: 任務或 ISR 通過調用 xTaskNotifyGive(), vTaskNotifyGiveFromISR(), xTaskNotify(), xTaskNotifyFromISR(), xTaskNotifyAndQuery(), xTaskNotifyAndQueryFromISR() 等 API 來更新目標任務的 ulNotifiedValueucNotifyState
  4. 接收者: 目標任務通過調用 ulTaskNotifyTake()xTaskNotifyWait() 來查詢、等待并消費通知。

?? ?在 FreeRTOS V10.4.0 之前,每項任務只有一個“通知值”, 所有任務通知 API 函數都只能操作這一個值。而從V10.4 開始,任務通知變為 了一組數組,用戶可以通過配置 configTASK_NOTIFICATION_ARRAY_ENTRIES 來決定了 每項任務的任務通知數組中的索引數。

在 V10.5.1 tskTaskControlBlock 結構體中可以查看到任務通知變量已變為了一個數組:

#if ( configUSE_TASK_NOTIFICATIONS == 1 )volatile uint32_t ulNotifiedValue[ configTASK_NOTIFICATION_ARRAY_ENTRIES ];volatile uint8_t ucNotifyState[ configTASK_NOTIFICATION_ARRAY_ENTRIES ];
#endif

而在V10.3.1 中,tskTaskControlBlock 中任務通知變量聲明如下:

#if( configUSE_TASK_NOTIFICATIONS == 1 )volatile uint32_t ulNotifiedValue;volatile uint8_t ucNotifyState;
#endif

xTaskNotify() 是原始 API 函數, 為保持向后兼容, 調用 xTaskNotify() 相當于調用 xTaskNotifyIndexed(), 其 uxIndexToNotify 參數設置為 0,其他的函數同此類似。

一 、發送通知

通知發送函數如下:

函數描述
xTaskNotify() / xTaskNotifyIndexed()任務中發送通知,攜帶通知值并且不保留接收任務原來的通知值
xTaskNotifyFromISR() / xTaskNotifyFromISRIndexed()中斷中發送通知,
xTaskNotifyGive() / xTaskNotifyGiveFromISR()任務中發送通知,不帶通知值并且不保留接收任務原來的通知值,
xTaskNotifyAndQuery() / xTaskNotifyAndQueryIndexed()任務中發送通知,帶有通知量并且保留接收任務的原來的通知值
xTaskNotifyAndQueryFromISR / xTaskNotifyAndQueryFromISRIndexed()xTaskNotifyAndQuery() 的中斷版本

1.1 xTaskNotify()

xTaskNotify()xTaskNotifyIndexed() 是等效函數,唯一區別在于 xTaskNotifyIndexed() 可以操作任務通知數組中的任何任務通知,而 xTaskNotify() 總是操作 數組中索引為 0 的任務通知。

BaseType_t xTaskNotify( TaskHandle_t xTaskToNotify,   // 任務句柄uint32_t ulValue,		      // 通知值eNotifyAction eAction );	  // 通知狀態

參數

  • xTaskToNotify

    接收通知的 RTOS 任務的句柄,通知值會遞增。可通過以下方法獲取任務句柄: 使用 xTaskCreate()創建任務,并通過 pxCreatedTask 參數獲取句柄; 使用 xTaskCreateStatic()創建任務,并返回值作為句柄; 調用 xTaskGetHandle(),通過任務名稱獲取句柄。當前正在執行的 RTOS 任務的句柄 由 xTaskGetCurrentTaskHandle()API 函數返回。

  • ulValue:用于更新目標任務的通知值。

  • eAction 任務通知更新的方法。枚舉類型,可以取下列任一值,以執行相關操作

task.h 中有如下的定義:

/* Actions that can be performed when vTaskNotify() is called. */
typedef enum
{eNoAction = 0,				/* Notify the task without updating its notify value. */eSetBits,					/* Set bits in the task's notification value. */eIncrement,					/* Increment the task's notification value. */eSetValueWithOverwrite,		/* Set the task's notification value to a specific value even if the previous value has not yet been read by the task. */eSetValueWithoutOverwrite	/* Set the task's notification value if the previous value has been read by the task. */
} eNotifyAction;

對應的解釋如下:

eNoAction不會更改通知值(只發信號,不傳數據)
eSetBits設置通知值的指定bit置一,類似事件組的用法
eIncrement通知值加一,類似計數信號量
eSetValueWithOverwrite覆蓋之前通知值的方式更新通知值
eSetValueWithoutOverwrite不覆蓋之前的通知值

返回值:

如果 eAction 設置為 eSetValueWithoutOverwrite ,且目標任務已有通知pending(待處理),則其通知值不會更新, 以免之前的值在使用前被覆蓋。在這種情況下,調用 xTaskNotify() 會失敗, 返回 pdFALSE。通過這種方式,RTOS 任務通知機制可以 在長度為 1 的隊列上作為 xQueueSend() 的輕量級替代方案。

其他情況下均返回 pdPASS。

BaseType_t xTaskNotifyIndexed( TaskHandle_t xTaskToNotify,UBaseType_t uxIndexToNotify,uint32_t ulValue,eNotifyAction eAction );

xTaskNotifyIndexedxTaskNotify() 多了一個 uxIndexToNotify 的參數,可以指定到目標任務的通知數組具體索引。

1.2 xTaskNotifyFromISR()

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

作為 xTaskNotify() 的中斷版本,可以用在中斷函數中。

參數

  • pxHigherPriorityTaskWoken

    *pxHigherPriorityTaskWoken 必須初始化為 pdFALSE。 如果發送通知導致任務解除阻塞,并且解除阻塞的任務的優先級高于當前正在運行的任務, 則 xTaskNotifyFromISR() 會將 *pxHigherPriorityTaskWoken 設置為 pdTRUE。如果 xTaskNotifyFromISR() 將此值設置為 pdTRUE,則應在退出中斷前 請求上下文切換。pxHigherPriorityTaskWoken 是可選參數, 可設置為 NULL。

返回值:

如果 eAction 設置為 eSetValueWithoutOverwrite ,且目標任務已有通知在pending(待處理),則其通知值不會更新, 以免之前的值在使用前被覆蓋。在這種情況下,調用 xTaskNotify() 會失敗, 返回 pdFALSE。通過這種方式,RTOS 任務通知機制可以 在長度為 1 的隊列上作為 xQueueSend() 的輕量級替代方案。

其他情況下均返回 pdPASS。

同樣的,當任務通知擴展到數組時,下面這個函數和 xTaskNotifyFromISR() 等價。

BaseType_t xTaskNotifyIndexedFromISR( TaskHandle_t xTaskToNotify,UBaseType_t uxIndexToNotify,uint32_t ulValue,eNotifyAction eAction,BaseType_t *pxHigherPriorityTaskWoken );

參數:

  • uxIndexToNotify

    指定發送到目標任務的通知數組具體索引處。 uxIndexToNotify 必須小于 configTASK_NOTIFICATION_ARRAY_ENTRIES。 xTaskNotifyFromISR() 沒有此參數,并且總是將通知發送到索引 0。

1.3 xTaskNotifyGive()

xTaskNotifyGive() 宏可視為速度更快的輕量級二進制或計數信號量的替代方案。

?? 當任務通知值用作二進制或計數信號量的等效物時, 接收通知的任務應該使用 ulTaskNotifyTake() API 函數來等待通知, 而不是使用 xTaskNotifyWait() API 函數。

在任務中發送通知

xTaskNotifyGive()xTaskNotifyGiveIndexed() 是等效宏,唯一區別在于 xTaskNotifyGiveIndexed() 可以操作數組中的任何任務通知,而 xTaskNotifyGive() 總是操作數組中索引為 0 的任務通知。

BaseType_t xTaskNotifyGive( TaskHandle_t xTaskToNotify );
BaseType_t xTaskNotifyGiveIndexed( TaskHandle_t xTaskToNotify, UBaseType_t uxIndexToNotify );
  • xTaskToNotify

    接收通知的 RTOS 任務的句柄,通知值會遞增。可通過以下方法獲取任務句柄: 使用 xTaskCreate()創建任務,并通過 pxCreatedTask 參數獲取句柄; 使用 xTaskCreateStatic()創建任務,并返回值作為句柄; 調用 xTaskGetHandle(),通過任務名稱獲取句柄。當前正在執行的 RTOS 任務的句柄 由 xTaskGetCurrentTaskHandle()API 函數返回。

  • uxIndexToNotify

    要向目標任務的通知值數組中發送的通知索引。 uxIndexToNotify 必須小于 configTASK_NOTIFICATION_ARRAY_ENTRIESxTaskNotifyGive() 沒有此參數,并且總是將通知發送到索引 0。

中斷版本

void vTaskNotifyGiveFromISR( TaskHandle_t xTaskToNotify,BaseType_t *pxHigherPriorityTaskWoken );void vTaskNotifyGiveIndexedFromISR( TaskHandle_t xTaskHandle, UBaseType_t uxIndexToNotify, BaseType_t *pxHigherPriorityTaskWoken );

可在中斷服務程序 (ISR) 中使用的 xTaskNotifyGive()xTaskNotifyGiveIndexed()版本 。

1.4 xTaskNotifyAndQuery()

 BaseType_t xTaskNotifyAndQuery( TaskHandle_t xTaskToNotify,uint32_t ulValue,eNotifyAction eAction,uint32_t *pulPreviousNotifyValue );BaseType_t xTaskNotifyAndQueryIndexed( TaskHandle_t xTaskToNotify,UBaseType_t uxIndexToNotify,uint32_t ulValue,eNotifyAction eAction,uint32_t *pulPreviousNotifyValue );

xTaskNotifyAndQueryIndexed() 執行的操作與 xTaskNotifyIndexed()相同, 另外還可通過額外的 pulPreviousNotifyValue 參數返回目標任務之前的通知值 (函數被調用時的通知值,而不是函數返回時的通知值) 。

xTaskNotifyAndQuery() 執行的操作與 xTaskNotify()相同, 另外還可通過額外的 pulPreviousNotifyValue 參數返回目標任務之前的通知值 (函數被調用時的通知值,而不是函數返回時的通知值) 。

參數

  • pulPreviousNotifyValue

    可用于在 xTaskNotifyAndQuery() 修改任何位之前傳出目標任務的通知值。 pulPreviousNotifyValue 是可選參數,如果不需要,可設置為 NULL。如果不使用 pulPreviousNotifyValue, 可以考慮使用 xTaskNotify()替代 xTaskNotifyAndQuery()

  • 返回值:

    如果 eAction 設置為 eSetValueWithoutOverwrite ,且此時目標任務已有的通知pending,則其通知值不會更新, 以免之前的值在使用前被覆蓋。在這種情況下,調用 xTaskNotify() 會失敗, 返回 pdFALSE。通過這種方式,RTOS 任務通知機制可以 在長度為 1 的隊列上作為 xQueueSend() 的輕量級替代方案。

    其他情況下均返回 pdPASS。

1.5 xTaskNotifyAndQueryFromISR()

 BaseType_t xTaskNotifyAndQueryFromISR(TaskHandle_t xTaskToNotify,uint32_t ulValue,eNotifyAction eAction,uint32_t *pulPreviousNotifyValue,BaseType_t *pxHigherPriorityTaskWoken );BaseType_t xTaskNotifyAndQueryIndexedFromISR(TaskHandle_t xTaskToNotify,UBaseType_t uxIndexToNotifyuint32_t ulValue,eNotifyAction eAction,uint32_t *pulPreviousNotifyValue,BaseType_t *pxHigherPriorityTaskWoken );

xTaskNotifyAndQueryFromISR() 執行的操作與 xTaskNotifyFromISR()相同, 另外還可通過額外的 pulPreviousNotifyValue 參數返回目標任務之前的通知值 (函數被調用時的通知值,而不是函數返回時的通知值) 。

二、接收通知

任務通知接收函數如下:

函數描述
ulTaskNotifyTake / ulTaskNotifyTakeIndexed獲取任務通知,可設置在退出此函數時將任務通知值清零或者減一。當任務通知用作二值信號量或者計數信號量的時候使用此函數來獲取信號量。
xTaskNotifyWait / xTaskNotifyWaitIndexed等待任務通知,功能比 ulTaskNotifyTake() 更齊全。

2.1 ulTaskNotifyTake()

uint32_t ulTaskNotifyTake( BaseType_t xClearCountOnExit,TickType_t xTicksToWait );uint32_t ulTaskNotifyTakeIndexed( UBaseType_t uxIndexToWaitOn, BaseType_t xClearCountOnExit, TickType_t xTicksToWait );

ulTaskNotifyTake()ulTaskNotifyTakeIndexed() 是等效的, 唯一的區別 是 ulTaskNotifyTakeIndexed() 可以在操作數組中的任何任務通知, 而 ulTaskNotifyTake() 只能操作數組索引 0 處的任務通知。

參數:

  • uxIndexToWaitOn

    調用任務的通知值數組中的索引, 調用任務將在該索引上等待非零通知。uxIndexToWaitOn必須小于configTASK_NOTIFICATION_ARRAY_ENTRIESxTaskNotifyTake() 沒有此參數,默認在索引 0 處等待通知。

  • xClearCountOnExit

    如果收到 RTOS 任務通知,且 xClearCountOnExit設置為 pdFALSE,那么 RTOS 任務的 通知值將在 ulTaskNotifyTake()

    退出前遞減。這相當于 成功調用xSemaphoreTake()后,計數信號量的值被遞減。如果收到 RTOS 任務通知 且xClearCountOnExit

    設置為pdTRUE,則 RTOS 任務的通知值 將在 ulTaskNotifyTake()退出前重置為 0。這等同于 在成功調用xSemaphoreTake()

    后,將二進制信號量的值保留為 0。

  • xTicksToWait

    表示如果調用 ulTaskNotifyTake()時尚未收到通知,在阻塞狀態下等待收到通知的最長時間。處于阻塞狀態的 RTOS 任務不會消耗 任何 CPU 時間。時間以 RTOS 滴答周期為單位。pdMS_TO_TICKS() 宏可用于 將以毫秒為單位的時間轉換為以滴答為單位的時間。

返回:

  • 被遞減或清除之前的任務通知值的值(原來的任務通知值)

2.2 xTaskNotifyWait()

該函數比 ulTaskNotifyTake() 功能更為強大,不管任務通知用作二值信號量、計數信號量、隊列和事件標志組中的哪一種,都可以使用此函數來獲取任務通知。

xTaskNotifyWait()xTaskNotifyWaitIndexed()是等效宏,唯一區別在于 xTaskNotifyWaitIndexed() 可以操作數組中的任何任務通知, 而 xTaskNotifyWait() 只能操作數組中索引為 0 的任務通知。

 BaseType_t xTaskNotifyWait( uint32_t ulBitsToClearOnEntry,uint32_t ulBitsToClearOnExit,uint32_t *pulNotificationValue,TickType_t xTicksToWait );BaseType_t xTaskNotifyWaitIndexed( UBaseType_t uxIndexToWaitOn,uint32_t ulBitsToClearOnEntry,uint32_t ulBitsToClearOnExit,uint32_t *pulNotificationValue,TickType_t xTicksToWait );

參數

  • ulBitsToClearOnEntry

    接收任務通知之前,先進行按位清除通知值。當沒有接收到任務通知的時候,將任務通知值與此參數的取反值進行按位與運算。當此參數設為0xffffffff 或者 ULONG_MAX 的時候,就會將任務通知值清零。

  • ulBitsToClearOnExit

    退出此函數之前,先按位清除通知值。如果接收到任務通知,在退出此函數之前,將任務通知值與此參數的取反值進行按位與運算。當此參數設為0xffffffff 或者 ULONG_MAX 的時候,就會將任務通知值清零。

  • *pulNotificationValue

    用于傳出 RTOS 任務的通知值,復制到 *pulNotificationValue 的值是 RTOS 任務的通知值,該值是在應用 ulBitsToClearOnExit 設置清除任何位 之前的值。如果無需保存通知值,可以將 pulNotificationValue 設置為 NULL。

  • xTicksToWait 阻塞時間

返回:

如果收到了通知,或者在調用 xTaskNotifyWait() 時通知已經在pending(待處理)狀態, 則返回 pdTRUE。

如果調用 xTaskNotifyWait() 超時且在超時前沒有收到通知, 則返回 pdFALSE。

三、清除通知狀態和值

3.1 xTaskNotifyStateClear()

在 FreeRTOS 中,xTaskNotifyStateClear() 是一個用于管理任務通知狀態的重要函數。它的核心作用是:清除目標任務的通知pending (待處理)狀態,而不會修改通知值本身

BaseType_t xTaskNotifyStateClear( TaskHandle_t xTask );BaseType_t xTaskNotifyStateClearIndexed( TaskHandle_t xTask, UBaseType_t uxIndexToClear );

3.2 ulTaskNotifyValueClear()

用于清除任務通知的指定標志位ulBitsToClear

uint32_t ulTaskNotifyValueClear( TaskHandle_t xTask, uint32_t ulBitsToClear );uint32_t ulTaskNotifyValueClearIndexed( TaskHandle_t xTask, UBaseType_t uxIndexToClear,uint32_t ulBitsToClear );

ulTaskNotifyValueClear()ulTaskNotifyValueClearIndexed() 是等效的宏。唯一的區別 是 ulTaskNotifyValueClearIndexed() 可以指定任務通知數組任意索引處, 而ulTaskNotifyValueClear()始終在數組索引 0 處的任務通知上運行。

  • 返回值:ulBitsToClear 指定位清零前目標任務的通知值。

四、eAction 值和相關操作

  • eNoAction

    目標任務接收事件,但其通知值不會更新。在這種情況下, 不會使用 ulValue。

  • eSetBits

    目標任務的通知值將與 ulValue 進行按位“或”操作。例如,如果 ulValue 設置為 0x01,則目標任務通知值中的第 0 位將被設置。同樣,如果 ulValue 設置為 0x04,則目標任務通知值中的第 2 位將被設置。通過這種方式,RTOS 任務 通知機制可以作為事件組的輕量級替代方案。

  • eIncrement

    目標任務的通知值將增加 1,這樣調用 xTaskNotifyFromISR() 相當于調用 vTaskNotifyGiveFromISR()。在這種情況下,不會使用 ulValue。

  • eSetValueWithOverwrite

    目標任務的通知值無條件設置為 ulValue。通過這種方式,RTOS 任務 通知機制可以作為 xQueueOverwrite() 的輕量級替代方案。

  • eSetValueWithoutOverwrite

    如果目標任務當前沒有通知pending,則其通知值 將設置為 ulValue。 如果目標任務已有通知在pending,則其通知值 不會更新,以免之前的值在使用前被覆蓋。在這種情況下, 調用 xTaskNotify() 會失敗,返回 pdFALSE。 通過這種方式,RTOS 任務通知機制可以 在長度為 1 的隊列上作為 xQueueSend() 的輕量級替代方案。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/92191.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/92191.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/92191.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Android視圖狀態以及重繪

一、視圖狀態(View States)1. 五種核心狀態狀態作用修改方法特點enabled視圖是否響應交互setEnabled(boolean)禁用狀態下不響應onTouch事件focused視圖是否獲得焦點requestFocus()需同時滿足focusable和focusableInTouchModewindow_focused視圖所在窗口是…

vue3接收SSE流數據進行實時渲染日志

后端使用的是 Spring Boot WebFlux(響應式編程框架),并且返回的是 Server-Sent Events (SSE) 流式數據,那么在 Vue3 中,需要使用 EventSource API 或 fetch 流式讀取 來正確獲取響應內容。方案 1:使用 Eve…

每日五個pyecharts可視化圖表-bars(6)

探索pyecharts庫中條形圖的高級用法與定制技巧 在數據可視化中,條形圖是最常用的圖表類型之一,它能夠清晰地展示不同類別之間的數量對比。今天,我們將繼續學習如何使用pyecharts創建5種不同風格的條形圖。pyecahts源碼 圖表1:帶…

【C語言】文件操作全解析

文章目錄一、為什么需要文件操作?二、認識文件:不止是磁盤上的存儲2.1 程序文件2.2 數據文件2.3 文件名的構成三、文本文件與二進制文件:數據的兩種形態3.1 存儲方式差異3.2 實例對比:整數10000的存儲3.3 二進制文件操作示例四、文…

C結構體的幾種定義形式 + typedef結合使用的好處

struct 語句定義了一個包含多個成員的新的數據類型,struct 語句的格式如下: struct tag { member-list member-list member-list ... } variable-…

SPICE電容矩陣

SPICE電容矩陣: 如果有許多條傳輸線,就可以用下標來標記每一條線。例如,如果有5條線,就用1~5分別標記,依慣例把返回路徑導體標記為導線0。圖10.6給出了5條導線和一個公共返回平面的橫截面圖。首先研究電容器元件,下一節再討論電感器元件。 在這個線的集合中,每對導線之間…

【Java】棧和隊列

文章目錄1.棧1.1 棧的定義1.2 棧的使用1.3 棧的模擬實現2.隊列2.1 隊列的定義2.2 隊列的使用2.3 隊列的模擬實現3.循環隊列3.1 循環隊列的概念3.2 循環隊列判斷空和滿4.雙端隊列Deque1.棧 1.1 棧的定義 棧是一種特殊的線性表,其只允許在固定的一段進行數據的插入或…

【性能測試】---測試工具篇(jmeter)

目錄 1、安裝并啟動jemeter 2、重點組件 2.1、線程組: 2.2、HTTP取樣器?編輯 2.3、查看結果樹 2.4、HTTP請求默認值 2.5、HTTP信息頭管理器 2.6、JSON提取器 2.7、JSON斷言 2.8、同步定時器 2.9、CSV數據文件設置 2.10、HTTP Cookie管理器 3、測試報告…

機器學習(12):拉索回歸Lasso

- 拉索回歸可以將一些權重壓縮到零,從而實現特征選擇。這意味著模型最終可能只包含一部分特征。 - 適用于特征數量遠大于樣本數量的情況,或者當特征間存在相關性時,可以從中選擇最相關的特征。 - 拉索回歸產生的模型可能更簡單,因…

Redis持久化存儲

Redis持久化存儲詳解 一、核心持久化機制 Redis提供兩種主要持久化方式:RDB(快照) 和 AOF(追加文件),以及兩者的混合模式。 RDB(Redis Database)快照持久化 工作原理 RDB通過創建數據…

python學智能算法(三十四)|SVM-KKT條件回顧

【1】引言 前序學習進程中,對軟邊界拉格朗日方程進行了初步構建。 其中約定了兩個拉格朗日乘子要非負,其本質是要滿足KKT條件。 今天就乘此次機會,在回顧一下KKT條件。 【2】定義 當問題無約束的時候,只要讓函數梯度為零&#…

【網絡基礎】計算機網絡發展背景及傳輸數據過程介紹

本文旨在幫助初學者建立起計算機網絡的基礎認知,從網絡的發展背景到網絡協議的分層模型,再到IP與MAC地址的基本概念,全面覆蓋第一階段學習重點。 📌 本節重點 了解計算機網絡的發展背景,掌握局域網(LAN&am…

阿里云-通義靈碼:解鎖云原生智能開發新能力,讓云開發更“靈”~

免責聲明:此篇文章所有內容皆是本人實驗,并非廣告推廣,并非抄襲,如有侵權,請聯系筆者。 每日一句 信念其實就是相信未來, 相信內在, 以及坦然美好的心境。 目錄 每日一句 一. 引言 二.通義…

lesson33:Python協程詳解:從原理到實戰的異步編程指南

目錄 一、協程核心概念:輕量級并發的本質 1.1 什么是協程? 1.2 協程與線程/進程的對比 二、協程工作原理:事件循環與協作式調度 2.1 事件循環(Event Loop):協程的"調度中心" 2.2 協作式調度…

深入理解C++模板進階:非類型參數、特化與分離編譯

前言C模板是泛型編程的核心,它允許我們編寫與類型無關的代碼。在掌握了模板的基礎知識后,我們需要進一步了解模板的高級特性,以便更靈活地使用它們。本文將深入探討三個重要的模板進階主題:非類型模板參數、模板特化以及模板的分離…

使用winsw把SpringBoot項目注冊成window服務

目錄 一、使用winsw注冊 1.1、項目打jar包 1.2、下載winsw 1.3、把 WinSW.NET4.exe 重新命名 1.4、編寫m配置文件用于配置注冊信息 1.5、創建文件夾存放你的文件 1.6、安裝服務 1.7、啟動服務 1.8、卸載服務 1.8、停止服務 一、使用winsw注冊 1.1、項目打jar包 例如項目jar包名…

進階向:Python開發簡易QQ聊天機器人

數字化時代的聊天機器人應用在當今數字化時代,聊天機器人已經成為日常生活和商業活動中不可或缺的一部分。根據市場研究數據顯示,全球聊天機器人市場規模預計將在2026年達到102億美元,年復合增長率達到34.75%。這些智能助手正廣泛應用于以下場…

基于開源鏈動2+1模式AI智能名片S2B2C商城小程序的用戶留存策略研究

摘要:在數字化商業競爭白熱化的當下,用戶留存成為企業可持續發展的核心命題。本文聚焦開源鏈動21模式AI智能名片S2B2C商城小程序這一創新技術組合,通過分析其技術架構、模式創新與生態閉環的協同效應,揭示其在降低用戶決策成本、提…

單詞的劃分(動態規劃)

題目描述有一個很長的由小寫字母組成字符串。為了便于對這個字符串進行分析,需要將它劃分成若干個部分,每個部分稱為一個單詞。出于減少分析量的目的,我們希望劃分出的單詞數越少越好。你就是來完成這一劃分工作的。輸入第一行,一…

C語言學習筆記——文件

目錄1 文件的概念2 程序文件和數據文件3 二進制文件和文本文件4 流4.1 流的概念4.2 標準流5 文件信息區和文件指針6 處理文件的庫函數6.1 fopen6.2 fclose6.3 fgetc6.4 fputc6.5 fgets6.6 fputs6.7 fscanf6.8 fprintf6.9 fread6.10 fwrite6.11 fseek6.12 ftell6.13 rewind6.14 …