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

評(píng)論