ARM:嵌入式系统介绍、开发板环境设置、tftp实现文件下载、SecureCRT工具烧写

时间:2021-10-03 16:29:26
'《ARM》'
【进程和线程的区别?】
    "线程,是执行的基本单位,线程共享进程的资源"。
    "进程,是资源分配的基本单位,调度的单位"。
    一个进程里可以有多个线程。
    每个进程都至少有一个线程,这个线程是进程的主线程。
【进程间的通讯方式?各有什么特点?】
【线程间的同步方式?】
【共享资源的互斥策略?】
【谈谈对嵌入式软件开发的认识】
【给你一块开发板,如何把它用起来】
【给你一个芯片,如何写好驱动程序】
【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】
    实现虚拟地址空间到物理存储空间的映射;
    存储器访问权限的控制;
    设置虚拟存储空间的缓冲特性。