• 正文
    • 嵌入式性能調(diào)優(yōu)
    • RTOS內(nèi)核深度剖析
  • 相關(guān)推薦
申請入駐 產(chǎn)業(yè)圖譜

嵌入式軟件進階指南,一起來進階!

04/10 09:50
488
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

大家好,我是雜燴君。

本次整理了一些嵌入式軟件進階上比較通用的建議,適合各行各業(yè)。

嵌入式性能調(diào)優(yōu)

程克非在《嵌入式系統(tǒng)設(shè)計》中指出,系統(tǒng)級優(yōu)化是提升嵌入式軟件競爭力的關(guān)鍵,需從代碼效率、資源利用率和實時性三個維度展開。

嵌入式軟件工程師進階可以考慮從「功能實現(xiàn)」到「性能深挖」,掌握內(nèi)存管理、緩存優(yōu)化、編譯器調(diào)優(yōu)及實時性分析技術(shù),突破嵌入式軟件性能瓶頸。

1、內(nèi)存管理深度實踐

調(diào)優(yōu)方向:動態(tài)內(nèi)存分配優(yōu)化、內(nèi)存泄漏檢測與碎片管理。

動態(tài)內(nèi)存池設(shè)計:在FreeRTOS中實現(xiàn)固定大小內(nèi)存池,將內(nèi)存分配延遲從μs級降至ns級。

#define?POOL_SIZE 1024
static?uint8_t?mem_pool[POOL_SIZE];
static?PoolHandle_t pool = xPoolCreate(mem_pool, POOL_SIZE,?sizeof(int));
int* ptr = xPoolAllocate(pool);

內(nèi)存泄漏檢測:使用Valgrind分析ARM平臺內(nèi)存泄漏,定位工業(yè)控制系統(tǒng)傳感器驅(qū)動的內(nèi)存泄漏點。

valgrind --leak-check=full --track-origins=yes ./app

相關(guān)工具

Valgrind:支持嵌入式Linux的內(nèi)存泄漏檢測與性能分析。

FreeRTOS內(nèi)存調(diào)試:通過vPortGetFreeHeapSize()實時監(jiān)控堆使用情況。

2、緩存優(yōu)化與代碼重構(gòu)

調(diào)優(yōu)方向:數(shù)據(jù)對齊、循環(huán)展開與緩存友好型算法設(shè)計。

優(yōu)化策略

數(shù)據(jù)對齊:強制結(jié)構(gòu)體按64字節(jié)對齊,提升Cache命中率。

typedef?struct?__attribute__((aligned(64))) {
? ??uint32_t?sensor_data[16];
? ??uint32_t?timestamp;
} DataPacket;

循環(huán)展開:將FFT算法的循環(huán)展開4次,減少循環(huán)控制開銷。

for?(int?i =?0; i < N; i +=?4) {
? ? process_sample(data[i]);
? ? process_sample(data[i+1]);
? ? process_sample(data[i+2]);
? ? process_sample(data[i+3]);
}

局部性優(yōu)化:將頻繁訪問的變量存儲在棧中,減少Cache Miss。

void?calculate(void)?{
? ??int?local_var = global_var;?// 將全局變量復(fù)制到棧中
? ??// 后續(xù)使用local_var
}

3、編譯器優(yōu)化與代碼生成

調(diào)優(yōu)方向:編譯選項調(diào)優(yōu)、內(nèi)聯(lián)函數(shù)與特定指令集優(yōu)化。

編譯器配置

GCC優(yōu)化選項

-O3 -ffast-math -march=armv7-a?-mfpu=neon-vfpv4

內(nèi)聯(lián)函數(shù):使用__attribute__((always_inline))強制內(nèi)聯(lián)關(guān)鍵函數(shù)。

static?inline?uint32_t?multiply(uint32_t?a,?uint32_t?b)?{
? ??return?a * b;
}

NEON指令優(yōu)化:利用ARM NEON指令加速圖像處理

#include?<arm_neon.h>
void?image_filter(uint8_t* src,?uint8_t* dst,?int?size)?{
? ??int?i =?0;
? ??for?(; i < size; i +=?16) {
? ? ? ??uint8x16_t?vec = vld1q_u8(src + i);
? ? ? ? vec = vaddq_u8(vec, vdupq_n_u8(50));
? ? ? ? vst1q_u8(dst + i, vec);
? ? }
}

4、實時性分析與優(yōu)化

調(diào)優(yōu)方向:任務(wù)執(zhí)行時間統(tǒng)計、最壞情況執(zhí)行時間(WCET)分析。

工具鏈實踐

任務(wù)時間統(tǒng)計:使用vTaskGetRunTimeStats()分析任務(wù)CPU占用率。

char?buffer[1024];
vTaskGetRunTimeStats(buffer);
printf("Task stats:n%s", buffer);

WCET分析:基于抽象解釋技術(shù),分析工業(yè)控制代碼的最壞執(zhí)行路徑。

RTOS內(nèi)核深度剖析

Jean J. Labrosse在《嵌入式實時操作系統(tǒng)μC/OS-III》中指出,RTOS的核心價值在于實現(xiàn)「可預(yù)測的任務(wù)調(diào)度」。

嵌入式軟件工程師進階可以考慮從「會用RTOS」到「理解RTOS設(shè)計原理」,掌握內(nèi)核裁剪、調(diào)度算法優(yōu)化及實時性分析。

對于想要進階的嵌入式軟件工程師,應(yīng)重點關(guān)注以下三個層面:

內(nèi)核裁剪與定制

分析FreeRTOS的configUSE_PORT_OPTIMISED_TASK_SELECTION配置項,理解硬件前導(dǎo)零指令對調(diào)度效率的影響。

實踐案例:在STM32F767開發(fā)板上,通過關(guān)閉configUSE_TRACE_FACILITY將內(nèi)核代碼體積從12KB縮減至8KB。

調(diào)度算法優(yōu)化
如實現(xiàn)基于優(yōu)先級的搶占式調(diào)度與時間片輪轉(zhuǎn)的混合模式,降低任務(wù)切換延遲。如圖:

實時性分析工具

如掌握vTaskGetRunTimeStats函數(shù)的使用,分析任務(wù)執(zhí)行時間分布。如ADC 采樣任務(wù)通過 DMA 優(yōu)化,降低CPU占用。

嵌入式安全體系構(gòu)建

OWASP在《嵌入式安全指南》中指出,80%的物聯(lián)網(wǎng)漏洞源于固件更新機制缺陷。嵌入式軟件工程師進階可以考慮從「功能實現(xiàn)」到「安全設(shè)計」,掌握加密算法、安全啟動及滲透測試技術(shù)。

加密算法實戰(zhàn)

#include?<aes.h>
uint8_t?key[] =?"12345678901234567890123456789012";
uint8_t?iv[] =?"0123456789abcdef";
aes_context ctx;
aes_init(&ctx, key,?256);
aes_crypt_cbc(&ctx, AES_ENCRYPT, data_len, iv, data, encrypted_data);
      • 使用AES-256-CBC模式加密傳感器數(shù)據(jù),代碼示例:

安全啟動實現(xiàn)

      • 工具鏈:例如使用TI Uniflash生成加密鏡像,通過eFuse存儲密鑰。
      • 基于信任鏈的啟動流程:

滲透測試實踐

      • 模擬攻擊:例如使用Metasploit的

auxiliary/scanner/ssh/ssh_login

    • 模塊爆破設(shè)備SSH密碼。防御措施:設(shè)置登錄失敗次數(shù)限制,啟用SSH密鑰認證。

系統(tǒng)架構(gòu)設(shè)計

《嵌入式系統(tǒng)設(shè)計:基于C語言的模塊化編程》中強調(diào),分層架構(gòu)可將代碼維護成本降低40%。

嵌入式軟件工程師進階可以考慮從「模塊化編程」到「分層架構(gòu)設(shè)計」,掌握狀態(tài)機、分層模型及設(shè)計模式。

分層架構(gòu)實踐

例如:工業(yè)控制系統(tǒng)中,將Modbus協(xié)議棧封裝在中間層,實現(xiàn)與硬件無關(guān)的通信邏輯。

      • 四層架構(gòu)模型:

狀態(tài)機設(shè)計
例如:電梯控制系統(tǒng)使用狀態(tài)機進行管理各狀態(tài)。狀態(tài)轉(zhuǎn)移圖:

設(shè)計模式應(yīng)用

    • 工廠模式:動態(tài)創(chuàng)建不同類型的傳感器驅(qū)動。單例模式:確保全局唯一的日志記錄器實例。往期相關(guān)文章:嵌入式編程模型 | 觀察者模式往期相關(guān)文章:嵌入式編程模型 | MVC模型......

功耗管理

TI在《低功耗設(shè)計白皮書》中指出,軟件策略對系統(tǒng)功耗的影響占比可達40%以上,需從代碼效率、任務(wù)調(diào)度和硬件協(xié)同三個維度展開深度優(yōu)化。

嵌入式軟件工程師進階可以考慮從「硬件驅(qū)動」到「軟件策略」,掌握動態(tài)電壓頻率調(diào)節(jié)(DVFS)、睡眠模式優(yōu)化、外設(shè)動態(tài)管理及RTOS功耗調(diào)度技術(shù),實現(xiàn)嵌入式軟件的能效躍升。

 

往期相關(guān)文章:一些低功耗軟件設(shè)計的要點!

1、動態(tài)電壓頻率調(diào)節(jié)(DVFS)

基于Linux cpufreq子系統(tǒng)和RTOS動態(tài)調(diào)整CPU頻率,平衡性能與功耗。

Linux系統(tǒng)DVFS配置

使用cpufreq子系統(tǒng)實現(xiàn)頻率動態(tài)調(diào)整:

# 查看可用頻率檔位
cat /sys/devices/system/cpu/cpu0/cpufreq/scaling_available_frequencies
# 設(shè)置ondemand策略
echo?"ondemand"?> /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor

RTOS輕量級DVFS實現(xiàn)

在FreeRTOS中自定義頻率調(diào)整接口:

void?vTaskAdjustFrequency(uint32_t?freq)?{
? ??if?(freq > MAX_FREQ) freq = MAX_FREQ;
? ??if?(freq < MIN_FREQ) freq = MIN_FREQ;
? ? HAL_RCC_ClockConfig(freq, RCC_PLLSOURCE_HSE);
}

2、睡眠模式優(yōu)化與喚醒機制設(shè)計

深度睡眠模式配置

STM32L476的Stop模式配置:

RCC->APB1ENR1 |= RCC_APB1ENR1_PWREN;?// 使能電源接口
PWR->CR3 |= PWR_CR3_SCUDS; ? ? ? ? ? ?// 配置深睡眠模式
HAL_PWR_EnterSTOPMode(PWR_LOWPOWERREGULATOR_ON, PWR_STOPENTRY_WFI);

喚醒事件管理

多源喚醒狀態(tài)機:

功耗敏感型外設(shè)協(xié)同

Nordic nRF52840的PPI硬件控制:

NRF_PPI->CH[0].EEP = (uint32_t)&NRF_GPIO->EVENTS_PIN0;
NRF_PPI->CH[0].TEP = (uint32_t)&NRF_SPI0->TASKS_START;
NRF_PPI->CHENSET =?1?<<?0;?// 使能PPI通道

3、外設(shè)動態(tài)管理與功耗建模

外設(shè)功耗分析

      • 使用專用儀器記錄電流波形,識別異常功耗點。

動態(tài)啟停策略

工業(yè)相機系統(tǒng)的外設(shè)管理:

void?Camera_Init(void)?{
? ? HAL_GPIO_WritePin(CAM_PWDN_GPIO_Port, CAM_PWDN_Pin, GPIO_PIN_RESET);?// 喚醒相機
? ? HAL_Delay(100);
? ? Camera_Configure();
}

void?Camera_Deinit(void)?{
? ? HAL_GPIO_WritePin(CAM_PWDN_GPIO_Port, CAM_PWDN_Pin, GPIO_PIN_SET);?// 關(guān)閉相機
}

功耗行為建模

建立狀態(tài)機功耗模型:

4、RTOS功耗調(diào)度與任務(wù)優(yōu)化

Tickless Idle模式

FreeRTOS配置:

#define?configUSE_TICKLESS_IDLE 1
#define?configEXPECTED_IDLE_TIME_BEFORE_SLEEP 100?// 預(yù)期空閑時間(ms)

任務(wù)優(yōu)先級與功耗平衡

任務(wù)調(diào)度策略:

功耗敏感型算法設(shè)計

優(yōu)化FFT算法的內(nèi)存訪問模式:

void?FFT_Optimized(float?*data,?int?n)?{
? ??for?(int?i =?0; i < n; i +=?4) {
? ? ? ??float?a = data[i];
? ? ? ??float?b = data[i+1];
? ? ? ??// 向量化計算
? ? }
}

以上就是本次的分享,嵌入式軟件的進階方向肯定不僅是以上列出的幾點。實際需要結(jié)合自己的行業(yè)相關(guān)或是發(fā)展方向進行對應(yīng)學(xué)習(xí)。

如果覺得文章有幫助,歡迎轉(zhuǎn)發(fā)!

 

猜你喜歡:

嵌入式編程模型 | MVC模型

嵌入式編程模型 | 觀察者模式

手把手教你搭建嵌入式容器化開發(fā)環(huán)境!

一款優(yōu)雅的嵌入式多功能調(diào)試器

一個非常輕量的嵌入式日志庫!

一個非常輕量的嵌入式線程池庫!

Github上熱門 C 語言項目匯總!

實用 | 10分鐘教你通過網(wǎng)頁點燈

嵌入式開發(fā)必備技能 | Git子模塊

 

相關(guān)推薦

登錄即可解鎖
  • 海量技術(shù)文章
  • 設(shè)計資源下載
  • 產(chǎn)業(yè)鏈客戶資源
  • 寫文章/發(fā)需求
立即登錄

本公眾號專注于嵌入式技術(shù),包括但不限于C/C++、嵌入式、物聯(lián)網(wǎng)、Linux等編程學(xué)習(xí)筆記,同時,公眾號內(nèi)包含大量的學(xué)習(xí)資源。歡迎關(guān)注,一同交流學(xué)習(xí),共同進步!