- 博客(24)
- 资源 (2)
- 收藏
- 关注
原创 【芝士点记录】A篇
之前在做嵌入式裸机开发时,一直不理解如何分层设计,是直接调用方案商/原厂提供的库还是中间封装一层再给逻辑层使用?如今在接触更复杂的软件系统后,逐渐明白,当某模块可独立且需要有大量独立逻辑时,才有必要针对此模块单独分层设计。只有这样,针对复杂的软件系统,可以分层给不同的开发人员做维护,各层之间再通过其他API进行传递。分层后,由于所有代码不是在一坨上,模块化设计可使代码更易于维护。不同的编译器,有不同的审查规范,也就间接导致了我们编译代码过程与结果的差异。同一行代码,在审查不严格的编译器,不会报错;
2024-01-14 22:03:25
339
原创 【上位机应用开发】Python篇 C部分
C语言无法很好的应对复杂场景下的开发,因此美国开发者们开发了C++语言,而后又基于C++语言,开发了Java、Python语言等等,作为一名中国的嵌入式开发人员,国内的嵌入式行业起步较晚,当前熟练掌握C语言可以立足,然而二十年后的光景谁都无法预测,鉴于国外的发展经验,此刻掌握一门面向对象的预言显得尤为重要,python小工具开发已告一段落,后续准备交给其他同事维护了,个人感觉python还是比较简单的,得益于开发者的数量庞大,不管是QT开发组件还是python中的一些方法,都可以在网上找到对应的用法。
2023-12-03 22:18:57
139
原创 C语言编程规范
不同的工作单位下不同同事的代码书写规范会有不同,初入一个单位,总是得适应当前代码工程的编码方式,编码方式的不统一也会经常让我感到疑惑,经过一段时间的熟悉,总结几个编码需遵守的共性规则,可使同事间代码维护更加方便。本质归纳:之所以针对C/C++规范命名规则,本质上是让代码更好地维护,此命名方式是灵活的,例如某些平台为了区分库函数和用户自定义函数,库函数使用小写开头...把握本质!a,b,c,x,y,z,i,j,k这类局部变量,一般用于函数体内循环使用,但最好有个具体的名字。
2023-11-19 22:15:15
94
原创 【C/C++基础】malloc相关
malloc占据内存的堆空间,与free函数在之前的单片机开发中很少用到,原因主要一是malloc后未及时释放容易导致内存泄漏(内存一直被申请占用,却未被释放,导致其他进程无法使用,单次内存泄漏也许不会导致问题,内存泄漏累积后系统会出现异常);二是普通的Cortex-M3核单片机上的资源往往较少,对于普通的STM32F103类单片机,系统的栈资源往往是1KB,堆资源往往是512B,内存资源太少不如使用数据段(20KB)进行一般数据的存储。现在开始重新梳理下这几个月收获吧~二、malloc函数。
2023-11-05 17:54:23
64
原创 【上位机应用开发】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
102
原创 【上位机应用开发】Python篇 A部分
由于当前仅被安排开发一个比较简单的上位机工具,实现功能有限,仅用到Pycharm(IDE)、QTdesigner(根据可视化界面生成.ui格式的文件)、PyUIC(将.ui格式文件转换为.py格式的可识别文件),但Python的版本迭代实在太快,导致很多教程都跟不上版本变化,看了好多篇博客才完成安装,下面是相关的安装过程和一些雷点。虽是嵌入式方向,刚毕业时一直想基于C#开发一款上位机,没争取到,近期偶然获取到一个用python开发的宝贵机会,记录一下。其次,进行QTdesigner和PyUIC的安装,
2023-05-02 17:18:44
858
原创 【正点原子Linux C应用编程指南】学习里程碑总结
说实话,当阅读正点原子的这篇文档时,带着些许失望,并不是文档写的不好,而是质量明显不如RTOS和裸机部分的编写,可能是没有实践过的原因。记得朱有鹏老师之前说过,正点原子也是从他的课程中总结了很多知识,现在看来,部分一章内容都没有朱老师一小节讲的明白,决定要加速看完这个再开始C++的系统学习了,加油!标准I/O库和系统调用的区别:标准的I/O库为C语言的自带属性,具有更好的平台可移植性,且其底层调用系统调用,相对系统调用增加了更多的特殊属性,更加强大,也更方便用户使用。【第五章】22/12/28。
2022-12-18 22:23:57
464
原创 【半音阶口琴】基础汇总
可能是4/4的谱子多了,大家习以为常以为四分音符为一拍,在其后加横线表示时长加倍,加下划线表示时长减半。例:4/4表示每一个小节有四拍,四分之一音符为一拍。3/4表示每一个小节由三拍,四分之一音符为一拍。一拍的时长都是可以变化的,例如规定一分钟为60拍,一拍就是一秒。这个在曲首都会有标注。四分音符:一首歌由一个个小节组成,小节由一个个音符组成。即把每个小节的时长分为四等份,每一份的时长为一拍。'2 结合性为先结合减时线,再结合附点,因此1表示3/4拍。增时线:2--- 后面的三个杠表示前面音符的续音。
2022-12-17 13:42:42
736
原创 【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
671
4
原创 【摄影汇总贴】基础篇(持续更新)
3、调节一张照片的影调就是调节他的曝光值,物理背景:自然界中白雪光的反射率为98%,黑炭为2%,然而大部分物体反射率为18%,因此相机也取18%来进行曝光,即灰蒙蒙的颜色。若遇到白雪,则需增加曝光,若遇到黑炭,则减少曝光。2、曝光补偿三元素:光圈、快门、感光度。一般常用光圈优先,设定一个曝光补偿值后,交给相机自动调节快门与感光度;在拍摄运动场景时会用到快门优先。1、使用大光圈时会虚化背景,使用小光圈时会出现光点的星芒现象。
2022-10-07 19:48:44
143
原创 【PhotoShop基础B篇】准确控制曝光
高光更多作用于60~90,阴影更多作用于20~50,对比度为提亮黑白的对比,饱和度则取决于白色部分的数量,白色部分数量越少,饱和度越高。直方图的横坐标表示亮度信息,纵坐标表示像素点的个数,例如高对比度的照片左右两侧的峰值都比较高,且直方图左右两侧的像素点高。通过直方图,我们可以轻松获取到照片中有无死黑和死白的现象,以及照片中色彩分布以及色彩所占的像素点数,按需进行调节。对于过曝的照片我们要适当降低其高光部分,对于曝光不足的部分,我们要适当拉高其阴影部分。以下素材来自B站UP主:平面设计洋洋。......
2022-08-30 23:52:53
551
原创 【PhotoShop基础A篇】磨皮/图层/液化
相对于传统的一键美颜APP,PS无疑更加强大,功能强大带来的往往是较高的上手难度,本节介绍一下常用的磨皮操作与图层的概念。相对前者更加智能,可以先使用Alt+鼠标左键瞄定某处皮肤,以此为参照,将皮肤瑕疵去除,注意此处为参照而非完全替换,PS加入了识别适配算法。选择混合画笔工具,使用固定参数2552,即20%、51%、46%、20%进行美肤,使明暗处过渡更加自然,即减少黑场,增加灰场。会自动攫取周边皮肤的颜色,来将面部污点去除,这种方式简单易操作,但以圆形形式攫取皮肤面积,不易获取不规则的皮肤表面;...
2022-08-29 00:56:19
1897
原创 【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
2064
原创 【C/C++】指针赋初值问题
之前在开始开发纯C的裸机软件时指针的定义较为随意,经常会出现未初始化的过程,这块理解的缺失直到今天才爆发出来,需谨记!对于某些中间件的commn接口,形参往往定义为void *的形式。当我们进行实参传入时,需保证实参指向明确的地址。一般较少使用,使用new分配空间后,后面一定要对其进行释放,否则容易造成内存泄漏。一开始没头绪,经同事一起排查,定位为指针定义时未初始化导致。对于某些不需要指针的场景,可以进行变量声明后直接进行&操作。2、在初始化时使用malloc或new为其分配堆空间。......
2022-08-07 14:53:25
1544
原创 C++中的模板类
什么是模板类:C++发展到一定层次后,必然有部分代码存在仅传参的数据类型不同而内容一致的情况。因此,C++为解决此类场景,特推出模板类的使用。模板类是一种泛型技术,即与数据类型无关的通用程序设计技术。可以使我们设计出独立于数据类型的程序。模板类本身不占空间,当编译器执行到模板参数的调用时,当在程序中赋予具体的数据类型后并调用时则占用空间。常见的模板包含函数模板与类模板。模板的声明中class含义同typenamec,class并不是表明后续的类型名是一个类,而表示后续是一个通用的类型说明符。一、函数模板函数
2022-07-11 00:35:35
13544
1
原创 C++中的friend 关键字
转载:(10条消息) C++ friend关键字_风叶翩翩的博客-CSDN博客_c++ friend关键字C++中的私有成员只能间接访问,一般架构清晰的程序中会使用Get()与Set()函数来用作外部访问,但存在一些场景下需要使用friend函数来访问私有成员,即C++的友元函数允许类的非公有。友元函数创建之初为方便类与类之间共享数据使用,可以减小开销,提升数据传递效率。即如果B类的函数方法要访问A类中的私有成员或者保护变量,则A类中该函数需要是B类的友元函数。在哪个类中声明了友元函数,别的类就可以使用这个
2022-07-03 12:12:36
611
原创 【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
1084
原创 C++类的单例模式浅谈
单例模式是C++23种设计模式中最简单也是最常用的一种,类似于C语言中只创建一个结构体变量,即一个类只有对象,具有全局变量的特点,任何位置都可以调用这个对象,可以有效预防类有多个对象导致的调用混乱问题。 通过单例模式, 可以确保一个类只有一个实例被建立 ,也就是C++中定义全局的东西的一个通用做法。例:操作一个驱动文件,如摄像头驱动,不可多线程同时操作,所有的处理必须通过唯一的实例来进行。单例模式需保证所创建对象的生命周期伴随程序始终,而非每次被赋值的对象都是局部变量,因为使用static声明静态变量是最佳
2022-06-30 21:38:10
375
原创 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
2793
原创 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
34306
4
原创 C++中的虚函数详解
虚函数在运行时绑定,即运行时确定执行的函数。所谓的后期绑定就是一个基类中有一个虚函数,而派生类中重写了这个函数,那么调用的这个虚函数的时候根据类的实例的不同而调用不同的函数。为什么会有虚函数的存在?c++发展至今,相信绝大多数类的场景都覆盖掉了。例如,在类的多态中,使用子类实例化对象调用子类的成员函数、使用父类对象调用父类的成员函数,使用子类对象继承类的成员函数,那么,有没有一种方式,可以使用父类的对象调用子类的成员函数呢?于是,虚函数就诞生了,可以让父类指针有多种形态。用例验证,定义一个基类Father,
2022-06-14 13:56:02
1755
原创 【C++基础】C++学习手记(持续更新)
搞过几年纯C,对于面向过程的编程思想有了一定掌握。对于常年征战面向对象的人来说,从java转python学习成本并不高,面向对象的思想具有通用性。而对于从纯C工程师而言,转型往往具备一定难度。以最近的工作为契机,接触到了C++方面的知识,随手记录下。一、C++中 :: 符的使用C语言中不同功能的C文件之间,其函数体往往需要加入前缀来区分,例如读取IIC操作,IIC_Read();读取串口,UART_Read()。在C++中为了避免不同的类成员命名重复,使用符号 ::来表示作用域和从属划分。::符前面一般是类
2022-06-11 17:44:19
112
原创 【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
1216
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人