自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(42)
  • 资源 (1)
  • 收藏
  • 关注

原创 Ubuntu用snap安装程序出现 snap xxx has install-snap change in progress的解决方法

在上一个程序没有安装完成强行关闭终端或者其他方式中途打断安装将会出现这种情况。。。1. 通过以下命令结合Ready状态查找没有完成的任务snap changes2. 查找到ID之后执行以下命令,注意ID要进行替换sudo snap abort ID...

2021-03-12 20:44:03 962

原创 【Linux】权限表示与管理

1) 普通用户与特权用户 su命令切换用户Windows中有普通用户和特权用户,特权用户是Administrator,普通用户可以有很多个。特权用户是系统的管理员,对系统内所有文件具有操作权限。每个普通用户只能处理自己的文件,不能访问其他用户的文件,更不能随意处理操作系统的文件。Linux中也有普通用户和特权用户的区别。特权用户就是root用户。普通用户权限受到限制,比如说普通用户不能cd /root,普通用户不能使用apt-get install 来装软件。可以使用su用户名来在不同用户间切换。

2020-11-22 15:15:42 461

原创 【Linux】常用命令汇总

一、常用命令1) ls(list,列表)作用:使用列表把当前文件夹下所有文件显示出来ls -a 显示所有文件,包括隐藏文件ls -l 以详细信息显示ls -a -l, ls -l -a, ls -la, ls -al四种方式都是可以的ls -l显示的详细信-rwxrwxrwx一共10个字符,第一个字符表示文件类型,后面9个字符表示文件权限。文件类型:-表示普通文件。普通文件指文本文件和二进制文件,如a.c 1.txt a.out都是普通文件d 表示文件夹,d是director

2020-11-22 15:14:35 215

原创 【K210】Ubuntu18.04下搭建K210开发环境

一、需要安装的内容CMake:这东西不知道干啥的就…面壁吧Toolchain:交叉编译器 Toolchain 是用于调试开发板的工具和相关库组合起来的集合。内附程式compiler如GCC,可以进行程式编译或跨平台编译等VSCode:用来编写业务代码,如果虚拟机与主机有共享文件夹,可不用在Ubuntu中安装。SDK:K210官方SDK,自带K210的各种驱动。K-flash:K210芯片烧录程序的工具。二、CMakeCMake大部分同僚应该都安装过,这里不详述,网上资料也很多【CMake

2020-11-22 15:09:23 2460

原创 【Cpp】alignof()与alignas()

一、继承C使用的内存对齐C++中继承了C语言里的内存对齐机制,也可以程序员进行干预,如下文章:往小对齐:#pragma pack的使用往大对齐:attribute((aligned(n)))二、alignof()与alignas()alignof和alignas是C++11开始新支持的关键字,其中:alignof用来测定变量或者类型的字节对齐数alianas用来往大改变字节对齐,使...

2020-02-18 23:33:42 1219

原创 【C/CPP】assert断言与static_assert静态断言

一、断言assert是一个宏函数,其原型定义在assert.h中:#ifdef NDEBUG#define assert(condition) ((void)0)#else#define assert(condition)#endif一般在调试版本中使用,作用是在程序运行的时候将条件condition的表达式的逻辑值与0进行比较,若相等,则在标准错误输出上输出实现指定的诊断信息,...

2020-02-18 22:53:10 1741 1

原创 【Cpp】NULL与nullptr(C++11起)

一、先来谈谈NULLNULL是一个宏,其定义如下#ifndef __cplusplus#define NULL (void *)0#else#define NULL 0#endif在C语言中,NULL就是(void *)0,通常用于指示指针没有有效操作对象,以避免野指针的出现int *p = NULL;/*业务代码*/if(NULL != p){ /*解引用p*/...

2020-02-18 21:19:24 1274

原创 【Cpp】inline关键字

一、保留了C中inline的特性详见:预处理、宏定义、内联函数关键点如下:inline必须与函数定义体放一起,声明处可不放(保险做法为都放)inline函数一般是直接在头文件中直接定义,无需额外声明inline函数可以在同一个项目中多次定义,只要函数体相同并且同一个源文件内未重复定义inline函数是否展开得看编译器心情递归函数不应被inline,过长(超10行)的函数不应该i...

2020-02-16 23:50:19 772

原创 【Cpp】C++中的union

一、继承C语言的unionC++中的共用体也是从C中继承过来的,沿用了C中的所有特性二、C++中union的提升C++中在定义共用体变量的时候也可以省略union关键字(类似enum),直接类型名 变量名C++中,union的成员还可以是简单对象,但是对象不能包含自定义构造函数和析构函数在C语言中,也可以通过函数指针实现类型的功能:union myunion{ void...

2020-02-16 23:12:20 876

原创 【Cpp】C++的enum

一、继承C语言的enumC++中的枚举是直接从C语言中继承过来的,在这过程中,也做了改进。如C语言中定义一个枚举类型的变量必须加上enum enum QuarterFirst{JAN, FEB, MAR};//定义类型QuarterFirst enum QuarterFirst quarter1 = JAN;//定义QuarterFirst类型的变量quarter1这在定义变...

2020-02-16 22:24:35 1600

原创 【Cpp】引用的本质

一、什么是引用引用是C++中的一个新的语言特性,从表面来说,引用就是某一变量(目标)的一个别名,对引用的操作与对变量直接操作完全一样。引用的声明如下:类型标识符 &引用名 = 目标变量名;这里面的&不是位运算、不是取地址,而是一个引用的标识符,可以认为是一个“类型标识符 &”类型,类型标识符是指目标变量的类型。如:int a = 10;int &b = ...

2020-02-16 19:48:34 719

原创 【Cpp】bool关键字和运算符代用关键字

一、bool关键字就是一种新的类型,只有ture(1)和false(0)两种逻辑值,其中,非零为ture(1),零为false(0)。用法和int、double等数据类型是一样的,比如说bool类型的变量可以进行数据运算、可以作为函数返回值、可以定义bool *类型的指针…#include <iostream>int main(void){ bool a = 0.55...

2020-02-16 14:19:48 1426

原创 【Cpp】C和C++混合编程

一、混合编程杂绪1.1 为什么需要混合编程Cpp是从C演变过来的,C有很多优秀成熟项目和库,没必要在C++中重写,C++程序可以直接调用调用庞大项目划分后一部分适合用C(底层),一部分适合用C++(中间层、上层)1.2 混合编程的支撑编译型程序的编译过程:源文件->目标(库)文件->可执行程序->镜像文件任何编程语言执行时都必须是可执行程序,所以都必须先被编译成...

2020-02-15 21:49:52 5737 1

原创 【C语言】main函数的argc、argv传参

一、main函数返回值1.1 函数为什么需要返回值一般而言,参数是函数的输入,返回值是函数的输出(在高级应用中,使用参数放回,放回值说明状态)函数需要对外输出数据(函数运行的一些结果值)因此需要返回值形式上来说,函数被另一个函数所调用,返回值作为函数式的值返回给调用这个函数的地方1.2 main函数的正确书写以下三种方式是正确规范的int main(void){}int ...

2020-02-15 00:46:00 13800 1

原创 【C语言】常用DEBUG宏汇总

一、printf函数与fprintf函数1.1 printfprintf的函数原型为: int printf(const char *format, ...);用于将格式化后的字符串输出到标准输出。标准输出,即标准输出文件,对应终端的屏幕。printf称为可变参数函数,其定义声明和普通函数相同。在其参数列表中,format称为固定参数部分,...称为参数占位符,二者共同构成可变参数...

2020-02-14 23:04:49 1940 2

原创 【CMake】初探CMake的使用

建立测试文件touch external_test.cpp external_test.h main.cpp CMakeLists.txt在CMakeLists.txt中添加相关指令CMAKE_MINIMUM_REQUIRED(VERSION 2.8) #最低版本要求SET(CMAKE_CXX_COMPILER "g++") #设置g++编译器PROJE...

2020-02-14 17:38:39 172

原创 【C++】命名空间namespace详解

一、命名空间的引入C++中,名称(name)可以是符号常量、变量、宏、函数、结构体、枚举、类和对象等等。而在大型工程中,难免会有重名的现象,命名空间namespace,就是C++引入的一种解决名称冲突的机制1.1 如何解决命名冲突C语言中C语言中是通过人为操作符号名称、限制符号的作用域和链接属性来完解决名称冲突的。比如:同一个C文件中的全局变量/函数加一个统一的前缀通过作用域的掩蔽...

2020-02-14 17:29:59 6962

原创 【C语言】存储类与作用域、生命周期与链接属性

一、概念解析与内存映像1.1 概念解析存储类:内存有多种管理方法:stack、heap、.data、bss段、.text等,一个变量的存储类属性就是描述这个变量存储在何种内存段中。作用域:用来描述一个符号(变量、函数等)起作用的范围。生命周期:用来描述变量的诞生(给变量分配内存)与消亡(回收分配的内存空间,此时变量无权访问此内存空间)链接属性:一个程序从源代码到最终的可执行程序需要经过...

2020-02-14 01:24:52 378

转载 【CMake】转载-Ubuntu 18.04下安装最新CMake及CMake简单使用

https://www.linuxidc.com/Linux/2018-09/154165.htm

2020-02-13 00:14:57 1040

原创 【C语言】静态链接库与动态链接库的制作与使用

一、函数库简述简单来说,函数库就是一些事先写好的模块化的函数的集合,可以供给其他程序员使用。最开始没有函数库,每个程序员写程序都要从零开始写,时间长了慢慢地就积累下来了一些优质的函数库。后来有组织把各种函数库收拢在一起,经过校准和整理,形成一份标准化的函数库,就是现在的标准的函数库,如glibc1.1 函数库的提供形式:动态链接库与静态链接库早期的函数共享都是以源代码的形式进行的,慢慢地,源...

2020-02-12 15:55:13 939

原创 【Makefile】初探Makefile大法

一、Makefile的引入1.1 用途Makefile是用来管理工程的,一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,Makefile定义了一系列的规则来指定,哪些文件先编译、后编译、重新编译,甚至于进行更复杂的功能操作。总而言之,Makefile方便编译链接过程,一旦写好,只需要一个make命令,整个工程完全自动编译链接,极大地提高了项目开发的效率。1.2 文件名M...

2020-02-12 02:02:42 288

原创 【C语言】预处理、宏定义、内联函数

一、由源码到可执行程序的过程1. 预处理: 源码经过预处理器的预处理变成预处理过的.i中间文件gcc -E test.c -o test.i2. 编译: 中间文件经过编译器编译形成.s的汇编文件gcc -S test.i -o test.s3. 汇编: 汇编文件经过汇编器生成目标文件.o(机器语言)gcc -c test.s -o test.o4. 链接: 链接器将目标文件链接...

2020-02-10 21:54:15 500

原创 【C语言】宏定义实现位运算

一、常用位操作符1.1 位与&真值表&10110000特点有0为0,全1为11.2 位或|真值表|10111010特点有1为1,全0为01.3 位异或^真值表^10101010特点相同为0,相异为11.4 位取反~位取反是将操作数...

2020-02-09 15:14:04 4172 1

原创 【C语言】共用体union与大小端模式

一、共用体union1.1 共用体的定义、变量定义和使用共用体union和结构体struct在类型定义、变量定义和使用方法上很相似,如下代码段#include <stdio.h>typedef union myunion1{ int a; char b;}MU1;int main(void){ MU1 test1; test1.a =...

2020-02-08 01:44:33 1882

原创 【8086汇编】2.访问寄存器与内存

一、寄存器及数据存储寄存器是CPU内部的信息存储单元,在8086CPU中有14个寄存器:通用寄存器:AX、BX、CX、DX变址寄存器:SI、DI指针寄存器:SP、BP指令指针寄存器:IP段寄存器:CS、SS、DS、ES标志寄存器:PSW共性:8086CPU中所有的寄存器都是16位的,可以存放两个字节1.1 通用寄存器(以AX为例)1.1.1 对数据的存储一个16位寄存...

2020-02-07 21:55:47 2986

原创 【8086汇编】1.8086汇编预备知识

一、机器语言到汇编语言1.1 机器语言与机器指令机器语言是机器指令的集合机器指令是一台机器可以正确执行的命令机器指令由一串二进制数表示,如010100001.2 汇编语言与汇编指令汇编语言的主体是汇编指令汇编指令和机器指令的差别在于指令的表示方法上汇编指令是机器指令便于记忆的书写格式汇编指令是机器指令的助记符1.3 物理结构到逻辑结构对于一块主板,其物理结构是...

2020-02-07 21:54:50 213

原创 内核第一宏:offsetof宏和container_of宏

绪论通过结构体的整体变量来访问其中的各个元素,形式上是通过./->来访问,实质上是通过指针方式来访问的(编译器会自动计算偏移量)。在C/C++中,其实可以用一些宏来计算结构体中成员变量与结构体的地址关系,那就是offsetof宏和container_of宏一、offsetof宏offsetof宏:通过虚拟一个type类型的结构体变量,然后用type.member的方式来访问member...

2020-02-05 17:56:47 328

原创 error while loading shared libraries: libmpfr.so.4: cannot open shared object file的简单解决方法

Ubuntu18.04在进行arm-linux-gcc交叉编译时遇到的一个问题:error while loading shared libraries: libmpfr.so.4: cannot open shared object file: No such file or directory加载共享库时出错:libmpfr.so.4:无法打开共享对象文件:没有这样的文件或目录解决方法:...

2020-02-05 15:36:01 12797 14

原创 Ubuntu18.04安装arm-linux-gcc交叉编译工具

1.下载工具包先下载arm-linux-gcc工具包:网盘下载CSDN下载(免积分)2.开始安装获得管理员权限:$ su进入/usr/local目录下$ cd /usr/local将下载的工具包移动到当前目录下并解压root@ubuntu:/usr/local# mv /home/baymax/Downloads/arm-linux-gcc-5.4.0.tar.gz arm...

2020-02-05 15:15:16 905

原创 __attribute__((aligned(n)))和__attribute__((packed))

绪__attribute__是GUN C中极具特设的一大机制,可以用来设置函数属性(Function Attribute)变量属性(Variable Attribute)类型属性(Type Attribute)这里我们主要阐述用__attribute__((aligned(n)))和__attribute__((packed))两个指令对结构体进行属性设置一、作用简述__at...

2020-02-04 23:56:42 2266 1

原创 #pragma pack的使用

绪论在没有外部干预的情况下,编译器会根据操作系统及编译环境来自动设定结构体的内存对齐的默认字节,但是在实际开发中,有时候考虑到实际内存,会有将结构体设置为1字节对齐(不对齐)的需求,这个时候就要借助C/C++编译指令#pragma pack(),这个指令也是非常复杂的,这里只总结两种常用的一、#pragma pack(n)与 #pragma pack()1.1 作用简述#pragma pa...

2020-02-04 21:10:26 758

原创 结构体及其内存对齐

一、结构体的类型与变量定义使用UDT时都是先定义类型再使用,使用结构体也一样:先定义结构体类型再用类型定义变量,有以下两种使用方式:1.1 方式一:类型和变量独立定义struct student{ char name[20]; int age;};struct student s1;注意:类型一般定义在主函数外面,变量根据实际需求来决定定义在哪里。1.2 方式二:...

2020-02-04 19:27:54 782

原创 字符串与字符数组、sizeof与strlen

一、C语言的字符串类型C语言没有原生的字符串类型,不像C#等高级语言中具有string类型来表示字符串,C语言中的字符串是通过字符指针来间接实现的,如:char *p = "WHUT2018";此时p就叫做字符串,但是实际上p只是一个字符指针(本质上就是一个指针变量,只是p指向了一个字符串的起始地址而已)1.1 C语言中字符串的本质字符串就是指针指向的一段连续的内存空间,在内存中就...

2020-02-03 20:23:58 1016 1

原创 代码段(.text)、数据区(.data)和bss段

一、三个常用段编译器在编译程序的时候,将程序中的所有元素分成一些部分,各部分构成一个段,段是可执行程序的组成部分。代码段:程序中的可执行部分,是由函数堆叠而成的数据段(数据区、静态数据区、静态区):程序中的数据,C语言中的全局变量(全局变量才算程序的数据,局部变量是函数的数据)bss段(ZI段(zero initial)):被初始化为0,bss段本质上也是属于数据段。也就是说bss段就...

2020-02-01 21:06:33 3834

原创 堆(heap)及内存泄露

一、堆内存特点操作系统堆管理器管理:堆管理器是操作系统的一个模块,堆管理内存分配灵活,按需分配大块内存:堆内存管理着总量很大的操作系统内存块,各进程可以按需申请使用,使用完释放手动申请、释放:需要写代码去malloc及free脏内存:堆内存也是反复使用的,而且使用者用完释放前不会清除,因此也是脏的临时性:堆内存只在malloc和free之间属于某个进程,可以访问。在malloc之间个...

2020-02-01 17:31:55 871

原创 栈(Stack)

一、内存杂谈1.1 程序执行需要内存支持对程序来说,内存就是程序的立足之地(程序是被放在内存中运行的);程序运行时需要内存来存储一些临时变脸1.2 内存管理内存管理最终是由操作系统来完成的:内存本身在物理上是一个硬件器件,由硬件系统提供内存是由操作系统统一管理。为了内存管理既方便又合理,操作系统提供了多种机制让程序使用内存。这些机制彼此不同,各自有各自特点,程序根据实际情况选择某种方...

2020-01-31 22:11:10 285

原创 二维数组及其动态内存分配

一、二维数组的基本概念1.1 二维数组的内存映像从内存角度看,二维数组和一维数组一样,在内存中都是连续分布的多个内存单元,并没有本质差别,只是内存的管理方式不一样,如下图所示一维数组int a[10]与二维数组int b[2][5]的对应关系一维数组a[0]a[1]a[4]a[5]a[9]二维数组b[0][0]b[0][1]b[0][4]b[1...

2020-01-31 18:42:15 10683 2

原创 二重指针

一、二重指针的本质二重指针与一重指针本质上都是指针变量,指针变量的本质也就是变量,都是用来指向别的东西的,在32位机上都是占4字节内存空间二重指针指向的变量类型是一个一重指针1.1 测试代码段 int a = 1; int *p1 = NULL; //一重指针 int **p2 = NULL; //二重指针 printf("sizeof(p1) = %...

2020-01-28 13:22:08 1281

原创 typedef的应用

一、与typedef相关的预备知识1.1 C语言的两种类型内建类型ADT(也叫原生类型、基础数据类型):编译器自带的类型,如int/double等自定义类型UDT:不是编译器自带的类型,是程序员自己定义的,如结构体类型、数组类型、函数指针类型等1.2 typedef加工的是类型而不是变量类型就是一个数据模板,变量是一个实在的数据类型是不占内存的,变量是占内存的在面向对象的语言中...

2020-01-27 22:20:07 430

原创 函数指针的应用

一、函数指针实现多态多态就是同一个执行但是实际结果不一样C语言虽然没有多态,但是可以用函数指针指向不同的函数来实现同一个调用执行不同的结果1.1 测试代码#include <stdio.h>//定义一个pFunc类型,这个函数指针类型指向一种特定参数列表和返回值得函数typedef int (*pFunc)(int, int);int add(int a, i...

2020-01-27 18:10:31 4308

arm-linux-gcc-5.4.0.tar.gz

Ubuntu安装arm-linux-gcc交叉编译工具 arm-linux-gcc工具包arm-linux-gcc-5.4.0.tar.gz

2020-02-05

空空如也

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

TA关注的人

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