【进程和线程的区别?】
"线程,是执行的基本单位,线程共享进程的资源"。
"进程,是资源分配的基本单位,调度的单位"。
一个进程里可以有多个线程。
每个进程都至少有一个线程,这个线程是进程的主线程。
【进程间的通讯方式?各有什么特点?】
【线程间的同步方式?】
【共享资源的互斥策略?】
【谈谈对嵌入式软件开发的认识】
【给你一块开发板,如何把它用起来】
【给你一个芯片,如何写好驱动程序】
【OSI七层模型,每层模型举1个协议出来】
C语言练习:重视'数据结构'。
【提高C语言的方式】:
1. 数据结构课程的练习题目
堆
栈
队列
-> 链式存储的方式实现(练的就是指针)
2. arm/env/MS.rar
每天做1-2套面试题。
'eg1:
int main (void) {
char* p; // 或 char* p = NULL;
strcpy (p, "hello");
printf ("%s\n", p); // a.out ---> 段错误!
return 0;
}
'eg2:
void func (char* str) { // 需要使用二级指针才行
str = malloc (100);
}
int main (void) {
char* p = NULL;
func (p);
strcpy (p, "hello"); // *p上一样是0,没有内存空间
printf ("%s\n", p); // 段错误!
return 0;
}
-------------------------------------------------
1、ARM体系结构与编程 - ARM裸板开发(不带操作系统)
main () {
xxx;
yyy;
while (1) {
...
}
}
异常处理...
|
v
>:搭建嵌入式开发环境
>:LED
>:UART 串口
>:g-sensor 重力传感器
>:ARM 汇编
>:异常处理
2、系统移植
bootloader 的移植 u-boot
kernel的移植 linux
根文件系统的制作
3、linux驱动程序开发
内核知识
驱动框架的知识
硬件知识
4、项目
智能家居
智能车
-------------------------------------------------
1、嵌入式系统
以'应用'为中心,软硬件的'裁剪'
对功能性、可靠性、成本、体积、功耗有严格要求的专用计算机系统。
大数据、云计算、物联网(智能家居/车联网)、智能穿戴、AR/VR
2、嵌入式系统的构成
【硬件系统】
--->最小系统 (设计开发板的时候必须存在的硬件)包含
:'处理器' arm/51单片机/mips/powerpc/intel
:'电源电路' 硬件设计不好易死机
:'复位电路'
:'时钟电路' <==> 相当于心跳,提供周期性的信号
:'存储电路' 掉电丢失:RAM (<==>PC机的内存)
sram静态/dram动态/ddram
掉电不丢失: ROM(<==>PC机的硬盘)
flash/nandflash
emmc: nandflash + 控制电
【软件系统】
:'驱动程序' 控制硬件工作的程序
:'OS' operate system (实时操作系统 vs 非实时操作系统)
linux : '非实时操作系统',取决于操作系统的调度策略
linux中主要的调度策略是 '时间片轮转'。
Rtlinux:'实时操作系统',基于优先级调度策略。
实时操作系统:ucos-II / Vxworks
'操作系统中常见调度策略':
1. 时间片轮转;
2. 先来先服务;
3. 基于优先级;
WinCE / qnx
:'应用程序' 范围很广很多了...
所需技能:C语言、QT、Unix-C、数据库(sqlite)
3、开发模式
在PC机上软件开发:vi hello.c ---> gcc hello.c ---> ./a.out
在嵌入式环境下开发:
1. 开发主机,PC (完成代码的编辑、编译工作);
2. 目标板,开发板 (运行编译后的可执行程序);
3. 开发主机和目标板的通信方式:USB线 / 串口线 / 网线 / JTAG调试口
4、硬件简介
4.1 核心板 (www.arm.com - 了解arm核版本,A53...)
【CPU】s5p6818 - 三星生产,基于cortex-A53 - 8核1.4GHz
【DDRAM】海力士 - 1GB
【EMMC】三星 - 8GB
【网卡】REALTEK - * - PHY(物理层)
【电源管理芯片】略 - 不用管
4.2 底板
连线:
电源线
串口线
网线
5、uboot烧写到emmc
env/ubootpak.bin
A. 烧写过程可以通过usb线来完成 fastboot
B. 也可以通过TF卡的方式来完成烧写
' TF卡烧写步骤:
1. 将TF卡插入读卡器,将读卡器插入电脑;
2. 格式化TF卡(FAT32 - 文件系统),可选可不选快速格式化;
3. env/IROM_Fusing_ToolV2.0.zip - 解压出可执行程序:
IROM_Fusing_Tool.exe - 运行此程序;
4. 选择对应的分区;
5. 点击Browse找到选择要写入的文件ubootpak.bin,点击add;
6. 点击START,完成写入;
7. 将TF卡插入开发板的SD0插槽,开发板启动时默认从TF卡读取并执行
8. 启动PC上的串口软件
env/SecureCRT.rar - 解压 (放在'非中文路径')
SecureCRT.exe - 放到桌面快捷方式,启动
Alt + Q 快速链接 (或 点击第二个图标)
> 协议:Serial
> 端口:COM1 // 笔记本COMx
(计算机 - 属性 - 硬件 - 设备管理器 - 端口 / 笔记本单独看一下)
> 波特率:115200
> 数据位:8
> 奇偶校验:None
> 停止位:1
> 流控:RTS/CTS (去掉勾选,空着)
---> 【连接】
9. 复位开发板
在倒数读秒 (3 s) 计时过程中按下空格键,进入 X6818# 命令行模式
5.1 保证开发板可以ping通服务器
> 纯ubuntu系统只要保证开发板和ubuntu系统处于同一网段即可。
> 虚拟机中需要注意三点:
1) 开发板、ubuntu系统、windows三者处于同一网段
ubuntu系统: 192.168.1.8 255.255.255.0
开发板: 192.168.1.6 255.255.255.0
SerialCRT软件下Serial-COM1(1)的命令行下
X6818#:'printenv // ipaddr / netmask / serverip
X6818#:'setenv ipaddr 192.168.1.6
X6818#:'setenv serveraddr 192.168.1.8
X6818#:'saveenv
// 写入环境变量到掉电不丢失的EMMC中
windows: 192.168.1.121
注意修改的是连接开发板的网卡的ip - 方法:拔插开发板网线
2) 设置VMware的桥接模式
VMware - 【虚拟机】 - 设置 - 网络适配器 - 桥接模式(B)
3) 选择用于桥接的网卡
VMware - 【编辑】 - 虚拟网络编辑器 - 桥接模式 - 桥接到(开发板对应的网卡,在本地连接中可以看名字,鼠标放在图标上即可)
>> 在串口中执行命令
X6818#:'ping 192.168.1.8
看到" host 192.168.1.8 is alive "此行内容即为ping通,成功。
注意:
a. 不能主机ping开发板;
b. 第一执行ping时不成功,忽略;(一直ping不通检查网线)
5.2 使用tftp协议的方式完成windows下的ubootpak.bin的下载
tftp:tftp是ftp协议的简化版本,其中没有用户管理的功能。
【tftp服务器】
1) 在ubuntu系统中 --->
联网方式:$:'sudo apt-get install tftpd-hpa [-d]
// VM联外网的方式:设置 - 网络适配器 - NAT,ubuntu ip自动获得
非联网方式:
$:'cd /home/tarena/Downloads/tftp
$:'sudo dpkg -i *.deb
2) 配置tftp server:
$:'sudo vi /etc/default/tftpd-hpa
---> TFTP_DIRECTORY="/tftpboot" // tftp客户端登陆后文件目录
3) 要想让新的配置生效需要重启tftp server,重启方式:
$:'sudo /etc/init.d/tftpd-hpa restart
4) 将要供客户端下载的文件拷贝到/tftpboot/目录下
$:'sudo cp /mnt/hgfs/arm/env/ubootpak.bin /tftpboot/
// $:' sudo chmod +w /tftpboot/ -R 此行命令可用sudo cp ...解决
【tftp客户端】 // 确保 serverip=192.168.1.8
X6818#:'tftp 0x48000000 ubootpak.bin
该命令下载ubootpak.bin到dram(内存)的0x48000000为开始的地址上了。
// 0x48000000 是物理地址,它是开发板上的物理地址,该物理地址对应的是哪个ddram,详见 cpu datasheet。
X6818#:'update_mmc 2 2ndboot 0x48000000 0x200 0x53bb0
// 2: 2th mmc 存储设备(SD0 - 0,SD1 - 1,EMMC - 2)
// 2ndboot:要更新的分区
// 0x48000000:源数据地址
// 0x200:源数据写入2ndboot分区的便宜(实际有512kb)
// 0x53bb0:写入的字节数(ubootpak.bin文件下载下来的大小)
验证:
将TF卡从开发板上拔下来,复位开发板。
// ubootpak.bin 文件会被自动从EMMC加载到dram(内存)中
6、led.bin文件的下载和运行
env/led.bin
$:'sudo cp /mnt/hgfs/env/led.bin /tftpboot/
开发板上执行:
$:'tftp 0x48000000 led.bin
$:'go 0x48000000
// 开发板上蓝色的led灯会亮
---------------------------------------------------------------------------------------------------------------
一、ARM硬件体系
【采用RISC架构的ARM处理器的特点】
1)体积小、低功耗、低成本、高性能;
2)支持Thumb-16-bit/ARM-32-bit双指令集,能很好的兼容8位/16位器件;
3)大量使用寄存器,指令执行速度更快;
4)大多数数据操作都在寄存器中完成;
5)寻址方式灵活简单,执行效率高;
6)指令长度固定。
// RISC:精简指令集
【ARM经典微处理器】
经典ARM处理器由 3 个处理器系列构成,包含 8 个处理器。
ARM 7 系列、ARM 9 系列、ARM 11 系列。
【ARM 7 处理器系列】
1)主要应用于:工业控制、internet设备、网络和调制解调器设备、移动电话等多媒体和嵌入式应用。
2)ARM7TMDI是目前最广泛的RISC处理器,属于低端ARM处理器核。
3)3级流水线 - 0.9 MIPS/MHz (每秒百万指令)
允许多个操作同时处理,比逐条指令执行要快。
最佳流水线:6个时钟周期执行了6条指令。
4)TDMI:
T:支持16bit压缩指令集Thumb,32bitARM指令,两种状态可选择执行;
D:支持片上Debug;
M:内嵌硬件乘法器,支持64bit结果;
I:嵌入式ICE支持片上断点和调试点。
【ARM 9 处理器系列】
1)主要用于引擎管理、仪器仪表、安全系统、机顶盒、高端打印机、数字照相机和数字摄像机等,以及mp3音频和mpeg4视频等多媒体智能电话;
2)使用Harvard架构,增加了可存储器宽度,实现对指令和数据库存储器同时访问;
3)5级流水线;
【ARM 11 处理器系列】
1)主要用于智能手机、消费类、家庭类嵌入式应用领域;
2)功耗非常低;
3)兼容以前所有ARM处理器;
4)功能:强大的ARMv6指令集体系结构,高效嵌入式系统,8级流水线。
二、ARM集成开发环境
【裸机】
1)无操作系统下的ARM系统开发,硬件资源均开放,可以理解为一个高级的单片机的开发;
2)更深入的从底层去理解ARM CPU的操作过程及系统设计,为日后自行设计系统打下基础,为bootloader的编写打好基础;
C/C++ ---> 编译器 ---> 目标文件 \
C/C++ ---> 编译器 ---> 目标文件 ---> 连接器 ---> 可重定位程序 ---> 定址器 ---> 可执行文件
汇编语言 ---> 汇编器 ---> 目标文件 /
3)模拟方式、仿真方式、调试方式
4)开发软件:SDT、ADS(ARM Developer Suite 1.2)、RVDS
调试软件:AXD、ARMSD、ADW/ADW
【ADS(ARM Developer Suite 1.2)】CodeWarrior(IDE) 集成开发环境
特点:源代码编辑器、代码着色;
源代码浏览器、源码跳转;
查找和替换功能、搜索替换;
文件比较功能、对比内容。
CodeWarrior(IDE)一般使用步骤:
1. 在磁盘里新建一个目录"D:\arm"
2. 打开ADS软件
3. 点击工具栏"File",下拉点击"New..."
4. Project - ARM Executable Image - "Project name" - "Location" <.mcp文件>
5. File - Text File - "File name" <.s汇编文件> (汇编要么全大写要么全小写)
6. 编写汇编代码
7. Debug setting - 必设:Debugger - RealView Debug - AXD
Debugger - RealView Runner - AXD
8. Make - 编译
9. Debug - 调试(打开调试器):软件仿真调试
// 只有当通过硬件或者是软件仿真调试所得到的结果达到了预期效果,才算是完成了应用程序编程工作。
调试器能够发送以下指令:
1)装载映像文件到目标文件;
2)启动或停止程序的执行;
3)显示内存,寄存器或变量的值;
4)允许用户改变存储的变量值;
【ARM编程模式】
ARM处理器模式有 7 种:
用户模式、快中断模式、中断模式、管理模式、终止模式、未定义模式、系统模式。
USR-------FIQ----------IRQ--------SVC------ABT--------UND--------SYS
// 更好的支持操作系统并提高工作效率。
【内部寄存器】
在ARM 7 TDMI处理器中有 37 个用户可见的的寄存器,其中 31 个通用32bit寄存器及 6 个状态寄存器。
// 在不同的工作模式和处理器状态下,程序员可访问的寄存器也不同。
r13:堆栈指针 (SP)
r14:链接寄存器(LR)
r15:程序计数器(PC)
Thumb状态寄存器:
它是ARM状态集的子集,程序员可以直接访问的寄存器有:
1)8个通用寄存器r0~r7;
2)程序计数器r15 - PC;
3)堆栈指针r13 - SP;
4)连接寄存器r14 - LR;
5)有条件访问程序状态寄存器CPSR。
程序状态寄存器:
1个CPSR + 5个异常处理程序所用的SPSR。
CPSR包含:
1)4个条件代码标志(31-N负,30-Z零,29-C进位,28-V溢出);
2)2个中断禁止位(7-I中断,6-F快中断);
3)5个用于处理器模式编码的位;
4)1个用于指示当前执行指令是ARM或Thumb的指令。
5)其他bit位为保留位,不用管。
三、ARM存储器组织
【异常和中断】
异常:(exception)由内部或外部源产生以引起处理器处理一个事件。
ARM支持 7 种类型的异常。异常出现后,强制从异常类型对应的固定存储器地址开始执行程序,这些固定的地址成为"异常向量"。
异常处理模式:
复位、未定义指令、软件中断(SWI)、预取终止、数据中止、IRQ、FIQ
异常优先级:
1-复位, 2-数据中止, 3-FIQ, 4-IRQ, 5-预取终止, 6-未定义指令, 7-SWI
ARM指令系统属于RISC指令系统,支持 6 种数据类型:
1)8bit有符号字节;
2)8bit无符号字节;
3)16bit有符号半字;
4)16bit无符号半字;
5)32bit有符号字;
6)32bit无符号字。
【存储器组织】
大端:字数据的高位字节存放在低地址中,字数据的低位字节存放在高地址中。
小端:低地址中存放字数据的低字节,高地址中存放字数据的高字节。
【ARM的存储器层次】
寄存器组
片上RAM
片上Cache
主存储器
硬盘
【ARM存储器管理单元MMU】
实现虚拟地址空间到物理存储空间的映射;
存储器访问权限的控制;
设置虚拟存储空间的缓冲特性。