ARM Cortex-M3权威指南-编程实践(4)

编程语言

纯汇编

汇编是一门低级语言,不利于编写大型程序,在以下特殊场合可使用汇编:

  1. 无法用 C 写成的函数,如操作特殊功能寄存器,以及实施互斥访问。
  2. 存储器极度受限,只有使用汇编才可能把程序或数据挤进去。
  3. 执行频率非常高的子程,如操作系统的调度程序。
  4. 与处理器体系结构相关的子程,如上下文切换。
  5. 性能要求极高的应用,如防空炮的火控系统。

C语言编程

C是一种通用语言,但是它不能指定处理器的初始化(用于在main执行前准备好环境)。一般工具链自带一套实现,如KEIL、IAR或者GNU的工具链。尽管使用C加快了开发,但是还会有一些地方需要汇编代码。在C代码中插入汇编称为内联汇编;或者编写独立的汇编模块然后与C模块一起链接;嵌入式汇编,在C程序中汇编语言编写的函数。

汇编与C的过程调用标准(ARM Architecture Procedure Call Standard,AAPCS)

在很多情况下,都需要让 C 程序模块与汇编程序模块互相交互,它们包括:

  1. 在 C 代码中使用了嵌入式汇编(或者是在 GNU 工具下,使用了内联汇编)
  2. C 程序呼叫了汇编程序,这些汇编程序是在独立的汇编源文件中实现的
  3. 汇编程序调用了C程序

AAPCS标准规定 :当主调函数需要传递参数(实参)时,它们使用R0‐R3。其中R0传递第一个, R1传递第2个……在返回时,把返回值写到R0中。可见,汇编程序使用R0‐R3, R12时会很舒服。但是如果换个立场——汇编要呼叫C函数,则考虑问题的方式就有所不同:必须意识到子程序可以随心所欲地改写R0‐R3, R12,却决不会改变R4‐R11。因此,如果在调用后还需要使用R0‐R3,R12,则在调用之前,必须先PUSH,从C函数返回后再POP它们,对R4‐R11则不用操心。

软件开发流程

调试系统框架

调试特性概览

一直以来,单片机的调试不是很突出的主题,很多简单些的程序在开发中,甚至都没有调试的概念,而只是把生成的映像直接少如片子,再根据错误症状来判断问题,然后修改程序重新烧,周而复始,直到问题解决或者放弃为止。这里面有多个地方会影响开发效率,一个版本的编译时间,一个是版本的烧写时间。如果不想着优化和提高效率,这将是一个非常痛苦的开发过程。

调试功能分类

侵入式调试(基本的调试功能),强调会打破程序的全速运行

    1. 停机以及单步执行程序
    2. 硬件断点
    3. 断点指令(BKPT)
    4. 数据观察点,作用于单一地址、一个范围的地址,以及数据的值。
    5. 访问寄存器的值
    6. 调试监视器的异常
    7. 基于ROM的调试(闪存地址重载(flash patching))

非侵入式调试

    1. 在内核运行的时候访问存储器
    2. 指令跟踪,需要通过可选的嵌入式跟踪宏单元(ETM)
    3. 数据跟踪
    4. 软件跟踪
    5. 性能速写(通过数据观察点以及跟踪模块)

coresight技术概览

coresight调试架构包括很多内容,调试接口协议、调试总线协议、对调试组件的控制、安全特性、跟踪接口等。了解调试系统的组成结构和基本原理有利于我们加速程序的开发。

调试逻辑

对处理器上总线逻辑的控制使用另外的总线接口,即所谓的调试访问端口(DAP)。把JTAG或串行线协议都转换成DAP总线接口协议,再控制DAP来执行调试动作。调试接口(DP),充当处理器与调试器的中介,一端连接到调试器上,另一端则连接到CM3的DAP接口上。

从外部调试器到 CM3 调试接口的连接,需要多级互联才能完成。DAP总线上的地址是32位的,其中高8位用于选择访问哪一个设备,由此可知DAP总线最多可挂接256个设备。在CM3处理器内部只用了一个设备的地址,剩余255个可用连接其他AP到DAP总线上。在把数据从 DAP 接口传递给 CM3 处理器后,下一步就连接到了一个称为“AHB‐AP”的AP 设备上,它相当于一个总线桥,用于把 DAP 总线的命令转换为 AHB 总线上的数据传送,再插入到 CM3 内部的总线网络中。

跟踪接口逻辑

CoreSight 架构的另一个部分用于跟踪。在 CM3 中有 3 种跟踪源:

  1. 指令跟踪:由 ETM(嵌入式跟踪宏单元)产生
  2. 数据跟踪:由 DWT 产生
  3. 调试消息:由 ITM 产生,提供形如 printf 的消息输入,送到调试器的 GUI 中

在跟踪踪过程中,由跟踪源产生的数据被裹成数据包,然后被送到“高级跟踪总线(ATB)”上进行传送。在 CoreSight 的架构中,如果某 SoC 含有多个跟踪源(例如,多核系统),则需要一种硬件水平的 ATB 归并器(merger),把各 ATB 数据流归并成一条(在 CoreSight 架构中,这种硬件被名为 ATB funnel)。归并后的数据流都送往 TPIU(跟踪端口接口单元), TPIU 再把数据导出到片外的跟踪硬件设备。在数据送到了调试主机(PC)后,再由 PC 端的调试软件还原为先前的多条数据流。
CM3 内建了一个归并硬件,因此不需要再添加 ATBfunel 模块了。跟踪输出接口可以直接连接到专为 CM3 设计的 TPIU 上,然后就可以供 PC 控制的外部硬件捕捉仪来跟踪数据。

coresight调试的优势

基于 CoreSight 的调试设计有很多优势:

  1. 即使在处理器运行时,也可以查看存储器和外设的寄存器的内容
  2. 使用单一调试器,就可以控制多核系统的调试接口。例如,如果使用 JTAG,则只需要一个 TAP 控制器,不管芯片中有几个处理机都一样。
  3. 内部的调试接口是基于单总线的方式设计的,因此非常有弹性,也使得为芯片的其它部分设计附加的测试逻辑变得容易。
  4. 它使得多条跟踪数据流可以由单一的跟踪捕获设备来收集,再在 PC 上还原出先前的各条数据流。

CM3 中的调试系统是基于 CoreSight 的,但是又有一些差异:标准coresight为apb调试总线单独开了地址空间。

 

调试模式

停机模式

  1. 指令执行被停止
  2. systick定时器停止
  3. 支持单步操作
  4. 中断可以在这期间悬起,并且可以在单步执行时响应,也可以屏蔽它们,使得单步时不受干扰

调试监视器模式(有些电子系统运行过程不能停止,比如汽车引擎控制器以及电机控制器)

  1. 处理器执行监视器异常的服务例程(异常号: 12)
  2. SysTick 定时器继续运行
  3. 新来的中断按普通执行时的原则来抢占
  4. 执行单步操作
  5. 存储器的内容(如堆栈内存)会在调试监视器的响应前后更新,因为有自动入栈和出栈的操作

跟踪组件-嵌入式跟踪宏单元ETM

ETM是个选配件。用于提供指令跟踪功能(即执行执行的历史记录),当它使能时,它会产生指令跟踪数据包。ETM中有一个FIFO缓冲区,为跟踪数据流的捕捉提供足够的时间,可用于定位复位问题的程序上下文。ETM需要一个触发信号,才开始启动指令跟踪。

跟踪组件-跟踪端口接口单元TPIU

ITM, DWT 和 ETM 的跟踪数据都在 TPIU 处汇聚。 TPIU 用于把这些跟踪数据格式化并输出到片外,以供跟踪端口分析仪之类的设备接收使用。 

GNU工具链

 GNU工具链在ARM产品开发中使用很广泛。提供一系列的二进制构建版本,简单的使用,可用EABI(嵌入式应用程序二进制接口)。GNU工具链包含了编译器、汇编器和链接器,从而使源代码可用C或者汇编写成。

 

posted @ 2021-08-27 11:40  zephyr~  阅读(902)  评论(0编辑  收藏  举报