大家好,我是雜燴君。
本次給大家整理一些嵌入式軟件開發(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ā)!謝謝