說明
本文檔對如何審核一個項目的軟件是否符合量產(chǎn)要求進行闡述;審核目的為確保軟件足夠健全、穩(wěn)定、易于量產(chǎn),做出更有品質(zhì)的產(chǎn)品;該文檔不一定會講清楚每個檢測項,但會盡可能提示你如何掌控調(diào)整方向。
本文檔適用于桃芯科技軟件平臺衍生品。
主要檢測項
1軟件框架檢查
桃芯平臺的軟件包有很多種,typical、exp等類型,還有noos版本,各自有不同的特點,評估該項目是否選擇了最優(yōu)的類型。
關(guān)于軟件包的版本選擇,請參考如下意見:
普通的產(chǎn)品,對功耗,最大連接數(shù)等沒有嚴格要求的,選通用的,用typical版本即可。
追求極致功耗,且連接數(shù)比較小,則選擇mini包類型。
需要連接數(shù)盡可能多,則可以考慮extention包。
需要要體驗sdk的一些新特性,或者比較全面的api體驗,但可以接受一些bug存在,則可采用實驗性質(zhì)的exp版本。
若不考慮內(nèi)置freertos系統(tǒng),或、需要更換其它rtos,則可以以上版本對應(yīng)的noos版本。
2功能符合性檢查
不同的產(chǎn)品功能不同,檢查項則不同,這里以藍牙串口模塊為例進行說明,供參考:
藍牙模塊的串口協(xié)議指令是否與規(guī)格書一致;
藍牙模塊的藍牙協(xié)議是否與規(guī)格書一致;
其它和基本功能相關(guān)的,統(tǒng)統(tǒng)檢查是否與設(shè)計目標一致。
3異常應(yīng)對檢查
對于不同的產(chǎn)品,滿足基本功能是基本要求,對于一些異常情況發(fā)生時,也應(yīng)該有應(yīng)對措施,常見的:
EMC干擾導(dǎo)致的接口通訊錯誤,比如UART或者SPI等;
其它環(huán)境因素(比如高溫低溫)造成的宕機問題等;
應(yīng)對異常,常見的應(yīng)對措施:
EMC等導(dǎo)致的通訊錯誤,可通過增加校驗來進行判斷,來識別幀錯誤。同時,對幀接收建立超時機制,來避免兩個不同幀之間發(fā)生重疊導(dǎo)致的判斷錯誤。以AT指令串口藍牙模組舉例,先發(fā)送一個異常uart指令(比如缺少幀尾),間隔200ms以上再發(fā)送一個正常指令,觀察模組是否可以正常接收第二個正常的指令等等。
對于其它因素造成的宕機問題,一般要用看門狗進行保護。
以上場景針對性比較強,不一定適用所有場景,請根據(jù)產(chǎn)品類型,制定詳細的異常測試計劃。
4Flash存儲檢查
對于桃芯的芯片,需要檢查藍牙配對使用的kv系統(tǒng)的存儲的地址是否被合理規(guī)劃,他們是否與應(yīng)用程序區(qū)沖突;
如果用戶自定義數(shù)據(jù)未使用kv系統(tǒng),也要確定地址范圍是否與應(yīng)用程序空間發(fā)生重疊;
還要考慮兩種自定義數(shù)據(jù)的地址范圍是否與OTA備份區(qū)的空間發(fā)生重疊;
各種flash存儲數(shù)據(jù)是否使用了循環(huán)存儲(存滿一個扇區(qū)才擦除一次的策略)來增加擦寫次數(shù),進而來提高產(chǎn)品壽命,按照10萬次擦寫壽命來看,產(chǎn)品平均使用壽命是多少,是否符合產(chǎn)品預(yù)期設(shè)計;
5任務(wù)優(yōu)先級(rtos版本)檢查
各任務(wù)優(yōu)先級設(shè)計是否合理,主要檢查:
檢查藍牙協(xié)議棧controller任務(wù)是否已經(jīng)是最高優(yōu)先級。(controller的task優(yōu)先級應(yīng)該是最高的)
檢查藍牙協(xié)議棧host任務(wù)優(yōu)先級。
檢查FreeRTOS timer 任務(wù)優(yōu)先級。
檢查用戶任務(wù)的優(yōu)先級安排是否合理,與藍牙協(xié)議棧任務(wù)優(yōu)先級等platform任務(wù)優(yōu)先級的關(guān)系是否合理。
檢查有沒有其它用戶任務(wù)優(yōu)先級與idle task的優(yōu)先級一樣,影響到睡眠的。
任務(wù)優(yōu)先級檢查可以參考如下文檔設(shè)計:3. FreeRTOS任務(wù)優(yōu)先級在桃芯sdk的設(shè)置(https://daklqpbddlx.feishu.cn/wiki/Tdytw22uYi0V8okrwUicFrgBnng)
6中斷優(yōu)先級檢查
檢查各個硬件中斷的優(yōu)先級安排是否合理,比如重要中斷是否優(yōu)先級是否更高。
7線程安全檢查
檢查應(yīng)用代碼中有沒有在任務(wù)和中斷中共同訪問一個變量或內(nèi)存的情況發(fā)生,這種情況會導(dǎo)致共享資源競爭問題,引起低概率問題,需要在設(shè)計階段避免這樣的行為,常用的處理手段有:
對于RTOS的系統(tǒng),可用信號量,隊列等消除線程安全問題;
對于沒有RTOS的系統(tǒng),可用匯編轉(zhuǎn)化為原子操作避免競爭;
檢查在調(diào)用桃芯藍牙協(xié)議棧接口時,是否通過btstack_push_user_msg的方式送到host任務(wù)執(zhí)行,以避免線程安全問題,或可以直接調(diào)用線程安全接口。
8看門狗WDT檢查
檢查看門狗是否打開:
一般測試階段不能打開,讓其發(fā)生死機等異常來暴露問題,方便及時發(fā)現(xiàn)和修復(fù);
量產(chǎn)階段要打開,以確保未知問題導(dǎo)致宕機后無法自恢復(fù)。
檢查看門狗的超時復(fù)位時間和喂狗周期設(shè)置是否合理:
檢查兩者時間是否過于接近,導(dǎo)致容易發(fā)生意外復(fù)位;
檢查喂狗時間是否設(shè)置過于頻繁,導(dǎo)致cpu時間過多被占用,影響其它任務(wù)性能;
檢查復(fù)位超時時間是否設(shè)置過大,導(dǎo)致宕機復(fù)位不及時;
檢查多程序間跳轉(zhuǎn),看門狗狀態(tài)如何,如果狗一直開著,兩個程序是不是都進行了喂狗操作。
9編譯優(yōu)化等級檢查
檢查優(yōu)化等級是否非-O0,如果是,則需要:
檢查寄存器設(shè)置是否均有volatile關(guān)鍵字,比如給某個寄存器設(shè)置為0,再設(shè)置為1,如果沒有加volatile,則可能被編譯器優(yōu)化為只賦值為1這一個操作,造成硬件執(zhí)行錯誤。
檢查部分關(guān)鍵狀態(tài)變量是否添加volatile關(guān)鍵字,以便于獲取真實的RAM變量值,避免邏輯錯誤。
需要注意的是,大量不必要的添加volatile將會導(dǎo)致程序運行變慢。
10日志檢查
日志添加/屏蔽:在調(diào)試階段,往往會打開調(diào)試日志,在量產(chǎn)階段,會關(guān)閉日志信息,提高性能,減少延時。 需要注意的是:去掉日志,會引起運行時序的變化,可能引入一些邏輯問題,所以,軟件去掉日志后需進行充分測試后軟件才能釋放。
11藍牙OTA升級
確認項目是否需要OTA功能,如果需要,則需要添加并測試。
檢查OTA是采用備份升級策略還是非備份升級策略。
檢查是僅升級APP,還是同時升級platform和APP。
檢查FLASH空間結(jié)構(gòu)是否被詳細規(guī)劃,整理一個flash分配圖,主要問自己:
哪些地方存儲協(xié)議棧platform.BIN
哪些存儲APP,APP備份區(qū)是否足夠大
是否需要二級boot
用戶數(shù)據(jù)存儲在哪里
檢查OTA升級過程是否可以正常進行。
檢查升級版本號有沒有正確添加,每次發(fā)布軟件是否修改了版本號。
12版本號控制
檢查是否添加了版本號。
檢查是否只有一個地方可以修改版本號,多個地方修改容易造成遺漏。
檢查通過串口等有線接口獲得的版本號是否與預(yù)設(shè)一致。
檢查通過藍牙接口獲得的版本號是否與預(yù)設(shè)一致。
13RAM相關(guān)檢查
堆、任務(wù)棧大小設(shè)置是否合理。
對于帶RTOS的包:.S類型啟動文件中堆的分配值是否為0(sdk例程默認為0),如果為0,特別注意不能使用malloc,可以使用pvPortMalloc和ll_malloc替代。
而對于非RTOS包:.S啟動文件的STACK大小是否足夠大。
14死循環(huán)檢測
桃芯平臺的異常檢測 hardfault、assert、OOM回調(diào)中一般是打印調(diào)試信息,并設(shè)置死循環(huán)。在調(diào)試階段沒有問題,但是在量產(chǎn)代碼中,這里的死循環(huán)應(yīng)改為軟件復(fù)位或看門狗復(fù)位。
檢查程序中每一個while(1)和for(;;)死循環(huán),是否增加了超時退出機制。
檢查另外一種比較隱藏for死機:比如uint8_t類型和大于256的數(shù)據(jù)/數(shù)據(jù)類型進行比較,永遠得不到滿足,也會造成死循環(huán),要特別注意。
15代碼風(fēng)格檢查
檢查是否存在隨意使用extern方式引用代碼,造成代碼結(jié)構(gòu)混亂問題,建議使用同名C文件和H文件,以及引用頭文件的方式來調(diào)用其它文件的函數(shù)。
檢查整體代碼風(fēng)格是否統(tǒng)一,盡量不要使用多種風(fēng)格的代碼,使得移植性、閱讀性較差;
程序中盡量用宏代替一些關(guān)鍵數(shù)字標記,方便統(tǒng)一修改,提高維護效率。
在C語言中,進行變量賦值時,需注意數(shù)字字面量的前綴表示不同進制:0x 前綴表示十六進制,0 前綴表示八進制,0b 前綴表示二進制。為避免潛在錯誤,應(yīng)在賦值操作前檢查數(shù)字字面量的前綴,確保其符合預(yù)期的進制表示,例如:
C #define TEST_MACRO 09 // 錯誤,第一個字符0代表八進制,八進制不存在數(shù)字9,范圍是0~7 #define TEST_MACRO 011 // 正確,第一個字符0代表八進制,八進制11代表9 #define TEST_MACRO 9 // 正確,默認10進制數(shù)9 #define TEST_MACRO 0x9 // 正確,十六進制數(shù)據(jù) #define TEST_MACRO 0b1001 // 正確,二進制,換算成十進制為9 |
16低級錯誤檢查
檢查所有switch case 是否有丟失 break而造成邏輯隱患或錯誤的問題。
檢查是否直接判斷一些沒有賦值的局部變量造成邏輯異常的問題。
檢查是否有指針沒有賦值則直接調(diào)用的情況,指針用之前需要判斷非空,是否直接分配堆后立即判斷非空。
檢查邏輯上是否可能使用已被釋放的指針,造成hardfault等問題;
檢查是否存在同一個中斷硬件在多個地方注冊回調(diào)的情況;
檢查free掉一個指針后是否在其后面添加了設(shè)置該指針為NULL的操作,這往往是必要的。
檢查邏輯上是否存在內(nèi)存泄露的風(fēng)險,例如:malloc一塊內(nèi)存后,用完未free,或邏輯缺陷導(dǎo)致無法free,隨著代碼運行,內(nèi)存申請越來越多,最終導(dǎo)致泄露。尤其內(nèi)存泄露要很久時間才會發(fā)生時,不易察覺,所以,應(yīng)盡量在設(shè)計階段避免。
17時鐘校準
檢查使用內(nèi)部RC低頻時鐘時,低功耗是否開啟了時鐘校準。
18詞語小介紹
檢查使用數(shù)組時,有沒有做最大值判斷,避免數(shù)組越界使用。
檢查使用指針時,有沒有做最大值判斷,避免指針空間越界使用。
檢查藍牙回調(diào)事件中回調(diào)參數(shù)的使用是否添加const關(guān)鍵:這些參數(shù)只能讀,不能寫和修改,意外修改會造成未知異常。
-
芯片
+關(guān)注
關(guān)注
462文章
53174瀏覽量
453623 -
藍牙
+關(guān)注
關(guān)注
116文章
6166瀏覽量
176459 -
軟件
+關(guān)注
關(guān)注
69文章
5239瀏覽量
90311 -
emc
+關(guān)注
關(guān)注
174文章
4265瀏覽量
189155
原文標題:《軟件設(shè)計指南》之一-桃芯軟件審核簡介
文章出處:【微信號:INGCHIPS_OFFICIAL,微信公眾號:桃芯科技】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
用proteus做一個桃心,尋求思路
合同智能審核軟件-提高審查效率和準確性
STM32CubeMX軟件簡介
采集軟件簡介
量子芯技術(shù)簡介
桃芯科技正在走向自主創(chuàng)芯打造國內(nèi)第一顆擁有自主協(xié)議的藍牙5.0芯片的道路上
EDA軟件公司芯愿景科創(chuàng)板IPO終止
桃芯科技車規(guī)級低功耗SoC芯片獲得AEC-Q100的測試認證
桃芯科技推出的低功耗藍牙應(yīng)用方案支持Apple Find My功能

評論