《Cortex-M0权威指南》之Cortex-M0编程⼊门
转载请注明来源:
嵌⼊式系统编程⼊门
微控制器是如何启动的
  为了保存编译号的⼆进制程序代码,⼤多数的现代微控制器都会包含⽚上flash存储器。有些微控制器还可能有⼀个独⽴的启动ROM,⾥⾯装有Bootloader程序。微控制器启动后,再执⾏flash的⽤户程序前,Bootloader会⾸先运⾏。
  在复位流程中,处理器会取出MSP的初始化值和复位向量,然后开始执⾏复位处理,这些信息都放在⼀个叫做启动代码的程序⽂件中。启动代码中的复位处理可能还会旅⾏初始化的职责,⽐如时钟控制电路和锁相环PLL的初始化。有些情况下,系统初始化的⼯作是放在C程序的main()函数中进⾏的。android编程入门指南 pdf
  对于⽤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的寄存器映射到了系统空间,并且它们还控制这外设,外设的典型初始化步骤如下:
1. 配置时钟控制回路,使能外设的时钟信号,如果有必要的话,初始化相应的引脚。在许多低功耗控制器中,时钟信号被分为了多路,
⽽且为了降低功耗,它们可以单独开关。⼤多数时钟信号默认都是关闭的,配置外设前需要使能相应的时钟。有些情况下,还可能需要使能外设总线系统的时钟。
2. 配置IO⼝。⼤多数控制器的引脚都是复⽤的,需要对IO引脚进⾏相应的功能配置。
3. 配置外设。⼤多数外设有⾃⼰的控制寄存器,为了确保外设⼯作正常,需要对寄存器进⾏配置。
4. 配置中断。如果外设操作需要中断处理,需要配置中断控制器(NVIC)。
开发流程
  在嵌⼊式开发中,可以使⽤C、汇编、C和汇编混合编程。程序代码的⽣成流程如下图所⽰。
  C/汇编通过对应的编译器⽣成相应的⽬标⽂件,链接器脚本加载分散的⽬标⽂件⽣成可执⾏映像。
  混合编程的实现是因为C编译器提供了内联汇编器,以便在C程序⽂件中内联汇编代码。
C和汇编的选择
程序映像详解
  Cortex-M0的程序映像⼀般包括以下⼏部分:向量表
C启动代码
程序代码(应⽤程序代码和数据)
C库代码(C库函数的程序代码,链接时插⼊)
向量表

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。