焦点滚动:灵化无穷_关于灵化无穷介绍
1、《灵化无穷》是2009年人民出版社出版的图书。2、作者是李贵生。
关注+星标公众号,不错过精彩内容
转自 | 大橙子疯嵌入式
【资料图】
软件开发中,每次需求的变更基本都需要改写代码,而代码变更后就需要进行功能测试,当然在功能测试之前需要代码的单元测试,避免代码改动后部分场景没有验证,最后出现各种问题。
分享正文之前推荐一个嵌入式招聘信息的平台:
常用的C语言测试框架有:
这里介绍Unity,其他的大家感兴趣可以自行查阅,不同的单元测试框架适用于不同的开发需求和场景。开发人员可以按照自己的项目要求选择最适合的框架。
Unity最小可以只用到几个文件即可完成,把Unity源码目录下的unity.c
、unity.h
、unity_internals.h
三个文件复制至我们的工程目录下进行编译即可,然后在测试文件代码中包含unity.h
简单的示例完成功能函数的验证
#include #include"unity.h"voidsetUp(){//这里可以放置每个测试用例运行前的初始化代码}voidtearDown(){//这里可以放置每个测试用例运行后的清理代码}intAdd(inta,intb){returna+b;}voidtest_AddFun(void){TEST_ASSERT_EQUAL_UINT(6,Add(1,5));TEST_ASSERT_EQUAL_UINT(4,Add(-1,5));TEST_ASSERT_EQUAL_UINT(-6,Add(-1,-5));}intmain(){UNITY_BEGIN();//启动测试RUN_TEST(test_AddFun);UNITY_END();//结束测试return0;}
通过串口或终端打印内容为:
C:\test/test.c:47:test_AddFun:PASS-----------------------1Tests0Failures0IgnoredOK
其中,unity_internals.h
文件中可以修改输出终端,即UNITY_OUTPUT_CHAR
宏的定义
/*-------------------------------------------------------*OutputMethod:stdout(DEFAULT)*-------------------------------------------------------*/#ifndefUNITY_OUTPUT_CHAR/*Defaulttousingputchar,whichisdefinedinstdio.h*/#include #defineUNITY_OUTPUT_CHAR(a)(void)putchar(a)#else/*Ifdefinedassomethingelse,makesurewedeclareitheresoit"sreadyforuse*/#ifdefUNITY_OUTPUT_CHAR_HEADER_DECLARATIONexternvoidUNITY_OUTPUT_CHAR_HEADER_DECLARATION;#endif#endif
旨在打造一个C语言的通用扩展库。
支持多种容器实现,包括通用队列(包括不定长队列)、栈、双向链表和动态数组功能
支持定义序列化/反序列化的结构体功能
移植了部分 C++ Boost库中的PP库功能
目录说明
├─cot│ ├─include│ │ ├─container // 容器实现头文件│ │ ├─preprocessor // 移植Boost库中的PP库头文件│ │ └─serialize // 序列化/反序列化实现头文件│ └─src│ ├─container // 容器实现源文件│ └─serialize // 序列化/反序列化实现源文件├─test│ ├─container // 容器实现测试代码│ └─serialize // 序列化/反序列化测试代码└─unity // 单元测试框架代码
双向链表使用方式demo
int main(){ cotList_t list; cotListItem_t nodeBuf[10]; cotList_Init(&list, nodeBuf, 10); int data1 = 10; int data2 = 20; int data3 = 30; // 头部增加元素 cotList_PushFront(&list, &data1); // 尾部增加元素 cotList_PushBack(&list, &data2); // 插入元素 cotList_Insert(&list, cotList_End(&list), &data3); // 使用迭代器遍历所有元素 for_list_each(item, list) { printf(" = %d\n", *item_ptr(int, item)); } // 移除指定元素 cotList_Remove(&list, &data3); // 根据添加移除元素 cotList_RemoveIf(&list, OnRemoveCondition); cotList_t list2; cotListItem_t nodeBuf2[3]; cotList_Init(&list2, nodeBuf2, 3); // 链表内存交换 cotList_Swap(&list1, &list2); return 0;}
动态数组使用方式demo
int main(){ uint8_t buf[20]; cotVector_t vector; cotVector_Init(&vector, buf, sizeof(buf), sizeof(uint32_t)); // 在尾部追加元素 uint32_t data = 42; cotVector_Push(&vector, &data); data = 56; cotVector_Push(&vector, &data); data = 984; cotVector_Push(&vector, &data); // 插入元素 uint32_t arrdata[2] = {125, 656}; cotVector_InsertN(&vector, 2, &arrdata, 2); // 删除两个元素 cotVector_RemoveN(&vector, 1, 2); // 根据添加删除元素 cotVector_RemoveIf(&vector, OnVectorRemoveCondition); // 打印数组中的数据内容 for (int i = 0; i < cotVector_Size(&vector); i++) { printf("%02x ", cotVector_Data(&vector)[i]); } return 0;}
双向队列(定长FIFO)使用方式demo
int main(){ uint8_t buf[10]; cotQueue_t queue; cotQueue_Init(&queue, buf, sizeof(buf), sizeof(int)); // 在尾部追加元素 int data = 42; cotQueue_Push(&queue, &data, sizeof(data)); data = 895; cotQueue_Push(&queue, &data, sizeof(data)); // 访问元素 int *pData = (int *)cotQueue_Front(&queue); printf("val = %d \n", *pData); // 弹出首个元素 cotQueue_Pop(&queue); return 0;}
队列(不定长FIFO)使用方式demo
int main(){ uint8_t buf[10]; cotIndQueue_t queue; cotIndQueue_Init(&queue, buf, sizeof(buf)); // 在尾部追加元素 char data = 42; cotIndQueue_Push(&queue, &data, sizeof(data)); int data1 = 80; cotIndQueue_Push(&queue, &data, sizeof(data1)); long data2 = -400; cotIndQueue_Push(&queue, &data, sizeof(data2)); // 访问元素 size_t length; int *pData = (int *)cotIndQueue_Front(&queue, &length); printf("val = %d \n", *pData, length); // 弹出首个元素 cotIndQueue_Pop(&queue); return 0;}
单向栈使用方式demo
int main(){ uint8_t buf[10]; cotStack_t stack; cotStack_Init(&stack, buf, sizeof(buf), sizeof(int)); // 在顶部追加元素 int data = 42; cotStack_Push(&stack, &data, sizeof(data)); data = 895; cotQueue_Push(&stack, &data, sizeof(data)); // 访问元素 int *pData = (int *)cotStack_Top(&stack); printf("val = %d \n", *pData); // 弹出顶部元素 cotStack_Pop(&stack); return 0;}
可以定义一个公共头文件
#ifndef STRUCT_H#define STRUCT_H#include "serialize/serialize.h"COT_DEFINE_STRUCT_TYPE(test_t, ((UINT16_T) (val1) (2)) ((INT32_T) (val2) (1)) ((UINT8_T) (val3) (1)) ((INT16_T) (val4) (1)) ((DOUBLE_T) (val5) (1)) ((INT16_T) (val6) (1)) ((STRING_T) (szName) (100)) ((DOUBLE_T) (val7) (1)) ((FLOAT_T) (val8) (1)) ((STRING_T) (szName1) (100)))#endif // STRUCT_H
各个模块引用头文件使用
#include "struct.h"int main(){ uint8_t buf[100]; // 序列化使用demo COT_DEFINE_STRUCT_VARIABLE(test_t, test); test.val1[0] = 5; test.val1[1] = 89; test.val2 = -9; test.val3 = 60; test.val4 = -999; test.val5 = 5.6; test.val6 = 200; test.val7 = -990.35145; test.val8 = -80.699; sprintf(test.szName, "test56sgdgdfgdfgdf"); sprintf(test.szName1, "sdfsdf"); int length = test.Serialize(buf, &test); printf("Serialize: \n"); for (int i = 0; i < length; i++) { printf("%02x %s", buf[i], (i + 1) % 16 == 0 ? "\n" : ""); } printf("\n"); // 反序列化使用demo test_t test2; // COT_DEFINE_STRUCT_VARIABLE(test_t, test2); COT_INIT_STRUCT_VARIABLE(test_t, test2); test2.Parse(&test2, buf); printf("val = %d\n", test2.val1[0]); printf("val = %d\n", test2.val1[1]); printf("val = %d\n", test2.val2); printf("val = %d\n", test2.val3); printf("val = %d\n", test2.val4); printf("val = %lf\n", test2.val5); printf("val = %d\n", test2.val6); printf("name = %s\n", test2.szName); printf("val = %lf\n", test2.val7); printf("val = %f\n", test2.val8); printf("name = %s\n", test2.szName1); return 0;}
------------END------------
关注公众号回复“加群”按规则加入技术交流群,回复“1024”查看更多内容。
关键词:
1、《灵化无穷》是2009年人民出版社出版的图书。2、作者是李贵生。
根据中国证监会2017年9月5日下发的[2017]13号《中国证监会关于证券投资基金估值业务的指导意见》的有关规定
中国农科新闻网是农业科技报社顺应网络时代新媒体发展趋势,在三农领域倾心打造的集资讯、互动、网上展示于
1、如果你的手机掉进水里怎么办? 首先,你应该尽快把手机打捞出来,立即取出电池,防止短路;同时也要
水电行业作为国民经济的基础性支柱产业,与国民经济发展及工业结构变化息息相关。目前,我国水电行业运行总
1、公共政策环境什么是公共政策环境 公共政策环境是指影响公共政策产生、存在和发展的一切因素的总和。2
“东风”俱备东风着陆场静候神十五航天员天外归来
1、楚人贩子。2、要说妖妖的未婚妻也只有楚风了。3、最后楚风突破仙王到成祭道都是妖妖跟林妙依陪伴的。本
来为大家解答以上的问题。电视剧《决胜》,决胜1一40集完整版这个很多人还不知道,现在让我们一起来看看吧!
1、、官话方言:2、官话方言有它突出的地位和影响。以洛阳为中心的北方话通行地区一直是中国政治的心脏地带
河南省第三次全国土壤普查调查采样工作在我市启动6月2日,河南省第三次全国土壤普查调查采样工作在祥符区西
北京同仁医院院长张罗:过敏性疾病是一个慢性疾病,要想把它控制好,需要长期的、规律的规范化治疗
阵痛中被迫“断奶”,物业企业的将来,或决胜于存量战场,断奶,房地产,开发商,克而瑞,物业管理,物业服务,物
粮食安全是“国之大者”,中国人的饭碗要牢牢端在自己手中农业发展不仅要杜绝生态环境欠新账,而且要逐步还
想必现在有很多于小米滴滴车主麦克风授权怎么开方面的知识都比较想要了解,那么小编就为大家收集了一些米滴
1、这里是迅雷下载地址magnet:?xt=urn:btih:65484EEA92540ACBABFE04A334472
日前,长安汽车官方宣布,旗下的览拓者EV(图片|配置|询价)车型上市,新车的定位是一台纯电动皮卡,仅提供一
金融界6月2日消息中闽能源公告,为做好福建省对口援藏工作,深化清洁能源开发合作,公司拟与昌都市康电清洁
榜样在身边——“立足岗位、解放思想、担当作为、开拓创新”先进个人和先进集体事迹■海南日报记者易宗平通
1、永平村,江苏省南通市通州区三余镇下辖村。2、 。文章到此就分享结束,希望对大家有所帮助。
日前,有关李从瑞“被带走了”或“被查”的小道消息迅速传遍地产圈,有的网络媒体还做了“详细报道“
5月31日,常宁市人民检察院法治宣讲团来到常宁市兰江乡中心小学。法治宣传课现场。为进一步贯彻落实《未成
据悉,苹果最新的专利显示,苹果计划给AppleWatch的背面加上摄像头,让佩戴者可以拍摄FaceID图像,生成可在
周五(6月2日)本交易日现货黄金开于1977 77美元 盎司,最高上探至1977 99美元 盎司,最低触及1973 83美元 盎
今日(6月2日),Marvelous宣布《牧场物语Welcome!美丽人生》Steam预购开启,国区售价230元,游戏支持简体