当前位置:首页 > 嵌入式 > 嵌入式云IOT技术圈
[导读]好久没写公众号了,最近两个月基本忙成狗,没办法,工作和家庭都要相互兼顾,有了个小宝宝以后好多时间都没那么自由啦,2020年第一篇就来分享一个刚毕业的时候写的一个量产测试工具吧,采用的是C语言来编写,刚开始应用在Linux和Android平台上,后面通过移植也















好久没写公众号了,最近两个月基本忙成狗,没办法,工作和家庭都要相互兼顾,有了个小宝宝以后好多时间都没那么自由啦,2020年第一篇就来分享一个刚毕业的时候写的一个量产测试工具吧,采用的是C语言来编写,刚开始应用在Linux和Android平台上,后面通过移植也用在单片机上,使用起来非常简单,让我们来看看怎么回事。


一、主程序源码分析

int main(void){ s32 i ; //初始化测试系统 INIT_TEST_SYSTEM(); //定义头指针,初始化头节点 INIT_WORK(work_node); for(i = ZERO ; i < NR(work_Register) ; i++)  { //实现工作任务的注册 REGISTER_WORK(work_node , create_cwork(work_Register[i].work_num ,work_Register[i].work_name , work_Register[i].work_handler)); } //调度工作任务,编号从小到大排序 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

如果你不去追,你可能以为这是四个定义好的函数,别被它的表面欺骗了,其实它们是宏,宏的下面一级才是函数的实现:

   
  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);

各个子函数的实现:

   
  1. //初始化一个子任务

  2. _work Init_cwork();

  3. //创建一个子任务

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

  5. //注册子任务

  6. No_returnRegister_work_fuc(_work __work,_work new_work);

  7. //查找子任务的编号

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

  9. //查找子任务的名称

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

  11. //执行子任务----根据任务名称来执行

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

  13. //销毁一个子任务

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

  15. //销毁全部任务

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

  17. //工作优先级调度执行--->工作编号小的优先级高,依次类推

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

通过宏调用各个子函数完成任务的初始化,注册、执行、销毁,这个过程是由一个链表来实现的:

   
  1. typedefstruct __Work

  2. {

  3. //任务编号

  4. //根据任务编号决定工作任务的优先级

  5. //编号越小,优先级越高

  6. s32 work_num ;

  7. //任务名称

  8. pchar work_name ;

  9. //根据相应的任务名称,处理相应的任务

  10. void(*work_handler)(int);

  11. struct __Work *next;

  12. }work;

  13. typedef work * _work ;

由于这是一个集成测试工具,所以存在着任务的并行执行,所以当执行一个任务的时候其实就创建了一条线程,这个过程是在Run_Priority_work里实现的。

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实现并行测试项


main.c的代码一句都不用动,如果你要添加一个并行的测试项目,只需要在结构体数组里声明好,定义好测试任务函数就可以了,具体使用方法如下:

   
  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. //电池状态测试

  10. intBattery_Status_Test(int work_num);

  11. //内存测试

  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. //初始化测试系统

  24. int INIT_TEST_SYSTEM();

  25. //Camera旋转按键测试

  26. int camera_rotate_test(int work_num);



  27. //结构体数组描述:

  28. /*

  29. ep:

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

  31. 1表示任务编号,同时也表示在LCD的哪一行进行显示

  32. "LCD_Test"表示任务名称

  33. LCD_Test表示任务执行函数

  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. };


预知详情,请详细看看我分享的项目代码,注释很详细。

三、分享链接


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

  2. 提取码:dlv3


往期分享

分享一个非常有用且简单C语言测试框架

C语言strstr函数解析自定义协议参数

深入浅出剖析C语言函数指针与回调函数

C语言数组结合位运算实战-位移与查表


我的创业故事


2019年和同学一起注册了一家公司—深圳云之手科技有限公司,主要是物联网相关产品的开发,目前任副总经理职位,我主要负责的是企业的经营和管理,由于人员还没有那么多,所以偶尔也会兼任产品的研发管理,如果各位有客户需要开发相关产品可以通过以下名片联系我,推荐成功的朋友有现金提成,绝对不低!

企业介绍






免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!

本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除。
换一批
延伸阅读

LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: 驱动电源

在工业自动化蓬勃发展的当下,工业电机作为核心动力设备,其驱动电源的性能直接关系到整个系统的稳定性和可靠性。其中,反电动势抑制与过流保护是驱动电源设计中至关重要的两个环节,集成化方案的设计成为提升电机驱动性能的关键。

关键字: 工业电机 驱动电源

LED 驱动电源作为 LED 照明系统的 “心脏”,其稳定性直接决定了整个照明设备的使用寿命。然而,在实际应用中,LED 驱动电源易损坏的问题却十分常见,不仅增加了维护成本,还影响了用户体验。要解决这一问题,需从设计、生...

关键字: 驱动电源 照明系统 散热

根据LED驱动电源的公式,电感内电流波动大小和电感值成反比,输出纹波和输出电容值成反比。所以加大电感值和输出电容值可以减小纹波。

关键字: LED 设计 驱动电源

电动汽车(EV)作为新能源汽车的重要代表,正逐渐成为全球汽车产业的重要发展方向。电动汽车的核心技术之一是电机驱动控制系统,而绝缘栅双极型晶体管(IGBT)作为电机驱动系统中的关键元件,其性能直接影响到电动汽车的动力性能和...

关键字: 电动汽车 新能源 驱动电源

在现代城市建设中,街道及停车场照明作为基础设施的重要组成部分,其质量和效率直接关系到城市的公共安全、居民生活质量和能源利用效率。随着科技的进步,高亮度白光发光二极管(LED)因其独特的优势逐渐取代传统光源,成为大功率区域...

关键字: 发光二极管 驱动电源 LED

LED通用照明设计工程师会遇到许多挑战,如功率密度、功率因数校正(PFC)、空间受限和可靠性等。

关键字: LED 驱动电源 功率因数校正

在LED照明技术日益普及的今天,LED驱动电源的电磁干扰(EMI)问题成为了一个不可忽视的挑战。电磁干扰不仅会影响LED灯具的正常工作,还可能对周围电子设备造成不利影响,甚至引发系统故障。因此,采取有效的硬件措施来解决L...

关键字: LED照明技术 电磁干扰 驱动电源

开关电源具有效率高的特性,而且开关电源的变压器体积比串联稳压型电源的要小得多,电源电路比较整洁,整机重量也有所下降,所以,现在的LED驱动电源

关键字: LED 驱动电源 开关电源

LED驱动电源是把电源供应转换为特定的电压电流以驱动LED发光的电压转换器,通常情况下:LED驱动电源的输入包括高压工频交流(即市电)、低压直流、高压直流、低压高频交流(如电子变压器的输出)等。

关键字: LED 隧道灯 驱动电源
关闭