• 正文
    • 什么是堆棧水印檢測(cè)?
    • 什么是深拷貝、淺拷貝?
    • 什么是同步、異步?
    • 什么是內(nèi)存屏障?
  • 相關(guān)推薦
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

嵌入式開發(fā):這幾個(gè)知識(shí)點(diǎn)讓你少走 3 年彎路

03/19 14:20
892
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

大家好,我是雜燴君。

本次給大家整理一些嵌入式軟件開發(fā)中重要的理論概念。

什么是堆棧水印檢測(cè)?

堆棧水印檢測(cè)是一種動(dòng)態(tài)監(jiān)測(cè)任務(wù)堆棧使用情況的技術(shù)。在任務(wù)初始化時(shí),將整個(gè)堆??臻g填充特定的標(biāo)識(shí)模式(如?0xDEADBEEF)。

隨著任務(wù)運(yùn)行,堆棧指針逐漸覆蓋這些預(yù)設(shè)值。通過定期檢查未被覆蓋的殘留標(biāo)識(shí)位置,可精確計(jì)算堆棧的歷史最大使用量。

相較于靜態(tài)代碼分析,該方法能真實(shí)反映中斷嵌套、遞歸調(diào)用等動(dòng)態(tài)行為的影響。實(shí)際應(yīng)用中需注意兩點(diǎn):

    標(biāo)識(shí)模式需避免與正常數(shù)據(jù)沖突;檢測(cè)時(shí)機(jī)應(yīng)選在任務(wù)空閑或切換時(shí),避免干擾實(shí)時(shí)性。

什么是深拷貝、淺拷貝?

淺拷貝(Shallow Copy)僅復(fù)制對(duì)象本身的值(指針變量的值),不復(fù)制指針指向的實(shí)際數(shù)據(jù)??截惡?,新舊對(duì)象的指針成員指向同一內(nèi)存地址。

深拷貝(Deep Copy)不僅復(fù)制對(duì)象本身的值,還會(huì)遞歸復(fù)制指針指向的所有數(shù)據(jù)??截惡?,新舊對(duì)象的指針成員指向獨(dú)立的內(nèi)存地址。

關(guān)鍵差異:

淺拷貝例子:

// 直接賦值指針(危險(xiǎn)操作)
voidshallow_copy(Student* dest,?const?Student* src)
{
? ? dest->id = src->id;
? ? dest->name = src->name; ?// 共享同一內(nèi)存地址
}
Student s1;
s1.id =?100;
s1.name =?malloc(6);
strcpy(s1.name,?"Alice");

Student s2;
shallow_copy(&s2, &s1);

printf("淺拷貝結(jié)果:n");
printf("s1.name=%p: %sn", s1.name, s1.name); ?// 輸出相同地址
printf("s2.name=%p: %snn", s2.name, s2.name);

// 修改s1會(huì)影響s2
strcpy(s1.name,?"Bob");
printf("修改后:n");
printf("s1.name: %sn", s1.name); ?// Bob
printf("s2.name: %sn", s2.name); ?// Bob

深拷貝例子:

// 完全獨(dú)立的數(shù)據(jù)副本
voiddeep_copy(Student* dest,?const?Student* src)
{
? ? dest->id = src->id;
? ? dest->name =?malloc(strlen(src->name) +?1); ?// 新分配內(nèi)存
? ??strcpy(dest->name, src->name); ? ? ? ? ? ? ?// 復(fù)制內(nèi)容
}
Student s3;
s3.id =?200;
s3.name =?malloc(6);
strcpy(s3.name,?"Carol");

Student s4;
deep_copy(&s4, &s3);

printf("深拷貝結(jié)果:n");
printf("s3.name=%p: %sn", s3.name, s3.name); ?// 不同地址
printf("s4.name=%p: %snn", s4.name, s4.name);

// 修改s3不影響s4
strcpy(s3.name,?"Dave");
printf("修改后:n");
printf("s3.name: %sn", s3.name); ?// Dave
printf("s4.name: %sn", s4.name); ?// Carol

// 必須分別釋放內(nèi)存
free(s1.name);
free(s3.name);
free(s4.name);

什么是同步、異步?

同步處理(Synchronous Processing)任務(wù)按順序執(zhí)行,當(dāng)前任務(wù)未完成時(shí),后續(xù)任務(wù)處于阻塞狀態(tài)。如:

// 同步UART發(fā)送(阻塞式)
voiduart_send_sync(uint8_t?*data,?uint16_t?len)
{
? ??for(int?i=0; i<len; i++)?
? ? {
? ? ? ??while(USART_GetFlagStatus(USART1, USART_FLAG_TXE) == RESET);?// 等待發(fā)送完成
? ? ? ? USART_SendData(USART1, data[i]);
? ? }
}

異步處理(Asynchronous Processing)任務(wù)啟動(dòng)后立即返回,通過中斷、回調(diào)或事件通知結(jié)果,不阻塞后續(xù)任務(wù)。如:

voidADC_IRQHandler()
{
? ??if(ADC_GetITStatus(ADC1, ADC_IT_EOC)) {
? ? ? ??uint16_t?result = ADC_GetConversionValue(ADC1);?// 讀取結(jié)果
? ? ? ? process_adc_result(result); ? ? ? ? ? ? ? ? ? ??// 回調(diào)處理
? ? ? ? ADC_ClearITPendingBit(ADC1, ADC_IT_EOC);
? ? }
}

關(guān)鍵差異:

什么是內(nèi)存屏障?

內(nèi)存屏障(Memory Barriers)是確保內(nèi)存操作順序性的底層機(jī)制。在弱一致性內(nèi)存模型中,編譯器/處理器可能重排指令,內(nèi)存屏障強(qiáng)制特定操作順序。關(guān)鍵場景包括多核通信、外設(shè)寄存器訪問等。

以上就是本次的分享,如果覺得文章有幫助,幫忙轉(zhuǎn)發(fā)!謝謝

相關(guān)推薦

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

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