精华内容
下载资源
问答
  • 嵌入式系统开发环境主要包括: 集成开发工具 交叉编译器 批处理文件 makefile Link Script 调试工具 下载工具 其它工具(Offline Tools) 模拟器 版本控制工具 接下来分别讲解以上各个工具: 1、集成开发工具 一般...

    嵌入式系统开发环境主要包括:

    • 集成开发工具
    • 交叉编译器
    • 批处理文件
    • makefile
    • Link Script
    • 调试工具
    • 下载工具
    • 其它工具(Offline Tools)
    • 模拟器
    • 版本控制工具

    接下来分别讲解以上各个工具:

    1、集成开发工具

    一般CPU厂商会提供针对该CPU的集成开发环境(IDE),但在实际应用中,大多数嵌入式项目开发公司都还是会使用自己开发的环境。一是项目某些功能的特殊性要求,二是并不是所有CPU型号都有相应的IDE。

    2、 Cross-Tools

    Cross-Tools包含:

    • Cross-Assembler
    • Cross-Compiler
    • Cross-Library
    • Cross-Linker
    • dump工具(将可执行文件转换为汇编语言代码的相关信息)
    • 调试工具(GNU gdb)

    以GNU Tool-Chain中的C编译器gcc为例,以下是一些编译时的选项:

    • -Werror:将所有警告信息变为错误信息,一旦有警告信息产生,就不产生目标文件。
    • -S : 编译时输出汇编语言代码。
    • -C : 编译时仅产生目标文件
    • -E : 只执行预处理,不产生目标文件
    • -D : 编译时定义宏常数
    • -O、-O2、-O3: 优化等级。
    • -g : 编译时加入调式信息,使之可以使用GDB进行调试

    以GNU Tool-Chain中的C链接器Linker为例,以下是一些选项:

    • -T : 制定链接脚本文件
    • -Map :连接时产生map文件,其中包含了程序中所有symbol的地址信息。

    GNU tool chain可以支持许多不同的CPU,使用者可以根据需求设定配置。例如arm-elf-gcc就是会以elf格式产生ARM机器码的C编译器,而68K-coff-ld就是会以COFF格式产生68000机器码的linker。

    3、Make

    make是用来进行自动编译的程序工具,只要在makefile中详细叙述要用什么工具(例如cross-compiler)对哪个文件(.c、.obj、…)做何种处理(产生不优化的目标文件),make同时还会检查这些文件是否过期,如果过期会仅仅自动重新编译需要编译的(make会比较文件之间的依存关系与日期,以决定某个文件是否需要重新编译),而通常的批处理程序(例如windows下的.bat程序),在有某些文件更新后,需要重新编译所有文件。

    《programming with GNU Software/GNU程序设计》

    《Managing Project with make/make 项目开发工具》

    以上两本书有对make使用的详细说明。

    (1) makefile里的重要概念

    • Target(目标):就是想要产生的文件名称。
    • Dependency(依赖):定义两个文件是否存在依存关系。
    • Prerequisite(必备文件):一些能建立target的文件,一个target通常由多个文件建立。
    • UP to Date(新版):假设某个文件比它所依赖的文件还要新,则表示这个文件有了新版本。

    makefile的基本语法:

    #文件名:sample.mak
    Target:Dependency list
       command1
       command2

    要执行上述makefile的命令是:make -f sample.mak,如果没有使用-f指定makefile文件的话,make会在当前目录下寻找名为“makefile”的文件。此外如果没有指定targe的话,make会以makefile中第一个target文件名当作目标名。

    (2)makefile举例

    • 下例为makefile中的宏定义示例:
    #File Name  :   DEFINE.MAK
    #
    #定义其它makefile中会用到的宏,思想和C语言的#define一样
    #
    !IFNDEF _DEFINE_MAK
    _DEFINE_MAK = DEFINED
    #
    #定义项目相关文件所在的磁盘机编号
    #
    PRJ_DRIVER  =   Y:
    #
    #定义项目工具所在目录
    #
    PRJ_TOOLS_ROOT  =   $(PRJ_DRIVER)\Tools
    #
    #定义编译器所在目录
    #
    GNU_CC  =   $(GNU33_ROOT)\kcc33
    GNU_LK  =   $(GNU33_ROOT)\ld
    GNU_AR  =   $(GNU33_ROOT)\ar
    #
    #定义项目程序所在目录
    #
    SRC_ROOT    =   $(PRJ_DRIVER)\Project2020
    SRC_INC     =   $(SRC_ROOT)\include
    #
    #当编译时传入-DXXX参数,其效果如同在程序中写了#define XXX
    #
    PRJ_CONFIG  =   -DPRJ_2020 -DCPU_ARM9 -DLCD_160X160
    #
    #定义执行C compiler时的参数
    #
    ?CFLAGS= -c -gstabs -mlong-calls -fno-builtin -mgda=0 -mdp=1 -O3 
            -I$(GNU_INCLUDE)
            -I$(SRC_INC)
            -I$(PRJ_CONFIG)
    #
    #定义执行linker时的参数
    #
    LDFLAGS= -T main.lds -Map $(TARGET).map -N
    #...
    #...
    !ENDIF
    • 下例为一个较复杂的范例:
    #
    #在makefile中,也可以和include一样,包含其它makefile
    #
    !IF "$(_DEFINE_MAK)" == ""
    !INCLUDE DEFINE.MAK
    !ENDIF
    #
    #定义各模块包含的object file,每个object都是一个target
    #
    MODEL1_OBJS = m1_001.obj m1_002.obj m1_003.obj
    MODEL2_OBJS = m2_001.obj m2_002.obj
    #
    # 项目中所有需要的object file
    #
    OBJS    = $(MODEL1_OBJS) $(MODEL2_OBJS)
    #
    #定义会用到的库函数
    #
    LIBS = $(GNU_LIB)\libgcc.a
    #
    #第一个target产生最终可执行文件main.elf,
    #和main.elf有依赖关系的target有:所有的object file,main.mak,Link Script
    #"$@"表示target本身,即main.elf
    #
    main.elf : $(OBJS) main.mak main.lds
        $(GNU_LK) $(LDFLAGS) -o $@ $(OBJS) $(LIBS)
    #
    # $* 表示target名称去掉扩展名
    # $@ 表示target本身
    # $< 表示XXX.c
    #
    m1_001.obj : $(SRC_ROOT)\m1\m1_001.c $(SRC_INC)\m1.h
        $(GNU_CC) $@ $(CFLAGS) $*.c
        
    m1_002.obj : $(SRC_ROOT)\m1\m2_001.c $(SRC_INC)\m1.h
        $(GNU_CC) $@ $(CFLAGS) $*.c
        
    ...
    • 当需要重复处理几个扩展名一样的文件时,通常可以使用make的预设编译规则。例如当需要以同样的规则编译所有以.obj为扩展名的target时可以采用如下语句:
    ?.c.obj:;$(GNU_CC) $@ $(CFLAGS) $<

    预设编译规则语法说明:

    • .c.obj:; 此行目录用来规范target为.obj文件,依赖为.c文件的预设编译规则

    • 在设定预编译规则时依然可以使用宏

    (3)非文件名称的Target

    clean:
        del $(OBJS)
        del main.elf
        del main.bin

    上述makefile语句中仅有target,没有dependency,意味着该target是一定会去执行下文的del命令。一般用于重新编译所有文件前执行。

    这种非文件名target也可作为其它target的dependency,用于当要make某个target时,先去执行一系列指令的效果:

    build_all : clean
        ...
        ...

    (4)版本控制

    在系统正式发布之前,程序代码中肯定会包含许多用于调试的代码行。但实际中,由于嵌入式系统的存储资源有限,不可能将含有调试代码的程序作为最终代码烧进板子。所以在设计时,一般会设计两个版本(调试版和发行版)。当然,当程序开发完,我们不可能用手动的方式一个个去删除这些调试代码。此时可以采用C语言中条件编译的思想,见下文分析:

    调试版批处理文件:make_debug.bat

    REM ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    REM Make_debug.bat
    REM~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
    REM 设定Windows/DOS的系统环境变量
    REM
    set BUILD_MODE = Debug
    
    REM make我们的程序
    REM
    make target

    发行版批处理文件:make_release.bat

    REM ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    REM Make_release.bat
    REM~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
    set BUILD_MODE = Release
    make target

    makefile:

    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    #makefile
    #~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    #
    !IF "$(BUILD_MODE)" == "Debug"
    # 如果BUILD_MODE等于“Debug”,则设定编译时期的参数CFLAGS_DEBUG = __DEBUG_VERSION
    # 反之,则设定编译时期的参数为空
    #
    CFLAGS_DEBUG = -D__DEBUG_VERSION
    !ENDIF
    
    target:
        gcc $(CFLAGS_DEBUG) xxx.c
    #-D参数用来在编译时期设定宏变量“__DEBUG_VERSION”

    4、Link Script

    制作可执行文件的流程中,要先把所有的程序文件编译成目标文件,接下来就是通过链接器linker将所有的目标文件与库文件链接为可执行文件。而具体如何链接,连接到哪个地址就是通过扩展名为.ld的连接脚本文件来指定了。

    有操作系统的情况下,不同的程序有自己的地址空间,而且相互之间互不干涉。这种程序都在RAM(内存)中执行,所有程序只要从同一个起始地址连接在一起就好。但嵌入式程序很多时候是没有操作系统的,系统和程序通常在在同一个地址空间,且往往连硬盘都没有,程序只能在ROM或flash中执行。但数据则只能被寻址在RAM中,所以连接时要告诉linker,程序段要被寻址到哪里(ROM的起始地址),数据段要被寻址到哪里(RAM的起始地址)。

    (1)程序区段的结构

    • text段:即代码段,执行期间text段的内容不会改变,其可以直接在ROM里执行,无须载入到内存。
    • Read-only-data(rodata)段:定义为const的变量,以及字符串都会归类到rodata段。,其也是直接在ROM里执行。
    • Data段 :有初值的全局变量放在这个段。在连接时期,这些初值必须加入到可执行文件中,但要被寻址到RAM的地址;在执行时期,这些变量被存储在ROM中,但必须被载入到RAM中才能使用,因为他们的值是可变的。所以,data段会被加入ROM,但却要寻址到RAM中。
    • bss段:没有初值的全局变量会被归类到bss段。因为无初值,所以不必加入到程序中,只要在连接时将其寻址到RAM即可。执行时期也没有载入的问题,但机器RESET后,由系统主动将整个bss段清零。

    (2)link script 的内容

    执行时期存储器的使用状况:

    执行时期存储器的使用状况
    • LMA(Load Memory Address)与VMA(Virtual Memory Address)

    数据会被放置在ROM,但执行时必须载入到RAM,则在ROM中(最终存储的地址)的地址称为LMA,而在RAM中(执行时期)的地址就是VMA。

    试着写一下具有如下连接要求的link script:

    • 系统中有一块ROM,它的起始地址是0xC00000,另有一块RAM,起始地址为0.
    • 可执行文件包含text、rodata、data段,其中text段和rodata段在ROM里执行即可,所以被寻址到0xC00000,而rodata跟在text后面。
    • bss段因为没有初值,所以不会占据可执行空间或ROM空间,它会被寻址到RAM的起始地址0.
    • data段比较复杂,它的内容也必须包含在可执行文件内,在执行时期它必须被载入到RAM里。所以data的VMA在RAM中,跟在bss段之后,而LVA则跟在rodata段后面。

    扩展:当希望某段程序以更快的速度执行,则只需要将其LMA在ROM里,VMA则寻址到RAM中,在执行前将其从ROM中载入到RAM里。

    执行时期的存储结构
    /*********************************************************
    Link Script sample
    存储器地址配置:ROM起始地址(0xC00000),RAM起始地址(0)
    输出ARM9机器码,可执行文件格式为elf32
    **********************************************************/
    
    OUTPUT_FORMAT("elf32-arm9")
    OUTPUT_ARCH(arm9)
    SEARCH_DIR(.);
    
    SECTIONS
    {
        /*****************************************
        定义text段,起始地址(VMA)从0xC00000开始,
        若没有指定LMA,表示LMA起始地址同VMA。
        *****************************************/
        .text 0xC00000:
        {
        /* 定义变量__START_text,句号.表示当前的VMA,即0xC00000 */
        __START_text = . ;
            
        /* *(.text)表示将当前目录中所有的.text段加入到这个段*/
        *(.text);
            
        /* 定义变量__END_text,目前VMA应该是0xC00000加上所有.text段的size总和 */
        __END_text = . ;
        }
        
         /*****************************************
        定义rodata段,起始地址(VMA)从__END_text开始(跟在text段之后),
        若没有指定LMA,表示LMA起始地址同VMA。
        *****************************************/
        .rodata __END_text :
        {
        __START_rodata = . ;
        *(.rodata);
        __END_rodata = . ;
        }
        
         /*****************************************
        定义bss段,起始地址(VMA)从0开始,
        若没有指定LMA,表示LMA起始地址同VMA。
        *****************************************/
        .bss 0x00000000:
        {
            __START_bss = .;
            *(.bss);
            __END_bss = .;
        }
        
         /* 定义可在程序中使用的变量__SIZE_BSS,表示bss段的大小。*/
        __SIZE_BSS = __END_bss - __START_bss;
            
        /*****************************************
        定义data段,其LMA应该在ROM,而VMA在RAM。
        所以,VMA跟在bss段后面,LMA跟在rodata段之后
        *****************************************/
        .data __END_bss : AT(__END_rodata)
        {
            __START_data = .;
            *(.data);
            __END_data = .;
        }
        
        /*定义变量__START_data_LMA,表示data段的起始地址*/
        __START_DATA_LMA =  LOADADDR(.data);
        
         /* 定义可在程序中使用的变量__SIZE_DATA,表示data段的大小。*/
        __SIZE_DATA = __END_data - __START_data;
        
        /***********************************************
        speed_up模块的VMA和LMA都是跟在data段之后,
        它会被加到可执行文件中,但执行时要载入到RAM才能执行
        **************************************************/
        .text_speed_up __END_data : AT(__START_data_LMA + SIZEOF(.data))
        {
        __START_text_speed_up = .;
          speed_up_main.o(.text);
          speed_up_main.o(.rodata);
          speed_up_main.o(.data);
        __END_text_speed_up = .;
        /* 为便于说明,假设该模块没有bss段*/
        }
        __START_text_speed_up_LMA = LOADADDR(.text_speed_up);
        __SIZE_TEXT_SPEED_UP = __END_text_speed_up - __START_text_speed_up;
    }

    将某个程序模块(speed_up)传输到速度较快的存储器上执行的代码如下:

    extern unsigned char * __START_text_speed_up;
    extern unsigned char * __START_text_speed_up_LMA;
    extern int __SIZE_TEXT_SPEED_UP;
    
    void copy_data_section(void)
    {
        //一个字节一个字节的传输(性能较差)
        int i;
        unsigned char *dest = __START_text_speed_up;
        unsigned char *src = __START_text_speed_up_LMA;
        for(i=0; i<__SIZE_TEXT_SPEED_UP; i++)
            dest[i] = src[i]
    }

    为bss段赋予0的代码为:

    extern unsigned char * __START_bss;
    extern int __SIZE_BSS;
    
    void clear_bss_section(void)
    {
        int i;
        unsigned char * dest = __START_bss;
        for(i=0; i<__SIZE_BSS;i++)
            dest[i] = 0;
    }

    (3)Map File或符号表(Symbol Table)

    连接后除了产生可执行文件外,通常还要求产生map文件(GNU linker ‘ld’ 的-m参数),其用于记录项目中每一个Symbol(程序中所有函数、库函数、全局变量及链接器自动产生的各个区段起始和结束地址的变量)的LMA与VMA的对应关系。通过该map文件可以得到如下信息:

    • 程序各区段的寻址是否正确;
    • 程序各区段的大小;即ROM和RAM的使用量;
    • 程序中各符号的地址;
    • 各个符号在存储器中的顺序关系
    • 各个程序文件的存储用量

    当连接完毕,下载可执行文件到实际存储器中前,一般需要查看map文件,以确定各区段的起始地址和大小符合自己的设想。下图是一个map文件的部分截图:

    map文件截图

    5、ROM Maker

    可执行文件的格式多样(ELF、COFF、HEX、S-Record、EXE等),但最终要烧到板子ROM里的是二进制文件,所以当得到可执行文件后,还需要通过ROM Maker将其转化为纯二进制文件才能执行烧录。当然,因为嵌入式系统通常没有硬盘,所以除了可执行二进制文件之外的文件也必须同时和他们一起转换成一个总的单一的二进制文件(Image File),这个过程称为make ROM。具体流程见下图:

    制作最终Image File的流程

    这里说的除了二进制可执行文件之外的一起加入到Image File的文件常见的有图片(JPG文件等),常见的作法是通过将该图片文件按字节转化为常量C数组,并给予一个名称,在程序中就可以通过直接操作存储器来使用这些数据,从而避免使用文件系统,但扩展性不强,更新麻烦。所以当这些图片文件有很多时,还是建议使用文件系统来管理较为方便。

    实际上,我们一般会开发一个工具,把某目录下的所有文件一一转化为C array的程序,同时会产生一个.h头文件,其中包含所有代表数据挖掘的C array声明与每一个数组的大小,使用时只要include这个.h文件就可以使用这些array。

    • 文件系统映像

    实际上文件系统就是一种访问数据的接口而已,它是一套实现了数据的存储、分级组织、访问和获取等操作的抽象数据类型。文件系统存储在哪、用什么样的格式都有可能,如果系统对文件没有写入需求,文件系统照样可以存储在ROM中。

    在嵌入式系统中,如果没有写入数据的需求,我一般会采用一个索引表格,记录文件名及其在存储器中的文件首地址和文件大小。为了查找方便,该索引表格一般位于最高地址处。

    用于嵌入式系统的文件系统

    6、Offline Tools

    用于开发阶段且必须自己开发并执行于PC上的工具叫做offline tools。这些工具可分为6大类:

    • 程序产生器(Program General)

      • 系统配置设定工具:一个运行于PC上,用于选择系统配置(某些功能开关、LCD分辨率等),并自动产生.h文件或make-file。
      • Resource Manager:要加到系统中的字符串、图形或数据文件为resource。例如用于UI界面的小图形文件必须转为C array并加到程序中,其它程序则通过resource ID对应到该array。该工具可以使我们仅通过编辑资源文件名,即可自动转出包含所有resource ID定义的.h文件,以及包含这些resource内容的C array的.c文件。
    • Data Maker:一般嵌入式系统无法使用诸如mySQL这种数据库,必须根据应用的特性自行设计。

      • File System:严格来说文件系统也是数据库,只是它的单元是文件而非记录。
      • Database:所谓的database基本上会包含数据文件与多个层级的索引表(index table)。在CPU算力有限二点前提下,数据库格式与压缩算法的设计尤为重要。
      • 产品内置的文件:例如一些MP3内置音乐或电子书内置书籍等不可被用户删除的文件必须与用户可编辑的文件区分开,而这就涉及多个文件存储区域或多个文件系统。
      • 产品信息或预设出厂设定:对于一些经常变动的信息(厂商、日期等),我们会倾向于不要写死在程序里,而是将这些信息存储在file或Database中,让系统在运行时取得其中的信息即可。
    • Image Maker:它的功能就是制作要最后烧入存储器中的image。该映像中不仅包含程序,可能还包含产品信息、FIle System image、Database等。

    offline tool在嵌入式系统开发的应用
    • 下载工具:除了用烧录器写image进存储器外,还需要提供局部下载的下载工具,因为有时候仅仅是更新部分程序或文件系统里的某些文件。
    • 量产工具:厂商有些信息(厂商名、批号、日期等)只有在烧录前才可决定,此时需要提供一个工具给厂商,将这些信息写入image特定位置后才进行存储器烧录。
    • 模拟器
    • 其它工具

    7、下载与执行

    严格来说,所谓的ROM是无法烧录的。在量产前,要委托专业的Mask-ROM制造商根据我们提供的image File进行一次性烧录。在开发阶段,我们要选用其它可重复读写的替代品,通常如NOR-flash、EPROM或EEPROM等。而要将数据写入一般有以下几个做法:

    • 先利用ICE下载到RAM执行并测试。
    • 烧录器:要先把存储器的Chip放在烧录器的socket上,然后利用PC操作厂商提供的烧录程序,选择image file并执行烧录即可。(开发阶段板子的存储器先设计成通过socket与板子连接,我们只要把烧好的IC放在socket上夹好即可)
    • ROM-Emulator:该工具就是模拟EPROM/EEPROM,它的一端接到板子的socket上,另一端接到PC上。通过厂商提供的程序,可以将image file下载到ROM模拟器的存储器内,机器连接着模拟器就如同接着一颗真正的ROM一样。
    • Update程序:在实际板子可以通过某种方式(USB、RS232、网线)与PC连接并传输数据的话,我们可以开发一个update程序模块用于接收PC端的image file内容并将其写入NOR flash中,如此一来就完成了更新机器上程序版本的功能。

    8、版本控制

    无论是嵌入式系统或一般软件项目,只要涉及多人协作开发,就一定要做版本控制。当软件开发达到某个里程碑或有重大突破时,管理者可以为当前版本取一个名字,我们称之为Lable或tag,以后任何人都可以从版本控制服务器下载某lable时间点的所有程序。

    当系统需要开发一个新功能时,可以建立一个分支(branch),并在该分支上进行开发。成功后在与主分支(master)进行合并。

    展开全文
  • 嵌入式系统的开发概述 1.嵌入式系统的定义 (1)以硬件为中心,以计算机技术为基础,软硬件可裁剪,应用系统对功能、可靠性、成本、体积、功耗和应用环境有特殊要求的专用计算机系统。是将应用程序、操作系统和...

    嵌入式系统的开发概述

    1.嵌入式系统的定义

    (1)以硬件为中心,以计算机技术为基础,软硬件可裁剪,应用系统对功能、可靠性、成本、体积、功耗和应用环境有特殊要求的专用计算机系统。是将应用程序、操作系统和计算机硬件集成在一起的系统(技术角度)
    (2)嵌入式系统是设计完成复杂功能的硬件和软件,并使其紧密耦合在一起的计算机系统(系统角度)
    嵌入式系统是以嵌入式应用为目的的计算机系统。

    2.嵌入式应用的特点

    (1)功耗限制
    (2)低成本
    (3)多速率
    (4)环境相关性
    (5)系统内核小
    (6)专用性强
    (7)不可垄断性
    (8)产品相对稳定性
    (9)实时性

    3.嵌入式系统组成

    嵌入式系统由软件子系统和硬件子系统两部分组成,软件子系统包括应用程序和操作系统,硬件子系统包含输入接口输出接口存储器以及处理器。

    4.嵌入式操作系统

    (1)操作系统分类
    微内核(micro-kernel)
    单晶内核(monolithic kernel)
    混合内核(hybrid kernel)
    (2)实时操作系统的特点
    异步的事件响应
    切换时间和中断延迟时间确定
    优先级中断和调度
    抢占式调度
    内存锁定
    连续文件
    同步
    (3)代码的临界区
    代码的临界区也称为临界区,指处理时不可分割的代码,运行这些代码不允许被打断。
    (4)资源
    程序运行时可使用的软硬件环境称为资源。
    (5)任务
    一个任务,也称作一个线程,是一个简单的程序,该程序可以认为CPU完全属于程序自己,线程从属于进程。
    (6)内核
    内核提供的基本服务是任务切换。内核提供必不可少的系统服务、如信号量、消息队列、延时等,内核又分为非占先式内核和占先式内核。
    (7)任务优先级
    任务的优先级是表示任务被调度的优先程度。
    (8)中断
    中断是一种硬件机制,用于通知CPU有个异步事件发生了。

    展开全文
  • 与个人计算机这样通用计算机系统不同,嵌入式系统通常执行是带有特定要求预先定义任务。由于嵌入式系统只针对一项特殊任务,设计人员能够对它进行优化,减小尺寸降低成本。嵌入式系统通常进行大...

    一、嵌入式介绍

    1.什么是嵌入式系统

      嵌入式系统(Embedded system),是一种“完全嵌入受控器件内部,为特定应用而设计的专用计算机系统”,它为控制、监视或辅助设备、机器或用于工厂运作的设备。与个人计算机这样的通用计算机系统不同,嵌入式系统通常执行的是带有特定要求的预先定义的任务。由于嵌入式系统只针对一项特殊的任务,设计人员能够对它进行优化,减小尺寸降低成本。嵌入式系统通常进行大量生产,所以单个的成本节约,能够随着产量进行成百上千的放大。

      嵌入式系统是用来控制或者监视机器、装置、工厂等大规模设备的系统。国内普遍认同的嵌入式系统定义为:以应用为中心,以计算机技术为基础,软硬件可裁剪,适应应用系统对功能、可靠性、成本、体积、功耗等严格要求的专用计算机系统。通常,嵌入式系统是一个控制程序存储在ROM中的嵌入式处理器控制板。事实上,所有带有数字接口的设备,如手表、微波炉、录像机、汽车等,都使用嵌入式系统,有些嵌入式系统还包含操作系统,但大多数嵌入式系统都是由单个程序实现整个控制逻辑。

      嵌入式系统的核心是由一个或几个预先编程好以用来执行少数几项任务的微处理器或者单片机组成。与通用计算机能够运行用户选择的软件不同,嵌入式系统上的软件通常是暂时不变的;所以经常称为“固件”。

    2.嵌入式系统的构成
    • 嵌入式系统的组成
    • 嵌入式系统的分层

       

    3.嵌入式系统的演进方向
    • 以单片机为核心、可编程控制器存在形式
      1、没有操作系统支持
      2、软件以汇编为主
      3、功能单一、处理效率低、存储容器小,没有外部接口
      4、使用简单、价格低
    • 以嵌入式CPU为基础、简单操作系统为核心
      1、CPU种类多,通用性弱
      2、系统开销小,效率高
      3、达到一定的兼容性,拓展性
      4、用户体验度不高,交互界面不够友好
    • 以嵌入式操作系统为标志
      1、兼容性好,适用于不同平台
      2、系统开销小,效率高,具有高度模块化及拓展性
      3、图形化界面、用户界面友好
      4、丰富的外部接口
    • 以物联网为标志
      1、将传感器技术、互联网技术及传统嵌入式技术综合联系
      2、小型化、智能化、网络化、可视化
      3、低功耗、绿色环保
      4、多核技术、云计算、虚拟化技术
    4.嵌入式的开发模式
    • 两种开发模式
      非嵌入式的开发:A类机编写源代码,编译得到可执行程序,发布给A类机运行。
      嵌入式开发:A类机编写源代码,编译得到可执行程序,发布给B类机运行,这种编译模式也叫作交叉编译。
    • 为什么使用交叉
      1、嵌入式开的CPU比较简单,本身无法搭建开发环境,有些甚至操作系统都没有。
      2、交叉编译器可以用高性能机器为低性能机器开发软件。
    • 交叉编译的特点
      1、必须使用专用的交叉编译工具。
      2、由于可执行程序不能在本地运行调试,因此必须使用特殊的方法将可执行程序加载到目标嵌入式设备上运行及调试。
    5.为什么需要SD卡等辅助设备
    • 嵌入式开发特点
      1、交叉编译,不便于本机运行调试程序。
      2、嵌入式系统需要bootloader来启动,而bootloader必须首先存在于可启动介质中,这个过程需要专用工具。
      3、嵌入式系统无法通过纯软件实现单步调试,因此必须借助专用的调试器。
    • SD卡的作用
      作为启动介质,工作方式是:事先用读卡器将SD卡连到PC机上,通过定卡软件将交叉编译得到的可执行程序镜像烧录到SD卡,然后将SD卡插入嵌入式目标机卡槽,设置正确的启动方式启动,则系统可以从SD卡中烧录的镜像处启动。
    • USB转串口线的作用
      串口本身用来做嵌入式目标机的调试输出主要目的是用来监视及调试软件。
      因为现在大部分个人电脑都未配置DB9串口,因此工作中一般直接使用USB转串口线来连接PC和开发板。

    二、ARM处理器介绍

    1.ARM的发展历史
    • ARM的前身是艾康电脑(Acorn),于1978年,在英国剑桥创建
    • 在1980年代晚期,苹果电脑开始与艾康电脑合作开发新版的ARM核心
    • 1985年开发出全球第一款商用RISC处理器
    • 1990年艾康电脑财务危机,受苹果VLSI的投资,分割出独立子公司,Advanced RISC Machine(ARM),ARM公司正式成立
    • 1991年,ARM推出第一款嵌入式RISC处理器,即ARM6
    • 1993年,发布ARM7
    • 1997年,发布ARM9TDMI
    • 1999年,发布ARM9E
    • 2001年,发布ARMv6架构
    • 2002年,发布ARM11微架构
    • 2004年,发布ARMv7架构的Cortex系列处理器,同时推出Cortex-M3
    • 2005年,发布Cortex-A8处理器
    • 2007年,发布Cortex-M1和Cortex-A9
    • 2009年,实现Cortex-A9、发布Cortex-M0
    • 2010年,推出Cortex-M4、成立Linaro,推出Cortex-A15 MPcore高性能处理器
    • 2011年,推出Cortex-A7,ARMv8发布
    • 2012年,开始64位处理器进程
    2.ARM的商业模式和生态系统
    • ARM之前的半导体行业
      Intel、AMD、Motorola、VIA等,自己设计IC、自己设计芯片、自己销售。
    • ARM的商业模式
      ARM只负责设计IC,并且出卖自己的设计IP。
      ARM自己不生产芯片,而是把设计IP授权给其它半导体厂商来生产芯片,收取低廉的授权费用。
      严格来说,ARM并不是一家半导体厂商。
    • ARM的启示 

      1、不要抱怨劣势,劣势反而可能是机会
      2、想成功,要先学会帮助别人,成全别人,只想着自己的人是没有机会的
      3、社会越来越成熟,成熟社会的特征就是不工不断细化
      4、成功有时候是不经意的
      5、ARM发展的很快,也很慢
      6、从设计到产品,需要很长时间努力 

     

    3.ARM的版本号
    • ARM的型号命名问题
      1、ARM7和ARMv7不是一回事
      2、Cortex-A9比Cortex-A7更先推出
      3、型号很乱,没有规律

    • ARM的几种版本号
      1、ARM内核版本号
      2、ARM SoC版本号
      3、芯片型号

    • ARM型号的发展历程,以三星为例

      1、ARM内核版本号和Soc版本号是由ARM确定的,而芯片型号是由半导体公司确定的
      2、Cortex系列ARM产品线分割成了3个系列,这个是市场细分的需要和选择
      3、ARM已经发布了一些64位架构如A53等,主要面向高性能服务器类的应用
      4、ARM下一步重点发展方向是Cortex-M7,特点是低功耗,主要面向物联网终端

    • CPU与SoC的区别

      1、SoC = System on Chip
      2、芯片的发展方向:从CPU到SoC
      3、现在已经没有纯粹的CPU了,都是SoC
      4、ARM卖的是内核,其实就是CPU+总线,各种外设是半导体厂商自己添加的
      5、SoC中外设大部分都融合进去了
      6、网卡、音频等个别还经常设计在外面
      7、芯片的发展趋势是更高的集成度,近年甚至将音视频编解码、DDR、网卡都集成到SoC内,做成所单芯片解决方案
      8、裸机学习其实就是学习SoC的内核和各种外设

    4.CPU的设计原理、数据总线、地址总线
    • CPU总线示意图

       

    • 地址总线和数据总线
      1、CPU通过地址总线寻址,然后通过数据总线与外部设备互换信息
      2、地址总线的倍数决定CPU寻址范围,数据总线的位数决定CPU单次通信能交换的信息数量
      3、总线的速度决定CPU和外设互换信息的速度
      4、CPU的地址总线位数和数据总线可以不同(典型代表就是51单片机),但一般都相同
      5、CPU的位数指的是数据的位数,32位CPU寻址的范围是4G,所以最多支持4G内存
      6、数据总线是32位的,所以内存是32位的好,所以编程最好用int……
    5.主流学习型主芯片
    • 以三星为例,按发行时间排列
      1、S3C44B0
      2、S3C2440 S3C2410
      3、S3C6410
      4、S5PV210 S5PC210
      5、Exynos4412 S5P4418

    • 其它半导体厂商
      1、飞思卡尔
      2、高通骁龙
      3、华为海思

     

    四、Windows开发环境构建

    1.安装USB转串口驱动

    1、打开驱动程序,单击”下一步“

    2、等待安装,单击”完成“并重启

    3、打开设备管理器,查看串口信息

    4、右击选择”属性“,查看串口设置

    2.安装串口通信工具

    常用的串口通信工具有:SecureCRT、PuTTY、超级终端等,建议使用PuTTY,免安装
    1、打开PuTTY运行

    2、选择“串口”,填写端口、波特率

    3、单击“打开”,使用串口与开发板进行通信,启动开发板,按任意键停止加载Android系统。

    4.安装tftp文件传输工具

    1、打开控制面板->选择小图标->防火墙->打开或关闭防火墙->关闭防火墙

    2、运行tftp32.ext->点击"Settings"->打开”Browse“,设置根文件目录,默认是当前目录,点击确定

    3、在putty中使用print查看开发板的相关设置

     

    4、设置PC端的ip地址,与开发板中的参数设置要一致

    5、使用ping命令测试开发板与PC端是否连通,下图为正常连接状态

    6、下图为连接失败状态

    连接失败后的检查:

    • 1、使用print命令检查uboot中的环境变量设置是否正确
    • 2、检查PC端ip地址和子网掩码是否正确
    • 3、检查PC端防火墙是否关闭
    • 4、检查网线的连接或重新插拔网线
    • 5、禁用网络连接然后再启用
    • 6、更换网线

    7、使用tftp命令下载程序到指定地址,并使用go命令执行程序

    转载于:https://www.cnblogs.com/xiehuan-blog/p/9704040.html

    展开全文
  • 嵌入式系统开发概述

    2017-01-17 16:21:03
    2、嵌入式系统定义  以应用为中心、以计算机技术为基础,软硬件可裁剪,应用系统对功能、可靠性、成本、体积、功耗和应用环境有特殊要求专用计算机系统。是将应用程序、操作系统和计算机硬件集成在一起系统...

    1、计算机的硬件部分:运算器、控制器、存储器、输入设备、输出设备。


    2、嵌入式系统定义

         以应用为中心、以计算机技术为基础,软硬件可裁剪,应用系统对功能、可靠性、成本、体积、功耗和应用环境有特殊要求的专用计算机系统。是将应用程序、操作系统和计算机硬件集成在一起的系统(技术角度)。

    3、实时性
    实时性的本质是任务处理所花费时间的可预测性,即任务需要在规定的时限内完成。
    嵌入式系统≠实时系统
    有些嵌入式系统没有实时性要求。
    硬实时软实时
    “软”意味着如果没有满足指定的时间约束并不会导致灾难性的后果,而对于硬实时系统来说却是灾难性的 。

    4、知识产权
    知识产权(IP)电路或核是设计好并经过验证的集成电路功能单元。

    5、代码的临界区

          代码的临界区也称为临界区,指处理时不可分割的代码,运行这些代码不允许被打断。一旦这部分代码开始执行,则不允许任何中断打入(这不是绝对的,如果中断不调用任何包含临界区的代码,也不访问任何临界区使用的共享资源,这个中断可能可以执行)。为确保临界区代码的执行,在进入临界区之前要关中断,而临界区代码执行完成以后要立即开中断。


    6.资源

            程序运行时可使用的软、硬件环境统称为资源。资源可以是输入输出设备,例如打印机、键盘、显示器。资源也可以是一个变量、一个结构或一个数组等。


    7、共享资源

            可以被一个以上任务使用的资源叫做共享资源。为了防止数据被破坏,每个任务在与共享资源打交道时,必须独占该资源,这叫做互斥


    8、任务

    一个任务,也称作一个线程,是一个简单的程序,该程序可以认为CPU完全属于该程序自己


    9、任务切换

         当多任务内核决定运行另外的任务时,它保存正在运行任务的当前状态,即CPU寄存器中的全部内容。这些内容保存在任务的当前状态保存区,也就是任务自已的栈区之中。入栈工作完成以后,就把下一个将要运行的任务的当前状态从任务的栈中重新装入CPU的寄予存器,并开始下一个任务的运行。这个过程就称为任务切换。

    这个过程增加了应用程序的额外负荷。CPU的内部寄存器越多,额外负荷就越重。做任务切换所需要的时间取决于CPU有多少寄存器要入栈。


    10、内核

    多任务系统中,内核负责管理各个任务,或者说为每个任务分配CPU时间,并且负责任务之间的通信。内核提供的基本服务是任务切换


    11、占先式内核

            当系统响应时间很重要时,要使用占先式内核。最高优先级的任务一旦就绪,总能得到CPU的控制权。当一个运行着的任务使一个比它优先级高的任务进入了就绪状态,当前任务的CPU使用权就被剥夺了,或者说被挂起了,那个高优先级的任务立刻得到了CPU的控制权。如果是中断服务子程序使一个高优先级的任务进入就绪态,中断完成时,中断了的任务被挂起,优先级高的那个任务开始运行。


    12、非占先式内核

            非占先式内核要求每个任务自我放弃CPU 的所有权。非占先式调度法也称作合作型多任务,各个任务彼此合作共享一个CPU。异步事件还是由中断服务来处理。中断服务可以使一个高优先级的任务由挂起状态变为就绪状态。但中断服务以后控制权还是回到原来被中断了的那个任务,直到该任务主动放弃CPU的使用权时,那个高优先级的任务才能获得CPU的使用权。


    13、任务优先级

            任务的优先级是表示任务被调度的优先程度。每个任务都具有优先级。任务越重要,赋予的优先级应越高,越容易被调度而进入运行态。 


    14、计算机只能进行二进制加法运算。

    展开全文
  • 用户选用ARM处理器开发嵌入式系统时,选择合适的开发工具可以加快开发进度,节省开发成本。因此一套含有编辑软件、编译软件、汇编软件、链接软件、调试软件、工程管理及函数库的集成开发环境(IDE)一般来说是...
  • 文章目录系统移植概述环境搭建嵌入式基本概念嵌入式系统的应用领域什么是嵌入式系统用嵌入式系统硬件组成部分通用嵌入式系统软件组成部分Linux 在嵌入式中应用的条件与前景嵌入式Linux内核结构Android系统嵌入式...
  • 嵌入式系统的特点(由三要素引出) 嵌入性:嵌入到对象体系中,有对象环境要求 专用性:软、硬件按对象要求裁剪 计算机:实现对象的智能化功能 嵌入式系统重要特征 系统内核小; 专...
  • 嵌入式系统开发圣经

    千次下载 热门讨论 2006-06-09 16:47:16
    第1章 嵌入式系统的介绍 1-1 嵌入式系统概述 1-1-1 嵌入式系统的组成 1-1-2 典型的嵌入式系统 1-1-3 嵌入式系统的发展趋势 1-2 信息家电 1-2-1 信息家电的兴起 1-2-2 信息家电的产品 1-2-3 信息家电的研发...
  • Linux嵌入式系统开发

    2011-06-12 14:48:50
    一、嵌入式系统开发概述 二、宿主机系统开发环境的建立 三、目标机最小系统的建立和安装 四、嵌入式系统应用程序的开发
  • 由嵌入式本身的特性所影响,嵌入式系统开发与通用系统的开发有很大的区别,嵌入式的开发分为系统总体开发,嵌入式硬件开发,嵌入式系统软件开发3大部分 在系统总体开发中,由于嵌入式系统与硬件依赖非常紧密,往往...
  • 二、嵌入式开发概述

    2021-01-06 12:46:43
    目录嵌入式开发概述嵌入式开发特点嵌入式系统开发流程UML 通用建模语言工具UML支持的图类别 嵌入式开发特点 使用开发板开发,提供相关的底层工具 极少有直接拿一个ARM CPU来做开发,尽量让工程师的开发面向功能。 ...
  • 嵌入式系统概述

    2013-03-09 21:29:37
    什么是嵌入式系统?...使用多种类型的处理器和处理器系统结构关注成本大多有功耗约束经常在极端的环境下运行系统资源比PC少的多需要专用工具和方法进行开发设计嵌入式系统的数量远远超过PC 应用领域
  • ubuntu文件 /bin:存放常用命令 /boot:存放启动命令 /dev:存放设备文件 /etc:存放启动、关闭、配置程序与文件 /home:用户工作根目录 .../sbin:系统管理员 ...Linux文件系统中只能有一个根目录,它没...
  • 为初学者精心录制整套视频教程,全部免费随IT技术发展而不断增添视频教程仍然免费一支有经验工程师团队会始终成为你...然后根据手册和视频安装开发环境,并编译和烧写系统。接着开始Linux应用和驱动编写...
  • 概述嵌入式应用程序通常都是在样机环境下调试与开发的,这种环境与最终产品之间并不完全相同。因此,在系统调试阶段就考虑应用程序在最终目标硬件中运行情况是非常重要。本文旨在讨论如何将一个开发/调试环境下...
  • 用户选用ARM处理器开发嵌入式系统时,选择合适的开发工具可以加快开发进度,节省开发成本。因此一套含有编辑软件、编译软件、汇编软件、链接软件、调试软件、工程管理及函数库的集成开发环境(IDE)一般来说是必不可...
  • 本书系统论述了在Linux 环境开发嵌入式系统的设计思想、设计方法及开发流程,通过实例与设计项目,帮助读者尽快掌握嵌入式系统的基本概念,提高嵌入式设计技能。本书共12 章,内容包括嵌入式基础知识、Linux 概述...
  • 嵌入式 VxWorks 系统开发与应用

    热门讨论 2010-04-26 18:35:30
    然后,结合作者多年的嵌入式系统的开发应用经验,详细阐述了VxWorks系统中BSP和应用的开发技巧,并提供了多个应用实例及分析设计。 本书适用于嵌入式系统开发人员作为参考手册使用。 目录 第1章 概述 1.1 嵌入式...
  • 本章主要介绍嵌入式系统和嵌入式操作系统的概况,讲述嵌入式 Linux 的发展历史和开 发环境,概括说明嵌入式 Linux 系统开发的特点。读完本章内容,可以对嵌入式 Linux 系统 有整体的认识,了解嵌入式Linux开发的要点...
  • 嵌入式系统开发

    2006-09-28 19:15:00
    如果您刚接触嵌入式开发,那么大量可用引导装载程序(bootloader)、规模缩小分发版(distribution)、文件系统和 GUI 看起来可能太多了。但是这些丰富选项实际上是一种恩赐,允许您调整开发或用户环境以完全...
  • 嵌入式系统的发展趋势第二章:ARM Cortex-M3微处理器基础1.CM3微控制器简介2.CM3存储格式类型3.CM3处理器组件4.CM3指令系统5.CM3寄存器组织6.CM3存储映射与位带操作7.CM3异常与中断8.STM32F10系列的GPIO第三章:...
  • 嵌入式系统概论 1.1嵌入式系统概述 1.1.1 概念 国内公认定义:以应用为中心、以计算机技术为基础、软件硬件...需要在专门的开发环境和开发工具进行设计 1.1.3 发展 8位/16位单片机为核心的初级嵌入式系统。 以32位嵌
  • 随着嵌入式系统应用不断深入和产业化程度不断提升,新应用环境和产业化需求对嵌入式系统软件提出了更加严格要求。在新需求推动下,嵌入式操作系统内核不仅需要具有微型化、高实时性等基本特征,
  • 6.1 嵌入式系统的程序设计方法 107 6.2 部件工作原理与编程示例 108 6.2.1 通用I/O 口工作原理与编程示例 108 6.2.2 串行通讯工作原理与编程示例 111 6.2.3 中断控制器工作原理与编程示例 120 6.2.4 定时器工作原理...
  •  Windows CE是Microsoft为PDA Set-Top-Box等用户化嵌入式系统开发的32位多任务多线程操作系统平台它具有Windows GUI 可ROM化整合电源管理标准通讯协议以及Windows CE可与其它Windows 应用软件共享信息为开发者...
  • 《ARM嵌入式系统软件开发实例(一) 周立功 北京航天航空大学出版社》(PDF) 目录第1章 ZLG/FS原理与应用 1.1 概述 1.1.1 ZLG/FS简介 1.1.2 ZLG/FS特点 1.1.3 已实现特性 1.1.4 暂时未实现特性 1.2 使用...
  • 如果您刚接触嵌入式开发,那么大量可用引导装载程序(bootloader)、规模缩小分发版(distribution)、文件系统和 GUI 看起来可能太多了。但是这些丰富选项实际上是一种恩赐,允许您调整开发或用户环境以完全...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 539
精华内容 215
关键字:

概述嵌入式系统的开发环境