大家好,我是ZhengN。
嵌入式大杂烩周记主要是一些实用项目学习分享,每周一篇,每篇一个主题。
内容主要来源于我们之前收集的资料:
https://gitee.com/zhengnianli/EmbedSummary
本期主角:gear-lib
gear-lib是一组通用的C基础库。
- 全部用POSIX C实现,目标是为了跨平台兼容linux, windows, android, ios。
- 适用于物联网,嵌入式,以及网络服务开发等场景。
gear-lib地址:
https://github.com/gozfree/gear-lib或者
https://gitee.com/gozfreee/gear-lib
license:MIT。
关于开源软件协议相关文章:常用的开源协议有哪些?
gear-lib的使用
gear-lib整理涵盖如下内容:
下载得到:
下面基于Ubuntu环境,整体编译、安装:
./build.sh
sudo ./build.sh install
下面我们选取几个库实践感受一下(库的文件夹下面有对应的使用示例,可参考这些示例)。
1、libconfig
libconfig支持ini、json、lua三种格式配置文件的解析,并且统一操作接口,即可以调用同一套接口对ini、json、lua三种格式配置文件进行解析。libconfig会自动识别配置文件后缀调用对应格式文件的操作接口。
(1)解析ini文件:
static int ini_test(void)
{
struct config *conf = conf_load("ini/ini_test.ini");
printf("==============================ini_test==============================\n");
printf("修改之前ini_test.ini的内容: \n");
printf("name = %s\n", conf_get_string(conf, "test:name"));
printf("num = %d\n", conf_get_int(conf, "test:num"));
conf_set_string(conf, "test:name", "LinuxZn");
conf_set_string(conf, "test:num", "888");
conf_dump(conf);
printf("修改之后ini_test.ini的内容: \n");
printf("name = %s\n", conf_get_string(conf, "test:name"));
printf("num = %d\n", conf_get_int(conf, "test:num"));
conf_save(conf);
conf_unload(conf);
return 0;
}
编译、运行:
ini文件解析的往期文章:嵌入式开发两则实用小知识分享
(2)解析json文件:
static int json_test(void)
{
struct config *conf = conf_load("json/json_test.json");
printf("==============================json_test==============================\n");
printf("修改之前json_test.json的内容: \n");
printf("name = %s\n", conf_get_string(conf, "test", "abc", 1, "name"));
printf("num= %s\n", conf_get_string(conf, "test", "abc", 1, "num"));
conf_set_string(conf, "test", "abc", 1, "num", "888");
printf("修改之后json_test.json的内容: \n");
printf("name = %s\n", conf_get_string(conf, "test", "abc", 1, "name"));
printf("num= %s\n", conf_get_string(conf, "test", "abc", 1, "num"));
conf_save(conf);
conf_unload(conf);
return 0;
}
编译、运行:
json文件解析的往期文章:例说嵌入式实用知识之JSON数据
2、liblog
static void test_no_init(void)
{
int i;
char tmp[32] = "abcd";
for (i = 0; i < 10; i++) {
loge("test rsyslog\n");
logw("debug msg %d, %s\n", i, tmp);
logd("debug msg %d, %s\n", i, tmp);
logi("debug msg %d, %s\n", i, tmp);
logv("debug msg %d, %s\n", i, tmp);
}
log_deinit();
}
编译、运行:
log相关往期文章:bug解决不了?使用日志法
3、libdarray
static void darray_test(void)
{
DARRAY(int) darray;
/* 初始化一个动态数组 */
da_init(darray);
/* 给数组赋值 */
for (int i = 0; i < 10; i++)
{
da_push_back(darray, &i);
}
/* 遍历数组元素并打印 */
for (int i = 0; i < 10; i++)
{
printf("%d ", darray.array[i]);
}
printf("\n");
/* 数组清理 */
da_free(darray);
}
编译、运行:
动态数组相关往期文章:什么是不完全类型?
4、libtime
static void time_test(void)
{
printf("time_now_sec_str: %s", time_now_sec_str());
printf("time_now_sec: %" PRIu64 "\n", time_now_sec());
printf("time_now_msec: %" PRIu64 "\n", time_now_msec());
printf("time_now_usec: %" PRIu64 "\n", time_now_usec(NULL));
printf("time_now_nsec: %" PRIu64 "\n", time_now_nsec());
}
编译、运行:
5、libhal
static void hal_test(void)
{
struct cpu_info cpu_info;
cpu_get_info(&cpu_info);
printf("cpu name : %s\n", cpu_info.name);
printf("cpu cores : %d\n", cpu_info.cores);
printf("cpu cores_available : %d\n", cpu_info.cores_available);
}
编译、运行:
6、libsort
void test_bubblesort()
{
int a[]={4,1,2,5,3};
print_array(int, "%d\t", a);
bubble_sort(a, sizeof(a)/sizeof(a[0]), sizeof(int), 0);
print_array(int, "%d\t", a);
}
编译、运行:
以上就是本期分享的内容。gear-lib包含的库很丰富,覆盖很多方面,大家可以去简单了解一下,看看是否有一些库是自己学习、工作中用得上的,避免重复造轮子。
另外,gear-lib是码云上GVP(最有价值开源项目),值得我们去学习。gear-lib虽然总的代码量也不少,但是各个库都相对独立(尽管有些库之间有依赖):
这也很方便我们选取一些库来进行代码研读。一起读代码,一起进步~
这就是本期的内容,咱们下期见~
往期好文:
我整理了一个嵌入式资料库,大家有什么好资料分享?可以给我留言,我把它加进去,资源共享,一起来完善这个资料库!
(资料库链接:
https://gitee.com/zhengnianli/EmbedSummary)
本文暂时没有评论,来添加一个吧(●'◡'●)