【FreeRTOS】FreeRTOS操作系統在嵌入式單片機上裸機移植

目錄

一 RTOS概述

二 FreeRTOS移植

三?FreeRTOS使用

四 附錄


一 RTOS概述

????????

? ? ? ? 先了解一些基礎概念,以下內容摘自FreeRTOS官網(FreeRTOS? - FreeRTOS?):

【1】RTOS基礎知識

????????實時操作系統 (RTOS) 是一種體積小巧、確定性強的計算機操作系統。 RTOS 通常用于需要在嚴格時間限制內對外部事件做出反應的嵌入式系統,如醫療設備和汽車電子控制單元 (ECU)。 通常,此類嵌入式系統中只有一兩項功能需要確定性時序,即使嵌入式系統不需要嚴格的實時反應,使用 RTOS 仍能提供諸多優勢。?

????????RTOS 通常比通用操作系統體積更小、重量更輕,因此 RTOS 非常適用于 內存、計算和功率受限的設備。

【2】多任務處理

????????內核是操作系統的核心組件。Linux 等通用操作系統采用的內核 允許多個用戶看似同時訪問計算機的處理器。這些用戶可以各自執行多個程序,看起來像是并發運行。
每個執行的程序由操作系統控制下的一個或多個線程實現。如果操作系統能夠以這種方式執行多個線程,則稱為多任務處理。 像 FreeRTOS 這樣的小型 RTOS 通常將線程稱為任務,因為它們不支持虛擬內存,因此進程和線程之間沒有區別。
使用多任務操作系統可以簡化原本復雜的軟件應用程序的設計:

  • 操作系統的多任務處理和任務間通信功能允許將復雜的應用程序 劃分為一組更小且更易于管理的任務。
  • 這種劃分可以簡化軟件測試,確保團隊分工明確,并促進代碼復用。
  • 復雜的時序和排序細節將由 RTOS 內核負責,從而減輕了應用程序代碼的負擔。

【3】多任務處理與并發

????????常規單核處理器一次只能執行一個任務,但多任務操作系統可以快速切換任務, 使所有任務看起來像是同時在執行。下圖展示了 三個任務相對于時間的執行模式。任務名稱用不同顏色標示,并寫在左側。時間從左向右移動, 彩色線條顯示在特定時間執行的任務。上方展示了所感知的并發執行模式, 下方展示了實際的多任務執行模式。

?

【4】調度

????????調度器是內核中負責決定在特定時間應執行什么任務的部分。內核 可以在任務的生命周期內多次暫停并恢復該任務。 如果任務 B 取代任務 A 成為當前執行的任務 (即任務 A 暫停,任務 B 恢復),我們就可以稱任務 A “換出”,任務 B “換入”。

????????調度策略是調度器用來決定何時執行哪個任務的算法。在(非實時)多用戶系統中, 調度策略通常會確保每個任務獲得“公平”的處理器時間。實時嵌入式系統中使用的策略詳見下文。

????????只有當調度算法決定執行不同的任務時,任務才會換出。這種切換可能在當前 執行的任務不知情的情況下發生,例如調度算法響應外部事件或定時器到期時; 還可能 發生在執行任務顯式調用某個導致其讓出、休眠(也稱為延遲)或阻塞的 API 函數時。

????????如果某任務讓出,調度算法可能會再次選擇同一任務執行。如果某任務休眠, 則在指定的延遲時間到期前不可被選擇。 同樣,如果某任務阻塞, 則在特定事件發生(例如,數據到達 UART)或超時期滿之前將不可被選擇。

????????操作系統內核負責管理這些任務狀態和轉換, 確保根據調度算法和每個任務的當前狀態在給定時間選擇適當的任務執行。

?

????????參考上圖中的數字標記:

  • 在標記 (1) 處,任務 1 正在執行。
  • 在標記 (2) 處,內核將任務 1 換出……
  • ……并在標記 (3) 處將任務 2 換入。
  • 在任務 2 執行期間,在標記 (4) 處,任務 2 鎖定了處理器外設以進行獨占訪問(圖中不可見)。
  • 在標記 (5) 處,內核將任務 2 換出……
  • ……并在標記 (6) 處將任務 3 換入。
  • 任務 3 試圖訪問之前被任務 2 鎖定的處理器外設,發現其被鎖定,在標記 (7) 處阻塞以等待外設解鎖。
  • 在標記 (8) 處,內核將任務 1 換入。
  • 如此往復。
  • 在標記 (9) 處,任務 2 再次執行,完成對外設的操作并解鎖。
  • 在標記 (10) 處,任務 3 再次執行,發現外設可用,繼續執行直到再次被換出。

【5】實時調度

????????實時操作系統 (RTOS) 利用與通用(非實時)系統相同的原理來實現多任務處理, 但兩者的目標截然不同。這一差異主要體現在調度策略上。實時嵌入式系統 旨在對現實世界的事件作出及時響應。這些事件通常有截止時間, 實時嵌入式系統必須在此之前響應,RTOS 調度策略必須確保遵守這些截止時間要求。

????????為在小型 RTOS(如 FreeRTOS)中實現這一目標,軟件工程師必須為每個任務分配優先級。RTOS 的調度策略 就是確保能夠執行的最高優先級任務獲得處理時間。如果存在多個能夠運行的同等最高優先級任務(既沒有延遲也沒有阻塞),則調度策略可以選擇在這些任務之間“公平”地分配處理時間。

????????這種基本形式的實時調度并非萬能,無法改變時間的快慢,應用程序編寫者必須確保設定的時序約束在所選任務優先級安排下是可行的。

????????以下為最基本的示例,涉及一個帶有鍵盤、LCD 和控制算法的實時系統。

????????用戶每次按鍵后, 必須在合理的時間內獲得視覺反饋,如果用戶在此期間無法看到按鍵已被接受, 則該軟件產品的使用感會很差(軟實時)。如果最長可接受的響應時間是 100 毫秒,則任何介于 0 和 100 毫秒之間的響應都是 可接受的。此功能可作為自主任務實現,結構如下:

void vKeyHandlerTask( void *pvParameters )
{// Key handling is a continuous process and as such the task// is implemented using an infinite loop (as most real-time// tasks are).for( ;; ){[Block to wait for a key press event][Process the key press]}
}

????????現在假設實時系統還在執行依賴于數字濾波輸入的控制功能。輸入必須 每 2 毫秒采樣一次、濾波一次并執行控制周期。為了正確操作濾波器,采樣時間 必須精確到 0.5 毫秒。此功能可作為自主任務實現,結構如下:

void vControlTask( void *pvParameters )
{for( ;; ){[Delay waiting for 2ms since the start of the previous cycle][Sample the input][Filter the sampled input][Perform control algorithm][Output result]}
}

軟件工程師必須為控制任務分配最高優先級,因為:

  1. 控制任務的截止時間比按鍵處理任務更嚴格。
  2. 錯過截止時間對控制任務的后果比對按鍵處理任務更嚴重。

下圖演示了實時操作系統如何調度這些任務。RTOS 會自行創建一個任務,即空閑任務, 僅當沒有其他任務能夠執行時,該任務才會執行。RTOS 空閑任務總是處于 可以執行的狀態。

?

????????請參閱上圖:

  • 起初,兩個任務都不能運行:vControlTask 等待合適的時間來開始新的控制周期, 而 vKeyHandlerTask 則在等待按鍵操作。處理器時間分配給了 RTOS 空閑任務。
  • 在時間 t1 處,發生按鍵事件。vKeyHandlerTask 可以執行,其優先級高于 RTOS 空閑任務, 因此獲得了處理器時間。
  • 在時間 t2 處,vKeyHandlerTask 已完成按鍵處理并更新 LCD。在按下另一個鍵之前該任務無法繼續執行, 因此將自己掛起,RTOS 空閑任務恢復執行。
  • 在時間 t3 處,定時器事件指示執行下一個控制循環的時間到了。vControlTask 現在可以執行, 因為優先級最高的任務被立刻分配了處理器時間。
  • 在時間 t3 和 t4 之間,vControlTask 仍在執行時,發生了按鍵事件。vKeyHandlerTask 可以執行, 但由于其優先級低于 vControlTask,因此未獲得任何處理器時間。
  • 在 t4 處, vControlTask 完成了控制周期的處理,并且直到下一次定時事件的發生前不能重新開始運行, 進入阻塞態。vKeyHandlerTask 現在成為可以運行的最高優先級的任務, 因此獲得處理器時間以處理先前的按鍵事件。
  • 在 t5 處,按鍵事件處理完成,并且 vKeyHandlerTask 進入阻塞態等待下一次按鍵事件。再一次, 兩個任務都未進入就緒態,RTOS 空閑任務獲得處理器時間。
  • 在 t5 與 t6 之間,定時事件發生并處理,沒有進一步的按鍵事件發生。
  • 在 t6 處發生按鍵事件,但在 vKeyHandlerTask 完成按鍵處理之前,發生了定時事件。 此時兩個任務都可以執行。由于 vControlTask 具有更高的優先級, 因此 vKeyHandlerTask 在完成按鍵操作之前被掛起,vControlTask 獲得處理器時間。
  • 在 t8 處,vControlTask 完成控制周期的處理,然后進入阻塞態等待下一次事件。vKeyHandlerTask 再次 成為運行的最高優先級任務,因此獲得處理器時間,以便完成按鍵處理 。

二 FreeRTOS移植

? ? ? ? 本文使用RTOS中應用最為廣泛,且開源免費的FreeRTOS進行移植。

【1】下載FreeRTOS

? ? ? ? 官網下載(下載 FreeRTOS - FreeRTOS?),我這邊選擇?FreeRTOSv202406.01-LTS 版本

?

【2】添加工程

? ? ? ? (1)解壓縮下載下來的包,這邊的移植只需要用到內核文件夾,所以取文件夾中?FreeRTOS-LTS\FreeRTOS\FreeRTOS-Kernel 路徑,將文件夾 FreeRTOS-Kernel 整體拖出來備用:

?

? ? ? ? (2)Keil工程中添加 FreeRTOS/srcFreeRTOS/port? 、 FreeRTOS/config 三個group,分別將下面的文件加入到工程中,其中:

  • FreeRTOS/src?中文件最外層根目錄下;
  • FreeRTOS/port??中文件 port.c 在?FreeRTOS\portable\RVDS\ARM_CM0\? 中(根據自己移植芯片的內核選擇)、heap_4.c 在 FreeRTOS\portable\MemMang\ 中(根據選用的內存管理方式進行選擇,詳情可以參考https://zhuanlan.zhihu.com/p/12892844067);
  • FreeRTOS/config?中文件 FreeRTOSConfig.h 在例程examples中獲取或者自己新建一個均可,我這邊采用自己新建的方式,包含詳細注釋,可以參考下文;

?

? ? ? ? 頭文件的包含如下:

?

【3】文件修改

? ? ? ? 主要針對配置文件?FreeRTOSConfig.h 進行修改,包含芯片支持庫頭文件 #include "hc32f072.h"?以及CPU主頻定義 extern uint32_t SystemCoreClock;

????????其他宏定義可以根據自己的工程實現進行裁剪:

#ifndef FREERTOS_CONFIG_H
#define FREERTOS_CONFIG_H#include "hc32f072.h"
extern uint32_t SystemCoreClock;#define configUSE_PREEMPTION                1//搶占式調度器開關
#define configUSE_IDLE_HOOK                 0//空閑任務鉤子函數
#define configUSE_TICK_HOOK                 0//時間片鉤子函數
#define configCPU_CLOCK_HZ                  ( SystemCoreClock )//CPU主頻
#define configTICK_RATE_HZ                  ( ( TickType_t ) 1000 )//RTOS節拍頻率 即1秒的中斷次數
#define configMAX_PRIORITIES                ( 5 )//可使用的最大優先級
#define configMINIMAL_STACK_SIZE            ( ( unsigned short ) 60 )//定義空閑任務使用的堆棧大小
#define configTOTAL_HEAP_SIZE               ( ( size_t ) ( 8*1024 ) )//RTOS內核總計可用的有效的RAM大小
#define configMAX_TASK_NAME_LEN             ( 12 )//任務名最大長度
#define configUSE_TRACE_FACILITY            1//是否啟動可視化跟蹤調試
#define configUSE_16_BIT_TICKS              0//系統節拍計數器的變量類型  0為32位 1為16為
#define configIDLE_SHOULD_YIELD             1//空閑任務放棄CPU使用權給其他同優先級的用戶任務
#define configUSE_MUTEXES                   1//是否使用互斥信號量
#define configQUEUE_REGISTRY_SIZE           8//設置可以注冊的信號量和消息隊列個數
#define configCHECK_FOR_STACK_OVERFLOW      0//堆棧溢出檢查 大于0有效
#define configUSE_RECURSIVE_MUTEXES         1//是否使用遞歸互斥信號量
#define configUSE_MALLOC_FAILED_HOOK        0//內存申請失敗鉤子函數
#define configUSE_APPLICATION_TASK_TAG      0//為任務分配標簽
#define configUSE_COUNTING_SEMAPHORES       1//是否使用計數信號量
#define configGENERATE_RUN_TIME_STATS       0//是否啟用運行時間統計功能/* Co-routine definitions. */
#define configUSE_CO_ROUTINES               0//啟用協程,啟用協程以后必須添加文件croutine.c
#define configMAX_CO_ROUTINE_PRIORITIES     ( 2 )//協程的有效優先級數目/* Software timer definitions. */
#define configUSE_TIMERS                    0//是否啟用軟件定時器
#define configTIMER_TASK_PRIORITY           ( 2 )//軟件定時器優先級
#define configTIMER_QUEUE_LENGTH            ( 5 )//軟件定時器隊列長度
#define configTIMER_TASK_STACK_DEPTH        ( 80 )//軟件定時器任務堆棧大小/* Set the following definitions to 1 to include the API function, or zero
to exclude the API function. *///是否啟用RTOS API函數
#define INCLUDE_vTaskPrioritySet            1
#define INCLUDE_uxTaskPriorityGet           1
#define INCLUDE_vTaskDelete                 1
#define INCLUDE_vTaskCleanUpResources       1
#define INCLUDE_vTaskSuspend                1
#define INCLUDE_vTaskDelayUntil             1
#define INCLUDE_vTaskDelay                  1/* Normal assert() semantics without relying on the provision of an assert.h
header file. */
#define configASSERT( x ) if( ( x ) == 0 )  { taskDISABLE_INTERRUPTS(); for( ;; ); }/* Definitions that map the FreeRTOS port interrupt handlers to their CMSIS
standard names - or at least those used in the unmodified vector table. */
#define vPortSVCHandler SVC_Handler
#define xPortPendSVHandler PendSV_Handler
#define xPortSysTickHandler SysTick_Handler#endif /* FREERTOS_CONFIG_H */

? ? ? ? 至此移植完成。

三?FreeRTOS使用

? ? ? ? (1)實現任務創建函數 FreeRTOS_TaskCreate

void STA_Task(void* param);
void IO_Task(void* param);
void TMP_Task(void* param);static TaskHandle_t AppStaTask_handle = NULL;
static TaskHandle_t AppIOTask_handle = NULL;
static TaskHandle_t AppTmpTask_handle = NULL;#define STA_TASK_SIZE 128
#define IO_TASK_SIZE 512
#define TMP_TASK_SIZE 128int FreeRTOS_TaskCreate(void)
{BaseType_t xReturn1 = pdPASS;BaseType_t xReturn2 = pdPASS;//創建心跳燈任務xReturn1 = xTaskCreate((TaskFunction_t )STA_Task,       //任務入口函數(const char*    )"StaTask",         //任務名字(uint16_t       )STA_TASK_SIZE,     //任務棧大小(void*          )NULL,              //任務入口函數參數(UBaseType_t    )2,                 //任務的優先級(TaskHandle_t*  )&AppStaTask_handle);//任務控制塊指針//創建輸入輸出任務xReturn2 = xTaskCreate((TaskFunction_t )IO_Task,        //任務入口函數(const char*    )"IOTask",          //任務名字(uint16_t       )IO_TASK_SIZE,      //任務棧大小(void*          )NULL,              //任務入口函數參數(UBaseType_t    )3,                 //任務的優先級(TaskHandle_t*  )&AppIOTask_handle);//任務控制塊指針//創建加熱任務(按鍵蜂鳴加熱溫度采樣)xReturn1 = xTaskCreate((TaskFunction_t )TMP_Task,       //任務入口函數(const char*    )"TmpTask",         //任務名字(uint16_t       )TMP_TASK_SIZE,     //任務棧大小(void*          )NULL,              //任務入口函數參數(UBaseType_t    )4,                 //任務的優先級(TaskHandle_t*  )&AppTmpTask_handle);//任務控制塊指針if (pdPASS != xReturn1 || pdPASS != xReturn2){return -1;  // 任務創建失敗}vTaskStartScheduler();//啟動調度return 0;
}

????????

????????(2)實現三個任務入口函數 STA_Task IO_Task TMP_Task

void STA_Task(void* param)
{while(1){// 計算棧使用總量和百分比UBaseType_t uxUsedStackSize = STA_TASK_SIZE - uxTaskGetStackHighWaterMark(NULL);UBaseType_t uxUsagePercentage = (uxUsedStackSize * 100) / STA_TASK_SIZE;// 打印棧使用總量和百分比Dbg_Printf("STA_Task-->Stack Used: %u/%u (%u%%)\r\n", (unsigned int)uxUsedStackSize, (unsigned int)STA_TASK_SIZE, (unsigned int)uxUsagePercentage);vTaskDelay(1000);}
}void IO_Task(void* param)
{while(1){// 計算棧使用總量和百分比UBaseType_t uxUsedStackSize = IO_TASK_SIZE - uxTaskGetStackHighWaterMark(NULL);UBaseType_t uxUsagePercentage = (uxUsedStackSize * 100) / IO_TASK_SIZE;// 打印棧使用總量和百分比Dbg_Printf("IO_Task-->Stack Used: %u/%u (%u%%)\r\n", (unsigned int)uxUsedStackSize, (unsigned int)IO_TASK_SIZE, (unsigned int)uxUsagePercentage);vTaskDelay(1000);}
}void TMP_Task(void* param)
{while(1){// 計算棧使用總量和百分比UBaseType_t uxUsedStackSize = TMP_TASK_SIZE - uxTaskGetStackHighWaterMark(NULL);UBaseType_t uxUsagePercentage = (uxUsedStackSize * 100) / TMP_TASK_SIZE;// 打印棧使用總量和百分比Dbg_Printf("TMP_Task-->Stack Used: %u/%u (%u%%)\r\n", (unsigned int)uxUsedStackSize, (unsigned int)TMP_TASK_SIZE, (unsigned int)uxUsagePercentage);vTaskDelay(1000);}
}

????????

????????(3)主函數包含頭文件 FreeRTOS.h 、task.h ,創建任務 FreeRTOS_TaskCreate 并啟動:

#include "ddl.h"
#include "Dbg.h"#include "FreeRTOS.h"
#include "task.h"static void App_SysClkInit(void)
{stc_sysctrl_clk_cfg_t stcCfg;stc_sysctrl_pll_cfg_t stcPLLCfg;Sysctrl_SetPeripheralGate(SysctrlPeripheralFlash, TRUE);    ///< 使能FLASH模塊的外設時鐘Flash_WaitCycle(FlashWaitCycle1);Sysctrl_SetRCHTrim(SysctrlRchFreq4MHz);             ///< PLL使用RCH作為時鐘源,因此需要先設置RCHstcPLLCfg.enInFreq    = SysctrlPllInFreq4_6MHz;     ///< RCH 4MHzstcPLLCfg.enOutFreq   = SysctrlPllOutFreq36_48MHz;  ///< PLL 輸出48MHzstcPLLCfg.enPllClkSrc = SysctrlPllRch;              ///< 輸入時鐘源選擇RCHstcPLLCfg.enPllMul    = SysctrlPllMul12;            ///< 4MHz x 12 = 48MHzSysctrl_SetPLLFreq(&stcPLLCfg);///< 選擇PLL作為HCLK時鐘源;stcCfg.enClkSrc  = SysctrlClkPLL;///< HCLK SYSCLK/2stcCfg.enHClkDiv = SysctrlHclkDiv1;///< PCLK 為HCLK/8stcCfg.enPClkDiv = SysctrlPclkDiv1;///< 系統時鐘初始化Sysctrl_ClkInit(&stcCfg);//    ///< 使用外部晶振
//    Sysctrl_SetXTHFreq(SysctrlXthFreq8_16MHz);
//    Sysctrl_XTHDriverCfg(SysctrlXtalDriver1);
//    Sysctrl_SetXTHStableTime(SysctrlXthStableCycle16384);
//    Sysctrl_ClkSourceEnable(SysctrlClkXTH, TRUE);
//    delay1ms(10);//    ///< 時鐘切換
//    Sysctrl_SysClkSwitch(SysctrlClkXTH);
}int32_t main(void)
{//系統時鐘App_SysClkInit();//打印初始化(調試用)Dbg_Init();Dbg_Cfg();//創建任務并啟動FreeRTOS_TaskCreate();while(1);
}

? ? ? ? (4)實現任務切換效果如下:

?

四 附錄

?【1】FreeRTOS官網:FreeRTOS? - FreeRTOS?

【2】掌握 FreeRTOS 實時內核:https://freertoskernel.asicfans.com/

【3】野火開發板的RTOS學習:[野火]STM32MP1-FreeRTOS應用開發實戰指南——基于STM32MP157開發板 — [野火]STM32MP1-FreeRTOS應用開發實戰指南——基于STM32MP157開發板 文檔

【4】FreeRTOS操作系統幾種典型的進程間通信方式及使用示例:【FreeRTOS】FreeRTOS操作系統幾種典型的進程間通信方式及使用示例-CSDN博客

【5】FreeRTOS學習:https://zhuanlan.zhihu.com/p/650595248

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

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

相關文章

文件包含漏洞第一關

一、什么是文件包含漏洞 1.文件包含漏洞概述 和SQL注入等攻擊方式一樣&#xff0c;文件包含漏洞也是一種注入型漏洞&#xff0c;其本質就是輸入一段用戶能夠控制的腳本或者代碼&#xff0c;并讓服務端執行。 什么叫包含呢&#xff1f;以PHP為例&#xff0c;我們常常把可重復使…

瑞芯微RK3576(1)-硬件設計

過年期間&#xff0c;趁著放假時間做了一款3576的核心板 方案是2G DDR432G emmc 引出所有IO口 關于接口方面&#xff0c;考慮了一段時間&#xff0c;最終決定使用BTB的模式&#xff0c;主要是能夠出更多的IO&#xff0c;方便拆卸&#xff0c;最讓我擔心的是BTB的位置問題 為了…

Java 大視界 -- Java 大數據在智能醫療藥品研發數據分析與決策支持中的應用(126)

&#x1f496;親愛的朋友們&#xff0c;熱烈歡迎來到 青云交的博客&#xff01;能與諸位在此相逢&#xff0c;我倍感榮幸。在這飛速更迭的時代&#xff0c;我們都渴望一方心靈凈土&#xff0c;而 我的博客 正是這樣溫暖的所在。這里為你呈上趣味與實用兼具的知識&#xff0c;也…

JWT的學習

1、HTTP無狀態及解決方案 HTTP一種是無狀態的協議&#xff0c;每次請求都是一次獨立的請求&#xff0c;一次交互之后就是陌生人。 以CSDN為例&#xff0c;先登錄一次&#xff0c;然后瀏覽器退出&#xff0c;這個時候在進入CSDN&#xff0c;按理說服務器是不知道你已經登陸了&…

時序和延時

1、延遲模型的類型 verilog有三種類型的延遲模型&#xff1a;分布延遲 、 集總延遲 、 路徑延遲&#xff08;pin to pin&#xff09; 1.1、 分布延遲 分布延遲是在每個獨立元件的基礎上進行定義的。 module M(output wire out ,input wire a …

SpringBoot基礎Kafka示例

這里將生產者和消費者放在一個應用中 使用的Boot3.4.3 引入Kafka依賴 <dependency><groupId>org.springframework.kafka</groupId><artifactId>spring-kafka</artifactId> </dependency>yml配置 spring:application:name: kafka-1#kafka…

API調試工具的無解困境:白名單、動態IP與平臺設計問題

引言 你是否曾經在開發中遇到過這樣的尷尬情形&#xff1a;你打開了平臺的API調試工具&#xff0c;準備一番操作&#xff0c;結果卻發現根本無法連接到平臺&#xff1f;別急&#xff0c;問題出在調試工具本身。今天我們要吐槽的就是那些神奇的開放平臺API調試工具&#xff0c;…

多方安全計算(MPC)電子拍賣系統

目錄 一、前言二、多方安全計算(MPC)與電子拍賣系統概述2.1 多方安全計算(MPC)的基本概念2.2 電子拍賣系統背景與需求三、MPC電子拍賣系統設計原理3.1 系統總體架構3.2 電子拍賣中的安全協議3.3 數學與算法證明四、數據加解密模塊設計五、GPU加速與系統性能優化六、GUI設計與系…

【Linux篇】初識Linux指令(上篇)

Linux命令世界&#xff1a;從新手到高手的必備指南 一 Linux發展與歷史1.1 Linux起源與發展1.2 Linux與Windows操作系統對比 二 Linux常用操作指令2.1 ls命令 - “List”&#xff08;列出文件)2.2 pwd指令- "打印當前工作目錄"2.3 cd指令 - “Change Directory”&…

編程視界:C++命名空間

目錄 命名空間 為什么要使用命名空間 什么是命名空間 命名空間的使用方式 關鍵點總結 命名空間的嵌套使用 匿名命名空間 跨模塊調用問題 命名空間可以多次定義 總結 首先從C的hello,world程序入手&#xff0c;來認識一下C語言 #include <iostream> using name…

Redux 和 MobX 高頻面試題

Redux 和 MobX 是 React 生態中的兩大狀態管理方案&#xff0c;在面試中常涉及 原理、使用方式、對比、最佳實踐 等方面。以下是 高頻面試題 詳細答案&#xff0c;助你輕松應對面試&#xff01;&#x1f680; &#x1f525; Redux 部分 1. Redux 是什么&#xff1f;為什么需要…

Excel 保護工作簿:它能解決哪些問題?如何正確使用?

在日常辦公中&#xff0c;Excel 表格常常涉及多人協作、重要數據保護&#xff0c;甚至是避免誤操作的情況。這時候&#xff0c;“保護工作簿”功能就能派上用場。它能有效防止他人修改表結構、刪除工作表&#xff0c;甚至可以設置密碼&#xff0c;確保數據的完整性和安全性。今…

Android Retrofit 框架注解定義與解析模塊深度剖析(一)

一、引言 在現代 Android 和 Java 開發中&#xff0c;網絡請求是不可或缺的一部分。Retrofit 作為 Square 公司開源的一款強大的類型安全的 HTTP 客戶端&#xff0c;憑借其簡潔易用的 API 和高效的性能&#xff0c;在開發者社區中廣受歡迎。Retrofit 的核心特性之一便是通過注…

C# Enumerable類 之 數據分組

總目錄 前言 在 C# 中&#xff0c;System.Linq.Enumerable 類是 LINQ&#xff08;Language Integrated Query&#xff09;的核心組成部分&#xff0c;它提供了一系列靜態方法&#xff0c;用于操作實現了 IEnumerable 接口的集合。通過這些方法&#xff0c;我們可以輕松地對集合…

推理模型對SQL理解能力的評測:DeepSeek r1、GPT-4o、Kimi k1.5和Claude 3.7 Sonnet

引言 隨著大型語言模型&#xff08;LLMs&#xff09;在技術領域的應用日益廣泛&#xff0c;評估這些模型在特定技術任務上的能力變得越來越重要。本研究聚焦于四款領先的推理模型——DeepSeek r1、GPT-4o、Kimi k1.5和Claude 3.7 Sonnet在SQL理解與分析方面的能力&#xff0c;…

IDEA接入阿里云百煉中免費的通義千問[2025版]

安裝deepseek 上一篇文章IDEA安裝deepseek最新教程2025中說明了怎么用idea安裝codeGPT插件&#xff0c;并接入DeepSeek&#xff0c;無奈接入的官方api已經不能使用了&#xff0c;所以我們嘗試從其他地方接入 阿里云百煉https://bailian.console.aliyun.com/ 阿里云百煉?是阿…

實施一套先進的智能攝像頭服務系統。

一、項目背景 隨著物聯網、人工智能和大數據技術的飛速發展&#xff0c;智能攝像頭已成為家庭、企業以及公共安全領域的重要設備。其便捷、高效、智能的特點&#xff0c;使得市場需求日益增長。為了滿足用戶對智能監控的多樣化需求&#xff0c;提供更加全面、可靠的監控服務&a…

linux自啟動服務

在Linux環境中&#xff0c;systemd是一個系統和服務管理器&#xff0c;它為每個服務使用.service文件進行配置。systemctl是用于控制系統服務的主要工具。本文將詳細介紹如何使用systemctl來管理vsftpd服務&#xff0c;以及如何設置服務自啟動。 使用Systemd設置自啟動服務 創…

010-Catch2

Catch2 一、框架簡介 Catch2 是一個基于 C 的現代化單元測試框架&#xff0c;支持 TDD&#xff08;測試驅動開發&#xff09;和 BDD&#xff08;行為驅動開發&#xff09;模式。其核心優勢在于&#xff1a; 單頭文件設計&#xff1a;v2.x 版本僅需包含 catch.hpp 即可使用自然…

數字人分身開發指南:從概念到實戰

一、什么是數字人分身&#xff1f; 想象一下&#xff0c;在電腦或手機屏幕里&#xff0c;一個能跟你聊天、回答問題&#xff0c;甚至還能做表情的虛擬角色。這就是數字人分身&#xff0c;它用上了人工智能技術&#xff0c;讓機器也能像人一樣交流。無論是在線客服、網絡主播還…