2019年3月7日木曜日

GPIO出力の速度比較 mbed OS5 vs HAL API vs LL API

しつこくGPIO出力の速度を比較します。STM32CubeのHAL APIより低レベルのLL APIも測定しました。

LL APIについてはYKb::Logさんの「STM32でLL APIを使ってみる」を参考にしました。
  • mbed-cli Version: 1.9.1
  • STM32CubeMX Version: 5.1.0
  • System Workbench for STM32 - C/C++ Embedded Development Tools for MCU Version: 2.7.2.201812190825
HALとLLはコンパイラオプションで-O2を指定しました。

mbed OS5

#include "mbed.h"

DigitalOut CheckPin1(D2);

int main() {
 while (true) {
  CheckPin1 = 1;
  CheckPin1 = 0;
 }
}

HAL API(一部)

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
 HAL_GPIO_WritePin(CHK1_GPIO_Port, CHK1_Pin, GPIO_PIN_SET);
 HAL_GPIO_WritePin(CHK1_GPIO_Port, CHK1_Pin, GPIO_PIN_RESET);
  }
  /* USER CODE END 3 */

LL API(一部)

  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
 LL_GPIO_SetOutputPin(CHK1_GPIO_Port, CHK1_Pin);
 LL_GPIO_ResetOutputPin(CHK1_GPIO_Port, CHK1_Pin);
  }
  /* USER CODE END 3 */

STM32CubeMXで、GPIOの「Maximum ouput speed」を「Very High」に設定。


ソースコードの「static void MX_GPIO_Init(void)」に反映されます。

  /*Configure GPIO pin : CHK1_Pin */
  GPIO_InitStruct.Pin = CHK1_Pin;
  GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
  GPIO_InitStruct.Pull = GPIO_NOPULL;
  GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_VERY_HIGH;  // <- Here
  HAL_GPIO_Init(CHK1_GPIO_Port, &GPIO_InitStruct);

LL APIはプロジェクト全体をLL APIにしなきゃいけないかと思っていましたが、HALと混在できるようです。LL APIを使用するには、STM32CubeMXの「Project Manager」-「Advanced Setting」でDriverごとに個別に設定できます。


mbed OS5

HAL API

LL API

- 処理時間(us) clock数
mbed OS5 61.09 11.0
HAL API 126.6 22.8
LL API 59.67 10.7

※クロック数はMPUの駆動クロックの180MHzをオシロの表示値で割って求めました。

LL APIを使ってやっとmbed OS5と同じ程度の処理時間になりました。LL APIの波形を見るとHよりLの時間が長くなっています。これはwhile()ループの処理がオーバーヘッドとなっているためだと思いますが、mbedの場合はそのような兆候は見られません。

いやはや、mbedの処理速度はあっぱれだと思います。

0 件のコメント:

コメントを投稿