自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 三、Linux内核信号

信号处理流程图:代码实现:system call:call sys call_table(, %eax, 4)sys_signaldo_signalsys_signal//进行一些信号的预处理设置int sys_signal(int signum, long handler, long restorer){ struct sigaction tmp;//设置一个信号结构体 if (signum<1 || signum>32 || signum==SIGKILL)//检索

2021-11-25 18:38:57 317

原创 二、Linux操作系统的引导和启动

Linux操作系统的引导和启动程序1.Linux操作系统的引导分析1.Linux操作系统的引导Linux是如何从硬盘中读出的?Linux在启动的时候是如何拿到硬件参数的?Linux在初始运行中都做了什么?分析BIOS/Bootloader做的事情:由PC机的BIOS(0xFFFF0是BIOS存储的总线地址)把我们的bootsect.s从某一个固定的地址拿到内存的0x7c00,然后bootsect.s自移到固定地址(0x90000),并且进行了一系列的硬件初始化和参数设置bootsect.s

2021-11-25 17:34:54 418

原创 一、Linux内核体系结构

Linux内核体系结构1. 内核模式与体系结构1.1 操作系统的结构1.2 操作系统的工作方式1.3 操作系统内核中各级模块的相互关联1.4 操作系统结构的独立性2. 内核中断概括2.1 目的2.1 Linux的中断机制2.1.1分类2.1.2 代码结构2.2 中断的工作流程2.2.1 回忆2.2.2 Linux中中断的工作流程2.3 中断的代码实现过程3. 内核进程管理3.1 系统进程的运转方式3.2 如何进行创建一个新的进程3.3 进程调度3.4 进程的退出3.5 进程间通信1. 内核模式与体系结构

2021-11-23 21:14:22 1653

原创 7. 自实现Bootloader

Bootloader自实现1. 启动流程2. 自制Bootloader12.1 在BL1中添加蜂鸣器提示2.2 编译和测试2.3 在BL1中添加初始化时钟驱动和串口驱动2.4 编译和测试2.5 在BL1中添加初始化DDR驱动2.6 在BL1中添加初始化NandFlash驱动2.7 编译和测试Bootloader别名:启动加载器作用:初始化硬件,启动操作系统1. 启动流程NFC:NandFlash控制器首先是iROM做的事情初始化硬件1.关闭看门狗定时器,因为它是默认开启的,每隔一段时间会重启

2021-11-20 14:20:04 470

原创 6. ARM接口编程

ARM接口编程1. GPIO编程1.1 学会看原理图和手册1.2 蜂鸣器驱动汇编版本1.3 编译和运行1.4 蜂鸣器驱动C语言版本1.5 编译和运行2. 串口编程2.1 并行和串行接口介绍2.1 串口电路原理图和手册2.2 串口编程2.3 编译和测试2.4 从0实现printf函数2.5 编译和运行3. Nand Flash编程3.1 Nand Flash管脚定义3.2 Nand Flash地址结构图3.3 Nand Flash电路原理图和手册3.4 Nand Flash编程实现初始化3.5 编译和测试S

2021-11-17 21:29:11 613

原创 5. ARM时钟系统

ARM时钟系统时钟设置编码实现编译和测试时钟是同步工作系统的同步信号,SOC内部有很多控制器,例如CPU,串口等外设,这些外设需要协同工作,互相通信,就需要同步的时钟系统来指挥。这个就是Soc的时钟系统。时钟设置编码实现查手册和系统时钟图算出各位置应该配置的值:计算分频器每部分应该设置的值之前的各时钟是由uboot程序设置好的,现在我们在跳转到C语言的main函数之前自己重新设置相应的时钟。start.s:.global _start_start: b reset b undef

2021-11-16 22:21:47 667

原创 4. ARM中断处理实现

ARM中断处理实现1. 中断概念2. 中断流程图3. 中断控制器流程图4. 外部中断实现1. 汇编程序2. C语言程序3. 编译和运行1. 中断概念为什么要有中断?cpu和外设之间要进行通信,那么cpu怎么知道外设有数据来,有两种方式:2. 中断流程图cpu处理步骤:1.保存现场2.向中断控制器查询是哪个中断3.执行中断处理程序4.恢复现场GPIO控制器:1.CON:功能配置寄存器2.INTC:触发方式3.PEND:中断记录标志位4.MASK:开关3. 中断控制器流程图

2021-11-16 12:25:05 1690

原创 3. ARM异常处理机制

ARM异常处理机制1. ARM的工作模式2. ARM寄存器组3. 异常向量表4. Undefined异常实现示例1. 通过查手册得到负责映射的协处理器的寄存器操作指令2. 重映射异常向量表程序3. 异常处理程序4. 运行5. swi异常处理实现1. 重映射异常向量表程序2. 异常处理程序3. 运行1. ARM的工作模式用户模式:权限低,只能访问一部分内存资源系统模式:权限高,能访问很多资源异常模式:当异常出现时,能够保证cpu不挂掉而去执行异常处理程序Supervisor:管理模式,cpu一上电

2021-11-15 17:12:20 482

原创 2. GCC开发环境搭建

GCC开发环境搭建1. 开发环境介绍2. 安装环境3. SD卡烧写uboot4. 裸机程序开发实例准备工作进行编程应该怎么编译呢?发送到开发板1. 开发环境介绍2. 安装环境1.安装编译器2.编译uboot3. SD卡烧写ubootiROM:一段固化程序 1.初始化硬件,关闭看门狗,初始化协处理器,icache,初始化时钟 2.判断OM开关,即判断是从那个外部设备启动设备1.先将uboot.bin烧入到SD卡中2.拨码开关拨到SD卡启动方式3.设备启动:先将uboot.bin的前面

2021-11-14 23:17:55 1324

原创 1. ARM汇编指令集

汇编指令集一、汇编语言介绍1. 概念2. 优缺点3. ARM指令集特点二、指令格式1. 立即数的编码规则2. Keil5汇编keil5汇编程序示例验证对立即数的操作三、数据传送指令1. mov mvn 使用示例2. ldr指令对非立即数的操作3. 往寄存器中存放数据的方式4. add sub mul 使用示例四、数据运算指令(位运算)1. orr and bic 示例2. 按需置1清零用法五、内存操作指令1. swp使用示例2. ldr str使用示例3. str连续存储4. ldmfd stmfd 指令

2021-11-14 22:06:45 568

原创 C++ 文件IO流

C++ 文件IO流1. C的IO流1.1 数据流1.2 缓冲区1.3 文件类型1.4 文件存取方式1.5 借助文件指针读写文件1.6 操作流程图2. C++ 文件IO流2.1 文件流类与文件流对象2.2 文件的打开和关闭2.2.1 定义流对象2.2.2 打开文件2.2.3 文件的关闭2.4 流文件状态与判断2.4.1 标识位2.4.2 函数2.5 文件的读写操作2.5.1 读写文本文件2.5.2 读写二进制文件3. (cin)和(!cin)的原理1. C的IO流1.1 数据流指程序与数据的交互是以流的

2021-11-03 19:28:26 956

原创 C++ 输入输出IO流

C++ 输入输出IO流1. IO 类图关系2. 流类综述2.1 IO对象不可复制或赋值2.2 IO对象是缓冲的2.3 重载了<< 和 >>运算cin 和 cout 充当了 scanf 和 printf 的功能。但他们并不是函数。而是类对象。1. IO 类图关系2. 流类综述2.1 IO对象不可复制或赋值#include <fstream>#include <iostream>fstream printf(fstream fs){}usi

2021-11-03 10:46:35 99

原创 C++ 模版

C++ 模版1. 函数模版1.1 函数重载实现的泛型1.2 函数模版的引入泛型(Generic Programming)即是指具有在多种数据类型上皆可操作的含意。泛型编程的代表作品 STL 是一种高效、泛型、可交互操作的软件组件。泛型编程最初诞生于 C++中,目的是为了实现 C++的 STL(标准模板库)。其语言支持机制就是模板(Templates)。模板的精神其实很简单:参数化类型。换句话说,把一个原本特定于某个类型的算法或类当中的类型信息抽掉,抽出来做成模板参数 T。1. 函数模版1.1 函数重载

2021-11-03 10:15:44 67

原创 C++ 运算符重载

C++ 运算符重载1. 语法格式1.1 友元重载1.2 成员重载1.3 注意事项2. 重载规则3. 双目运算符重载3.1 成员函数重载+=实现3.2 友元函数重载+=实现4. 单目运算符重载4.1 友元函数重载++(前++)实现4.2 友元函数重载++(后++)实现运算符重载的本质是函数重载。1. 语法格式返值类型 operator 运算符名称(形参表列){ 重载实体;}operator 运算符名称 在一起构成了新的函数名。比如const Complex operator+(const C

2021-11-02 15:07:45 1010

原创 C++ 多态

C++ 多态1. 多态的意义2. 多态实现的前提2.1 规则1. 多态的意义如果有几个相似而不完全相同的对象,有时人们要求在向它们发出同一个消息时,它们的反应各不相同,分别执行不同的操作。这种情况就是多态现象。C++中所谓的多态(polymorphism)是指,由继承而产生的相关的不同的类,其对象对同一消息会作出不同的响应。多态性是面向对象程序设计的一个重要特征,能增加程序的灵活性。可以减轻系统升级,维护,调试的工作量和复杂度。2. 多态实现的前提2.1 规则赋值兼容规则是指在需要基类对象的任

2021-11-02 14:24:31 318

原创 C++ 继承与派生

C++ 继承与派生定义1. 继承1.1 语法1.2 继承方式1.3 派生类的组成1.4 注意事项2. 派生类的构造2.1 派生类构造函数的语法2.2 代码示例2.3 小结3.派生类的拷贝构造3.1 格式3.2 代码示例3.3 小结4. 派生类的赋值运算符重载4.1 格式4.2 代码示例4.3 小结5. 派生类友元函数6. 派生类析构函数的语法7.派生类成员的标识和访问7.1 作用域分辨符7.2 小结定义类的继承,是新的类从已有类那里得到已有的特性。或从已有类产生新类的过程就是类的派生。原有的类称为基类或

2021-11-01 13:12:18 148

原创 C++ 友元

C++ 友元1. 何为友元2. 同类对象之间无隐私3.异类对象之间有友元3.1 友元函数3.1.1 全局函数作友元函数3.1.2 类成员函数作友元函数3.2 友元类4. 小结4.1 声明位置4.2 友元利弊4.3 注意事项1. 何为友元采用类的机制后实现了数据的隐藏与封装,类的数据成员一般定义为私有成员,成员函数一般定义为公有的,依此提供类与外界间的通信接口。但是,有时需要定义一些函数,这些函数不是类的一部分,但又需要频繁地访问类的数据成员,这时可以将这些函数定义为该类的友元函数。除了友元函数外,还有友

2021-10-31 10:28:07 1177

原创 C++类和对象--指向类成员的指针

C++类和对象--指向类成员的指针1. 指向普通变量和函数的指针2. 指向类数据成员的指针2.1 定义2.2 赋值&初始化2.3 解引用2.4 案例3. 指向类成员函数的指针3.1 定义3.2 赋值&初始化3.3 解引用3.4 案例3.5 应用之实现隐蔽接口4. 指向类静态成员的指针1. 指向普通变量和函数的指针#include <iostream>using namespace std;void func(int a){ cout<<a<&l

2021-10-31 10:01:41 597

原创 C++类与对象--static修饰符

C++类与对象--static修饰符1.类静态数据成员的定义及初始化1.1 声明1.2 初始化1.3 调用1.4 案例在 C++中,静态成员是属于整个类的而不是某个对象,静态成员变量只存储一份供所有对象共用。所以在所有对象中都可以共享它。使用静态成员变量实现多个对象之间的数据共享不会破坏隐藏(相比全局变量的优点)的原则,保证了安全性还可以节省内存。类的静态成员,属于类,也属于对象,但终归属于类。1.类静态数据成员的定义及初始化1.1 声明static 数据类型 成员变量; //在类的内部1.2

2021-10-30 18:36:05 630

原创 C++类与对象--const修饰符

C++类与对象--const修饰符1. 常数据成员2. 常成员函数2.1 const修饰函数的意义2.2 const修饰函数位置2.3 const构成函数重载2.3 小结3. 常对象3.1 小结1. 常数据成员const 修饰类的成员变量,表示成员常量,不能被修改,同时它只能在初始化列表中赋值(c11 中支持类中实始化)。可被 const 和非 const 成员函数调用,而不可以修改。class A{public: A():iValue(199) {}private: const int

2021-10-30 12:28:41 278

原创 C++类与对象--成员函数的存储方式

C++类与对象--成员函数的存储方式类成员实际组成调用原理注意事项类成员实际组成用类去定义对象时,系统会为每一个对象分配存储空间。如果一个类包括了数据和函数,要分别为数据和函数的代码分配存储空间。按理说,如果用同一个类定义了 10 个对象,那么就需要分别为 10 个对象的数据和函数代码分配存储单元。那能否只用一段空间来存放这个共同的函数代码段,在调用各对象的函数时,都去调用这个公用的函数代码。如下图:显然,这样做会大大节约存储空间。C++编译系统正是这样做的,因此每个对象所占用的存储空间只是该对象

2021-10-30 11:32:00 651

原创 C++类与对象--栈和堆上的对象及对象数组

栈和堆上的对象及对象数组引例栈对象数组堆对象数组修改引例后结论引例类没有无参构造器时#include <iostream>using namespace std;class Stu{public: Stu(string n):_name(n){} void dis() { cout<<_name<<endl; }private: string _name;};int main(){ //

2021-10-30 11:18:27 244

原创 C++类与对象--返回栈对象

C++ 返回栈对象示例1示例2示例3示例1#include <iostream>using namespace std;class A{public: A(){ cout<<this<<" constructor"<<endl; } A(const A &other) { cout<<this<<" cp contructor from "<&lt

2021-10-30 10:47:11 312

原创 C++类与对象--赋值运算符重载(Operator=)

赋值运算符重载1. 定义2. 规则1. 定义类名{ 类名& operator=(const 类名& 源对象) 拷贝体}class A{ A& operator=(const A& another) { //函数体 return *this; }};2. 规则1.系统提供默认的赋值运算符重载,一经实现,不复存在。2.系统提供的也是等位拷贝,也就浅拷贝,会造成内存泄漏,重析构。3.要实现深拷贝,必须自定义。4.自定义面临的问题有三个

2021-10-29 21:24:57 662

原创 C++类与对象--this指针

C++ this指针1. 意义2. 作用1. 意义系统在创建对象时,默认生成的指向当前对象的指针。这样作的目的,就是为了带来方便。2. 作用避免构造器的入参与成员名相同。基于 this 指针的自身引用还被广泛地应用于那些支持多重串联调用的函数中。比如连续赋值。如下:#include <iostream>using namespace std;class Stu{public: Stu(string name, int age) // :name(name),age(ag

2021-10-29 21:23:11 69

原创 C++类与对象--拷贝构造

C++ 拷贝构造1. 拷贝构造的定义及意义2. 拷贝构造发生的时机3. 深拷贝和浅拷贝1. 拷贝构造的定义及意义由己存在的对象,创建新对象。也就是说新对象,不由构造器来构造,而是由拷贝构造器来完成。拷贝构造器的格式是固定的。class 类名{ 类名(const 类名 & another) 拷贝构造体}class A{ A(const A & another) {}}规则:系统提供默认的拷贝构造器。一经实现,不复存在。系统提供的是等位拷贝,也就是所谓的浅拷

2021-10-29 21:03:34 328

原创 C++类与对象--构造器和析构器

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入欢迎使用Markdown编辑器你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar

2021-10-29 14:37:29 196

原创 十、C++ 系统String类

十、C++ 系统String类除了使用字符数组来处理字符串以外,c++引入了字符串类型。可以定义字符串变量。1.定义及初始化#include <iostream>#include <string.h>using namespace std;int main(){ string str; str = "china"; string str2 = " is great "; string str3 = str2; cout<<str<<s

2021-10-29 11:05:30 190 1

原创 九、C++ 命名空间(namespace scope)

九、C++ 命名空间命名空间为了大型项目开发,而引入的一种避免命名冲突的一种机制。比如说,在一个大型项目中,要用到多家软件开发商提供的类库。在事先没有约定的情况下,两套类库可能在存在同名的函数或是全局变量而产生冲突。项目越大,用到的类库越多,开发人员越多,这种冲突就会越明显。1.默认NameSpace(Global&Function)Global scope 是一个程序中最大的 scope。也是引起命名冲突的根源。C 语言没有从语言层面提供这种机制来解决。也算是 C 语言的硬伤了。Global

2021-10-28 20:55:07 197

原创 八、C++ 类型强转

八、C++ 类型强转1.静态类型转换1.语法格式static_cast<目标类型> (标识符)2.转化规则在一个方向上可以作隐式转换,在另外一个方向上就可以作静态转换。int a = 10;int b = 3;cout<<static_cast<float>(a)/b<<endl; //float = int int = floatreturn 0;int *p; void *q;p = static_cast<int*>

2021-10-28 20:20:45 106

原创 七、C++ 内联函数

七、C++ 内联函数1.内联C 语言中有宏函数的概念。宏函数的特点是内嵌到调用代码中去,避免了函数调用的开销。但是由于宏函数的处理发生在预处理阶段,缺失了语法检测和有可能带来的语意差错。2.语法C++提供了 inline 关键字,实现了真正的内嵌。宏函数 VS inline函数...

2021-10-28 19:44:21 62

原创 六、C++ new/delete Operator

六、C++ new/delete Operatorc 语言中提供了 malloc 和 free 两个系统函数,完成对堆内存的申请和释放。而 c++则提供了两关键字 new 和 delete。1.new/new[] 用法1.开辟单变量地址空间int *p = new int; //开辟大小为 sizeof(int)空间int *a = new int(5); //开辟大小为 sizeof(int)空间,并初始化为 52.开辟数组空间一维: int *a = new int[100]{0};开辟

2021-10-27 20:38:57 68

原创 五、C++ 引用

五、C++ 引用变量名,本身是一段内存的引用,即别名(alias)。此处引入的引用,是为己有变量起一个别名。声明如下int main(){ int a; int &b = a;}1.规则引用没有定义,是一种关系型声明。声明它和原有某一变量的关系。类型与原有类型保持一致,且不分配内存。与被引用的变量有相同的地址。声明的时候必须初始化,一经声明,不可变更。可对引用,再次引用。多次引用的结果,是某一个变量具有多个别名。&符号前面有数据类型时,是引用。其他均为取地址。

2021-10-27 17:09:30 90

原创 四、C++ 默认参数

四、C++ 默认参数通常情况下,函数在调用时,形参从实参那里取得值。对于多次调用同一函数同一实参时,C++给出了更简单的处理办法。给形参以默认值,这样就不用从实参那里取值了。1.举例1.单个参数#include <iostream>#include <ctime>using namespace std;void weatherForcast(char * w="sunny"){ time_t t = time(0); char tmp[64]; strftime

2021-10-27 12:49:16 112

原创 三、C++ 操作符重载

三、C++ 操作符重载<<本身在 c 语言中是位操作中的左移运算符。现在又用作流插入运算符,这种一个字符多种用处的现象叫作重载。在 c 语中本身就用重载的现象,比如 & 既表示取地址,又表示位操作中的与。*既表示解引用,又表示乘法运算符。只不过 c 语言并没有开放重载机制。C++提供了运算符重载机制。可以为自定义数据类型重载运算符。实现自定义的数据类型也可以像基本数据类型一样的运算特性。#include <iostream>#include <iomanip&g

2021-10-27 11:59:39 182

原创 二、C++ 函数重载

二、C++ 函数重载C++ 致力于简化编程,能过函数重名来达到简化编程的目的1.重载规则函数名相同参数的个数不同,类型不同,顺序不同,都可以构成重载返回值类型必须相同,不同则不可以构成重载例如:void func(int a); //okvoid func(char a); //okvoid func(char a,int b); //okvoid func(int a, char b); //okchar func(int a); //与第一个函数有冲突2.匹配原则严格匹

2021-10-27 11:46:58 109

原创 一、C++ 标准输入与输出

一、C++ 输入与输出 格式化输出1.cin与cout2.格式化输出2.1设置域宽及位数对于实型,cout 默认输出六位有效数据,setprecision(2) 可以设置有效位数,setprecision(n)<<setiosflags(ios::fixed)合用,可以设置小数点右边的位数。#include <iostream>#include <iomanip>using namespace std;int main(){ printf("%c\n

2021-10-27 11:13:31 2925

空空如也

空空如也

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

TA关注的人

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