品從能跑到量產(chǎn))
很多嵌入式項(xiàng)目都有過(guò)類似經(jīng)歷:樣機(jī)剛做出來(lái)時(shí),基本功能全部正常;軟件能跑、通信正常、傳感器也有數(shù)據(jù)。于是大家覺(jué)得項(xiàng)目已經(jīng)差不多了。但真正進(jìn)入實(shí)際使用后,問(wèn)題卻開(kāi)始陸續(xù)出現(xiàn):高溫環(huán)境下偶發(fā)死機(jī);靜電一打,設(shè)備自動(dòng)復(fù)位;連續(xù)運(yùn)行幾天后出現(xiàn)內(nèi)存耗盡;實(shí)驗(yàn)室測(cè)試正常,換一批物料參數(shù)就開(kāi)始漂移;工程師手工做出來(lái)沒(méi)問(wèn)題,到了產(chǎn)線良率卻突然下降;單臺(tái)樣機(jī)表現(xiàn)很好,但批量生產(chǎn)后產(chǎn)品一致性完全失控。這些問(wèn)題背后的根本原因在于:“功能跑通”只是產(chǎn)品驗(yàn)證的起點(diǎn),而不是終點(diǎn)。一個(gè)真正成熟的嵌入式產(chǎn)品,需要經(jīng)歷從功能可行性、設(shè)計(jì)可靠性到量產(chǎn)一致性的逐層驗(yàn)證。驗(yàn)證對(duì)象也不僅僅是硬件或軟件,而是電路、PCB、結(jié)構(gòu)、固件、環(huán)境適應(yīng)性、EMC、可靠性以及生產(chǎn)工藝共同組成的完整系統(tǒng)。從工程角度看,嵌入式產(chǎn)品驗(yàn)證并不是簡(jiǎn)單地“測(cè)一測(cè)有沒(méi)有問(wèn)題”,而是在不同階段回答不同的問(wèn)題。一、嵌入式產(chǎn)品驗(yàn)證,本質(zhì)上是在逐步降低系統(tǒng)風(fēng)險(xiǎn)一個(gè)產(chǎn)品從概念走向量產(chǎn),風(fēng)險(xiǎn)并不是一次性暴露的。通常可以將驗(yàn)證過(guò)程劃分為三個(gè)核心階段:階段核心目標(biāo)主要問(wèn)題EVT工程驗(yàn)證設(shè)計(jì)方案到底能不能工作?DVT設(shè)計(jì)驗(yàn)證產(chǎn)品能否在各種條件下穩(wěn)定工作?PVT生產(chǎn)驗(yàn)證這個(gè)設(shè)計(jì)能否穩(wěn)定、高效地批量制造?整個(gè)過(guò)程可以理解為:產(chǎn)品需求 │ ▼ EVT:驗(yàn)證“能不能實(shí)現(xiàn)” │ ▼ DVT:驗(yàn)證“能不能長(zhǎng)期穩(wěn)定地實(shí)現(xiàn)” │ ▼ PVT:驗(yàn)證“能不能穩(wěn)定批量制造” │ ▼ 量產(chǎn)因此,三個(gè)階段雖然都叫“測(cè)試”,但關(guān)注的核心完全不同。如果把它們混在一起,就容易出現(xiàn)兩個(gè)極端:一種是EVT階段就投入大量時(shí)間做完整可靠性測(cè)試,導(dǎo)致研發(fā)效率過(guò)低;另一種則是樣機(jī)剛跑通就急著開(kāi)模、備料、上線,最終把大量設(shè)計(jì)問(wèn)題帶到了生產(chǎn)階段。正確的驗(yàn)證策略不是“盡可能多地測(cè)試”,而是在正確的階段驗(yàn)證正確的問(wèn)題。二、EVT:先證明產(chǎn)品“能工作”EVT,即工程驗(yàn)證階段。這個(gè)階段最核心的目標(biāo)只有一個(gè):驗(yàn)證設(shè)計(jì)方案本身是否成立。此時(shí)的樣機(jī)通常還不完美。PCB可能存在飛線,結(jié)構(gòu)件可能只是臨時(shí)加工,軟件也可能只是測(cè)試版本。這個(gè)階段不應(yīng)該過(guò)早追求外觀、工藝和量產(chǎn)效率,而應(yīng)該優(yōu)先解決最基礎(chǔ)的問(wèn)題:硬件能否啟動(dòng)?軟件能否運(yùn)行?各模塊之間能否正常協(xié)同?1. 從最小系統(tǒng)開(kāi)始,而不是一上來(lái)測(cè)試完整功能嵌入式系統(tǒng)的驗(yàn)證應(yīng)該遵循自底向上的原則。首先需要確認(rèn):電源是否正常;時(shí)鐘是否穩(wěn)定;CPU是否能夠啟動(dòng);Flash是否正常;RAM是否可靠;下載、調(diào)試接口是否正常。例如可以在上電后執(zhí)行基礎(chǔ)自檢:voidevt_power_on_self_test(void){assert(voltage_check(VCC_3V3,3.15f,3.45f)==0);assert(voltage_check(VCC_1V8,1.71f,1.89f)==0);assert(clock_check(SYSCLK,168000000)==0);assert(clock_check(LSECLK,32768)==0);assert(flash_crc_check()==0);assert