转载请注明来源:cuixiaolei的技术博客


嵌入式系统编程入门

微控制器是如何启动的

  为了保存编译号的二进制程序代码,大多数的现代微控制器都会包含片上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的寄存器映射到了系统空间,并且它们还控制这外设,外设的典型初始化步骤如下:

  1. 配置时钟控制回路,使能外设的时钟信号,如果有必要的话,初始化相应的引脚。在许多低功耗控制器中,时钟信号被分为了多路,而且为了降低功耗,它们可以单独开关。大多数时钟信号默认都是关闭的,配置外设前需要使能相应的时钟。有些情况下,还可能需要使能外设总线系统的时钟。
  2. 配置IO口。大多数控制器的引脚都是复用的,需要对IO引脚进行相应的功能配置。
  3. 配置外设。大多数外设有自己的控制寄存器,为了确保外设工作正常,需要对寄存器进行配置。
  4. 配置中断。如果外设操作需要中断处理,需要配置中断控制器(NVIC)。

开发流程

  在嵌入式开发中,可以使用C、汇编、C和汇编混合编程。程序代码的生成流程如下图所示。

  C/汇编通过对应的编译器生成相应的目标文件,链接器脚本加载分散的目标文件生成可执行映像。

  混合编程的实现是因为C编译器提供了内联汇编器,以便在C程序文件中内联汇编代码。


C和汇编的选择


程序映像详解

  Cortex-M0的程序映像一般包括以下几部分:

  • 向量表
  • C启动代码
  • 程序代码(应用程序代码和数据)
  • C库代码(C库函数的程序代码,链接时插入)

向量表

《Cortex-M0权威指南》之Cortex-M0编程入门的更多相关文章

  1. netty权威指南学习笔记二——netty入门应用

    经过了前面的NIO基础知识准备,我们已经对NIO有了较大了解,现在就进入netty的实际应用中来看看吧.重点体会整个过程. 按照权威指南写程序的过程中,发现一些问题:当我们在定义handler继承Ch ...

  2. 『CUDA C编程权威指南』第二章编程题选做

    第一题 设置线程块中线程数为1024效果优于设置为1023,且提升明显,不过原因未知,以后章节看看能不能回答. 第二题 参考文件sumArraysOnGPUtimer.cu,设置block=256,新 ...

  3. JavaScript权威指南--多媒体和图形编程

    知识要点 21.1节介绍如何用传统的JavaScript技术实现诸如图片翻转(鼠标指针移动到一张静态图片上切换成另外一张图片)这样的视觉效果. 21.2节介绍HTML5的<audio>和& ...

  4. netty权威指南学习笔记一——NIO入门(4)AIO

    NIO2.0引入了新的异步通道的概念,并提供了异步文件通道和异步套接字通道的实现.异步通道提供以下两种方式获取操作结果. 1.通过java.util.concurrent.Future 类来表示异步操 ...

  5. netty权威指南学习笔记一——NIO入门(3)NIO

    经过前面的铺垫,在这一节我们进入NIO编程,NIO弥补了原来同步阻塞IO的不足,他提供了高速的.面向块的I/O,NIO中加入的Buffer缓冲区,体现了与原I/O的一个重要区别.在面向流的I/O中,可 ...

  6. netty权威指南学习笔记一——NIO入门(2)伪异步IO

    在上一节我们介绍了四种IO相关编程的各个特点,并通过代码进行复习了传统的网络编程代码,伪异步主要是引用了线程池,对BIO中服务端进行了相应的改造优化,线程池的引入,使得我们在应对大量客户端请求的时候不 ...

  7. netty权威指南学习笔记一——NIO入门(1)BIO

    公司的一些项目采用了netty框架,为了加速适应公司开发,本博主认真学习netty框架,前一段时间主要看了看书,发现编程这东西,不上手还是觉得差点什么,于是为了加深理解,深入学习,本博主还是决定多动手 ...

  8. Kubernetes权威指南 第一章:Kubernetes入门

    Kubernetes是什么 官网 https://kubernetes.io/ 中文版:https://kubernetes.io/zh/ Kubernetes是谷歌十几年大规模容器管理经验的成果 是 ...

  9. 读《Android编程权威指南》

    因为去年双十二购买了一折的<Android 编程权威指南(第一版)>,在第二版出来后图灵社区给我推送了第二版的优惠码,激动之余就立马下单购买电子书,不得不说Big Nerd Ranch G ...

随机推荐

  1. CodeForces 710C Magic Odd Square (n阶奇幻方)

    题意:给它定一个n,让你输出一个n*n的矩阵,使得整个矩阵,每行,每列,对角线和都是奇数. 析:这个题可以用n阶奇幻方来解决,当然也可以不用,如果不懂,请看:http://www.cnblogs.co ...

  2. C#与C++对应的类型

    //c++:HANDLE(void   *)       ----   c#:System.IntPtr         //c++:Byte(unsigned   char)   ----    c ...

  3. LDA(Latent Dirichlet Allocation)

    转自:http://leyew.blog.51cto.com/5043877/860255#559183-tsina-1-46862-ed0973a0c870156ed15f06a6573c8bf0 ...

  4. ADO与ADO.NET的区别

    ADO是使用ole db接口并基于微软的COM技术,ADO.NET使用自己的ADO.NET接口并基于微软的.NET体系架构,所以ADO.NET与ADO是两种数据访问方式. ADO以recordset存 ...

  5. 【OpenGL】glFinish()和glFlush()函数详解-[转]

    通常情况下,OpenGL指令不是立即执行的.它们首先被送到指令缓冲区,然后才被送到硬件执行.glFinish和glFlush都是强制将命令缓冲区的内容提交给硬件执行. 一.glFinish()函数   ...

  6. OpenGL光照测试

    OpenGL光照测试 花了大概半个月,研究了OpenGL的光照.请注意是固定管线渲染的光照,如果使用着色器的高手们请飘过.这个程序是通过光照对模型的照射,来研究OpenGL光照的性质.以后可以通过这个 ...

  7. PPT美化大师

    PPT美化大师 http://docer.mysoeasy.com/ PPT文档美化大师是一款专门为Office文档优化锦上添花的工具,该软件时尚个性打造出最漂亮的模板,有了这款软件在操作起来也简单许 ...

  8. Adobe Photoshop CC 14.0简体中文特别版32位和64位下载

    国内私募机构九鼎控股打造APP,来就送 20元现金领取地址:http://jdb.jiudingcapital.com/phone.html内部邀请码:C8E245J (不写邀请码,没有现金送)国内私 ...

  9. Chrome的JS调试工具

    你是怎么调试 JavaScript 程序的?最原始的方法是用 alert() 在页面上打印内容,稍微改进一点的方法是用 console.log() 在 JavaScript 控制台上输出内容.嗯~,用 ...

  10. hadoop备战:hadoop,hbase兼容版本号汇总

    Hbase的安装须要考虑Hadoop的版本号,即兼容性.有不足的希望能指出. 下面考究官网得到的,关于hadoop版本号和hbase版本号可到下面网址中下载:http://mirror.bit.edu ...