自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(65)
  • 收藏
  • 关注

原创 VScode + WSL +一键自动编译

具体教程网上已经有了很多无非是自己写一个Task脚本设置一件运行该脚本,本文在他人脚本的基础上加入了编译后自动运行结果,希望能帮助到有需要的人,具体的教程操作可以参考https://blog.csdn.net/Jerry_xzj/article/details/89705643本人修改的编译运行脚本如下{ // See https://go.microsoft.com/fwlink/?LinkId=733558 // for the documentation about the tas

2021-12-20 20:21:08 540

原创 VS Code C/C++补全失效及解决方法

1.问题复现一直吹爆vscode做Linux 开发的远程连接IDE,最近遇到了一个玄学问题前一天写的代码自定义了一个结构体,在同一个文件内调用还可以,到了第二天在调用结构体成员时居然就不认识了,后来我发现vs code的c/c++插件自动补全经常会识别不了,如下图所示,隔了一行注释,在注释上方就可以识别到结构体成员,到了下面就死活不行了。查了一天网上都没有明确的说法,故在此记录一下怕坑记录。二、解决方案只要改一个配置就可以,改下这位大佬,https://blog.csdn.net/y24283648

2021-11-09 21:12:46 9929 4

原创 Select函数与poll 、epoll函数的比较

网上看了圈Select函数的使用,要么没重点,要么就是复制粘贴,因此我这用最通俗易懂的方式来说以下。1.select函数的功能select 函数实质就是一个可以被打断的定时器,他会检测一个指定文件描述符集合,这个函数的返回值有三种情况:返回 -1表示出错;0表示在规定的定时时间内没有指定的文件描述符集合中的元素没有发送我们所期望的事件(timeout);1表示检测到文件描述符发生状态变化。应用场景select主要用在socket编程,他的最大价值是防值一直阻塞式的傻等,他也可用来规定完成文件描述符操

2021-08-12 20:03:58 542

原创 WinFrom C#自定义控件的实现与添加流程

一、基本流程介绍保姆级流程:主要针对会C#但不熟悉VS控件制作流程的同学学习。我会复制一个简单的Demo然后对他的代码进行简单的分析,希望对大家有帮助。制作一个自定义的控件基本需要以下三步1.创建一个Winform 的类库项目2.设计自定义控件的一些方法和属性 编译生成.dll文件3.在一个winform的工具箱加入该dll,接下来只需要将自己做的控件托出即可。二、创建工程打开VS 选择创建一个新项目 进入如下界面输入 C# windows 然后选择Windows窗体控件库 如下图所示给

2021-06-24 22:26:43 8070 2

原创 HAL库CAN通信

CAN通信入门CAN通信的特点在于:发送帧的长度固定,不论数据的长短发送帧长度始终固定,信号采用差分的方式当CAN_H线和CAN_L线压差大时为显性状态(逻辑0),反之为隐性状态(逻辑1),接收帧时,不使用地址而使用ID(优先级),使用过滤器使的不需要CPU的介入就可以判断一帧数据是否需要被接收还是过滤。一.CAN通信的帧类型CAN通信有五种帧类型,其中最常使用也最复杂的就是数据帧。如下图所示,以下内容围绕数据帧的格式展开。[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img

2021-06-21 21:03:02 2247

原创 等精度测频

记录一种检测时间短且精度要求高的频率测量方式

2021-06-03 11:04:33 594

原创 Linux 定时执行shell脚本

1.crontab定时调用1.1crontab安装与使用 Ubuntu下安装crontab可以通过apt安装:安装:sudo apt install croncrontab 常使用的命令选项有:crontab -e #新建/编辑一个定时任务表crontab -l #列出当前正在执行的任务表crontab -r #移除当前正在执行的任务表提示:第一次使用crontab -e创建一个需要执行的任务表时会想让你选择使用哪一种编辑器,通过输入对应数字进行选择,如下图所示:

2021-01-23 14:50:02 2665

原创 STM 32——TIM定时器频率测量

STM 32——TIM定时器频率测量1.定时器不同工作模式的配置在使用STM32进行脉冲频率测量时,免不了会碰上TIM定时器的配置问题,这里做一个简单介绍1.1计数器模式首先我们选择内部时钟(PCLK)作为定时器的时钟源,PHB总线时钟的频率配置为170MHZ,在不采用预分频的情况下计数加一的时间即为1/(170M)秒。如上图所示,预分频系数(Prescaler)为1(0+1),向上计数模式,计数溢出值为65535(16位),若需要出发定时器中断(计数溢出中断)就要在NVIC Setting

2020-10-25 18:15:04 4630

原创 QT多线程编程

QT多线程编程最近的项目中用到了QT的多线程编程,在QT4.8之后推荐使用的子线程创建方式相对较为繁琐,在这里简单记录下。基本流程如下图所示:一.创建子线程1.1创建子线程类型在QT中每一个子线程需要设计一个基类为QObject类型的自定义子线程类型对象,这个类型中至少要包含线程处理函数,线程运行标志位以及标准位的设置函数。子线程的处理函数默认返回类型为Void,如果不是void类型在暂停或退出子线程时必须要要有返回值否则推出或暂停子线程会出错。class MyThread : public Q

2020-09-11 18:41:07 238

原创 QT中事件处理函数的触发流程

QT中事件处理函数的触发流程1.基本概念在QT中想要实现对特定的控件(如按钮,标签)的特定动作(如点击,拖动)做出指定的响应过程可以称之为事件的触发。在这个过程中有四个概念要首先了解,分别是事件对象,事件过滤器,事件函数,事件处理函数。1.1什么是事件对象​ 在QT中你对界面中控件做出任意动作(点击,按键输入)都会被捕获,并转化为一个事件对象QEvent,目的就是为了能够通过程序对所有的动作进行统一的识别和管理。1.2什么是事件过滤器​ QT中有许许多多不同种类的控件类型,每一种控件又包含了各种

2020-08-25 16:53:56 1683

转载 ProtoBuf编码原理

背景Protobuf是我们在网络传输中经常会用到的协议,优点是版本间兼容性强,对数据序列化时的极致压缩使得Protobuf包体积比xml、json等格式要小很多,节约流量。对于pb协议的具体使用方法,其官网有比较详细的说明,本文不再详述。我们的数据不管在代码中是什么复杂结构体,传输时都要序列化成二进制串。官网中也介绍了Protobuf的序列化算法,不过给的例子比较简单,学习起来不够直观。因此,本文用一个较为完整的例子直观展示一下Protobuf的序列化,一个例子即可搞懂Protobuf的序列化算法。一个

2020-08-24 11:22:27 1186

原创 stm32的总线架构

stm32的总线架构1.采用m3架构的stm32遵循哈佛架构,即数据和程序指令分别存储,在总线的设计上也会发现有一条指令总线(I-Bus)和一条数据总线(D-Bus),地址总线则与所有IO和外设相连,按照M3架构统一的存储器映射表分配对应地址。2.指令总线和数据总线如下图所示只会负责对应存储地址范围内的传输,剩下片内外设和外界设备则是需要通过系统总线(AHB)进行数据的传输,对于低速外设则是挂载在相对较慢的外设总线(APB)总线,APB总线通过一个桥接器最终还是会挂载到AHB总线上。...

2020-08-06 20:52:50 3602

原创 VSCODE远程连接到WSL问题

一、频繁断开连接当使用vscode的remote-ssh与WSL内的linux系统进行ssh连接时,不知道为什么每次在连接后隔一段时间就会弹出重新连接的弹窗,再尝试了一堆方法后,发现将remote-ssh 版本进行回退后能够解决问题,亲测使用0.50版本可以稳定建立连接。...

2020-07-10 08:36:08 3502

原创 C++引用的使用

C++引用的使用一、什么是引用引用是C++在C的基础上新添加的一类数据类型,他的优点是既保留了C语言中指针操作的高效性,又弥补了指针直接操作内存可能带来的安全性问题。1.1引用的声明方法数据类型标识符 & 引用变量名 =被引用变量名;【列1】int a ;int & b=a; //定义一个引用变量b引用的的对象是a说明:一、&符号在C++中不再仅仅表示取地址,这里的&符号使用做引用变量的标识符的作用二、声明引用类型变量时必须对其进行初始化,一旦初始化后

2020-06-23 10:58:08 2848 1

原创 C#接口

一、什么是接口抽象类:提到接口前一定要先知道什么抽象类(abstract),一个类里面一旦有了 abstract 成员,类就变成了抽象类,就必须标 abstract。abstract 成员即暂未实现的成员,因为它必须在子类中被实现,所以抽象类不能是 private 的。抽象类不能用于实例化对象,而只能用于被继承,因此抽象类一般有两个作用:作为基类,在派生类里面实现基类中的 abstract 成员声明基类(抽象类)类型变量去引用子类(已实现基类中的 abstract 成员)类型的实例,这又称为多态

2020-06-04 13:55:56 805

原创 C#继承、重写与多态

一、类的继承Timothy:继承的本质是派生类在基类已有的成员基础上,对基类进行的横向和纵向的扩展。• 横向扩展:对类成员个数的扩充• 纵向扩展:对类成员(重写)版本的更新只能扩展不能缩减,这是静态类型语言(C#、C++、JAVA 等)的特征,继承时类成员只能越来越多。动态类型语言(Python、JavaScript)可以移除类成员。继承的特点是:子类会获得所有父类所具备的成员,子类中还可以在父类基础上添加成员形成横向扩展,也可以对父类成员就行修改(重写)从而形成纵向扩展。二、子类对父类方法

2020-06-03 14:47:20 282

原创 C# 关键字学习

一、static与private**static:**限定了被声明的方法或属性的访问方式,只能通过类名进行访问。**private:**限定了被声明的方法或属性的作用域,仅限被本类内的成员进行访问,无法通过类或该类对象直接访问。**存储区别:**Static声明的成员被称为类成员,即该成员属于该类所有的该类成员都共享这一块内存,不会随着每个对象的创建而新建一块内存副本,private声明的成员被称为私有成员,在类创建新对象时,每一个对象都会有属于自己的内存,不同对象间互不影响。在使用static时要

2020-06-01 21:10:37 416

原创 C#事件的声明与定义

一、什么是事件组成一个事件的五个部分:事件的拥有者、事件拥有者的某个事件成员、事件订阅器、事件响应者以及事件响应者的成员。简单来说事件实质就是:事件的拥有者(Event source)的某个事件成员(Event,成员)被调用导致订阅该事件的事件响应者(Event Subcriber)调用事件处理成员(Event Handler,成员)被触发(本质上就是一个回调函数被调用)。二、事件的声明与定义方式上面我们已经知道到了什么是事件,事件的组成的五个部分(事件的拥有者、事件拥有者的某个事件成员、事件订阅

2020-06-01 17:00:42 2730

原创 C#委托学习

一、什么是委托什么是委托 Delegate委托实例 Action 与 FuncAction 和 Func 是 C# 内置的委托实例,它们都有很多重载以方便使用。class Program{ static void Main(string[] args) { var calculator = new Calculator(); // Action 用于无形参无返回值的方法。 Action action = new Action(calc

2020-05-26 12:03:34 272

原创 C#参数的传值与输出

一、值参数、值类型参数、引用参数、引用类型参数的分类如下图所示值参数与引用参数的划分关键是看有没有特殊修饰符修饰(ref 或out)的修饰。值类型参数与引用类型参数的划分则是根据在方法中声明与定义的参数类型而不是修饰符。二、参数的传值1.值类型的传值参数class Program{ static void Main(string[] args) { int y=100; Console.WriteLine(y); SomeMethod(y)

2020-05-23 19:41:48 801

原创 C#字段、属性、索引器和常量

字段使类具备封装数据的能力,而属性是为了更好的保护字段的一种特殊方法。一、字段字段是一类对象内部数据的实际存储者,其他的一切方法都是对字段的加工。从作用域上可以把字段分为共享字段和静态字段(如下声明),静态字段的特点是静态字段不属于任何对象,只属于类,必须要用 类名.静态字段名 进行访问,反过来通过 对象名.静态字段名 的方式是访问不到静态字段的。静态字段是可以重新赋值的,类名.静态字段名 = 新的值;静态字段的值为一个类的所有实体所共享;在概念上,它的值属于类所有,而不是类的每一个实体/对象所有c

2020-05-22 22:28:41 248

原创 C#中类型的派生

一、什么是类型Type 又名数据类型(Data Type)• A data type is a homogeneous collection of values, effectively presented, equipped with a set of operations which manipulate these values.• 是数据在内存中存储时的“型号”• 小内存容纳大尺寸数据会丢失精度、发生错误• 大内存容纳小尺寸数据会导致浪费• 编程语言的数据类型与数据的数据类型不完全相同

2020-05-21 10:31:34 1036

原创 一张图搞定Git基本指令

2020-05-12 17:32:43 209

原创 VIM——自动补全插件coc.nvim的安装与使用

最近发现了一个新的自动补全插件coc.nvim异步,nodejs后端,配合它自身的lsp支持用起来非常舒服,同样也支持lsp和snippets,强烈推荐,值得一试。一、使用vimplug安装插件1.进入coc.nvim 在github的主页https://github.com/neoclide/coc.nvim由于该插件需要nodejs的支持所以需要先安装nodejs,已安装可忽略此步cu...

2020-04-29 10:07:49 39213 13

原创 LINUX——命令实现原理

一、前情提要在了解linux中各种命令是如何实现的原理之前,首先要了解一些基本概念包括: 什么是终端(terminal),什么是shell以及他们之间是如何运行工作的。终端(Terminal)是对字符输入输出设备的抽象,在Linux中terminal是一种特殊的文件,在/dev目录下。通常情况下,键盘输入会写这个文件,而对应的终端驱动程序会执行诸如回显的工作(可以通过stty改变驱动程序的默...

2020-04-28 12:33:46 4385

原创 VIM-PLUG插件管理

用来记录vim的插件及具体使用一、检查安装VIM检查当前是否安装vim可以使用命令vim --version //检查vim版本若未安装则提示无此命令安装VIM $sudo apt-get install vim二、插件管理器vim-plug安装及使用1、安装在终端输入以下命令,该命令用于安装插件管理器 $ curl -fLo ~/.vim/autoload/plug.vim ...

2020-04-26 23:18:46 3070 5

原创 Git报错总结

为记录使用git过程中出现的问题做记录一、本地版本库与云端版本库莫名其妙出现无法匹配的情况最近改了一部分VIM的配置文件再上传到云端版本库时遇到了报错一开始以为是SSH与云端的连接出现了问题使用ssh -T [email protected]发现连接正常后来仔细查了半天发现本地原本设置的默认路径与云端不同不知道是github端对路径做了修改还是本地路径被修改解决方法git remote rm...

2020-04-25 23:04:25 118

原创 ARM NVIC内嵌向量中断控制器

本文主要围绕基于ARM M3内核提供的终中断管理器NVIC的介绍、功能以及实现展开。一、NVIC简要介绍ARM—CM3 内核支持256个中断,其中包含了16个内核中断(异常)和240个外部中断,并且具有256级的可编程中断设置。单片机设计商并不会使用内核提供的所有中断接口,而是选择其中的一部分。中断是指系统停止当前正在运行的程序转而其他服务,可能是程序接收了比自身高优先级的请求,或者是人为设...

2020-04-23 22:56:35 808

原创 UCOS III学习(五)

一、UCOS III中断管理1、中断函数的一般形式中断:应内部或外部异步事件的请求中止当前任务,而去处理异步事件所要求的任务的过程叫做中断。UCOSIII中中断服务函数一般格式如下void USART1_IRQHandler(void){ OSIntEnter(); //中断进入函数 //中断服务程序 OSIntExit(); //中断退出...

2020-04-15 22:01:26 839

原创 UCOS学习(四)

一、消息队列主要作用:为多个任务或者中断服务程序间通信提供了一个队列保存消息,定向或广播式发布消息。消息一般包含:指向数据的指针,表明数据长度的变量和记录消息发布时刻的时间戳,指针指向的可以是一块数据区或者甚至是一个函数。消息队列与信号量的对比:两者都在多任务间进行,信号量更像是一种授权,他只能告诉一个任务是否能够继续进行下去回答YES OR NO的问题,而消息队列能传递的内容丰富得多,可...

2020-04-15 16:07:39 311

原创 UCOSIII学习(三)

一、软件定时器1、什么是软件定时器UCOS中软件定时器本质是递减计数器,当计数器减到零时可以触发某种动作的执行,这个动作通过回调函数来实现。UCOSIII中定时器的时间分辨率由一个宏OS_CFG_TMR_TASK_RATE_HZ,单位为HZ,默认为100Hz(定时单位为5ms),可以通过修改宏定义的值来修改定时单位长度,定时时间=定时数*定时单位长度。2、UCOS中软件定时器的API函数...

2020-04-14 10:15:10 369

原创 STM32——FSMC模块驱动4.3寸80并口TFTLCD

一、FSMC模块1、什么是FSMCFSMC(Flexible Static Memory Controller):灵活的静态存储控制器,能够与同步或异步存储器和16位PC存储器卡连接,STM32的FSMC接口支持包括SRAM、NAND FLASH、NOR FLASH和PSRAM等存储器。2、FSMC的作用FSMC,在外部存储器扩展方面具有独特的优势,可根据系统的应用需要,方便地进行不同类型...

2020-04-12 14:23:00 2270

原创 UCOS III学习(二)

一、时间片轮转调度1、时间片轮转UCOS III支持同优先级任务下的时间片轮转调度,首先解释下什么是时间片轮转时间片是指一个较小的时间间隔,通常为 10 ms~100 ms 。在简单的轮转算法中,系统将所有的就绪的任务进程按 FIFO 规则排成一个队列,将 CPU 分配给队首进程,且规定它最多只能连续执行若干个时间片,若时间片用完时进程仍未完成,也必须将其插入就绪队列末尾,并把 CPU 交给...

2020-04-11 13:28:11 258

原创 UCOS III学习(一)

一、为什么要学习实时操作系统(rtos)随着嵌入式系统要处理的任务越来越复杂,对任务时时性要求越来越高。我们往往需要花比较大的精力用在任务间的调度处理上,比如我们想要设计一个行列键盘按键输入并用数码管动态显示的系统,单纯的行列键盘按键输入和数码管动态显示都很简单,但把他们放到一起就会出现问题,数码管动态显示内部需要延迟和定时刷新才能保证数码管的亮度和显示的实时性,而键盘的输入往往也需要按键消抖的...

2020-04-09 09:59:01 298

原创 ARM内核——寄存器功能讲解

根据“ARM-thumb 过程调用标准”:R0-R3 用作传入函数参数,传出函数返回值。在子程序调用之间,可以将 r0-r3 用于任何用途。被调用函数在返回之前不必恢复 r0-r3。如果调用函数需要再次使用 r0-r3 的内容,则它必须保留这些内容。R4-R11 被用来存放函数的局部变量。如果被调用函数使用了这些寄存器,它在返回之前必须恢复这些寄存器的值。R12 是内部...

2020-04-08 14:11:42 2669

原创 嵌入式C语言(三)

五、基地址、偏移地址和模块内寄存器地址分布随着嵌入式芯片的飞速发展,现在一个普通的MCU内部往往包含着几十个乃至上百个外设模块,包还常用的Gpio,各种定时器,IIC、SPI等通讯模组,如何高效的部署和管理成百上千的寄存器就变得尤为重要。如上图所示,同通常我们根据芯片的参考手册来部署寄存器地址采用的是基地址+地址偏移量的方式。首先根据具体MCU内核提供的预定义寄存器映射,我们可以找到外设寄存...

2020-04-08 13:51:15 234

原创 嵌入式C语言(二)

二、.h文件的作用在分析.h文件作用前先要么明确一个基本概念,在C语言中调用任意一个函数都必须是先有其定义或声明,随着整个工程越来越庞大实现对所有函数的分类管理变得很有必要,于是我们按照函数间的关联度将所有函数分割为若干的.c文件并把对应的函数声明包含在.h文件中。调用库文件内容要用#include <XXX.h>自己定义的库文件要用#include “XXX.h”具体的.h文...

2020-04-07 14:25:27 540

原创 嵌入式C语言(一)

一、关键字很多的C语言教材都是这针对面向计算机编程,因此很多时候忽略了一些不常用的关键字的讲解,而在嵌入式中往往会看到很多不常用的关键字,值得我们去进一步理解。1、register和auto在计算机中CPU的运算速度最快,现在都达到3GHZ左右,而相对应的存储器速度却相对慢很多,访问速度最快的寄存器和缓存,由于其体积又大,不适合大容量的使用,所以只能二者相接合的方式来提高效率。程序代码保存在...

2020-04-06 23:01:01 328

原创 ARM启动流程及启动代码分析

一、ARM的启动流程基于ARM的芯片多数为复杂的片上系统。这种复杂系统里的多数硬件模块都是可配置的。需要由软件来设置其需要的工作状态。因此在用户的应用程序之前,需要由专门的一段代码来完成对系统的初始化。由于这类代码直接面对处理器内核和硬件控制器进行编程,一般都是用汇编语言。一般通用的内容包括:中断向量表初始化存储器系统初始化堆栈初始化有特殊要求的端口,设备初始化用户程序执行环境改变处...

2020-04-05 21:01:53 7296

原创 ARM处理器架构——内存管理

一、内存映射1.什么是内存映射内存映射指的是在ARM存储系统中,使用内存管理单元(MMU)实现虚拟地址到实际物理地址的映射,如下图所示。【注】图中的地址转化器即MMU,CPU操作的称为虚拟地址MMU操作的为实际的物理地址2、为什么要内存映射ARM的地址总线为32位,故CPU可寻址范围为0x00000000~0xffffffff寻址空间为4GB,所有的内部和外部存储或者外设单元都需要通过...

2020-04-04 20:59:24 3602

空空如也

空空如也

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

TA关注的人

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