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

嵌入式軟件進(jìn)階指南,一起來進(jìn)階!

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

大家好,我是雜燴君。

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

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

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

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

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

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

動態(tài)內(nèi)存池設(shè)計(jì):在FreeRTOS中實(shí)現(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)存泄漏點(diǎn)。

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

相關(guān)工具

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

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

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

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

優(yōu)化策略

數(shù)據(jù)對齊:強(qiáng)制結(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)方向:編譯選項(xiàng)調(diào)優(yōu)、內(nèi)聯(lián)函數(shù)與特定指令集優(yōu)化。

編譯器配置

GCC優(yōu)化選項(xiàng)

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

內(nèi)聯(lián)函數(shù):使用__attribute__((always_inline))強(qiáng)制內(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、實(shí)時(shí)性分析與優(yōu)化

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

工具鏈實(shí)踐

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

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

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

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

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

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

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

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

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

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

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

實(shí)時(shí)性分析工具

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

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

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

安全啟動實(shí)現(xiàn)

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

滲透測試實(shí)踐

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

auxiliary/scanner/ssh/ssh_login

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

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

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

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

分層架構(gòu)實(shí)踐

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

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

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

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

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

功耗管理

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

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

 

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

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

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

Linux系統(tǒng)DVFS配置

使用cpufreq子系統(tǒng)實(shí)現(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實(shí)現(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)化與喚醒機(jī)制設(shè)計(jì)

深度睡眠模式配置

STM32L476的Stop模式配置:

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

喚醒事件管理

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

功耗敏感型外設(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è)功耗分析

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

動態(tài)啟停策略

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

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

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

功耗行為建模

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

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

Tickless Idle模式

FreeRTOS配置:

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

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

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

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

優(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];
? ? ? ??// 向量化計(jì)算
? ? }
}

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

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

 

猜你喜歡:

嵌入式編程模型 | MVC模型

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

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

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

一個(gè)非常輕量的嵌入式日志庫!

一個(gè)非常輕量的嵌入式線程池庫!

Github上熱門 C 語言項(xiàng)目匯總!

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

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

 

相關(guān)推薦

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

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