写在前面 在开发的过程中,大多数人都需要对代码进行测试。目前对于c/c项目,可以采用google的gtest框架,除此之外在github上搜索之后可以发现很多其他类似功能的项目。但把别人的轮子直接拿来用,终究比不过自己造一个同样功能的轮子更有成就感。作为“linux环境编程”系列文章的第一篇,本篇文章记录了如何用较少的代码实现一个可用的单元测试框架,这个测试框架将一直在后续系列文章中的代码实例环节使用,并且在使用过程中不断完善和改进。相比于文字说明,我相信有人更喜欢直接看代码实现,所以这里先放一个github传送门。 需求来源 先给项目取个名字吧,毕竟命名是最困难的环节了:P.这个测试框架一句...

  tB9Gvpoy7LDx   2023年11月01日   92   0   0 Linux

1.写在前面 linux系统内核为上层应用程序提供了多种进程间通信(IPC)的手段,适用于不同的场景,有些解决进程间数据传递的问题,另一些则解决进程间的同步问题。对于同样一种IPC机制,又有不同的API供应用程序使用,目前有POSIXIPC以及SystemVIPC可以为应用程序提供服务。后续的系列文章将逐一介绍消息队列,共享内存,信号量,socket,fifo等进程间通信方法,本篇文章主要总结了管道相关系统调用的使用方式。文中代码可以在这个代码仓库中获取,代码中使用了我自己实现的一个单元测试框架,对测试框架感兴趣的同学可以参考上一篇文章。 2.pipe介绍 在linux环境进行日常开发时,管道...

  tB9Gvpoy7LDx   2023年11月01日   60   0   0 Linux

1.写在前面 之前的文章总结了使用管道进行进程间通信的方法,除了pipe和fifo,Linux内核还为我们提供了其他更高级的IPC方式,包括共享内存,消息队列,信号量等,本篇文章会通过一个具有完整逻辑功能的示例说明如何使用这些IPC方法。毕竟单纯地查手册,写代码...周而复始,这个过程还是比较枯燥的,而且并没有哪个IPC方法能解决所有的进程间通信问题,每种方法都不是孤立存在的,通过一个小例子把它们串联起来,是一种更好的学习方式。下文中的代码实现可以参考我的代码仓库。 2.POSIXIPC概述 进程间通信,主要解决两个问题,即数据传递和同步。POSIXIPC提供了下面三种方法: 消息队列 共享...

  tB9Gvpoy7LDx   2023年11月01日   75   0   0 Linux

开篇 module_init是linux内核提供的一个宏,可以用来在编写内核模块时注册一个初始化函数,当模块被加载的时候,内核负责执行这个初始化函数.在编写设备驱动程序时,使用这个宏看起来理所应当,没什么特别的,但毕竟我还是一个有点追求的程序员嘛:P,这篇文章是我学习module_init相关源码的一个记录,主要就回答了下面的3个问题,篇幅略长,做好准备. 问题1 内核模块是什么? 问题2 内核模块是怎么被加载的? 问题3 内核怎么获取到module_init注册的初始化函数? 注:以下回答是个人学习总结,仅供参考. 回答1 编译好内核模块的代码,会得到一个".ko"文件,这个就是内核模块了....

  tB9Gvpoy7LDx   2023年11月01日   107   0   0 Linux

开篇 现在流行的开源项目经历了长时间的开发,积累了大量的代码,想要一行一行地阅读代码去学习开源项目,需要的时间成本是巨大的.所以,我们也需要用一种高效的方式去"阅读"代码.计算机科学发展到现在,产生了很多高效成熟的工具,调试器就是其中之一(扯句题外话,那些大牛程序员似乎就是喜欢琢磨怎么制造各种工具哈),调试器能够帮程序员定位代码的bug,理解代码的运行机制.这篇文章总结了如何搭建一个调试linux内核源码的开发环境,并简单介绍了一些调试器的实现原理. 问题1 调试内核和调试用户态程序有什么区别? 问题2 使用qemu调试内核,原理是什么? 问题3 如何搭建调试linux内核源码的开发环境? ...

  tB9Gvpoy7LDx   2023年11月01日   64   0   0 Linux

正片开始 在之前的文章中,介绍了如何实现一个类似gtest的单元测试框架,完整的项目代码可以参考这里:https://github.com/kfggww/cutest.近期对cutest的实现做了一些修改,包括: TestSuite的声明宏,修改为TEST_SUITE 增加TestSuite的声明宏TEST_SUITE_WITH.可传递Suite的init和cleanup函数,在Suite中每个Case运行之前和之后分别被调用,用于公共资源的初始化和回收. TestCase的定义宏,修改为TEST_CASE 增加TestSuite和TestCase的过滤功能.通过命令行参数,过滤出要运行哪些...

  tB9Gvpoy7LDx   2023年11月01日   93   0   0 Linux

linux内核为用户态进程提供了一组IO相关的系统调用:select/poll/epoll,这三个系统调用功能类似,在使用方法和性能等方面存在一些差异.使用它们,用户态的进程可以"监控"自己感兴趣的文件描述符,当这些文件描述符的状态发生改变时,比如可读或者可写了,内核会通知进程去处理,这里的文件描述符可以是socket,设备文件,管道等.使用这组系统调用,用户态可以实现事件循环机制,比如redis源码中就基于此实现了自己内部使用的事件循环,同样还有很多其他专门提供事件循环机制的开源库.这里通过一个驱动模块实现的poll接口,去分析内核中poll系统调用的实现原理.主要讨论了以下3个问题: 用...

  tB9Gvpoy7LDx   2023年11月01日   114   0   0 Linux

下面的系列文章记录了如何使用一块linux开发扳和一块OLED屏幕实现视频的播放: 项目介绍 为OLED屏幕开发I2C驱动 使用cuda编程加速视频处理 这是此系列文章的第3篇,主要总结和记录了如何使用cuda编程释放GPU的算力.在此之前尝试过使用python调用opencv直接处理视频数据,但使用之后发现处理过程效率不高,处理时间偏长.后来想到还有一块显卡没利用起来,毕竟在前司见证了某国产GPGPU芯片从立项,到流片再到回片验证的整个过程,cuda编程也算是传统艺能了.最终效果看下面的视频: 跳转到6:48,直接观看演示 1).要用GPU做什么 这里不会介绍cuda的编程模型,cud...

  tB9Gvpoy7LDx   2023年11月01日   82   0   0 Linux

下面的系列文章记录了如何使用一块linux开发扳和一块OLED屏幕实现视频的播放: 项目介绍 为OLED屏幕开发I2C驱动 使用cuda编程加速视频处理 这是此系列文章的第2篇,主要总结和记录一个I2C从设备的驱动,在linux内核中如何实现,如何给用户态的程序暴露合适的接口,让用户态有机会操作真实的硬件设备.可以通过下面的视频快速了解最终达到的效果和实现的总体思路. 跳转到6:48,直接观看演示 1).I2C驱动架构 I2C总线是一种主从,同步,半双工的低速通信总线,硬件标准可以参考这里.这篇文章只讨论I2C总线上从设备的驱动在linux平台下如何实现,下图是linux中I2C总线相关...

  tB9Gvpoy7LDx   2023年11月01日   115   0   0 Linux

下面的系列文章记录了如何使用一块linux开发扳和一块OLED屏幕实现视频的播放: 项目介绍 为OLED屏幕开发I2C驱动 使用cuda编程加速视频处理 这篇文章主要对项目的实现做整体的介绍,包括硬件的需求,最终实现的视频播放效果,以及软件的实现思路. 1).硬件需求 beagleboneblackboard(之后简称bbb) ssd1306oled屏幕(支持i2c接口) 支持cuda的N卡(用于视频处理加速) 2).效果演示 跳转到6:48直接观看演示 3).实现原理 下图是系统中各部分的交互关系: 待播放视频以mp4文件的形式保存.OLED屏幕不支持彩色,并且要求每帧视频分辨...

  tB9Gvpoy7LDx   2023年11月01日   86   0   0 Linux
关注 更多

空空如也 ~ ~

粉丝 更多

空空如也 ~ ~