日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > 嵌入式 > 嵌入式云IOT技術(shù)圈
[導(dǎo)讀]好久沒寫公眾號了,最近兩個月基本忙成狗,沒辦法,工作和家庭都要相互兼顧,有了個小寶寶以后好多時間都沒那么自由啦,2020年第一篇就來分享一個剛畢業(yè)的時候?qū)懙囊粋€量產(chǎn)測試工具吧,采用的是C語言來編寫,剛開始應(yīng)用在Linux和Android平臺上,后面通過移植也















好久沒寫公眾號了,最近兩個月基本忙成狗,沒辦法,工作和家庭都要相互兼顧,有了個小寶寶以后好多時間都沒那么自由啦,2020年第一篇就來分享一個剛畢業(yè)的時候?qū)懙囊粋€量產(chǎn)測試工具吧,采用的是C語言來編寫,剛開始應(yīng)用在Linux和Android平臺上,后面通過移植也用在單片機(jī)上,使用起來非常簡單,讓我們來看看怎么回事。


一、主程序源碼分析

int main(void){ s32 i ; //初始化測試系統(tǒng) INIT_TEST_SYSTEM(); //定義頭指針,初始化頭節(jié)點(diǎn) INIT_WORK(work_node); for(i = ZERO ; i < NR(work_Register) ; i++)  { //實(shí)現(xiàn)工作任務(wù)的注冊 REGISTER_WORK(work_node , create_cwork(work_Register[i].work_num ,work_Register[i].work_name , work_Register[i].work_handler)); } //調(diào)度工作任務(wù),編號從小到大排序 SCHEDULING_WORK(work_node,Positive,NR(work_Register)); while(True) { ; } DESTROY_WORK(work_node,work_Register); return SUCCESS ;}

這段程序的核心框架由四部分組成:

  • INIT_WORK

  • REGISTER_WORK

  • SCHEDULING_WORK

  • DESTROY_WORK

如果你不去追,你可能以為這是四個定義好的函數(shù),別被它的表面欺騙了,其實(shí)它們是宏,宏的下面一級才是函數(shù)的實(shí)現(xiàn):

   
  1. #define __INIT_WORK(_work) \

  2. do{ \

  3. _work =Init_cwork(_work); \

  4. }while(0)


  5. #define INIT_WORK(work_node) \

  6. _work work_node = NULL ; \

  7. __INIT_WORK(work_node);


  8. #define REGISTER_WORK(__work,new_work) \

  9. Register_work_fuc(__work,new_work);


  10. #define SCHEDULING_WORK(work_node,direction,array_size) \

  11. Run_Priority_work(work_node,direction,array_size);



  12. #define DESTROY_WORK(work_node,array) \

  13. work_node =Destroy_work(work_node ,array);

各個子函數(shù)的實(shí)現(xiàn):

   
  1. //初始化一個子任務(wù)

  2. _work Init_cwork();

  3. //創(chuàng)建一個子任務(wù)

  4. _work create_cwork(s32 work_num,pchar work_name ,work_fun work_fuc);

  5. //注冊子任務(wù)

  6. No_returnRegister_work_fuc(_work __work,_work new_work);

  7. //查找子任務(wù)的編號

  8. s32 Find_Work_Num(_work headler,s32 work_num);

  9. //查找子任務(wù)的名稱

  10. pchar Find_Work_Name(_work headler,pchar work_name);

  11. //執(zhí)行子任務(wù)----根據(jù)任務(wù)名稱來執(zhí)行

  12. s32 Run_work_for_work_name(_work headler,pchar work_name);

  13. //銷毀一個子任務(wù)

  14. s32 Destroy_cwork(_work headler,pchar work_name);

  15. //銷毀全部任務(wù)

  16. _work Destroy_work(_work headler,_work array);

  17. //工作優(yōu)先級調(diào)度執(zhí)行--->工作編號小的優(yōu)先級高,依次類推

  18. s32 Run_Priority_work(_work handler,s32 direction,const s32 work_array_size);

通過宏調(diào)用各個子函數(shù)完成任務(wù)的初始化,注冊、執(zhí)行、銷毀,這個過程是由一個鏈表來實(shí)現(xiàn)的:

   
  1. typedefstruct __Work

  2. {

  3. //任務(wù)編號

  4. //根據(jù)任務(wù)編號決定工作任務(wù)的優(yōu)先級

  5. //編號越小,優(yōu)先級越高

  6. s32 work_num ;

  7. //任務(wù)名稱

  8. pchar work_name ;

  9. //根據(jù)相應(yīng)的任務(wù)名稱,處理相應(yīng)的任務(wù)

  10. void(*work_handler)(int);

  11. struct __Work *next;

  12. }work;

  13. typedef work * _work ;

由于這是一個集成測試工具,所以存在著任務(wù)的并行執(zhí)行,所以當(dāng)執(zhí)行一個任務(wù)的時候其實(shí)就創(chuàng)建了一條線程,這個過程是在Run_Priority_work里實(shí)現(xiàn)的。

s32 Run_Priority_work(_work handler,s32 direction,const s32 work_array_size){  s32 count = 0 ; s32 i ; assert(handler != NULL); _work temp = handler->next ; s32 Curent_node_Array[work_array_size];  while(temp != NULL){ Curent_node_Array[count] = temp->work_num ; temp = temp->next ; if(count < work_array_size) count++ ; } Sort_work_num(Curent_node_Array,NR(Curent_node_Array),direction) ; for(i = 0 ; i < NR(Curent_node_Array) ; i++) Run_work_for_work_num(handler,Curent_node_Array[i]); return SUCCESS ;}

核心的部分也就這些了,接下來講講怎么用吧。

二、使用MTTEST實(shí)現(xiàn)并行測試項(xiàng)


main.c的代碼一句都不用動,如果你要添加一個并行的測試項(xiàng)目,只需要在結(jié)構(gòu)體數(shù)組里聲明好,定義好測試任務(wù)函數(shù)就可以了,具體使用方法如下:

   
  1. //按鍵測試

  2. intTpad_Key_Test(int work_num);

  3. //Gsensor測試

  4. intTpad_Gsensor_Test(int work_num);

  5. //時鐘測試

  6. int RTC_Test(int work_num);

  7. //電池電量測試

  8. intBattery_Capacity_Test(int work_num);

  9. //電池狀態(tài)測試

  10. intBattery_Status_Test(int work_num);

  11. //內(nèi)存測試

  12. int DDR_Test(int work_num);

  13. //EMMC測試

  14. int EMMC_Test(int work_num);

  15. //SD卡測試

  16. int SD_Test(int work_num);

  17. //WIFI MAC地址讀取測試

  18. int NVRAM_WIFI_MAC_ADDRESS_READ_TEST(int work_num);

  19. //WIFI ssid獲取測試

  20. int WIFI_SSID_Test(int work_num);

  21. //LCD RGB測試

  22. int LCD_Test(int work_num);

  23. //初始化測試系統(tǒng)

  24. int INIT_TEST_SYSTEM();

  25. //Camera旋轉(zhuǎn)按鍵測試

  26. int camera_rotate_test(int work_num);



  27. //結(jié)構(gòu)體數(shù)組描述:

  28. /*

  29. ep:

  30. {1,"LCD_Test",LCD_Test},

  31. 1表示任務(wù)編號,同時也表示在LCD的哪一行進(jìn)行顯示

  32. "LCD_Test"表示任務(wù)名稱

  33. LCD_Test表示任務(wù)執(zhí)行函數(shù)

  34. */

  35. work work_Register[]=

  36. {

  37. {1,"Tpad_Key_Test",Tpad_Key_Test},

  38. {2,"Tpad_Gsensor_Test",Tpad_Gsensor_Test},

  39. {3,"RTC_Test",RTC_Test},

  40. {4,"Battery_Capacity_Test",Battery_Capacity_Test},

  41. {5,"Battery_Status_Test",Battery_Status_Test},

  42. {6,"DDR_Test",DDR_Test},

  43. {7,"EMMC_Test",EMMC_Test},

  44. {8,"SD_Test",SD_Test},

  45. {9,"NVRAM_WIFI_MAC_ADDRESS_READ_TEST",NVRAM_WIFI_MAC_ADDRESS_READ_TEST},

  46. {10,"WIFI_SSID_Test",WIFI_SSID_Test},

  47. #ifndef __PLAN_A

  48. {11,"camera_rotate_test",camera_rotate_test},

  49. #endif

  50. {12,"LCD_Test",LCD_Test},

  51. };


預(yù)知詳情,請?jiān)敿?xì)看看我分享的項(xiàng)目代碼,注釋很詳細(xì)。

三、分享鏈接


   
  1. 鏈接:https://pan.baidu.com/s/1rPjS2r1-JgmzhF1nFhc0Kg

  2. 提取碼:dlv3


往期分享

分享一個非常有用且簡單C語言測試框架

C語言strstr函數(shù)解析自定義協(xié)議參數(shù)

深入淺出剖析C語言函數(shù)指針與回調(diào)函數(shù)

C語言數(shù)組結(jié)合位運(yùn)算實(shí)戰(zhàn)-位移與查表


我的創(chuàng)業(yè)故事


2019年和同學(xué)一起注冊了一家公司—深圳云之手科技有限公司,主要是物聯(lián)網(wǎng)相關(guān)產(chǎn)品的開發(fā),目前任副總經(jīng)理職位,我主要負(fù)責(zé)的是企業(yè)的經(jīng)營和管理,由于人員還沒有那么多,所以偶爾也會兼任產(chǎn)品的研發(fā)管理,如果各位有客戶需要開發(fā)相關(guān)產(chǎn)品可以通過以下名片聯(lián)系我,推薦成功的朋友有現(xiàn)金提成,絕對不低!

企業(yè)介紹






免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個人觀點(diǎn),不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: 驅(qū)動電源

在工業(yè)自動化蓬勃發(fā)展的當(dāng)下,工業(yè)電機(jī)作為核心動力設(shè)備,其驅(qū)動電源的性能直接關(guān)系到整個系統(tǒng)的穩(wěn)定性和可靠性。其中,反電動勢抑制與過流保護(hù)是驅(qū)動電源設(shè)計(jì)中至關(guān)重要的兩個環(huán)節(jié),集成化方案的設(shè)計(jì)成為提升電機(jī)驅(qū)動性能的關(guān)鍵。

關(guān)鍵字: 工業(yè)電機(jī) 驅(qū)動電源

LED 驅(qū)動電源作為 LED 照明系統(tǒng)的 “心臟”,其穩(wěn)定性直接決定了整個照明設(shè)備的使用壽命。然而,在實(shí)際應(yīng)用中,LED 驅(qū)動電源易損壞的問題卻十分常見,不僅增加了維護(hù)成本,還影響了用戶體驗(yàn)。要解決這一問題,需從設(shè)計(jì)、生...

關(guān)鍵字: 驅(qū)動電源 照明系統(tǒng) 散熱

根據(jù)LED驅(qū)動電源的公式,電感內(nèi)電流波動大小和電感值成反比,輸出紋波和輸出電容值成反比。所以加大電感值和輸出電容值可以減小紋波。

關(guān)鍵字: LED 設(shè)計(jì) 驅(qū)動電源

電動汽車(EV)作為新能源汽車的重要代表,正逐漸成為全球汽車產(chǎn)業(yè)的重要發(fā)展方向。電動汽車的核心技術(shù)之一是電機(jī)驅(qū)動控制系統(tǒng),而絕緣柵雙極型晶體管(IGBT)作為電機(jī)驅(qū)動系統(tǒng)中的關(guān)鍵元件,其性能直接影響到電動汽車的動力性能和...

關(guān)鍵字: 電動汽車 新能源 驅(qū)動電源

在現(xiàn)代城市建設(shè)中,街道及停車場照明作為基礎(chǔ)設(shè)施的重要組成部分,其質(zhì)量和效率直接關(guān)系到城市的公共安全、居民生活質(zhì)量和能源利用效率。隨著科技的進(jìn)步,高亮度白光發(fā)光二極管(LED)因其獨(dú)特的優(yōu)勢逐漸取代傳統(tǒng)光源,成為大功率區(qū)域...

關(guān)鍵字: 發(fā)光二極管 驅(qū)動電源 LED

LED通用照明設(shè)計(jì)工程師會遇到許多挑戰(zhàn),如功率密度、功率因數(shù)校正(PFC)、空間受限和可靠性等。

關(guān)鍵字: LED 驅(qū)動電源 功率因數(shù)校正

在LED照明技術(shù)日益普及的今天,LED驅(qū)動電源的電磁干擾(EMI)問題成為了一個不可忽視的挑戰(zhàn)。電磁干擾不僅會影響LED燈具的正常工作,還可能對周圍電子設(shè)備造成不利影響,甚至引發(fā)系統(tǒng)故障。因此,采取有效的硬件措施來解決L...

關(guān)鍵字: LED照明技術(shù) 電磁干擾 驅(qū)動電源

開關(guān)電源具有效率高的特性,而且開關(guān)電源的變壓器體積比串聯(lián)穩(wěn)壓型電源的要小得多,電源電路比較整潔,整機(jī)重量也有所下降,所以,現(xiàn)在的LED驅(qū)動電源

關(guān)鍵字: LED 驅(qū)動電源 開關(guān)電源

LED驅(qū)動電源是把電源供應(yīng)轉(zhuǎn)換為特定的電壓電流以驅(qū)動LED發(fā)光的電壓轉(zhuǎn)換器,通常情況下:LED驅(qū)動電源的輸入包括高壓工頻交流(即市電)、低壓直流、高壓直流、低壓高頻交流(如電子變壓器的輸出)等。

關(guān)鍵字: LED 隧道燈 驅(qū)動電源
關(guān)閉