编写多端口ITM功能以改善调试

在“使用ITM提高调试效率”中,我讨论了如何使用Arm®Cortex-M处理器上的ITM快速,有效地将调试信息打印到coresight终端。我们看到,ITM非常快,比UART快得多,它最大程度地减少了与打印来自系统的日志和调试信息相关的开销。 CMSIS中包含几个ITM功能,但是不幸的是,它们被编写为仅使用ITM上可用的32个激励端口之一。在本文中,我们将研究如何创建通用的多端口ITM功能。

在编写我们自己的ITM功能之前,重新检查CMSIS中包含的功能很有用。 ITM_SendChar函数采用单个参数(要在终端上打印的字符),然后在已启用ITM的情况下将其打印到激励端口0。功能代码如下所示:

__STATIC_INLINE uint32_t ITM_SendChar (uint32_t ch)
{
  if (((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL) &&      /* ITM enabled */
      ((ITM->TER & 1UL               ) != 0UL)   )     /* ITM Port #0 enabled */
  {
    while (ITM->PORT[0].u32 == 0UL) { __NOP(); }
    ITM->PORT[0].u8 = (uint8_t)ch;
  }
  return (ch);
}

复制ITM_SendChar是创建多端口功能的一个很好的起点,但是为了创建有用的功能,我们需要进行一些更改。这些更改包括:

  • 将名称更改为ITM_SendData
  • 将ITM端口作为参数添加到函数中
  • 将数据大小(以字节为单位)添加为参数
  • 添加断言以检查参数输入是否在有效范围内
  • 传输数据时调用正确的数据大小成员

这些更改非常简单,可以在下面的更新功能中看到:

__STATIC_INLINE uint32_t ITM_SendData (uint8_t Channel, uint32_t Data, uint8_t DataSizeInBytes)
{
  assert(Channel < 32);
  assert(DataSizeInBytes <= 4);                       /* 1, 2, 4 are valid */
  assert((ITM->TCR & ITM_TCR_ITMENA_Msk) != 0UL);  /* ITM enabled */
  assert((ITM->TER & (1UL << Channel)  ) != 0UL);  /* ITM Port enabled? */

  /* Wait for the buffer to clear */
  while (ITM->PORT[Channel].u32 == 0UL)
  {
      __NOP();
  }

  if(DataSizeInBytes == 1)
  {
      ITM->PORT[Channel].u8 = (uint8_t)Data;
  }
  else if(DataSizeInBytes == 2)
  {
     ITM->PORT[Channel].u16 = (uint16_t)Data;
  }
  else
  {
     ITM->PORT[Channel].u32 = (uint32_t)Data;
  }

  return (Data);
}

您会注意到,我将启用ITM的检查从C可执行代码转换为断言检查。我这样做是因为,如果我们正在使用ITM,则毫无疑问,我们将其用于开发目的,而我个人更愿意将这些检查作为使用该功能的前提条件。换句话说,如果ITM被禁用并且有人调用了此功能,则是一个错误,应通知开发人员。

注意的第二项是函数之前的__STATIC_INLINE。每次代码调用此函数时,编译器都会用该函数中的所有代码替换该函数调用。我之所以提到它,是因为这是为了进一步减少与ITM调用相关的开销。删除它会增加函数调用的开销,但也会减小代码大小。进一步的优化是删除断言,并确保清楚函数的限制是什么。

有了这个简单的功能,现在可以轻松快捷地在不同的激励端口之间传输不同的调试信息。端口0可以用于标准消息,端口1可以用于状态机的状态,端口2可以用于传感器消息,依此类推。请享用!

2 thoughts 上 “编写多端口ITM功能以改善调试”

    1. 所有32个Stimulus端口都通过SWO从ITM发送回去。您’我会注意到大多数IDE’使用s可以选择要启用的端口,然后’能够使用ITM终端查看返回数据。不管您使用的是ULink,JLink还是STLink。

发表评论

您的电子邮件地址不会被公开。 必需的地方已做标记 *

该网站使用Akismet减少垃圾邮件。 了解如何处理您的评论数据.