自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

weixin_44458100的博客

记录嵌入式Linux知识

  • 博客(38)
  • 收藏
  • 关注

原创 Linux下互斥体的学习使用

当多个应用同时打开的话,当第一个应用程序调用驱动正常执行,在执行第二个应用程序再次调用驱动的时候会因为获取不到互斥锁导致应用程序进入休眠等待,直到第一个应用程序运行完释放互斥锁释放驱动后,第二个应用程序就会释放互斥锁从而释放资源,可以继续打开。其实信号量的值设置为1就可以使用信号量进行互斥访问了,虽然信号量也可以实现互斥,但是Linux内核提供了一个比信号量更专业的机制来实现互斥,他就是互斥体-mutex,互斥体相对于信号量要简单轻便一些,且比信号量执行速度更快。当进程持有互斥锁时,进程不可以退出。

2024-06-05 16:07:38 291

原创 内核常见宏定义| module_init 详解必看

module_init驱动如何初始化

2024-06-05 16:07:01 544

原创 白嫖的在线工具类宝藏网站清单,快点击进来收藏一波

今年开始使用的一款网盘工具,和百度网盘类似,叫奶牛快传,如果公司不让用百度网盘而苦恼的话,这个工具可以完美替代,因为奶牛快传没有下载速度的限制,并且可以支持自定义分享文件的下载次数(需要开会员)。

2024-05-26 10:43:37 455

原创 Linux下自旋锁的学习使用

1、spin_lock和spin_lock_irq的区别是如果临界区发生中断,系统会暂停当前进程运行,转向处理中断,有人会问临界区会不会发生中断,如果调用spin_lock保护临界区的话,答案是一定会发生中断。自旋锁会自动禁止抢占,也就说当线程A得到锁以后会暂时禁止内核抢占,如果线程A在持有锁期间进入了休眠状态,那么线程A会自动放弃CPU使用权,线程B开始运行,线程B也想要获取锁,但是此时线程A持有,而且内核抢占还被禁止了,线程B无法被调度出去,那么线程A就无法运行,锁也就无法释放,好了死锁就发生了。

2024-05-25 10:35:06 282

原创 RK3588系列适配RTL8852BE驱动指南

如果用内核自带的btusb驱动报的错误日志信息,未识别8852的IC,会导致扫描周边的蓝牙设备扫描不出来。需要注意的是Realtek的模块,不能使用。

2024-05-19 23:40:52 1162

原创 Linux内核定时器Timer的学习

内核定时器因为采用系统时钟属于软件定时器所以他精度不高,不能作为高精度定时器使用,用法和硬件定时器一样,只不过不需要初始化一大堆寄存器而工作,需要注意一点是默认执行一次就结束了并不是周期性运行的,因此如果要想实现周期性的定时,就需要在定时处理函数中重新开启定时器。

2024-05-08 10:48:21 613

原创 推荐应届生找工作写进简历的10个项目

GitHub上关于无人机的开源项目很多,当然这并不只适用于无人机(从传统飞机、四翼飞机、多旋翼和直升机到漫游车、船只、平衡机器人,甚至潜艇),ardupilot是一个开源自动驾驶仪软件项目。FreeModbus是一款开源的Modbus协议栈,Modbus在工业产品用的比较多,不过只有从机开源,主机源码是需要收费的。

2024-05-05 12:53:20 349

原创 内核中常用宏定义| container_of

最后一句的意义是拿到结构体成员member的地址,减去这个成员在结构体type中的偏移,结果就是结构体type的首地址。这个宏有两个参数,一个是结构体类型TYPE,一个是结构体成员MEMBER,就是获得0地址常量指针的偏移是一样的,如果是结构体的首地址为0的话,那么获取的变量地址既是绝对地址也是结构体内的偏移。container_of是内核中使用最为常用的一个函数了,简单来说,它的主要作用是根据结构体中的已知的成员变量的地址,来寻求该结构体的首地址,直接看图,更容易理解。type, 表示结构体的类型。

2024-05-05 12:03:17 765

原创 1v1 付费咨询说明

有些从知乎上关注我公众号的知道,我从去年开始在知乎开始做咨询,收到几十个粉丝咨询且一直受到咨询粉丝的五星好评,也有面试上岸成功的案例,因为平台咨询次数较少且文字不能彻底解决你的疑问,所以借本篇特此费咨询说明。2020年毕业于一所双非本科院校,目前坐标杭州,工作了四年,前半年左右从事单片机相关的工作,后面换工作到目前在一家某五百强企业从事Linux驱动方面的工作。最后有需求的同学想咨询价格的可以私信我,付费后发送我你的背景和学习经历,然后咱们预约时间即可,这会是你在校期间及工作初期做的最正确最值得的投资。

2024-05-02 17:51:27 288

原创 内核中C语言高级语法 | attribute

别急喜欢我的文章可以在公众号右上角设置为星标。当你在一个函数声明或定义前加上__attribute__((constructor))属性时,就会告诉编译器,在程序加载时(在main函数执行之前),需要自动调用这个函数。__ attribute__((section("name"))): 使用__attribute__ 来声明一个 section 属性,主要用途是在程序编译时,将一个函数或变量放到指定的段,即 section 中。因此,在程序启动时,它们将按照a()->b()->c()->d()的顺序执行。

2024-05-01 10:46:44 384

原创 RV1126添加gc2093摄像头

上篇讲的是双目摄像头GC2053摄像头进行拉流,本篇介绍下如何适配添加RGB Sensor GC2093并且可以在windows上成功拉取视频流这两期我们学会了双目摄像头如何进行在VLC软件进行拉流。

2024-04-28 15:03:34 400

原创 RV1126 添加gc2053摄像头驱动

最近基于RV1126做人脸识别,选用了一款双目摄像头,RGB+IR,RGB Sensor为GC2093,IR Sensor为GC2053,可以读取两个sensor的图像,本节介绍下如何适配添加GC2053 sensor并且可以在windows上成功拉取视频流我们学会了如何用VLC进行拉取视频流,下期我们来做下拉取GC2093图像的视频流。vlc软件可以在公众号后台进行回复"vlc"进行获取。

2024-04-28 15:00:13 597

原创 单片机、嵌入式的大神都平时浏览什么网站?

/linux内核有关补丁,内核相关问题可以搜索看看。//电子工程师偏硬件的学习,电源,PCB。//凡亿课堂,我以前学画板在这里学的网站。付费的课程:淘宝上搜索唐左林的C/C++在线看各个版本linux内核的源码的网站。老吴的硬件宝藏博客网站,你要的东西都有。

2024-04-23 09:57:57 701

原创 Linux内核调试之如何用kdb调试

为了更加方便内核调试,社区开发了内核级的调试模块kdb和kgdb,通过它们可以实现对内核的在线调试。1、调试支持:KDB支持多进程、多线程调试,可以在多CPU上进行调试,同时支持几种核心调试技术,包括单步、断点、进程状态检查、运行状态检查、记录系统调用、跟踪系统调用等。

2024-04-04 09:58:39 477

原创 u-boot-2017.09 make配置过程分析

工具fixdep用于更新每一个生成目标的依赖文件*.cmd。2.执行make -f ./scripts/Makefile.build obj=scripts/kconfig rk3588_defconfig, 编译生成scripts/kconfig/conf 工具。如果依赖不存在,则会以依赖为目标,先生成依赖,待依赖生成后,再执行命令生成目标。1.执行make -f ./scripts/Makefile.build obj=scripts/basic,编译生成scripts/basic/fixdep工具。

2024-03-19 14:16:22 1040 1

原创 RK3588的u-boot编译和镜像生成

之前我有写过RK3588上电一文带你了解了RK3588,有需要可以看下之前的文章。本篇带着大家获取RK3588Q源码的获取以及u-boot源码单独编译的方法,uboot镜像说明,uboot镜像如何生成。让大家对uboot编译出来的镜像有个整体认识。本篇大体上了解一下在uboot.img, rk3588_spl_loader_v1.05.107.bin从哪里来的,make.sh做了哪些事情, 这样后面如果需要改代码, 就知道那些镜像会被重新编译。

2024-03-06 18:29:39 1484 4

原创 如何用git命令生成patch和打patch

程序员的日常开发过程中经常会经常做代码托管与提交,对于code的生成patch和打patch成为经常需要做的事情。什么是patch?简单地讲,patch中存储的是你对代码的修改什么是生成patch?生成patch就是记录你对代码的修改并将其保存在patch文件中什么是打patch?打patch就是将patch文件中对代码的修改,应用到源代码,从而把代码的修改应用到code中。尽管本身Linux命令里有diff和patch两个命令可以生成patch和打patch。

2024-02-20 22:10:20 897

原创 手把手教你搭建用buildroot构建qemu环境

手把手教你buildroot构建qemu环境

2024-02-10 15:47:48 958 1

原创 总结repo命令使用

我们日常工作开发的项目代码目录错综复杂,如果单单用git去管理代码的时候,太费时间,尤其是面对Android庞大的项目工程的代码,用git简直是灾难,这时候就要用到repo来管理项目代码,repo其实git的父亲可以这么说,repo命令可以对所有的有git仓库的目录进行操作。常用git命令上篇有讲过,没看的同学可以看看​。总结常用git命令。

2024-02-08 17:50:11 377

原创 这些git必会命令,你确定不进来看下

在项目开发中,基本都会遇到这样的情况:本来你在自己的分支上愉快的开发功能A,但是突然加了一个优先级很高的需求B或者有bug需要先修复掉。但这个时候,你新做的功能A刚开发到一半,总不能先提交A再开发B,或者直接拉个新分支切过去吧?临时保存分支修改的内容就像是,切换分支使用,git stash可以保存多次修改内容。

2024-02-06 11:46:36 926 1

原创 手把手教你搭建ARM64 QEMU环境

etc/profile文件是全局的shell配置文件,简单的讲就是登陆shell前的配置文件,主要是设置环境变量路径,设置主机用户名,创建设备节点。

2024-02-05 15:27:06 1247 1

原创 不常用但又必会Linux命令

这篇讲下Linux下不常用但又必会的命令,学会这些命令保证工作效率加快一大半,新手可以用于学习,老手可以用于复习。tar 命令常用于压缩tar.bz2,tgz文件,解压缩tar.bz2,tar.gz文件。我们常用-h选项,以人类可读的格式显示所有目录和子目录的磁盘使用情况。cat 不仅可以查看文件内容,还可以边创建文件边编辑文件内容。chown命令用于设置文件所有者和文件关联组的命令。解压 .tgz 或 .tar.gz 结尾的文件。解压 .tar.bz2 结尾的文件。解压 .tar.xz 结尾的文件。

2024-02-04 14:26:07 309 1

原创 手把手教你搭建ARM32 QEMU环境

dtb ./arch/arm/boot/dts/vexpress-v2p-ca9.dtb 指定单板的设备树文件。

2024-02-04 10:28:35 1076 1

原创 vim大神打造完整的IDE需要哪些插件

有需要本节小编的VIM配置文件的,可以在关注公众号[ Linux随笔录 ], 回复关键字"vim"即可获得 如果本篇对你有帮助的,可以一键三连支持一波。主要作用是在vim界面一侧显示文件的标签的插件,类似于taglist,比如文件的类、结构体、函数、变量等。主要作用是可用于在vim窗口下查看项目文件的数形结构,对于打开kernel复杂的项目工程非常有帮助。若能显示My Plugins已安装的插件,则表示Vundle已安装成功,下图是小编安装的插件。这些插件主要作用是什么,别急!

2024-01-28 16:49:52 417

原创 手把手教你用VIM编辑器阅读代码

大家阅读代码的时候普遍使用vscode的比较多,但是使用vscode阅读代码会偶尔出现no definition found不知道有没有遇到过,为了避免这样的麻烦产生,小编这次带大家使用VIM来一起阅读C/C++代码,轻松方便快捷而且也有IDE的效果。ctags通常与vim一起使用,以便在于都代码的时候更好的利用ctags提供的功能:代码导航,跳转到定义,查找引用,代码补全,重构支持。cscope提供的功能: 查找引用某符号的地方、调用某函数的地方、包含某文件得地方,就是cscope的独特地方。

2024-01-26 11:11:22 524 1

原创 VIM常用命令的总结使用

VIM是Linux下常用的文本编辑器,本篇文章主要聊聊VIM的常用命令的总结使用,用好了可以说是比vscode都好用。当然,还有许多其他的Vim命令和技巧可以掌握,不断练习并查阅相关资料,您将成为一位Vim高手。Visual 模式:选择内容,属于 Normal 模式的扩展,和 Command 模式配合,可以做到很多操作。:%s/<old>/<new>/g:将整个文件中的<old>替换为<new>。:s/<old>/<new>/g:将当前行中的<old>替换为<new>。在Vim中,您可以编辑多个文件。

2024-01-21 22:31:44 878 1

原创 总结编译stress-ng源码遇到的问题

运行时动态库依赖高版本glibc,和静态编译依赖库的问题如何解决

2023-12-11 20:10:28 308

原创 小米校招面试题

ARM Device Tree起源于OpenFirmware (OF),在过去的Linux中,arch/arm/plat-xxx和arch/arm/mach-xxx中充斥着大量的垃圾代码,相当多数的代码只是在描述板级细节,而这些板级细节对于内核来讲,不过是垃圾,如板上的platform设备、resource、i2c_board_info、spi_board_info以及各种硬件的platform_data。strncpy拷贝函数,虽然计算了复制的大小,但是也不安全,没有检查目标的边界。

2023-09-29 17:36:24 187 1

原创 解决Assertion `cnt < (sizeof (_nl_value_type_LC_TIME) / sizeof (_nl_value_type_LC_TIME[0]))‘ failed问题

上面的编译报的日志所报的是 flex-2.5.39: loadlocale.c:130: _nl_intern_locale_data: Assertion `cnt < (sizeof (_nl_value_type_LC_TIME) / sizeof (_nl_value_type_LC_TIME[0]))’ failed.做过Android的人应该都知道Android编译其实挺烦的,所以以后每次遇到的问题,还是记录下来以免忘记了。LC_ALL=C 是为了去除所有本地化的设置,让命令能正确执行。

2023-06-12 20:11:47 529

原创 嵌入式软件应届生面试题(三)

这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,在windows下栈的大小是2M,如果申请的空间超过栈的剩余空间时,将提示overflow,因此能从获取的空间较小。堆:堆是低地址向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连续的,而链表的遍历方向是由低地址向高地址。3、全局区(静态区)(static)是全局变量和静态变量的存储时放在一起的,初始化的全局变量和静态变量在一块区域,未初始化的全局变量和未初始化的静态变量在相邻区域。

2023-06-10 15:07:34 236

原创 嵌入式软件常见面试题目系列(二)

定义的常量是没有类型的(不进行类型安全检查,可能会产生意想不到的错误),所给出的是一个立即数,编译器只是把所定义的常量值与所定义的常量的名字联系起来,define所定义的宏变量在预处理阶段的时候进行替换,在程序中使用到该常量的地方都要进行拷贝替换;这样的函数又叫作静态函数。const 和指针结合的写法多少有点让初学者摸不着头脑,大家可以这样来记忆:const 离变量名近就是用来修饰指针变量的,离变量名远就是用来修饰指针指向的数据,如果近的和远的都有,那么就同时修饰指针变量以及它指向的数据。

2023-06-05 23:17:06 88 1

原创 嵌入式软件常见面试题目系列(一)

嵌入式软件面试题目系列(一)距离秋招还有三个多月左右,打算出几套面试基础题的文章。

2023-06-03 12:10:27 276

原创 perror和printf的区别

perror和printf的区别我们大多都使用printf来打印一些信息,其它的接口都比较少用。perror函数用的比较少,但是用起来调试比printf打印更加详细注意:perror不能带参数,printf可以带参数printf例子:#include<stdio.h>int main(void){ FILE *fp; fp = fopen("/home/book/test_file", "r+"); if (NULL == fp) {

2020-11-08 22:43:00 2037

原创 零数组长度的使用

零数组长度的使用零长度数组大小是多少?int main(){ char a[0]; printf("%d\n",sizeof(a)); return 0;}编译结果:0这玩意有什么作用呢?这个时候我们就可以通过a去访问后面的地址了。他更多的是被用在长度不确定的数据上。什么意思呢看下面的简单例子//声明typedef struct test{ int len; char *a; }TEST;//定义TEST *demo = (TEST *

2020-11-08 22:27:54 292

原创 #pragma不为人知的秘密

1、#pragma(n)和#pragma pack()#pragma pack(1) /* 1字节对齐 */struct test{ int a; char b; int c; short d;};#pragma pack() /* 还原默认对齐 */结论1:#pragma(n)和#pragma pack()一起用是在这期间保证n字节对齐,而且要成对存在#pragma(push)和#pragma(pop)#pragma(push):push是"压入"的意思。

2020-10-18 13:51:55 775

原创 面试题之大小端比较最常规的方法

大小端:大端就是高字节存放低地址,低字节存放高地址;小端就是低字节存放低地址,高字节存放高地址结合联合体的写法写大小端int check_endian(void){ union { char b; int a; }u; u.a = 1; return (u.b == 1);}int main(void){ if (check_endian() == 1) { printf("small endian!\n"); } else { printf("big e

2020-10-17 11:02:55 215

原创 宏的特殊用法

如果有错误,欢迎下面留言评论1.#字符串化#的作用就是将#后边的宏参数进行字符串的操作,也就是将#后边的参数两边加上一对双引号使其成为字符串。例如a是一个宏的形参,则替换文本中的#a被系统转化为"a",这个转换过程即为字符串化。#define TEST(param) #paramchar *pStr=TEST(123);printf("pSrt=%s\n",pStr);输出结果:pSrt=123表示的意思是字符串123,这里的#xxx,可以是数字也可以是字母,反正都是字符串含义2.#

2020-10-11 19:40:54 182

原创 Gcc的所有语法及编译过程

Gcc的所有语法及编译过程1.直接编译不加选项gcc main.c ./a.out2.-o选项这种方法 唯一要注意的就是-o后面一定要紧跟要生成的可执行文件名gcc -o main main.c./main3.-g选项用于给生成的可执行文件加上调试信息gcc -g -o main main.cgdb main4.-O选项-O用来优化,gcc默认是O0,-O3优化等级最高,但是在编译时间变长了5.-D选项5.1给源文件传递一个常量宏//main.cint main(i

2020-10-06 17:05:42 1505

Bluez协议栈文档代码解析

希望能给学习bluez的蓝牙爱好者一些帮助

2023-06-23

官网下的A2DP协议规范电子书

文档配套协议栈实现进行学习

2023-06-23

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除