- 博客(36)
- 资源 (2)
- 收藏
- 关注
原创 【Vela学习】存储系统
VFS全称是Virual file system,Linux中的不同文件系统包含FAT、ROMFS、RAMFS等,不同的文件操作系统均包含Open、Close、Read、Write等接口,但不同文件系统的对文件的处理方式是不同的,因此需要单独抽象出一层级作为上层差异性的屏蔽,VFS提供统一的文件操作接口(如。norflash中没有页的概念,以字节进行读取和写入,以扇区作为最小擦除单元,写入前需进行擦除操作(负荷检测单元,存储90天数据,一天天擦除,按扇区进行)。二、扇区、页、块的区别。
2025-03-10 23:56:53
222
原创 【梦想终会实现】Linux驱动学习7
是Linux内核虚拟抽象出来的设备,以应对显卡、LCD、显卡驱动等场景,抽象出来的一个体系,Framebuffer是Linux内核向驱动提供的一套标准的显示设备,Linux内核把系统中所有跟硬件和软件集合出来虚拟出的设备,并给应用层提供统一的标准接口。向应用层屏蔽了驱动层的细节。framebuffer驱动,上难度了。
2025-02-09 10:58:48
156
原创 【梦想终会实现】Linux驱动学习6
类创建用class_create(),设备创建用device_create(),设备创建时需要主次设备号,用***_chrdev_***相关函数创建即可,随后使用cdev绑定到内核。device_create()关联应用层的udev处理,即上抛相关信息,上层接收到后创建/删除对应的设备文件。明显为write仅支持不复杂的数据写入,若针对复杂的数据结构,若还用write接口,无疑会增加难度,故使用ioctrl接口,以应对复杂的控制。主设备编号将动态选取,并与第一个从设备编号一同返回至 @dev 中。
2025-02-08 15:10:08
395
原创 【梦想终会实现】Linux驱动学习4
内核的解决方案就是给内核启动时要调用的所有函数归类,然后每个类按照一定的次序去调用执行。内核开发者在编写内核代码时只要将函数设置合适的级别,这些函数就会被链接的时候放入特定的段,内核启动时再按照段顺序去依次执行各个段即可。module_init的宏为__define_initcall("6",fn,6)。驱动框架就是内核开发者自己写了一部分公共代码,然后剩下的部分交给其他厂家的驱动开发工程师去写。模块的入口和出口都是在下面的。不同设备的驱动框架不同(wifi、蓝牙、触摸屏),每个的驱动框架都要重新学习。
2025-02-01 23:55:04
181
原创 【梦想终会实现】Linux驱动学习3
register_chrdev为早期Linux版本中分配主设备号的函数,register_chrdev_region为增强版本,不仅能分配主设备号,还能分配一定范围内的从设备号,并自动生成/dev下的文件名。经过前两篇的学习,也算对驱动进行了祛魅,驱动本质上不过是在内核地址空间运行的一块儿代码,依据Linux独有的驱动架构,对外设进行类裸机操作,从而Linux驱动开发。dev:字符设备结构体,用于存储分配好的主设备号和从设备号。设备号通常由主设备号和次设备号组成,可以通过。: 需要注册的连续设备号的数量。
2025-01-27 23:09:22
316
原创 【梦想终会实现】Linux驱动学习1
狭义上驱动:先了解要学习的平台是什么,windows下驱动 or linux下驱动 or android驱动,这个驱动是非常依赖平台的,要看这个平台采用什么样的编译方式,区分于裸机驱动。应用-->C库-->API-->驱动,API与驱动之间分了各层级,重点学习这中间各层级间的关系, 驱动往上是API,往下是寄存器。linux兼具微内核和宏内核的特点,它的代码都是集成在一起的,因此是个大的宏内核,但是又可以通过宏开关来裁剪(静态模块化),且驱动是以.ko的形式存在,可以动态注册与删除(动态模块化)。
2025-01-19 09:33:17
213
原创 为什么需要状态机?
可以设计为一个while(1)顺序执行的方式,每个时刻都有执行的操作,睡觉->起床->上午工作->中午吃饭->下午工作->晚上加班.....,if (早上) else if (中午).........这是标准的面向过程的执行方式,一天就是一个过程,不适合阅读,维护成本高,有没有面向对象的方式去执行呢?2、在RTOS中,根据任务划分功能,每个任务都有停止态、挂起态、就绪态、运行态这几种状态,每个任务有需要抢占时间片执行对应的逻辑,每个任务都是一个状态机,抢占时间片去跑自己的逻辑。
2025-01-05 23:38:02
248
原创 【C++基础汇总】A篇(完结)
因此在C++中环境中编写代码时,若涉及大量C代码实现某功能时,一定要检索一下有没有此类的C++库函数,千万要记住,可以事半功倍,还能少出错!C++中的容器一般是由STL标准模板库提供,如vector、list、deque,可以动态地删除、添加或者改变元素,容器的大小根据需要而改变,容器中可以存储任意对象。因为结构体涉及字节对齐问题,因此无法直接将结构体转换为数组,尽量也不要用结构体++的形式,若有结构体对齐的行为,这样很容易出问题。3、结构体无法直接转换为数组。
2024-11-10 22:02:40
138
原创 【杂乱芝士点记录】A篇
之前在做嵌入式裸机开发时,一直不理解如何分层设计,是直接调用方案商/原厂提供的库还是中间封装一层再给逻辑层使用?如今在接触更复杂的软件系统后,逐渐明白,当某模块可独立且需要有大量独立逻辑时,才有必要针对此模块单独分层设计。只有这样,针对复杂的软件系统,可以分层给不同的开发人员做维护,各层之间再通过其他API进行传递。分层后,由于所有代码不是在一坨上,模块化设计可使代码更易于维护。不同的编译器,有不同的审查规范,也就间接导致了我们编译代码过程与结果的差异。同一行代码,在审查不严格的编译器,不会报错;
2024-01-14 22:03:25
390
原创 【上位机应用开发】Python篇 C部分
C语言无法很好的应对复杂场景下的开发,因此美国开发者们开发了C++语言,而后又基于C++语言,开发了Java、Python语言等等,作为一名中国的嵌入式开发人员,国内的嵌入式行业起步较晚,当前熟练掌握C语言可以立足,然而二十年后的光景谁都无法预测,鉴于国外的发展经验,此刻掌握一门面向对象的预言显得尤为重要,python小工具开发已告一段落,后续准备交给其他同事维护了,个人感觉python还是比较简单的,得益于开发者的数量庞大,不管是QT开发组件还是python中的一些方法,都可以在网上找到对应的用法。
2023-12-03 22:18:57
194
原创 C语言编程规范
不同的工作单位下不同同事的代码书写规范会有不同,初入一个单位,总是得适应当前代码工程的编码方式,编码方式的不统一也会经常让我感到疑惑,经过一段时间的熟悉,总结几个编码需遵守的共性规则,可使同事间代码维护更加方便。本质归纳:之所以针对C/C++规范命名规则,本质上是让代码更好地维护,此命名方式是灵活的,例如某些平台为了区分库函数和用户自定义函数,库函数使用小写开头...把握本质!a,b,c,x,y,z,i,j,k这类局部变量,一般用于函数体内循环使用,但最好有个具体的名字。
2023-11-19 22:15:15
169
原创 【C/C++基础】malloc相关
malloc占据内存的堆空间,与free函数在之前的单片机开发中很少用到,原因主要一是malloc后未及时释放容易导致内存泄漏(内存一直被申请占用,却未被释放,导致其他进程无法使用,单次内存泄漏也许不会导致问题,内存泄漏累积后系统会出现异常);二是普通的Cortex-M3核单片机上的资源往往较少,对于普通的STM32F103类单片机,系统的栈资源往往是1KB,堆资源往往是512B,内存资源太少不如使用数据段(20KB)进行一般数据的存储。现在开始重新梳理下这几个月收获吧~二、malloc函数。
2023-11-05 17:54:23
122
原创 【上位机应用开发】Python篇 B部分
python不同于C/C++、Java、C#,他是一个解释性语言,是一个脚本语言,执行顺序是从上到下,不必有具体的main函数。的使用,但三四级的缩进,很难看清代码的层次,因为觉得不如大括号方便,通常使用一个TAB(4个空格)来表示一个缩进量。from...import为导入一个具体的模块,可以直接使用模块中的函数而不用库引用标识。--- import和from...import的区别。--- pthon中使用分号作为语句分隔符,而。--- python中的main函数。import为导入一个文件夹。
2023-08-27 23:00:50
142
原创 【上位机应用开发】Python篇 A部分
由于当前仅被安排开发一个比较简单的上位机工具,实现功能有限,仅用到Pycharm(IDE)、QTdesigner(根据可视化界面生成.ui格式的文件)、PyUIC(将.ui格式文件转换为.py格式的可识别文件),但Python的版本迭代实在太快,导致很多教程都跟不上版本变化,看了好多篇博客才完成安装,下面是相关的安装过程和一些雷点。虽是嵌入式方向,刚毕业时一直想基于C#开发一款上位机,没争取到,近期偶然获取到一个用python开发的宝贵机会,记录一下。其次,进行QTdesigner和PyUIC的安装,
2023-05-02 17:18:44
995
原创 【正点原子Linux C应用编程指南】学习里程碑总结
说实话,当阅读正点原子的这篇文档时,带着些许失望,并不是文档写的不好,而是质量明显不如RTOS和裸机部分的编写,可能是没有实践过的原因。记得朱有鹏老师之前说过,正点原子也是从他的课程中总结了很多知识,现在看来,部分一章内容都没有朱老师一小节讲的明白,决定要加速看完这个再开始C++的系统学习了,加油!标准I/O库和系统调用的区别:标准的I/O库为C语言的自带属性,具有更好的平台可移植性,且其底层调用系统调用,相对系统调用增加了更多的特殊属性,更加强大,也更方便用户使用。【第五章】22/12/28。
2022-12-18 22:23:57
567
原创 【半音阶口琴】基础汇总
可能是4/4的谱子多了,大家习以为常以为四分音符为一拍,在其后加横线表示时长加倍,加下划线表示时长减半。例:4/4表示每一个小节有四拍,四分之一音符为一拍。3/4表示每一个小节由三拍,四分之一音符为一拍。一拍的时长都是可以变化的,例如规定一分钟为60拍,一拍就是一秒。这个在曲首都会有标注。四分音符:一首歌由一个个小节组成,小节由一个个音符组成。即把每个小节的时长分为四等份,每一份的时长为一拍。'2 结合性为先结合减时线,再结合附点,因此1表示3/4拍。增时线:2--- 后面的三个杠表示前面音符的续音。
2022-12-17 13:42:42
942
原创 【Linux应用编程基础】ioctl函数
例如我需要控制电机正向旋转,在裸机开发中我可以直接控制GPIO口,但在Linux中需要驱动层给我封装一层MOTO_CTL_FORWARD的属性,并存储设备节点于/dev/moto1路径下,我open对应路径的节点后,直接通过ioctl函数调用其属性,就可以实现电机的正向旋转。而在Linux开发中Linux驱动与Linux应用在代码层级上是分开的,在实际开发过程中也是分两拨人开发的,Linux驱动服务于应用,Linux应用又作用于驱动。,IO表示file input/output,即对文件的读写操作。
2022-11-03 00:26:17
744
4
原创 【摄影汇总贴】基础篇(持续更新)
3、调节一张照片的影调就是调节他的曝光值,物理背景:自然界中白雪光的反射率为98%,黑炭为2%,然而大部分物体反射率为18%,因此相机也取18%来进行曝光,即灰蒙蒙的颜色。若遇到白雪,则需增加曝光,若遇到黑炭,则减少曝光。2、曝光补偿三元素:光圈、快门、感光度。一般常用光圈优先,设定一个曝光补偿值后,交给相机自动调节快门与感光度;在拍摄运动场景时会用到快门优先。1、使用大光圈时会虚化背景,使用小光圈时会出现光点的星芒现象。
2022-10-07 19:48:44
177
原创 【PhotoShop基础B篇】准确控制曝光
高光更多作用于60~90,阴影更多作用于20~50,对比度为提亮黑白的对比,饱和度则取决于白色部分的数量,白色部分数量越少,饱和度越高。直方图的横坐标表示亮度信息,纵坐标表示像素点的个数,例如高对比度的照片左右两侧的峰值都比较高,且直方图左右两侧的像素点高。通过直方图,我们可以轻松获取到照片中有无死黑和死白的现象,以及照片中色彩分布以及色彩所占的像素点数,按需进行调节。对于过曝的照片我们要适当降低其高光部分,对于曝光不足的部分,我们要适当拉高其阴影部分。以下素材来自B站UP主:平面设计洋洋。......
2022-08-30 23:52:53
676
原创 【PhotoShop基础A篇】磨皮/图层/液化
相对于传统的一键美颜APP,PS无疑更加强大,功能强大带来的往往是较高的上手难度,本节介绍一下常用的磨皮操作与图层的概念。相对前者更加智能,可以先使用Alt+鼠标左键瞄定某处皮肤,以此为参照,将皮肤瑕疵去除,注意此处为参照而非完全替换,PS加入了识别适配算法。选择混合画笔工具,使用固定参数2552,即20%、51%、46%、20%进行美肤,使明暗处过渡更加自然,即减少黑场,增加灰场。会自动攫取周边皮肤的颜色,来将面部污点去除,这种方式简单易操作,但以圆形形式攫取皮肤面积,不易获取不规则的皮肤表面;...
2022-08-29 00:56:19
2146
原创 【repo/git小技巧】repo sync时报错“The remote end hung up unexpectedly”解决办法
像往常一样使用repo init ~ -->repo sync 的形式进行代码仓库下载,但每次下载repo sync都不能执行成功,问题为“The remote end hung up unexpectedly”,亲测,可采用如下方法。执行完上述三层步骤后,进行repo sync -j32,无报错,问题解决。repo init [repo仓库链接] --depth=1。步骤一:Shell下输入如下指令增加缓存。步骤二:输入以下指令增加等待延迟。步骤三:只拉取一层log信息。......
2022-08-10 19:05:14
2411
原创 【C/C++】指针赋初值问题
之前在开始开发纯C的裸机软件时指针的定义较为随意,经常会出现未初始化的过程,这块理解的缺失直到今天才爆发出来,需谨记!对于某些中间件的commn接口,形参往往定义为void *的形式。当我们进行实参传入时,需保证实参指向明确的地址。一般较少使用,使用new分配空间后,后面一定要对其进行释放,否则容易造成内存泄漏。一开始没头绪,经同事一起排查,定位为指针定义时未初始化导致。对于某些不需要指针的场景,可以进行变量声明后直接进行&操作。2、在初始化时使用malloc或new为其分配堆空间。......
2022-08-07 14:53:25
1655
原创 C++中的模板类
什么是模板类:C++发展到一定层次后,必然有部分代码存在仅传参的数据类型不同而内容一致的情况。因此,C++为解决此类场景,特推出模板类的使用。模板类是一种泛型技术,即与数据类型无关的通用程序设计技术。可以使我们设计出独立于数据类型的程序。模板类本身不占空间,当编译器执行到模板参数的调用时,当在程序中赋予具体的数据类型后并调用时则占用空间。常见的模板包含函数模板与类模板。模板的声明中class含义同typenamec,class并不是表明后续的类型名是一个类,而表示后续是一个通用的类型说明符。一、函数模板函数
2022-07-11 00:35:35
14662
1
原创 C++中的friend 关键字
转载:(10条消息) C++ friend关键字_风叶翩翩的博客-优快云博客_c++ friend关键字C++中的私有成员只能间接访问,一般架构清晰的程序中会使用Get()与Set()函数来用作外部访问,但存在一些场景下需要使用friend函数来访问私有成员,即C++的友元函数允许类的非公有。友元函数创建之初为方便类与类之间共享数据使用,可以减小开销,提升数据传递效率。即如果B类的函数方法要访问A类中的私有成员或者保护变量,则A类中该函数需要是B类的友元函数。在哪个类中声明了友元函数,别的类就可以使用这个
2022-07-03 12:12:36
672
原创 【Git基础】 工作区 暂存区 版本库详解
一 、Git GUI的各区域的显示在Git GUI中,工作区、暂存区、本地仓库以可视化形式显示,对新手十分友好,如下所示。二、Git bush下各区域简介先描述下各区域,其中工作区记录了本地代码与上次提交的差异代码项,即git add 之前的代码。暂存区记录了git add的但未git commit分支的代码。本地仓库记录了git commit提交到本地分支的代码。 三、如何在Git bash下中如何使用命令行进行各区域切换1、我更改了a.c文件的代码,想把整个文件都恢复原状,需要一行一行改回来吗? 不需要
2022-07-02 13:21:46
1200
原创 C++类的单例模式浅谈
单例模式是C++23种设计模式中最简单也是最常用的一种,类似于C语言中只创建一个结构体变量,即一个类只有对象,具有全局变量的特点,任何位置都可以调用这个对象,可以有效预防类有多个对象导致的调用混乱问题。 通过单例模式, 可以确保一个类只有一个实例被建立 ,也就是C++中定义全局的东西的一个通用做法。例:操作一个驱动文件,如摄像头驱动,不可多线程同时操作,所有的处理必须通过唯一的实例来进行。单例模式需保证所创建对象的生命周期伴随程序始终,而非每次被赋值的对象都是局部变量,因为使用static声明静态变量是最佳
2022-06-30 21:38:10
410
原创 Android中的Log输出
安卓系统的代码量十分庞大,无法使用Jlink之类的工具进行单步调试,因而日志系统十分有必要。为此,安卓开发了Log日志类用于开发者的日常调试使用。Log中配置了五种Log类,分别表示打印五类不同输出等级的Log,如下:一般使用Log.i()和Log.e()会比较多。 当程序中添加上述打印信息后,需要上层加入logcat进行捕获,logcat是一个命令行工作,可以在shell下进行日志捕获,我们可以使用logcat进行数据项捕获,经常配合grep一起使用,常用指令为logcat | grep -iE "待检索
2022-06-26 21:54:04
2932
原创 C/C++中字符串拼接的使用详解(加常见字符串使用小结)
C/C++中针对字符串函数的使用过程中,需要格外注意字符串终止符'\0'。字符串结尾处默认带'\0'。 带形参n的库函数可以有效防止因字符串长度过长导致的段错误,建议使用带n的字符串函数。一 、snprintf函数的使用字符串复制是别样的一种字符串拼接方式,通过将目标字符串复制到源字符串结尾处实现字符串拼接效果。int snprintf(char *str, size_t size, const char *format, ...)设将可变参数(...)按照 format 格式化成字符串,并将字符串复制到
2022-06-26 16:43:31
36389
4
原创 C++中的虚函数详解
虚函数在运行时绑定,即运行时确定执行的函数。所谓的后期绑定就是一个基类中有一个虚函数,而派生类中重写了这个函数,那么调用的这个虚函数的时候根据类的实例的不同而调用不同的函数。为什么会有虚函数的存在?c++发展至今,相信绝大多数类的场景都覆盖掉了。例如,在类的多态中,使用子类实例化对象调用子类的成员函数、使用父类对象调用父类的成员函数,使用子类对象继承类的成员函数,那么,有没有一种方式,可以使用父类的对象调用子类的成员函数呢?于是,虚函数就诞生了,可以让父类指针有多种形态。用例验证,定义一个基类Father,
2022-06-14 13:56:02
1787
原创 【C++基础】C++学习手记(持续更新)
搞过几年纯C,对于面向过程的编程思想有了一定掌握。对于常年征战面向对象的人来说,从java转python学习成本并不高,面向对象的思想具有通用性。而对于从纯C工程师而言,转型往往具备一定难度。以最近的工作为契机,接触到了C++方面的知识,随手记录下。一、C++中 :: 符的使用C语言中不同功能的C文件之间,其函数体往往需要加入前缀来区分,例如读取IIC操作,IIC_Read();读取串口,UART_Read()。在C++中为了避免不同的类成员命名重复,使用符号 ::来表示作用域和从属划分。::符前面一般是类
2022-06-11 17:44:19
135
原创 【Git基础】常用Git指令(持续更新)
刚参加工作时主要使用GitGUI+Tortoise git工具+GitLab进行Git的代码协同,可视化的操作界面使刚毕业的我不必记录复杂的Git指令,使我能更专注于代码本身。而入职新公司后,将近半G的代码量的庞大项目取代了老东家200k的代码量的逻辑项目,版本管理也自然而然使用更适合多人协同的Repo+Git Bash+Gerrit的方式,在简单试用一段时间后,感叹在命令行下才可以深入理解Git的设计内核。1、RepoRepo全程是repository,是谷歌开发的用于管理Android 版本库的一个工具
2022-06-08 20:46:27
1595
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人