嵌入式体系编程入门
微操控器是怎么发动的
为了保存编译号的二进制程序代码,大多数的现代微操控器都会包含片上flash存储器。有些微操控器还或许有一个独立的发动ROM,里边装有Bootloader程序。微操控器发动后,再履行flash的用户程序前,Bootloader会首要运转。
在复位流程中,处理器会取出MSP的初始化值和复位向量,然后开端履行复位处理,这些信息都放在一个叫做发动代码的程序文件中。发动代码中的复位处理或许还会游览初始化的责任,比方时钟操控电路和锁相环PLL的初始化。有些情况下,体系初始化的作业是放在C程序的main()函数中进行的。
关于用C开发的运用程序,在进入主流程之前,发动代码现已开端履行,并且对运用程序用到的变量和内存等进行初始化。发动代码无需编程者忧虑,C开发工具会将其主动刺进程序映像中。
履行完C发动代码后,运用程序就开端履行了,运用程序一般包含下面几个部分:
硬件初始化(如时钟,PLL和外设)
运用程序的处理部分
中止服务程序
别的,运用程序或许会用到C言语库,此刻,C编译器/链接器会将所需求的库函数参加编译好的程序映像中。
硬件初始化或许会涉及到一系列的外设、体系操控寄存器和中止操控器。假如在复位处理时没有进行处理,体系时钟操控和PLL此刻也需求进行初始化。外设初始化完成后,程序就能够持续履行运用程序部分了。
嵌入式程序设计
运用程序处理流程的完成方法如下:
轮询,如图4-4
中止驱动,如图4-5
轮询和中止组合运用,如图4-6
处理并发使命(操作体系),如图4-7
关于杂乱的运用程序,能够运用实时操作体系(RTOS)。RTOS将处理器时刻划分为多个时刻片,在有多个运用进程运转时,只要一个进程会取得时刻片。运用RTOS,需求有定时器发生周期性的中止请求,当一个时刻片的时刻届时,RTOS的使命调度器会由定时器中止触发,调度器判别是否需求履行上下文切换。假如需求进行上下文切换,调度器会暂停当时履行的使命,并切换到下一个准备就绪的使命。
输入和输出
在许多嵌入式体系中,输入或输出或许会限制与简略的电子接口,如uart、IO、LCD、SD卡等,这些接口由微操控器的外设操控。
Cortex-M0的寄存器映射到了体系空间,并且它们还操控这外设,外设的典型初始化过程如下:
装备时钟操控回路,使能外设的时钟信号,假如有必要的话,初始化相应的引脚。在许多低功耗操控器中,时钟信号被分为了多路,并且为了下降功耗,它们能够独自开关。大多数时钟信号默许都是封闭的,装备外设前需求使能相应的时钟。有些情况下,还或许需求使能外设总线体系的时钟。
装备IO口。大多数操控器的引脚都是复用的,需求对IO引脚进行相应的功用装备。
装备外设。大多数外设有自己的操控寄存器,为了保证外设作业正常,需求对寄存器进行装备。
装备中止。假如外设操作需求中止处理,需求装备中止操控器(NV%&&&&&%)。
开发流程
在嵌入式开发中,能够运用C、汇编、C和汇编混合编程。程序代码的生成流程如下图所示。
C/汇编经过对应的编译器生成相应的方针文件,链接器脚本加载涣散的方针文件生成可履行映像。
混合编程的完成是因为C编译器供给了内联汇编器,以便在C程序文件中内联汇编代码。
C和汇编的挑选
程序映像详解
Cortex-M0的程序映像一般包含以下几部分:
向量表
C发动代码
程序代码(运用程序代码和数据)
C库代码(C库函数的程序代码,链接时刺进)