Linux嵌入式系统专栏
文章平均质量分 74
Linux开源系统,促进世界进步
smartvxworks
VxWorks,Linux,QNX,PowerPC,ARM,FPGA,DSP,嵌入式系统架构师,QT UI架构师,项目经理,军工领域耕耘数十载,一起成长,不断进步。
一个优雅的程序员、一个沉稳的架构师。
展开
-
公司常用的Project管理工具
主要用于远程电脑的作用,开发者可以通过瘦终端远程开发电脑进行开发,保证了代码不会外泄;远程的开发电脑只能将某些指定的文件传出来,代码是没有权限传出的,开发电脑一般在机房,开发人员无法直接操作电脑,只能通过远程来进行开发。reviewBoard代码审查工具,所有工程师写的代码上传到reviewBoard,经过审查没有问题后,再上传到SVN,保证代码的可靠性。禅道主要用于测试人员对Bug的发布,然后指定到个人,去解决bug;svn主要是对代码的管理,保证代码的同步开发。reviewboard的搭建方法。原创 2023-02-10 11:07:46 · 2259 阅读 · 0 评论 -
VxWorks开发环境-VxWorks6.8-VxWorks6.9-VxWorks7.0-各个CPU型号的BSP
vxworks,vxworks下载,VxWorks开发环境,VxWorks6.8,VxWorks6.9,VxWorks7.0,各个CPU型号的,BSP;原创 2021-06-03 16:33:01 · 4458 阅读 · 20 评论 -
【Linux】运行程序前加上strace,可以追踪到函数库调用过程
如执行结果可知: 我们的程序虽然只有一个printf函数,但是在执行过程中,我们前后调用了execve、access、open、fstat、mmap、brk、write等系统调用。其中write系统调用会把字符串:yikoulinux通过设备文件1,发送到驱动,该设备节点对应终端stdout。【注意】运行程序前加上strace,可以追踪到函数库调用过程。原创 2023-08-04 09:19:06 · 2328 阅读 · 0 评论 -
【Linux】Makefile自动生成详解
针对上面提到的各个命令,我们再做些详细的介绍。autoscan是用来扫描源代码目录生成configure.scan文件的。autoscan可以用目录名做为参数,但如果你不使用参数的话,那么autoscan将认为使用的是当前目录。autoscan将扫描你所指定目录中的源文件,并创建configure.scan文件。configure.scan包含了系统配置的基本选项,里面都是一些宏定义。我们需要将它改名为configure.in3、 aclocalaclocal是一个perl 脚本程序。原创 2023-07-12 09:03:08 · 656 阅读 · 0 评论 -
【Linux】shell中快速遍历所有文件下匹配的内容
xargs (英文全拼: eXtended ARGuments)是给命令传递参数的一个过滤器,也是组合多个命令的一个工具。-ok 和-exec的作用相同,只不过以一种更为安全的模式来执行该参数所给出的命令,在执行每一个命令之前,都会给出提示,让用户来确定是否执行。变化时间(-ctime/天,-cmin/分钟):文件数据元(例如权限等)最后一次修改时间。访问时间(-atime/天,-amin/分钟):用户最近一次访问时间。修改时间(-mtime/天,-mmin/分钟):文件最后一次修改时间。原创 2023-06-28 15:43:20 · 5876 阅读 · 0 评论 -
linux下通过V4L2驱动USB摄像头
目录文章目录目录 前言 `v4l2`解析 `v4l2`介绍 应用程序通过`V4L2`接口采集视频数据步骤 相关结构体解析 总结 参考链接前言在移植罗技C270摄像头到6818的过程中,内核已经检测到了USB摄像头,但是直接用OpenCV的API(比如CvCapture*cvCaptureFromCAM(int index)接口,无法打开USB摄像头,至少目前我是这么认为的。然后,网上搜索答案说是要使用V4l2进行操作。没有别的办法!只有一边学一边试试看行不行喽!.原创 2020-10-12 11:38:47 · 723 阅读 · 0 评论 -
Linux USB摄像头使用
Linux USB摄像头使用一、使用V4l2工具调试摄像头1.v4l2-ctl 常用操作# 安装V4l2工具包$ sudo apt install v4l-utils# 通过v4l2查看摄像头设备$ sudo v4l2-ctl --list-devicesEP28WD (usb-fe380000.usb-1.3): /dev/video0 /dev/video1 # 查看当前摄像头支持的视频压缩格式$ sudo v4l2-.原创 2020-10-12 11:26:25 · 6738 阅读 · 2 评论 -
【Linux】linux进程间通信netlink socket(用户与内核通信) 二
netlink socket是一种用于用户态进程和内核态进程之间的通信机制。它通过为内核模块提供一组特殊的API,并为用户程序提供了一组标准的socket接口的方式,实现了全双工的通讯连接。原创 2023-05-30 16:29:22 · 721 阅读 · 0 评论 -
【Linux】Linux /proc/iomem与/proc/ioports
大多数适用于PCI总线的current cards(以及其他cards)都向总线提供一个或多个I/O内存区域(I/O memory regions)。通过访问这些区域,处理器可以与外设通信。查看/proc/iomem将显示在给定系统上已经注册的I/O内存区域。原创 2023-05-16 10:27:04 · 1245 阅读 · 0 评论 -
【Linux】浅谈Linux内核定时器timer_list
mod_timer(struct timer_list *, unsigned long jiffier_timerout):修改定时器的超时时间为jiffies_timerout;timer_pending(struct timer_list *):定时器状态查询,如果在系统的定时器列表中则返回1,否则返回0;init_timer(struct timer_list*):定时器初始化函数;在超时处理函数结尾重新加载定时器时间mod_timer(&my_timer,HZ);原创 2023-05-09 11:49:49 · 494 阅读 · 0 评论 -
【Linux】内核中双向链表
将新节点加到链表尾部,添加一个节点b为下图所示,再添加一个节点C,则在b后面再加一个c,组成双循环链表。使用 INIT_LIST_HEAD初始化双向列表头元素,使得prev和next都指向头自己。这里把a(只是替代)当作头结点,初始化时,使得prev和next都指向自己。该函数创建头节点,注意list要已分配好空间。原创 2023-05-09 11:03:03 · 99 阅读 · 0 评论 -
【Linux】浅谈网络协议栈-网桥br0
简单来说,桥接就是把一台机器上的若干个网络接口“连接”起来。其结果是,其中一个网口收到的报文会被复制给其他网口并发送出去。以使得网口之间的报文能够互相转发。交换机就是这样一个设备,它有若干个网口,并且这些网口是桥接起来的。于是,与交换机相连的若干主机就能够通过交换机的报文转发而互相通信。如下图:主机A发送的报文被送到交换机S1的口,由于eth0与eth1、eth2桥接在一起,故而报文被复制到eth1和eth2,并且发送出 去,然后被主机B和交换机S2接收到。而S2又会将报文转发给主机C、D。原创 2023-05-09 09:10:56 · 388 阅读 · 0 评论 -
【Linux】linux进程间通信netlink socket(用户与内核通信) 一
netlink 中定义的相关宏主要是为了计算方便,方便得到数据的位置,方便得到下一个消息。/*上述NLMSG_ALLIGN(len)得到不小于len且字节对齐的最小数值*//*得到不小于nlmsghd且字节对齐的值 *//*NLMSG_LENGTH(len)得到数据部分长度为len时实际的消息长度,它一般用于分配消息缓存*//*获取数据部分的首地址*//*得到下一个消息的首地址,并且len的长度为剩余消息的长度。该宏一般在一个消息被分成几个部分发送或接收时使用*/原创 2023-05-08 12:01:17 · 782 阅读 · 0 评论 -
【Linux】 rlimit 函数详解,进程资源限制
每个进程在运行时系统不会无限制的允许单个进程不断的消耗资源,因此都会设置资源限制。Linux系统中使用resource limit来表示,每个进程都可以设置不同的资源限制,当前进程和其以后fork的子进程会遵循此限制,而其他进程不受当前进程条件的影响。转载 2023-05-08 10:33:39 · 1022 阅读 · 0 评论 -
【Linux】linux backtrace()详细使用说明,分析Segmentation fault
用户态或者内核态程序异常退出时回溯堆栈信息。开发应用程序时,经常碰到程序挂掉后,串口打印输出一大串让人看不懂的数据。其实这些数据是程序挂掉时的堆栈帧数据(stack frame data)。通过这些堆栈帧数据可以分析出程序当时的运行状态和定位程序哪里出现了问题。这就是本文要讲的—backtrace()和backtrace_symbols()函数的使用。原创 2023-05-08 10:15:40 · 2007 阅读 · 1 评论 -
【Linux】linux进程间通信unix socket(域套接字)
使用套接字除了可以实现网络间不同主机间的通信外,还可以实现,将通信域指定为。原创 2023-05-06 16:54:22 · 1229 阅读 · 0 评论 -
【Linux】Makefile中打印宏定义
那么就需要寻找根目录下的PWD当前路径,然后再一级一级的包含下去,最终在包含XXX.h的c文件同级Makefile中将头文件包含进Makefile中即可;那么这个过程中避免不了打印输出Makefile中各种宏定义,下面将介绍如何在Makefile中输出宏定义到编译控制台的shell中。有时编译时,会报找不到XXX.h头文件,如果头文件在其他路径下,此时需要将头文件在Makefile中进行包含;因为Makefile的嵌套关系,导致Makefile中很多宏定义是看不到的。原创 2023-05-06 09:28:06 · 765 阅读 · 1 评论 -
【Linux】浅谈eloop机制
如果 select() 返回结果大于0,说明有socket事件发生,则调用 eloop_sock_table_dispatch() 依次处理三个 table(遍历三个table中的eloop_sock,调用其handler)(6)如果不是超时事件,则应该是rfds, wfds或者efds事件,fd_set里面会被改变,存放发生事件的描述符。在循环期间,外部调用 eloop_sock_table_add_sock() 函数往 eloop_sock_table 中添加 eloop_sock。原创 2023-05-05 18:44:29 · 1566 阅读 · 0 评论 -
【Linux】Linux性能优化-内存优化
内存映射,其实就是将虚拟内存地址映射到物理内存地址。为了完成内存映射,内核为每 个进程都维护了一张页表,记录虚拟地址与物理地址的映射关系,如下图所示:转载 2023-05-04 18:41:24 · 1390 阅读 · 0 评论 -
C语言预处理条件语句的 与或运算
ifdef (MIN) || (MAX) -----------------------------错误使用。#ifdef (MIN) && (MAX) ----------------------------错误使用。#ifndef (MIN) || (MAX) --------------------------错误使用。#ifndef (MIN) && (MAX) -------------------------错误使用。1.#ifdef 与或运算。原创 2023-03-20 11:42:12 · 2134 阅读 · 0 评论 -
RK1808固件升级说明
升级固件前言本文介绍了如何将主机上的固件文件,通过公对公USB线,烧录到开发板的闪存中。升级时,需要根据主机操作系统和固件类型来选择合适的升级方式。准备工作 Core-1808-JD4 开发板 固件 主机 公对公USB线 固件文件一般有两种: 单个统一固件 update.img, 将启动加载器、参数和所有分区镜像都打包到一起,用于固件发布。 多个分区镜像,如 boot.img, rootfs.img, recovery.img 等,在开发阶原创 2020-08-10 11:17:27 · 2330 阅读 · 0 评论 -
Linux下Makefile、Kconfig、.config、make menuconfig的关系
在drivers/input/touchscreen/Makefile中添加驱动:obj-$(CONFIG_TOUCHSCREEN_GSLX680) += gslx680/。只要当配置了CONFIG_TOUCHSCREEN_GSLX680的选项才会去编译gslx680目录下的内容。在配置内核的时候会通过make menuconfig来配置对应的选项。或者是直接在defconfig文件中强制设置该选项。示例:驱动所在的路径:firefly-sdk\kernel\drivers\input\to...原创 2020-08-26 10:48:47 · 173 阅读 · 0 评论 -
Linux驱动,如何添加驱动,让make menuconfig识别到
在drivers/input/touchscreen/Makefile中添加驱动:obj-$(CONFIG_TOUCHSCREEN_GSLX680) += gslx680/。只要当配置了CONFIG_TOUCHSCREEN_GSLX680的选项才会去编译gslx680目录下的内容。在配置内核的时候会通过make menuconfig来配置对应的选项。或者是直接在defconfig文件中强制设置该选项。示例:驱动所在的路径:firefly-sdk\kernel\drivers\input\to...原创 2020-08-26 10:50:01 · 561 阅读 · 0 评论 -
C 语言popen函数,逐行读取shell命令内容
参数是一个字符串指针, 指向的是 一个以 null 结束符结尾的字符串, 这个字符串包含一个 shell 命令. 这个命令被送到。参数也是一个 指向以 null 结束符结尾的字符串的指针, 这个字符串必须是 'r' 或者 'w’ 来指明是读还是写.函数用创建管道的方式启动一个进程, 并调用 shell. 因为管道是被定义成单向的, 所以。参数只能定义成只读或者只写, 不能是两者同时, 结果流也相应的是只读或者只写.函数的返回值是一个普通的标准I/O流, 它只能用。函数的输出流默认是被全缓冲的;原创 2023-02-09 17:53:55 · 1672 阅读 · 0 评论 -
不同路径下的文件打包提交到svn
修改代码一般都是位于不同路径,这时候将这些不同路径下修改的文件提交到svn,就需要用的changlist对不同路径下的文件进行打包,然后将打包后的文件统一提交到svn,下面就是具体步骤。原创 2023-02-09 17:43:24 · 541 阅读 · 0 评论 -
解析Linux中的 likely 和 unlikely
linux内核里的likely和unlikely实际上功能和if是一样的的,likely和unlikely在编译阶段,编译器对其进行了优化,减少分支,使得CPU执行更高效!转载 2023-02-03 12:08:02 · 648 阅读 · 0 评论 -
隐式Makefile详解
第20~22行:if语句,判断定义的ARCH宏是否等于arm,如果等于就定义当前的交叉编译器CROSS_COMPILE为arm交叉编译器,具体编译器根据项目来;第24~26行:if语句,判断定义的ARCH宏是否等于x86,如果等于就定义当前的交叉编译器CROSS_COMPILE为空,编译时默认编译器为x86架构的;第3行:指定Makefile所在的当前路径下的include文件夹路径赋值给INCLUDE_DIR;第2行:指定Makefile所在的当前路径下的lib文件夹路径赋值给LIB_DIR;原创 2023-01-30 09:51:49 · 1107 阅读 · 0 评论 -
ARM公司发展史
当前,X86和ARM架构是公认的在商业化进程中表现最优秀的两大架构。之前我们已经介绍了X86架构,今天介绍另一个在近十年大火的架构,ARM。ARM架构,过去称作(Advanced RISC Machine,更早称作:Acorn RISC Machine),是一个32位精简指令集(RISC)处理器架构,被广泛地使用在嵌入式系统设计。原创 2023-01-17 10:22:32 · 1829 阅读 · 5 评论 -
reedlau高精度 高分辨率 计时函数 Linux
但是常规的时间函数精度比较低,对某个函数执行时间的测量可能得到的结果为零,但是循环次数很多的情况下又会占用很大的时间,此处你可能会说可以将其他的地方屏蔽掉来单纯测量某一个函数执行多次的时间,但是这样编译器可能会做一些优化,直接或间接地影响测量的准确性。同时提供的diff函数可以统计两个测量点之间的时间差,tv_sec 表示整秒数tv_nsec表示以ns为单位的小数部分。在优化程序过程中,经常性的要统计时间,尤其是科学计算程序,只有在理解每一个部分占用的时间的基础上,才能做进一步的优化和分析。原创 2022-12-21 15:15:10 · 126 阅读 · 0 评论 -
Linux内核中断之获取中断号
Linux内核中可使用函数获取dts文件中设置的中断号。原创 2022-10-09 16:16:41 · 4946 阅读 · 0 评论 -
Linux开发,内核代码,找不到内核宏定义,找不到内核函数
Linux内核代码量是庞大的,如果将代码全部加入工程中不太现实,这样就导致,开发时,找不到很多内核的函数和宏定义;Linux开发,内核代码,找不到内核宏定义,找不到内核函数;原创 2022-09-30 16:16:27 · 404 阅读 · 2 评论 -
linux网络之数据包的接受过程
网卡收包从整体上是网线中的高低电平转换到网卡FIFO存储再拷贝到系统主内存(DDR3)的过程,其中涉及到网卡控制器,CPU,DMA,驱动程序,在OSI模型中属于物理层和链路层,如下图所示。原创 2022-08-15 15:47:30 · 819 阅读 · 0 评论 -
Linux内核中的下半部机制之tasklet
开发驱动模块时如果要使用tasklet,首先驱动模块自己要定义自己的tasklet(通过内核提供的接口),包括定义自己驱动感兴趣的动作并以回调函数(图上的function)的方式记录在tasklet的结构体中,完成这些注册后,驱动模块可以在中断处理的上半部分触发。软中断的处理函数以下半部的形式在一个合适的推迟的时间点上被内核运行,该函数会扫描tasklett的链表,针对链表中的每一个预先注册的tasklet,调用回调函数function。对应位为1,注意以上检查和设置的操作以原子的方式进行。...原创 2022-08-13 12:21:59 · 436 阅读 · 0 评论 -
secureCRT打印增加时间戳
这里有个地方需要注册,老化测试的时候,可能会抓取几天甚至几十天的log信息,所以最好把串口信息保存到本地,可在Logfilename位置设置,比如D\SecureCRT\log%H_%Y%M%D_%h%m%s.log。在Uponconnect和Oneachline添加[%Y%M%D_%h%m%s]就可以了。...转载 2022-07-15 10:43:24 · 4770 阅读 · 0 评论 -
Linux内核memcpy的不同实现
目录1.概述2.高级SIMD和浮点寄存器介绍2.NEON指令2.1 VLDR2.2 VLDM2.3 VSTR2.4 VSTM3.ARM架构程序调用寄存器使用规则3.1.ARM寄存器使用规则3.2.NEON寄存器使用规则3.优化代码3.1.memcpy_libc3.2.memcpy_13.3.memcpy_323.4.memcpy_643.5.memcpy_gen3.7.memcpy_neon_1283.速度测试3.1.对齐拷贝测试(单位:MiB/s)3.2.非对齐拷贝测试(单位:MiB/s) 4.影响拷贝速转载 2022-07-05 16:18:16 · 1911 阅读 · 0 评论 -
解决undefined reference to `__aeabi_uidivmod‘和undefined reference to `__aeabi_uidiv‘错误
自己写裸机驱动程序时,使用了除法,在链接的时候出了如下错误:使用的编译器是:后来上网搜了一下原因,由于编译器不支持除法运算,但是也没有搜到解决方案。看了一下代码确实用到了除法,把除法去掉可以正常连接通过。后来想了想了,之前编译内核和编译u_boot都是这个编译器的呀,他们肯定有除法运算呀,他们是怎么做到的呢?于是看了一下u_boot的Makefile,很晕,东西很多,后来编译了一下,看到了这个:u_boot在链接的时候,指定了黄色颜色的路径和-lgcc选项(-l后面的是链接库的名字)到指定的目录下看到如下内转载 2022-06-30 18:49:07 · 711 阅读 · 0 评论 -
Linux下ARM64 的 memcpy 优化与实现
Linux 内核用到了许多方式来加强性能以及稳定性,本文探讨的 memcpy 的汇编实现方式就是其中的一种,memcpy 的性能是否强大,拷贝延迟是否足够低都直接影响着整个系统性能。通过对拷贝函数的理解可以加深对整个系统设计的一个理解,同时提升自身技术实力。罗马不是一天建设而成的,Linux 内核的拷贝函数也不是一开始就是那么优秀,在 3.14 之前(具体多少版本忘记了),Linux 尚且没有完善对 ARM64 架构的支持,系统的内存拷贝函数就是一个简单的 c 语言版本,也就是目前内核中的通用拷贝函数。#转载 2022-06-27 18:04:57 · 2256 阅读 · 1 评论 -
Linux链接脚本lds概述
一、概论ld:用来把一定量的目标文件跟档案文件链接在一起,并重新定位它们的数据,链接符号引用.一般编译一个程序时,最后一步就是运行ld进行链接每一个链接过程都由链接脚本(linker script, 一般以lds作为文件的后缀名)控制. 链接脚本主要用于规定如何把输入文件内的section放入输出文件内, 并控制输出文件内各部分在程序地址空间内的布局. 但你也可以用连接命令做一些其他事情.连接器有个默认的内置连接脚本, 可用ld –verbose查看. 连接选项-r和-N可以影响默认的连转载 2022-05-27 06:32:49 · 798 阅读 · 1 评论 -
C++ inline内联函数详解
函数是一个可以重复使用的代码块,CPU 会一条一条地挨着执行其中的代码。CPU 在执行主调函数代码时如果遇到了被调函数,主调函数就会暂停,CPU 转而执行被调函数的代码;被调函数执行完毕后再返回到主调函数,主调函数根据刚才的状态继续往下执行。一个 C/C++程序的执行过程可以认为是多个函数之间的相互调用过程,它们形成了一个或简单或复杂的调用链条,这个链条的起点是 main(),终点也是 main()。当 main() 调用完了所有的函数,它会返回一个值(例如return 0;)来结束自己的生命,从而结束.转载 2022-05-20 09:43:03 · 100 阅读 · 0 评论 -
gcc命令行选项说明
GCC 支持许多命令行选项,这些选项控制将运行时检测添加到其通常生成的代码中。例如,检测的一个目的是收集分析统计信息,以用于查找程序热点、代码覆盖率分析或按配置文件优化。另一类程序检测是添加运行时检查,以检测编程错误,如无效的指针取消引用或越界数组访问,以及故意的恶意攻击,如堆栈粉碎或C++ vtable 劫持。还有一个通用的钩子,可用于实现其他形式的跟踪或函数级检测,以进行调试或程序分析。-p-pg生成额外的代码以编写适合于分析程序(用于)或(用于)的配置文件信息。在编译要访问其数据的原创 2022-05-20 08:47:24 · 2282 阅读 · 0 评论