三、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)//检索
二、Linux操作系统的引导和启动 Linux操作系统的引导和启动程序1.Linux操作系统的引导分析1.Linux操作系统的引导Linux是如何从硬盘中读出的?Linux在启动的时候是如何拿到硬件参数的?Linux在初始运行中都做了什么?分析BIOS/Bootloader做的事情:由PC机的BIOS(0xFFFF0是BIOS存储的总线地址)把我们的bootsect.s从某一个固定的地址拿到内存的0x7c00,然后bootsect.s自移到固定地址(0x90000),并且进行了一系列的硬件初始化和参数设置bootsect.s
一、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. 内核模式与体系结构
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.关闭看门狗定时器,因为它是默认开启的,每隔一段时间会重启
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
5. ARM时钟系统 ARM时钟系统时钟设置编码实现编译和测试时钟是同步工作系统的同步信号,SOC内部有很多控制器,例如CPU,串口等外设,这些外设需要协同工作,互相通信,就需要同步的时钟系统来指挥。这个就是Soc的时钟系统。时钟设置编码实现查手册和系统时钟图算出各位置应该配置的值:计算分频器每部分应该设置的值之前的各时钟是由uboot程序设置好的,现在我们在跳转到C语言的main函数之前自己重新设置相应的时钟。start.s:.global _start_start: b reset b undef
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. 中断控制器流程图
3. ARM异常处理机制 ARM异常处理机制1. ARM的工作模式2. ARM寄存器组3. 异常向量表4. Undefined异常实现示例1. 通过查手册得到负责映射的协处理器的寄存器操作指令2. 重映射异常向量表程序3. 异常处理程序4. 运行5. swi异常处理实现1. 重映射异常向量表程序2. 异常处理程序3. 运行1. ARM的工作模式用户模式:权限低,只能访问一部分内存资源系统模式:权限高,能访问很多资源异常模式:当异常出现时,能够保证cpu不挂掉而去执行异常处理程序Supervisor:管理模式,cpu一上电
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的前面
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 指令
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 数据流指程序与数据的交互是以流的
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
C++ 模版 C++ 模版1. 函数模版1.1 函数重载实现的泛型1.2 函数模版的引入泛型(Generic Programming)即是指具有在多种数据类型上皆可操作的含意。泛型编程的代表作品 STL 是一种高效、泛型、可交互操作的软件组件。泛型编程最初诞生于 C++中,目的是为了实现 C++的 STL(标准模板库)。其语言支持机制就是模板(Templates)。模板的精神其实很简单:参数化类型。换句话说,把一个原本特定于某个类型的算法或类当中的类型信息抽掉,抽出来做成模板参数 T。1. 函数模版1.1 函数重载
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
C++ 多态 C++ 多态1. 多态的意义2. 多态实现的前提2.1 规则1. 多态的意义如果有几个相似而不完全相同的对象,有时人们要求在向它们发出同一个消息时,它们的反应各不相同,分别执行不同的操作。这种情况就是多态现象。C++中所谓的多态(polymorphism)是指,由继承而产生的相关的不同的类,其对象对同一消息会作出不同的响应。多态性是面向对象程序设计的一个重要特征,能增加程序的灵活性。可以减轻系统升级,维护,调试的工作量和复杂度。2. 多态实现的前提2.1 规则赋值兼容规则是指在需要基类对象的任
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 小结定义类的继承,是新的类从已有类那里得到已有的特性。或从已有类产生新类的过程就是类的派生。原有的类称为基类或
C++ 友元 C++ 友元1. 何为友元2. 同类对象之间无隐私3.异类对象之间有友元3.1 友元函数3.1.1 全局函数作友元函数3.1.2 类成员函数作友元函数3.2 友元类4. 小结4.1 声明位置4.2 友元利弊4.3 注意事项1. 何为友元采用类的机制后实现了数据的隐藏与封装,类的数据成员一般定义为私有成员,成员函数一般定义为公有的,依此提供类与外界间的通信接口。但是,有时需要定义一些函数,这些函数不是类的一部分,但又需要频繁地访问类的数据成员,这时可以将这些函数定义为该类的友元函数。除了友元函数外,还有友
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
C++类与对象--static修饰符 C++类与对象--static修饰符1.类静态数据成员的定义及初始化1.1 声明1.2 初始化1.3 调用1.4 案例在 C++中,静态成员是属于整个类的而不是某个对象,静态成员变量只存储一份供所有对象共用。所以在所有对象中都可以共享它。使用静态成员变量实现多个对象之间的数据共享不会破坏隐藏(相比全局变量的优点)的原则,保证了安全性还可以节省内存。类的静态成员,属于类,也属于对象,但终归属于类。1.类静态数据成员的定义及初始化1.1 声明static 数据类型 成员变量; //在类的内部1.2
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