
Linux应用开发
文章平均质量分 57
多进程多线程编程和应用开发
LINK稚朋
写博客只是副业,私聊评论不能及时回复勿怪
展开
-
chrony+gpsd部署pps校时
将外部gps信号输出通过串口转usb线接到自己电脑或者直接接入到控制器查看串口输出数据是否有RMC信息。pps信号线接好之后在控制器 通过sudo ppstest ./dev/pps0 测试pps信号是否正常。直接使用apt方式安装软件,需要的软件有chrony、gpsd、pps-tools。注:如有之前已经配置过的控制器,此步骤建议直接拷贝之前控制器的配置到新控制器。chrony配置路径为 /etc/chrony/chrony.conf。2、通过gpsmon确认输出信息,如下图正常。原创 2023-03-17 15:59:31 · 3381 阅读 · 1 评论 -
时间同步,校时问题总结
前段时间测试现场车辆上报云端数据的延迟,使用的测试方案是车端上报数据中携带精确到毫秒的时间戳,云端收到协议之后在本身的日志存储接收时的时间戳,比对两者的差异从而确认网络+业务延迟。当然正常情况下测试两者延迟的方法是客户端发送时记录时间戳,然后服务端接收后马上进行业务处理同步的返回回复协议,客户端计算发收时间间隔的1/2就是延迟。这里不使用这种方法的原因有二,一是车和平台目前只有个别这样同步收发消息的业务,难以做长时间的拷机稳定测试;二是我们不关想测试网络延迟,是想测试车云真正的业务处理延迟,所以为了不增加新原创 2022-07-06 19:56:02 · 1646 阅读 · 0 评论 -
交叉编译过程中常遇见的问题
1、Find_package没有对应的cmake文件怎么处理?SET(fastrtps_DIR /home/share/Lib_DIR)不行,Find_package运行成功的最终目的是 在工程的顶层目录中的CMakeLists.txt 文件添加 include_directories(XXX_INCLUDE_DIRS) 来包含库的头文件,添加target_link_libraries(XXX_LIBRARIES)命令将源文件与库文件链接起来。所以如果我们知道要链接的头文件和库路径,手动在cmakelist原创 2022-06-17 15:49:04 · 1151 阅读 · 0 评论 -
CMake交叉编译配置
很多时候,我们在开发的时候是面对嵌入式平台,因此由于资源的限制需要用到相关的交叉编译。即在你host宿主机上要生成target目标机的程序。里面牵扯到相关头文件的切换和编译器的选择以及环境变量的改变等,我今天仅仅简单介绍下相关CMake在面对交叉编译的时候,需要做的一些准备工作。 CMake给交叉编译预留了一个很好的变量即CMAKE_TOOLCHAIN_FILE,它定义了一个文件的路径,这个文件即toolChain,里面set了一系列你需要改变的变量和属性,包括C_COMPILER,CXX...转载 2022-02-08 14:34:58 · 871 阅读 · 0 评论 -
应用程序debug调试方案
linux环境下debug调试问题怎样才能做到最方便?像单片机可以直接重写printf(puts)函数,直接将打印输出到串口;而linux下的应用程序如何实现,问题困扰了我好久,最近恰好想到一个比较不错的解决方案,仅供参考;需求:1、应用程序可以通过终端操作将日志重定向到指定位置(包括指定log文件,ssh终端,串口终端等)2、应用程序的打印日志可以通过命令调节打印等级;3、整个方案不涉及内核修改,方便做跨平台开发;...原创 2021-09-30 15:15:52 · 295 阅读 · 0 评论 -
关于终端和console
一个好的应用程序,要提供给开发人员和维护人员一个好用的日志系统;最近在做打印系统模块,把需要的知识点简单记录下;一、终端百度下终端的概念,可以看到很多解释;我大概的理解就是一个程序的IO控制端口;linux系统原始有7个真正的终端,可以通过ctrl+alt+F1-F7切换,在终端中可以看到linux最初的模样,完全命令行模式的;处理这几个终端外,我们可以新建无数个虚拟终端,来方面使用;例如我们可以在linux的桌面端通过ctrl+alt+t的方式新建无数个终端,特殊的还有ssh终端,串口终端;我原创 2021-09-30 09:48:16 · 918 阅读 · 0 评论 -
posix定时器失效问题记录
个别定时器线程处理接口存在阻塞情况;从而导致所有定时器失效;从这个问题看,定时器内部也是轮训处理机制,单个定时器问题会导致整个定时系统异常原创 2021-09-29 18:45:40 · 415 阅读 · 0 评论 -
浅谈内存函数栈中的栈帧
栈是函数调用的实现基础,而栈帧就是函数调用栈中的一个基础知识点。对栈帧理解后能更好的理解函数运行过程。简单来理解,程序运行过程中,PC指针每遇到一个函数,栈都会新增一个栈帧。栈帧记录着函数的参数,返回地址,父函数的栈底指针和自身相关的局部变量等。理解栈帧前先明确以下几个寄存器概念:esp,栈顶指针ebp,栈底指针pc,指向程序运行的下一行程序地址注意:ebp指向当前位于系统栈最上边一个栈帧的底部,而不是系统栈的底部。严格说来,“栈帧底部”和“栈底”是不同的概念;esp所指的栈帧顶部和系统栈的顶部原创 2020-12-10 22:29:00 · 438 阅读 · 0 评论 -
函数参数中使用const
转自:http://blog.youkuaiyun.com/mathe/article/details/1271519在函数的参数中使用const,可以让编译器知道在函数调用过程中,对于某个参数不会修改数据,从而可以提供给编译器更多的优化机会。比如标准函数char *strcpy(char *dst, const char *src);这里,第二个输入参数使用const char *src,而...转载 2018-12-28 11:59:57 · 9118 阅读 · 1 评论 -
内存区域的划分和分配
一个由c/C++编译的程序占用的内存分为以下几个部分1、栈区(stack)— 程序运行时由编译器自动分配,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。程序结束时由编译器自动释放。2、堆区(heap) — 在内存开辟另一块存储区域。一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。用mall...转载 2018-09-23 16:31:41 · 6126 阅读 · 1 评论 -
代码规范——全局变量使用规范
最近参与的项目有大量的开发量,功能调试过程中发现自己在使用全局变量时引入了严重的问题,导致程序崩溃。回想下自己开发时使用全局变量,十有八九都会引起各种问题。所以想着专门记录下全局变量的使用规范和注意事项,防止以后还会出现同样的问题。一、声明和初始化声明时最好是在开发设计到的模块文件进行声明,对每个变量定义资源锁,使用时必须获取线程锁资源。在模块内部**封装初始化、获取、配置(init, get, set)**三个接口,如全局变量是数组要对数组的索引进行有效性验证。全局变量定义最好是使用static静态原创 2020-08-09 15:36:10 · 2209 阅读 · 0 评论 -
基础学习总结——线程池
经常听到线程池的概念,不过在实际工作和项目里没有应用过线程池。线程池可能是作为服务端的开发经常用到的技术架构,所以最近我也通过网络简单的学习了下线程池的概念,稍微理解了线程池的应用场景。在高并发的服务环境下,存在多个客户端访问服务端相同服务的场景,而传统方式,是为多客户端创建一一对应的处理线程,这在高并发场景下极大的耗费服务端的资源。为了解决这类问题,服务端可使用线程池,为同一服务创建相同的线程队列,这些线程循环处理工作队列中的任务,当有客户端需要这种服务时将增加任务到工作队列中。在实际使用上,可能大原创 2020-08-30 15:47:22 · 231 阅读 · 0 评论 -
210的IIC应用例程的修改
早在单片机课上接触过I2C,不过当时只是大概了解然后直接把课本上的代码敲上了事。课上学习的是AT24c02的驱动。I2C总线作为单片机嵌入式中常见的名词并不是徒有虚名,常见的EEROM,lcd液晶,以及运动传感器都是通过I2C与MCU通信。而我这次需要驱动的是一个三轴加速度传感器(LIS331DL)认真阅读完了I2C总线协议后开始上手代码,难度还是很大。首先查阅LIS331传感器所给的例程,该...原创 2018-08-14 17:21:28 · 565 阅读 · 0 评论 -
Linux命令行查看内存
用 'top -i' 看看有多少进程处于 Running 状态,可能系统存在内存或 I/O 瓶颈,用 free 看看系统内存使用情况,swap 是否被占用很多,用 iostat 看看 I/O 负载情况...还有一种办法是 ps -ef | sort -k7 ,将进程按运行时间排序,看哪个进程消耗的cpu时间最多。top:主要参数 :d:指定更新的间隔,以秒计算。 q:没有任何延迟的...转载 2019-11-13 11:34:53 · 1789 阅读 · 0 评论 -
LINUX文件类系统调用的几个问题
在学习进程通信是遇到个疑惑:学习Linux编程前,一直认为在C中字符数组和字符指针是一回事,而今天遇到的问题说明两者并不相同。学习进程通信阶段,包括管道通信,信号通信,共享内存。在编写共享内存测试程序时有这样一段:strncpy(p_addr,argv[1],1024);strncpy的三个参数,分别是目标地址这里是上面定义的指针char *p_addr,复制地址这里是通过主函数参...原创 2018-08-28 18:18:03 · 253 阅读 · 0 评论 -
linux设置开机自启脚本
要开机运行只需将它加入到 rc.local ,一般为/etc/rc.d/rc.local或/etc/rc.d/rc.sysinit在其中加入以下行:sh /mnt/yaffs/test.sh或者 sudo/mnt/yaffs/test.sh或者 cd/mnt/yaffs/./test.sh...原创 2018-10-26 20:03:37 · 15701 阅读 · 1 评论 -
修改linux内核的开机图片
windows中把一张xx.jpg的图片转换成xx.bmp的图片方法: linux中生成ppm图片(ppm图片应该是其他格式的图片解析成数据序列的文件)【方法1】 转换方法如下: bmp图片使用bmptoppm。jpg,png,gif都有相应的topnm工具,但我没有试过。 $bmptoppm pic.bmp > temp1.ppm //生成ppm $ppm...转载 2018-10-26 19:11:06 · 2680 阅读 · 0 评论 -
应用开发中常用的进程线程通信
进程通信是学习应用编程的基础,尤其是对于大型嵌入式项目而言,熟悉常用的通信方式是能写好代码和能看懂代码的前提。其实在大学刚接触linux就学习过进程间的几种通信方式,不过由于当时接触的项目都比较简单,导致没能对这几种通信有比较好的理解和应用。工作之后有了大量的代码阅读量,感觉对几种通信的应用有了新的认识,所以坐下简单的总结。共享内存信号量消息队列管道共享内存共享内存是几种通信方式中常用的程序间通信方式容易理解的。(如果不理解共享内存这个名词,你可直接把他想象成常用标志位,不过这个标志位可能会原创 2020-08-23 21:29:51 · 294 阅读 · 0 评论 -
对Linux中消息队列和信号量集合的理解
消息队列和信号量集合同样作为进程间通信的重要手段,是LInux编程必需理解的内容,但两者类似的操作和文件结构让很多人不能理解其中的原理。下面我来介绍下我的理解:在使用消息队列和信号量集合前都必须使用的一个函数Key_t ftok(char *pathname,char proj), 其功能是:根据文件名(包含路径)和项目名返回对应键值key,留作创建消息队列的参数(这里可以理解为同一个文件可以...原创 2018-08-30 09:55:46 · 1467 阅读 · 2 评论