STM32系統定時器(SysTick)詳解:從原理到實戰的精確延時與任務調度

前言:為什么SysTick是嵌入式開發的"瑞士軍刀"?

在STM32開發中,我們經常需要精確的延時功能(如毫秒級延時控制LED閃爍)或周期性任務調度(如定時采集傳感器數據)。實現這些功能的方式有很多,比如使用外設定時器(TIM2-TIM5),但這類定時器往往需要占用GPIO引腳和外設資源。

而Cortex-M內核自帶的SysTick(系統定時器) 完美解決了這一問題——它是內核集成的16位定時器,無需占用外設資源,可直接用于系統延時、RTOS任務調度等核心功能。無論是裸機開發還是RTOS環境,SysTick都是不可或缺的"基礎組件"。

本文將從SysTick的硬件結構講起,詳細解析其工作原理、配置方法、實戰應用(如精確延時函數、RTOS調度),并結合代碼示例,幫助你徹底掌握這一"輕量級定時器"的使用技巧。

一、SysTick系統定時器概述

1.1 SysTick的核心特性

SysTick(System Tick Timer)是Cortex-M0/M3/M4/M7等內核標配的定時器,其核心特性如下:

特性說明
位數16位遞減計數器,最大計數值為65535(0xFFFF)
計數模式僅支持遞減計數(從裝載值減到0后自動重裝載)
時鐘源可選兩種時鐘源:
- 內核時鐘(HCLK)
- 內核時鐘/8(HCLK/8)
中斷支持計數到0時可觸發中斷(SysTick_IRQn)
資源占用內核集成,不占用外設定時器資源(如TIM2-TIM5)
典型應用系統延時函數(delay_ms/delay_us)、RTOS任務調度、周期性任務觸發

為什么選擇SysTick?

  • 無需配置GPIO引腳,簡化硬件設計;
  • 內核級定時器,響應速度比外設定時器更快;
  • 跨平臺兼容(所有Cortex-M內核通用),代碼可移植性強;
  • 適合作為系統級定時器(如RTOS的時基)。

1.2 SysTick與外設定時器的區別

STM32的外設定時器(如TIM2-TIM5)功能強大,但與SysTick相比有明顯差異:

對比項SysTick外設定時器(如TIM3)
所屬模塊Cortex-M內核STM32外設
功能復雜度簡單(僅定時中斷)復雜(PWM、輸入捕獲、編碼器接口等)
資源占用無外設資源占用占用定時器外設和GPIO引腳
適用場景系統延時、RTOS時基復雜定時任務(如PWM輸出、頻率測量)
移植性跨Cortex-M平臺兼容僅限特定STM32型號

總結:SysTick適合做"系統基石"(如延時、調度),外設定時器適合做"專項任務"(如電機控制、傳感器數據采集)。

二、SysTick硬件結構與寄存器解析

2.1 核心寄存器

SysTick通過3個寄存器實現全部功能,所有寄存器都是32位,但實際有效位根據功能有所不同:

寄存器名稱地址范圍功能描述
SYST_CSR0xE000E010控制與狀態寄存器,負責使能定時器、選擇時鐘源、查看計數狀態
SYST_RVR0xE000E014重裝載值寄存器,存儲計數最大值(遞減到0后自動裝載此值)
SYST_CVR0xE000E018當前值寄存器,存儲當前計數數值,寫入任意值可清零
SYST_CALIB0xE000E01C校準值寄存器,存儲出廠校準信息(一般不使用)
(1)控制與狀態寄存器(SYST_CSR)
位段功能描述
0位(ENABLE)定時器使能位:0=關閉,1=開啟
1位(TICKINT)中斷使能位:0=計數到0不觸發中斷,1=計數到0觸發中斷
2位(CLKSOURCE)時鐘源選擇:0=HCLK/8,1=HCLK(內核時鐘)
16位(COUNTFLAG)計數標志位:1=已計數到0(讀寄存器后自動清零)

示例:配置SysTick為HCLK/8時鐘源,使能中斷并啟動定時器:

SYST_CSR = (1 << 0) | (1 << 1) | (0 << 2);  // ENABLE=1, TICKINT=1, CLKSOURCE=0
(2)重裝載值寄存器(SYST_RVR)
  • 低16位有效(16位定時器),高16位保留;
  • 存儲遞減計數的最大值,計數到0后自動重新裝載此值;
  • 若設置為0,則定時器不工作(每次計數到0后停止)。

最大計數范圍:0~65535(16位),若時鐘源為72MHz/8=9MHz,則最大定時時間為:65535 / 9MHz ≈ 7.28ms(超過此值會溢出)。

(3)當前值寄存器(SYST_CVR)
  • 低16位有效,存儲當前計數數值;
  • 讀取時返回當前計數值,寫入任意值會將計數器清零;
  • 計數到0時,COUNTFLAG(SYST_CSR的16位)置1。

清零計數器示例

SYST_CVR = 0;  // 寫入任意值(如0),計數器清零

2.2 工作原理

SysTick的工作流程如下:

  1. 配置SYST_RVR寄存器,設置重裝載值(如9000);
  2. 配置SYST_CSR寄存器,選擇時鐘源(如HCLK/8)并使能定時器;
  3. 計數器從SYST_RVR的值開始遞減計數(9000→8999→…→0);
  4. 計數到0時:
    • 若TICKINT=1(使能中斷),則觸發SysTick_IRQn中斷;
    • COUNTFLAG(SYST_CSR.16)置1;
    • 自動重新裝載SYST_RVR的值,重復計數。

定時時間計算公式

定時時間(秒)= 重裝載值 / 時鐘源頻率(Hz)

例如:時鐘源=9MHz(72MHz/8),重裝載值=9000 → 定時時間=9000/9e6=0.001秒=1ms。

三、SysTick配置步驟(HAL庫與寄存器兩種方式)

3.1 HAL庫配置(適合新手)

STM32Cube HAL庫提供了SysTick的封裝函數,無需直接操作寄存器,適合快速開發。

步驟1:CubeMX配置SysTick
  1. 新建工程,選擇STM32型號(如F103C8T6);
  2. 配置系統時鐘(HCLK=72MHz);
  3. SysTick無需額外配置(默認用于HAL_Delay函數),若需自定義,需在代碼中重配置。
步驟2:HAL庫函數解析

HAL庫中與SysTick相關的核心函數:

函數名功能描述
HAL_InitTick()初始化SysTick,用于HAL_Delay函數(默認配置)
HAL_SYSTICK_Config()配置SysTick定時器(設置重裝載值和中斷)
HAL_Delay()基于SysTick的毫秒級延時函數

自定義SysTick中斷示例

// 初始化SysTick,配置為1ms中斷
void SysTick_Init(void)
{// 時鐘源=HCLK/8=72MHz/8=9MHz,1ms需計數9000次if (HAL_SYSTICK_Config(SystemCoreClock / 8 / 1000) != 0){Error_Handler();  // 配置失敗}// 設置SysTick中斷優先級(最低優先級)HAL_NVIC_SetPriority(SysTick_IRQn, 15, 0);
}// SysTick中斷服務函數(在stm32f1xx_it.c中)
void SysTick_Handler(void)
{HAL_IncTick();  // HAL庫的系統滴答計數(用于HAL_Delay)User_SysTick_Callback();  // 用戶自定義回調函數
}// 用戶自定義回調(如定時執行任務)
void User_SysTick_Callback(void)
{static uint32_t cnt = 0;if (++cnt >= 1000)  // 1ms中斷,1000次=1秒{cnt = 0;HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);  // 翻轉LED}
}

3.2 寄存器直接配置(適合進階)

直接操作寄存器可跳過HAL庫的封裝,提高效率,適合對實時性要求高的場景。

步驟1:初始化SysTick定時器
// 初始化SysTick,時鐘源=HCLK/8,定時1ms中斷
void SysTick_Init(void)
{// 1. 關閉定時器SYST_CSR &= ~(1 << 0);  // ENABLE=0// 2. 清零計數器SYST_CVR = 0;// 3. 設置重裝載值(9000 = 9MHz * 1ms)SYST_RVR = 9000;// 4. 配置時鐘源(HCLK/8)和中斷SYST_CSR |= (1 << 1) | (0 << 2);  // TICKINT=1(使能中斷),CLKSOURCE=0(HCLK/8)// 5. 設置中斷優先級(最低優先級)NVIC_SetPriority(SysTick_IRQn, 15);NVIC_EnableIRQ(SysTick_IRQn);// 6. 使能定時器SYST_CSR |= (1 << 0);  // ENABLE=1
}
步驟2:實現中斷服務函數
// SysTick中斷服務函數
void SysTick_Handler(void)
{static uint32_t ms_cnt = 0;// 1ms中斷一次,每1秒翻轉LEDif (++ms_cnt >= 1000){ms_cnt = 0;GPIOC->ODR ^= GPIO_PIN_13;  // 翻轉PC13(LED)}
}

3.3 兩種配置方式的對比

配置方式優點缺點適用場景
HAL庫簡單易用,無需了解寄存器細節代碼冗余,效率稍低快速開發、新手入門
寄存器直接操作代碼精簡,執行效率高需了解寄存器結構,移植性稍差對實時性要求高的場景、底層優化

四、實戰案例:SysTick的典型應用

4.1 案例1:實現精確延時函數(delay_us/delay_ms)

SysTick最常用的功能是實現微秒級和毫秒級延時,替代低效的for循環延時。

實現思路
  • delay_us:根據微秒數計算需要的計數次數,等待計數器減到0;
  • delay_ms:基于delay_us實現,循環調用微秒延時(注意16位定時器的最大延時限制);
  • 關閉中斷(避免中斷干擾延時精度)。
代碼實現
// 時鐘源:HCLK/8=9MHz(1us≈9個計數周期)
#define SYSTICK_CLK 9000000  // 9MHz// 微秒級延時(最大約7280us,超過會溢出)
void delay_us(uint32_t us)
{uint32_t ticks;uint32_t start;// 計算需要的計數值(向上取整)ticks = us * (SYSTICK_CLK / 1000000);// 關閉SysTick中斷(避免干擾)SYST_CSR &= ~(1 << 1);  // TICKINT=0// 設置重裝載值SYST_RVR = ticks - 1;  // 計數從ticks-1到0,共ticks次// 清零計數器并啟動SYST_CVR = 0;SYST_CSR |= (1 << 0);  // ENABLE=1// 等待計數完成(COUNTFLAG置1)do{start = SYST_CSR;} while (!(start & (1 << 16)));  // 等待COUNTFLAG=1// 停止定時器并恢復中斷SYST_CSR &= ~(1 << 0);  // ENABLE=0SYST_CSR |= (1 << 1);   // 恢復TICKINT=1
}// 毫秒級延時(通過多次調用delay_us實現)
void delay_ms(uint32_t ms)
{while (ms--){delay_us(1000);  // 每次延時1000us=1ms}
}
關鍵注意事項
  • 最大延時限制:16位計數器的最大計數值為65535,若時鐘源為9MHz,則delay_us的最大支持值為:65535 / 9 ≈ 7281us(約7.28ms),超過此值需分多次調用;
  • 中斷影響:延時過程中關閉SysTick中斷(TICKINT=0),避免中斷打亂計數;
  • 時鐘源一致性:延時函數的精度依賴于時鐘源頻率的準確性,需確保HCLK配置正確(如72MHz)。

4.2 案例2:SysTick作為RTOS的時基(以FreeRTOS為例)

RTOS(如FreeRTOS)需要一個系統時基來實現任務調度,SysTick是最常用的選擇。

FreeRTOS中配置SysTick
// FreeRTOS配置文件(FreeRTOSConfig.h)
#define configUSE_SYSTICK_TIMER     1  // 使用SysTick作為時基
#define configTICK_RATE_HZ          1000  // 時基頻率1000Hz(1ms一次中斷)// 初始化FreeRTOS時,自動配置SysTick
int main(void)
{HAL_Init();SystemClock_Config();  // 配置HCLK=72MHz// 創建任務xTaskCreate(LED_Task, "LED Task", 128, NULL, 1, NULL);// 啟動調度器(內部會配置SysTick為1ms中斷)vTaskStartScheduler();while (1);  // 不會執行到這里
}// LED任務(每500ms翻轉一次LED)
void LED_Task(void *pvParameters)
{while (1){HAL_GPIO_TogglePin(GPIOC, GPIO_PIN_13);vTaskDelay(pdMS_TO_TICKS(500));  // 延時500ms(基于SysTick)}
}
原理說明
  • FreeRTOS的vTaskDelay()函數依賴SysTick的定時中斷;
  • 每1ms觸發一次SysTick中斷,FreeRTOS在中斷中更新任務狀態(如延時計數器減1);
  • 任務調度器根據時基判斷任務是否就緒,實現多任務切換。

4.3 案例3:高頻數據采集(10kHz采樣率)

SysTick的中斷響應速度快,適合作為高頻數據采集的觸發源(如10kHz采樣率)。

// 全局變量:采樣數據緩沖區
uint16_t adc_buf[1000];
uint16_t adc_idx = 0;// 初始化SysTick為10kHz中斷(100us一次)
void SysTick_Init_10kHz(void)
{SYST_CSR &= ~(1 << 0);  // 關閉定時器SYST_CVR = 0;           // 清零計數器SYST_RVR = 900;         // 9MHz / 900 = 10kHz(100us)SYST_CSR |= (1 << 1) | (0 << 2);  // 使能中斷,時鐘源HCLK/8NVIC_SetPriority(SysTick_IRQn, 0);  // 高優先級SYST_CSR |= (1 << 0);   // 啟動定時器
}// SysTick中斷服務函數(10kHz)
void SysTick_Handler(void)
{if (adc_idx < 1000){// 讀取ADC數據(假設已初始化ADC)adc_buf[adc_idx++] = HAL_ADC_GetValue(&hadc1);}
}// 主函數中處理數據
int main(void)
{// 初始化ADC和SysTickMX_ADC1_Init();SysTick_Init_10kHz();while (1){if (adc_idx >= 1000){// 數據采集完成,處理數據process_adc_data(adc_buf, 1000);adc_idx = 0;  // 重置索引}}
}

五、常見問題與解決方案

5.1 延時函數精度不足

現象delay_ms(1000)實際延時為1050ms,誤差超過5%。

可能原因

  1. 系統時鐘配置錯誤(如HCLK實際為64MHz而非72MHz);
  2. SysTick中斷被高優先級中斷阻塞;
  3. 延時函數中關閉中斷不徹底,被其他中斷打斷;
  4. 重裝載值計算錯誤(如未考慮時鐘源分頻)。

解決方案

  • 用示波器測量SysTick中斷周期,驗證時鐘源頻率;
  • 降低SysTick中斷優先級(避免被低優先級中斷阻塞);
  • 延時過程中關閉所有可屏蔽中斷(臨界區保護);
  • 重新計算重裝載值:重裝載值 = 時鐘頻率(Hz) * 延時時間(s) - 1

5.2 SysTick中斷不觸發

現象:初始化后無中斷響應,LED不翻轉。

可能原因

  1. 未使能SysTick中斷(TICKINT=0);
  2. 中斷優先級配置錯誤(被NVIC屏蔽);
  3. 重裝載值設置為0(SYST_RVR=0);
  4. 定時器未使能(SYST_CSR的ENABLE=0)。

排查步驟

  1. 檢查SYST_CSR寄存器:printf("SYST_CSR: 0x%X\n", SYST_CSR);,確認ENABLE=1、TICKINT=1;
  2. 檢查NVIC配置:確保NVIC_EnableIRQ(SysTick_IRQn)已調用;
  3. 驗證重裝載值:printf("SYST_RVR: 0x%X\n", SYST_RVR);,確認不為0;
  4. 用調試器單步執行,觀察計數器是否遞減。

5.3 16位計數器溢出問題

現象:需要延時10ms,但SysTick最大只能延時7.28ms,導致計時不準。

解決方案

  • 分多次延時(如10ms = 7ms + 3ms);
  • 結合循環實現長延時:
    void delay_ms_long(uint32_t ms)
    {while (ms > 7)  // 每次延時7ms(小于最大7.28ms){delay_us(7000);ms -= 7;}delay_us(ms * 1000);  // 延時剩余毫秒數
    }
    

5.4 SysTick與HAL_Delay沖突

現象:自定義SysTick配置后,HAL_Delay()函數失效。

原因

  • HAL庫的HAL_Delay()依賴SysTick中斷(HAL_IncTick());
  • 自定義配置可能覆蓋了HAL庫的SysTick設置(如重裝載值、中斷使能)。

解決方案

  • 在自定義中斷服務函數中調用HAL_IncTick()
    void SysTick_Handler(void)
    {HAL_IncTick();  // 保留HAL庫的滴答計數User_SysTick_Callback();  // 自定義邏輯
    }
    
  • 若無需HAL_Delay(),可在CubeMX中禁用SysTick作為HAL時基(不推薦)。

六、總結與進階學習

6.1 核心知識點總結

  1. SysTick是Cortex-M內核的16位定時器,適合做系統延時和RTOS時基;
  2. 核心寄存器:SYST_CSR(控制)、SYST_RVR(重裝載值)、SYST_CVR(當前值);
  3. 配置方式:HAL庫適合快速開發,寄存器操作適合高效場景;
  4. 典型應用:精確延時、RTOS任務調度、高頻數據采集。

6.2 進階學習方向

  1. SysTick在低功耗模式中的應用

    • 深入學習STM32的低功耗模式(STOP、STANDBY),了解SysTick在低功耗下的運行機制;
    • 配置SysTick喚醒低功耗模式,實現周期性喚醒采集數據。
  2. 中斷優先級優化

    • 學習NVIC嵌套中斷機制,合理設置SysTick中斷優先級(如RTOS中設為最低優先級);
    • 避免高優先級中斷長時間阻塞SysTick,影響延時精度。
  3. 與DMA結合

    • 結合DMA實現無CPU干預的高頻數據傳輸(如SysTick觸發ADC+DMA采集);
    • 減少中斷響應時間,提高系統吞吐量。
  4. 跨平臺移植

    • 將基于SysTick的代碼移植到其他Cortex-M平臺(如STM32L4、NRF52832),理解不同內核的差異。

SysTick看似簡單,卻是嵌入式系統的"基石"。掌握它的工作原理和配置技巧,能為復雜項目開發打下堅實基礎。無論是裸機開發還是RTOS應用,SysTick都是你不可或缺的工具——用好這把"瑞士軍刀",讓你的STM32項目更高效、更穩定!

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

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

相關文章

【微信小程序】12、生物認證能力

1、生物認證 生物認證 是一種基于個體獨特生理或行為特征進行身份驗證的技術,廣泛應用于安全、金融、醫療等領域。 小程序目前暫時只支持指紋識別認證。 2、查詢支持的生物認證方式 獲取本機支持的 SOTER 生物認證方式&#xff0c;文檔 onLoad(options) {wx.checkIsSuppor…

高級機器學習

機器學習常見方法涉及方法&#xff1a;2.半監督學習3.無監督學習4.度量學習5.遷移學習6.多示例多標記學習7.在線學習8.元學習9.聯邦學習10.強化學習11.概率圖模型獨立同分布獨立指的是&#xff0c;樣本集包括訓練集測試集的任意兩個樣本之間都是不相關的。在表示樣本的特征確定…

Chrome 提示 “此擴展程序不再受支持”(MacOS/Windows)

原因 最新 Chrome 使用 Manifest V3, 并在新版瀏覽器中 停止 V2 支持 處理方法 MacOS 新建一個后綴為 .mobileconfig 的文件, 內容參考 <?xml version"1.0" encoding"UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN&…

C++20協程實戰:高效網絡庫、手機終端、多媒體開發開發指南

基于C++協程和事件循環的網絡庫 以下是基于C++協程和事件循環的網絡庫實例,涵蓋常見場景和功能實現。示例基于libuv、Boost.Asio或自定義事件循環,結合C++20協程(如std::coroutine)或其他協程庫(如cppcoro)實現。 基礎TCP服務器 #include <cppcoro/task.hpp> #in…

數據庫4.0

索引 事務 JDBC~ 目錄 一、MySQL索引 1.0 概述 2.0 相關操作 3.0 注意 4.0 索引背后的原理的理解 二、 事務 1.0 原子性 2.0 隔離性 (1)并發執行 (2) 出現的問題 3.0 使用 三、JDBC編程 1.0 概述 2.0 如何下載驅動包 3.0 jar如何引入到項目之中 4.0 jdbc…

HarmonyOS-ArkUI Web控件基礎鋪墊6--TCP協議- 流量控制算法與擁塞控制算法

HarmonyOS-ArkUI Web控件基礎鋪墊1-HTTP協議-數據包內容-CSDN博客 HarmonyOS-ArkUI Web控件基礎鋪墊2-DNS解析-CSDN博客 HarmonyOS-ArkUI Web控件基礎鋪墊3--TCP協議- 從規則本質到三次握手-CSDN博客 HarmonyOS-ArkUI Web控件基礎鋪墊4--TCP協議- 斷聯-四次揮手解析-CSDN博客…

Dify 從入門到精通(2/100 篇):Dify 的核心組件 —— 從節點到 RAG 管道

Dify 的核心組件&#xff1a;從節點到 RAG 管道 引言 在 Dify 博客系列&#xff1a;從入門到精通&#xff08;100 篇&#xff09; 的第一篇《Dify 究竟是什么&#xff1f;真能開啟低代碼 AI 應用開發的未來&#xff1f;》中&#xff0c;我們全面介紹了 Dify 的定位、核心特點…

在線培訓、遠程示教——醫療器械行業的直播解決方案

文章目錄前言一、醫療器械直播應用的兩大核心場景二、直播平臺在醫療場景中的關鍵技術支持點三、典型功能實現原理總結前言 醫療器械行業對“培訓”和“示教”的專業性要求極高&#xff0c;傳統的線下模式常因時間、空間、人員成本等受限而效率低下。而隨著高清低延遲視頻技術…

Mqttnet的MqttClientTlsOptions.CertificateValidationHandler詳解

MqttClientTlsOptions.CertificateValidationHandler 是 MQTTnet 庫中用于自定義 TLS 證書驗證邏輯的關鍵回調函數。在 MQTT 客戶端與服務器建立 TLS 連接時&#xff0c;該回調允許你覆蓋默認的證書驗證流程&#xff0c;實現自定義的安全策略。核心作用當 MQTT 客戶端通過 TLS …

【圖像噪點消除】——圖像預處理(OpenCV)

目錄 1 均值濾波 2 方框濾波 3 高斯濾波 4 中值濾波 5 雙邊濾波 6 小結 噪聲&#xff1a;圖像中的一些干擾因素。通常是由于圖像采集設備、傳輸信道等因素造成的&#xff0c;表現為圖像中隨機的亮度。常見的噪聲類型有高斯噪聲和椒鹽噪聲。高斯噪聲是一種分布符合正態分布…

Vulnhub napping-1.0.1靶機滲透攻略詳解

一、下載靶機 下載地址&#xff1a;https://download.vulnhub.com/napping/napping-1.0.1.ova 下載好后使用VM打開&#xff0c;將網絡配置模式改為net&#xff0c;防止橋接其他主機干擾&#xff08;橋接Mac地址也可確定主機&#xff09;。 二、發現主機 使用nmap掃描沒有相應…

Kubernetes自動擴容方案

Kubernetes 自動擴容可以概括為 “三層六類”&#xff1a;層級類型觸發維度官方/社區方案一句話說明Pod 級HPACPU / 內存 / 自定義 / 外部指標內置副本數橫向擴縮&#xff0c;最常用VPACPU / 內存社區組件單 Pod 資源豎向擴縮&#xff0c;不改副本數KEDA任意事件&#xff08;隊…

linux命令ps的實際應用

ps&#xff08;Process Status&#xff09;是 ?Linux/Unix 系統中最核心的進程管理工具&#xff0c;用于實時抓取系統進程快照。它直接讀取 /proc 文件系統&#xff0c;不持續監控進程&#xff08;區別于 top&#xff09;&#xff0c;但可通過參數組合實現精準進程診斷。下面從…

深入理解C語言:詳解直接插入排序的實現與優化

目錄 引言 一、直接插入排序的相關概念 1.1、基本概念 1.2、直接插入排序過程詳解 二、代碼實現 三、時間復雜度 四、希爾排序 4.1、希爾排序的陳述 4.2、代碼實現 4.3、時間復雜度 結語 引言 在計算機科學的世界里&#xff0c;排序算法是基礎且重要的組成部分。它們…

【DRAM存儲器五十五】LPDDR5介紹--command bus training

??個人主頁:highman110 ??作者簡介:一名硬件工程師,持續學習,不斷記錄,保持思考,輸出干貨內容 參考資料:《某LPDDR5數據手冊》 、《JESD209-5A》 在為高頻或中頻操作啟用ODT之前,必須對L

一道曾經百度面試題

&#x1f680;個人主頁&#xff1a;BabyZZの秘密日記 &#x1f4d6;收入專欄&#xff1a;C語言 &#x1f30d;文章目入1. 題目重現2. 大小端到底在比什么&#xff1f;3. 解法一&#xff1a;聯合體&#xff08;union&#xff09;為什么一行就夠&#xff1f;使用示例4. 解法二&am…

VIKOR(Multi-criteria Optimization and Compromise Solution)簡介與簡單示例

前言 提醒&#xff1a; 文章內容為方便作者自己后日復習與查閱而進行的書寫與發布&#xff0c;其中引用內容都會使用鏈接表明出處&#xff08;如有侵權問題&#xff0c;請及時聯系&#xff09;。 其中內容多為一次書寫&#xff0c;缺少檢查與訂正&#xff0c;如有問題或其他拓展…

【算法訓練營Day18】二叉樹part8

文章目錄修剪二叉搜索樹將有序數組轉換為二叉搜索樹把二叉搜索樹轉換為累加樹修剪二叉搜索樹 題目鏈接&#xff1a;669. 修剪二叉搜索樹 解題邏輯&#xff1a; 因為在刪除的同時要保證相對結構&#xff0c;所以我們不能沿用上一篇文章中的刪除邏輯&#xff0c;新的刪除邏輯為&…

【C++篇】“內存泄露”的寶藏手段:智能指針

目錄 智能指針的使用場景分析 RAII和智能指針的設計思路 C標準庫智能指針的使用 auto_ptr的使用&#xff1a; unique_ptr的使用&#xff1a; shared_ptr的使用&#xff1a; 模擬shared_ptr: 定制刪除器&#xff1a; shared_ptr的循環引用 weak_ptr 智能指針的使用場景…

【密碼學】4. 分組密碼

目錄分組密碼分組密碼概述Feistel 密碼結構數據加密標準&#xff08;DES&#xff09;差分密碼分析與線性密碼分析分組密碼的運行模式國際數據加密算法&#xff08;IDEA&#xff09;高級加密標準&#xff08;AES&#xff0c;Rijndael&#xff09;中國商用密碼 SM4祖沖之密碼&…