このページでは

C

NXP 用MCUXpresso IDEプロジェクトの作成

このトピックでは、NXP のMCUXpresso IDEプロジェクトを作成し、アプリケーションとプラットフォームのソースコードを統合するための手順を順を追って説明します。

MCUXpresso IDE および ARM GCC ツールチェーンの両方を含む、MCUXpresso SDK バージョン 2.16.0 が必要です。Qt Online Installer が提供する SDK を使用するか、ご自身で SDK をダウンロードしてください。MCUXpresso IDE またはボード用 SDK の新しいバージョンでも動作する可能性はありますが、動作確認は行っていません。

SDKを自分でビルドする場合は、以下のコンポーネントをインストールしてください:

  • すべてのツールチェーン(これにより、ARM GCC および MCUXpresso ファイルの両方が確実に含まれます)
  • FreeRTOS
  • VG-Lite GPU ライブラリ

新しいプロジェクトを作成します

SDKを任意のディレクトリに解凍し、以下の手順に従ってください:

  1. MCUXpresso IDEを起動し、ダウンロードしたSDKをインストールしてください:
    • Window > Show View > Installed SDKs 」を選択し、SDKビューが表示されていることを確認してください。
    • Installed SDKs 」に移動します。
    • ビューを選択して長押しするか、右クリックして「Import folder... 」を選択します。SDKがアーカイブ形式の場合は、「Import archive... 」を選択することもできます。
    • フォルダまたはアーカイブを選択し、「Open 」を選択して、SDKをIDEにインポートします。
  2. File > New > Create a new C/C++ Project 」を使用して、i.MX RT1170 EVKB用の新しいプロジェクトを作成します。
    • evkbmimxrt1170 」ボードを選択し、「Next 」を選択します。
    • 次の画面で、「MIMXRT1176DVMAA 」デバイスパッケージを選択します。プロジェクトの設定は次の通りである必要があります。
      • コア:cm7 コアが「Standalone 」ロールに設定されています。
      • ボード:Default board files
      • プロジェクトタイプ:C++ Project
      • プロジェクトオプション:SDK Debug Console が「UART 」に設定されています。「Copy sources 」と「Import other files 」の両方が選択されています。

      以下のリストにあるコンポーネントも選択してください:

      • Operating Systems
        • RTOS > Core > FreeRTOS kernel
      • Drivers
        • Device > SDK Drivers
          • anatop_ai
          • clock
          • common
          • dcdc_soc
          • elcdif
          • gpio
          • i2c
          • iomuxc
          • lcdifv2
          • lpuart
          • memory
          • mipi_dsi
          • nic301
          • pmu
          • pxp
          • soc_mipi_csi2rx
          • xip_device
      • CMSIS Include
        • CMSIS > CORE > CMSIS_Include_CM
        • Device > CMSIS > MIMXRT1176_CMSIS
        • Device > CMSIS > MIMXRT1176_system
      • Utilities
        • Device > SDK Drivers > lpuart_adapter
        • Device > SDK Utilities
          • assert
          • debug_console
          • serial_manager
          • serial_manager_uart
      • Board Components
        • Board Support > SDK Drivers > xip_board
        • Device > SDK Drivers
          • display-hx8394
          • display-rm68191
          • display-rm68200
          • xmcd
      • Abstraction Layer
        • Device > SDK Drivers
          • dc-fb-common
          • dc-fb-elcdif
          • dc-fb-lcdifv2
          • display-common
      • Software Components
        • Device > SDK Drivers
          • display-mipi-dsi-cmd
          • lists
          • video-common
      • Project Template
        • Board Support > SDK Project Template > evkbmimxrt1170
      • Other
        • Device > Startup > MIMXRT1176_startup

      Next 」を選択して、次の画面に進んでください。

    • Advanced project settings 」で、以下の設定を変更してください:
      • Set Floating Point type:FPv5-D16 (Hard ABI)
      • Language standard:GNU C++14 (-std=gnu++14)

      Finish 」を選択して、プロジェクトの設定を完了してください。

ピンを設定し、追加の SDK コンポーネントをインポートします

  1. ConfigTools > Pins 」オプションを使用して、NXP のi.MX RT1170ピンを設定します。詳細については、NXP のi.MX RT1170ピンの設定」を参照してください。
  2. 追加のSDKコンポーネントをインポートします:
    • プロジェクトを選択して長押しするか、右クリックして「Import 」を選択します。
    • File System 」を選択します。
    • From directory 」フィールドに「<SDK_PATH>/components/gt911 」を追加し、「fsl_gt911.h/*.c files」を選択します。
    • Into folder 」フィールドに「<PROJECT_NAME>/gt911 」を追加し、「Finish 」を選択します。
    • <SDK_PATH>/middleware/vglite から<PROJECT_NAME>/vglite へ、以下のディレクトリ(その中のファイルおよびサブディレクトリを含む)をインポートします:
      • inc
      • VGLite
      • VGLiteKernel
    • startup_MIMXRT1176_cm7.S 」を「<SDK_PATH>/devices/MIMXRT1176/gcc 」から「<PROJECT_NAME>/startup 」へインポートします。プロジェクトから「<PROJECT_NAME>/startup/startup_mimxrt1176_cm7.c/.cpp 」を削除します。
    • <SDK_PATH>/rtos/freertos/freertos-kernel/portable/MemMang からheap_4.c<PROJECT_NAME>/freertos/freertos-kernel/portable/MemMang にインポートします。

アプリケーションのバックエンドを開発する

  1. UIコミュニケーター構造体を作成する

    バックエンドにより、アプリケーションのUIはプラットフォームと通信し、ハードウェアから必要な情報を取得できるようになります。この例では、コミュニケーターがオンボードLEDの状態を取得します。次の図は、これら2つのコンポーネント間のワークフローを示しています:

    アプリケーションのUIとバックエンド間の連携。

    1. Project Explorer 内の「source 」フォルダを選択して長押しするか、右クリックし、「New > Class 」を選択します。
    2. Class name 」フィールドに「UICommunicator 」を追加します。「Header 」と「Source 」をそれぞれ「uicommunicator.h 」および「uicommunicator.cpp 」に名前を変更し、「Finish 」を選択します。
    3. uicommunicator.h を開き、次のように変更します:
      #ifndef UICOMMUNICATOR_H
      #define UICOMMUNICATOR_H
      
      #include <qul/singleton.h>
      #include <qul/property.h>
      #include <qul/eventqueue.h>
      
      struct UICommunicator : public Qul::Singleton<UICommunicator>
      {
          friend struct Qul::Singleton<UICommunicator>;
      
          enum Command { LED1State };
      
          Qul::Property<bool> led1Status;
      
          void sendFromUI(Command command, bool commandData);
          void receiveToUI(Command command, bool commandData);
      
      private:
          UICommunicator();
          UICommunicator(const UICommunicator &);
          UICommunicator &operator=(const UICommunicator &);
      };
      
      struct CommandEvent
      {
          UICommunicator::Command command;
          bool commandData;
      };
      
      class CommandEventQueue : public Qul::EventQueue<struct CommandEvent, Qul::EventQueueOverrunPolicy_Discard, 10>
      {
      public:
          void onEvent(const CommandEvent &commandEvent);
      };
      
      namespace UI {
      void sendToThread(bool led1Data);
      }
      
      #endif // UICOMMUNICATOR_H

      このヘッダーでは、Qul::Singleton を継承するUICommunicator 構造体を宣言しており、UIコードとの統合を容易にしています。詳細については、Singleton クラスのリファレンスを参照してください。

      また、このヘッダーでは、コマンドのリストを定義する `Command ` 列挙型と、キューを管理するための `CommandEventQueue ` も宣言されています。この列挙型により、UI とアプリケーション間の通信が可能になります。

      UICommunicator また、led1Status プロパティを宣言し、搭載LEDの状態を示します。このプロパティはQMLコンテキストからアクセス可能であり、ボタンの色を決定するために使用されます。

      UICommunicator クラスには、コマンドの送受信を行うsendFromUI およびreceiveToUI 関数が用意されています。また、スレッドセーフな方法でUIスレッドと通信するためのCommandEventQueue も備えています。アプリケーションスレッドからreceiveToUI を呼び出す代わりに、コマンドはCommandEventQueue に追加されます。Qt Quick のUltraliteスレッドは、receiveToUI を呼び出すことでこのキューを処理します。

    4. uicommunicator.cpp を開き、次のように変更してください:
      #include "uicommunicator.h"
      #include "app_thread.h"
      
      UICommunicator::UICommunicator()
      {
          led1Status.setValue(false);
      }
      
      void UICommunicator::sendFromUI(Command command, bool commandData)
      {
          QUL_UNUSED(command)
      
          App::sendToThread(commandData);
      }
      
      void UICommunicator::receiveToUI(Command command, bool commandData)
      {
          switch (command) {
          case LED1State:
              led1Status.setValue(commandData);
              break;
          default:
              break;
          }
      }
      
      void CommandEventQueue::onEvent(const CommandEvent &commandEvent)
      {
          UICommunicator::instance().receiveToUI(commandEvent.command, commandEvent.commandData);
      }
      
      static CommandEventQueue commandEventQueue;
      
      void UI::sendToThread(bool led1Data)
      {
          CommandEvent commandEvent;
          commandEvent.command = UICommunicator::LED1State;
          commandEvent.commandData = led1Data;
          commandEventQueue.postEvent(commandEvent);
      }

      UICommunicator クラスは、led1Statusfalse に初期化します。そのsendFromUI() メンバ関数は、LEDの新しい状態を示すブール値をアプリケーションスレッドに送信します。receiveToUI() メンバ関数は、command引数を使用して、プロパティを更新する必要があるかどうかを判断します。

      次に、CommandEventQueue クラスはonEvent() 関数をオーバーライドします。この関数は、command およびcommandData パラメータを指定して、UICommunicator インスタンスのreceiveToUI() を呼び出します。さらに、CommandEventQueue の静的インスタンスが作成され、UI::sendToThread() 関数によってイベントの投稿に使用されます。UI::sendToThread() は、指定されたブール値からCommandEvent を構築し、処理のためにcommandEventQueue に追加します。これは、LEDの状態が変更された際にアプリケーションスレッドから呼び出されます。

Qt for MCUs CMSIS-Packを作成する

CMSIS-Packとは、MCUXpresso IDEプロジェクト内でQt for MCUs アプリケーションを設定するために必要な情報やファイルを含む、IDEに依存しないパッケージです。

  1. qmlprojectexporter ツールを使用してCMSIS-Packを作成します。

    UIプロジェクトにUICommunicator インターフェースを追加します:

    • 開くpath/to/YourProject.qmlproject
    • Project 内に以下を追加します:
      InterfaceFiles {
          files: ["path/to/mcuxpresso/project/source/uicommunicator.h"]
      }
    export QUL_ROOT=/path/to/QtMCUs/2.12.2
    export QMLPROJECT_FILE=/path/to/YourProject.qmlproject
    export PLATFORM_METADATA=$QUL_ROOT/lib/QulPlatformTargets_mimxrt1170-evkb-freertos_32bpp_Linux_armgcc-export.json
    export BOARDDEFAULTS=$QUL_ROOT/platform/boards/nxp/mimxrt1170-evkb-freertos/cmake/BoardDefaults_32bpp.qmlprojectconfig
    export CMSIS_EXPORT_DIR=/output/dir/of/your/choice
    
    $QUL_ROOT/bin/qmlprojectexporter $QMLPROJECT_FILE --platform=mimxrt1170-evkb-freertos --toolchain=GCC --platform-metadata=$PLATFORM_METADATA --boarddefaults=$BOARDDEFAULTS --outdir=$CMSIS_EXPORT_DIR --project-type=cmsis
    set QUL_ROOT=C:\path\to\QtMCUs\2.12.2
    set QMLPROJECT_FILE=C:\path\to\YourProject.qmlproject
    set PLATFORM_METADATA=%QUL_ROOT%\lib\QulPlatformTargets_mimxrt1170-evkb-freertos_32bpp_Windows_armgcc-export.json
    set BOARDDEFAULTS=%QUL_ROOT%\platform\boards\nxp\mimxrt1170-evkb-freertos\cmake\BoardDefaults_32bpp.qmlprojectconfig
    set CMSIS_EXPORT_DIR=C:\output\dir\of\your\choice
    
    %QUL_ROOT%\bin\qmlprojectexporter.exe %QMLPROJECT_FILE% --platform=mimxrt1170-evkb-freertos --toolchain=GCC --platform-metadata=%PLATFORM_METADATA% --boarddefaults=%BOARDDEFAULTS% --outdir=%CMSIS_EXPORT_DIR% --project-type=cmsis
  2. 作成したCMSISパッケージをMCUXpresso IDEプロジェクトにインポートします
    1. 。「CMSIS-Pack Manager 」パースペクティブに移動します。
    2. Packs 」タブで、「Import Existing Packs... 」ボタンを選択します。
    3. qmlprojectexporterで指定された出力フォルダに移動します。packファイルは「CMSIS 」フォルダ内に、「<YourProject>-mimxrt1170-evkb-freertos-<OS>-armgcc-cmsis.pack 」という名前で保存されているはずです。「Open 」を選択します。すると、そのpackがCMSIS-Packsのリストに表示されるはずです。
    4. Develop 」パースペクティブに戻ります。
    5. Project Explorer 」内のプロジェクト名を選択したままにしておくか、右クリックします。
    6. SDK Management > Add Open-CMSIS Components 」に移動します。
    7. 以下のコンポーネントを選択します:
      • Graphics (バリアント:Qt for MCUs
        • Platform DeviceLink library (バリアント:FreeRTOS
        • Platform sources (バリアント:FreeRTOS
        • Qt Quick Ultralite headers
        • Qt Quick Ultralite libraries
      • Project
        • Qt for MCUs Application
    8. Qt for MCUs Application 」チェックボックスの横にある小さなボタンを選択します。これにより qmlprojectexporter が起動し、Qt Quick Ultralite アプリケーションがプロジェクトにエクスポートされます。
    9. エクスポートが完了するまで待ちます。次の画像に示すように、プロジェクトエクスプローラーにapplication.gpdscが表示されるはずです:
  3. エクスポートされた application.gpdsc ファイルを含むプロジェクトエクスプローラー。

    1. Apply and save changes 」を選択します。
  • MCUXpresso IDE プロジェクトの設定

    1. プロジェクトを選択し、[File > Properties ] を選択して、以下の変更を行います:
      • [C/C++ General > Paths and Symbols > Source Location
      • ] を選択し、リストに以下を追加します:
        • gt911
        • vglite
      • [C/C++ General > Paths and Symbols > Includes] の下の C++ インクルードディレクトリリストに、以下のインクルードパスを追加します。[Add to all configurations ] および [Add to all languages] を選択します。このアプリケーションでは、以下のインクルードディレクトリを追加します:
        • ワークスペース内の `
      • gt911
        • `
        • ワークスペース内の
        • `
      • vglite/inc
        • `
        • ワークスペース内の `
      • vglite/VGLite/rtos
        • `
        • ワークスペース内の `
      • vglite/VGLiteKernel
        • ` ワークスペース内の `vglite/VGLiteKernel/rtos `
      • C/C++ General > Paths and Symbols > Symbols 」を選択し、以下のプリプロセッサ定義を追加します:
        • すべての構成および言語について:
          • BOARD_MIPI_PANEL_TOUCH_IRQ GPIO2_Combined_16_31_IRQn
          • BOARD_MIPI_PANEL_TOUCH_IRQ_HANDLER GPIO2_Combined_16_31_IRQHandler
          • CPP_NO_HEAP これにより、cpp_config.cpp に空の実装を導入することで、デフォルトのmalloc およびfree の実装が無効化されます。
          • FSL_RTOS_FREE_RTOS
          • PRINTF_ADVANCED_ENABLE 0
          • PRINTF_FLOAT_ENABLE 0
          • SCANF_ADVANCED_ENABLE 0
          • SCANF_FLOAT_ENABLE 0
          • SKIP_SYSCLK_INIT
          • USE_SDRAM
          • SDK_I2C_BASED_COMPONENT_USED 1
          • XIP_BOOT_HEADER_ENABLE 1
          • XIP_EXTERNAL_FLASH 1
          • XIP_BOOT_HEADER_DCD_ENABLE 1
      • __MCUXPRESSO
          • を削除します
        • GNU C++ の場合
          • VGLITE_POINT_FILTERING_FOR_SIMPLE_SCALE
          • QUL_STD_STRING_SUPPORT
      • C/C++ Build > Settings > Tool Settings > MCU C++ Linker > Miscellaneous > Other objects 」を選択します。リスト内のライブラリの順序を次のように変更します:
        • libQulCore_cortex-m7-hf-fpv5-d16_Linux_armgcc_MinSizeRel.a
        • libQulControlsTemplates_cortex-m7-hf-fpv5-d16_Linux_armgcc_MinSizeRel.a
        • libQulControls_cortex-m7-hf-fpv5-d16_Linux_armgcc_MinSizeRel.a
        • libQulShapes_cortex-m7-hf-fpv5-d16_Linux_armgcc_MinSizeRel.a
        • libQulTimeline_cortex-m7-hf-fpv5-d16_Linux_armgcc_MinSizeRel.a
        • libQulMonotypeUnicodeEngineShaperDisabled_cortex-m7-hf-fpv5-d16_Linux_armgcc_MinSizeRel.a
        • libQulMonotypeUnicode_cortex-m7-hf-fpv5-d16_Linux_armgcc_MinSizeRel.a
        • libQulPNGDecoderNull_cortex-m7-hf-fpv5-d16_Linux_armgcc_MinSizeRel.a
        • libQulDeviceLink_mimxrt1170-evkb-freertos_Linux_armgcc_MinSizeRel.a
        • libQulCore_cortex-m7-hf-fpv5-d16_Windows_armgcc_MinSizeRel.a
        • libQulControlsTemplates_cortex-m7-hf-fpv5-d16_Windows_armgcc_MinSizeRel.a
        • libQulControls_cortex-m7-hf-fpv5-d16_Windows_armgcc_MinSizeRel.a
        • libQulShapes_cortex-m7-hf-fpv5-d16_Windows_armgcc_MinSizeRel.a
        • libQulTimeline_cortex-m7-hf-fpv5-d16_Windows_armgcc_MinSizeRel.a
        • libQulMonotypeUnicodeEngineShaperDisabled_cortex-m7-hf-fpv5-d16_Windows_armgcc_MinSizeRel.a
        • libQulMonotypeUnicode_cortex-m7-hf-fpv5-d16_Windows_armgcc_MinSizeRel.a
        • libQulPNGDecoderNull_cortex-m7-hf-fpv5-d16_Windows_armgcc_MinSizeRel.a
        • libQulDeviceLink_mimxrt1170-evkb-freertos_Windows_armgcc_MinSizeRel.a

        注:ライブラリは 記載された順序で並べる必要があります。そうしないと、リンカーがリンキング順序の誤りによりシンボルが見つからないというエラーを報告する可能性があります。

      • C/C++ Build > Settings > Tool Settings > MCU C++ Linker > Miscellaneous > Linker flags 」を選択し、「-specs=nosys.specs 」を追加します。

        注: Other options(-Xlinker [option]) フィールドにフラグを追加しないよう注意してください 。追加すると、リンカーが正しく認識できなくなります。

      • Resource > Linked Resources 」を選択します。「Linked Resources 」タブで、「Variable Relative Location > MIMXRT1176xxxxx_cm7_flexspi_nor_sdram.ld 」を選択し、「Edit... 」ボタンをクリックします。「Edit Link Location 」に、「Location 」フィールドの内容をコピーします。
      • C/C++ Build > Settings > Tool Settings > MCU C++ Linker > Managed Linker Script 」を選択し、「Manage linker script 」の値をクリアしてから、前の手順でコピーした内容を「Linker script 」フィールドに貼り付けます。
      • [C/C++ ] を選択し、[Build] > [Settings] > [Tool Settings] > [MCU C++ Linker] > [General] の順に選択して、[No startup or default libs ] オプションのチェックを解除します。
      • 変更を行った後、[Apply and Close ] ボタンを選択します。
    2. プロジェクトから「source/FreeRTOSConfig.h 」を削除します。生成された CMSIS パックには、プロジェクトで動作する FreeRTOSConfig.h がすでに含まれています。
    3. source/cpp_config.cpp を開き、以下の変更を行います:
      • 追加
        #include <FreeRTOS.h>
        #include <portable.h>
        #include <task.h>
      • すべての `malloc() ` および `free() ` の呼び出しを、それぞれ `pvPortMalloc() ` および `vPortFree() ` の呼び出しに置き換えてください。

        注: #ifdef CPP_NO_HEAP 内の関数定義の名前は変更しないでください

      • 必要に応じて、malloc() およびfree() の空の実装を、FreeRTOS のメモリ割り当て関数への呼び出しに置き換えることもできます。

    アプリケーションのバックエンドを完成させる

    1. source/<project-name>.cpp を開き、その内容を次のコードに置き換えてください。

      注: YOUR_UI_APP を、エクスポートされた UI アプリケーション名に置き換えてください

      #include <app_thread.h>
      #include <YOUR_UI_APP.h>
      
      #include <qul/application.h>
      #include <qul/qul.h>
      
      #include <platforminterface/log.h>
      
      #include <FreeRTOS.h>
      #include <task.h>
      
      #include <board.h>
      
      static void Qul_Thread(void *argument);
      static void App_Thread(void *argument);
      
      int main()
      {
          Qul::initHardware();
          Qul::initPlatform();
          if (xTaskCreate(Qul_Thread, "Qul_Thread", 32768, 0, 4, 0) != pdPASS) {
              Qul::PlatformInterface::log("Task creation failed!.\r\n");
              configASSERT(false);
          }
      
          if (xTaskCreate(App_Thread, "App_Thread", 200, 0, 4, 0) != pdPASS) {
              Qul::PlatformInterface::log("Task creation failed!.\r\n");
              configASSERT(false);
          }
      
          vTaskStartScheduler();
      
          // Should not reach this point
          return 1;
      }
      
      static void Qul_Thread(void *argument)
      {
          (void) argument;
          Qul::Application _qul_app;
          static struct ::YOUR_UI_APP _qul_item;
          _qul_app.setRootItem(&_qul_item);
      #ifdef APP_DEFAULT_UILANGUAGE
          _qul_app.settings().uiLanguage.setValue(APP_DEFAULT_UILANGUAGE);
      #endif
          _qul_app.exec();
      }
      
      static void App_Thread(void *argument)
      {
          App::run();
      }
      
      extern "C" {
      void vApplicationStackOverflowHook(TaskHandle_t xTask, signed char *pcTaskName)
      {
          (void) xTask;
          (void) pcTaskName;
      
          Qul::PlatformInterface::log("vApplicationStackOverflowHook");
          configASSERT(false);
      }
      
      void vApplicationMallocFailedHook(void)
      {
          Qul::PlatformInterface::log("vApplicationMallocFailedHook");
          configASSERT(false);
      }
      }

      main() これにより、ボードが初期化され、以下の 2 つのタスクが作成されます:

      • Qul_Thread UIを実行するために
      • App_Thread LEDコマンドを処理し、LEDの状態に基づいてボタンの色を更新するようUIに信号を送る。
    2. source フォルダを選択して長押しするか、右クリックして「New > Header File 」を選択します。ファイル名を「app_thread.h 」とし、以下の内容を追加します:
      #ifndef APP_THREAD_H_
      #define APP_THREAD_H_
      
      namespace App {
      
      void run();
      void sendToThread(bool ledStatus);
      
      } // namespace App
      
      #endif /* APP_THREAD_H_ */
    3. source フォルダを選択して長押しするか、右クリックして「New > Source File 」を選択します。ファイル名を「app_thread.cpp 」とし、以下のコードを追加します:
      #include "app_thread.h"
      
      #include "uicommunicator.h"
      #include "board.h"
      
      #include <fsl_gpio.h>
      
      #include <FreeRTOS.h>
      #include <queue.h>
      
      namespace App {
      
      static QueueHandle_t appQueue = NULL;
      
      void run()
      {
          // enable SW7/WAKE UP button interrupt
          NVIC_SetPriority(BOARD_USER_BUTTON_IRQ, configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY);
          EnableIRQ(BOARD_USER_BUTTON_IRQ);
      
          USER_LED_INIT(0U); // initialize LED to be off
      
          appQueue = xQueueCreate(20, 1);
          bool ledState;
      
          while (true) {
              if (pdTRUE == xQueueReceive(appQueue, &ledState, portMAX_DELAY)) {
                  if (ledState)
                      USER_LED_ON();
                  else
                      USER_LED_OFF();
      
                  UI::sendToThread(ledState);
              }
          }
      }
      
      void sendToThread(bool ledStatus)
      {
          if (appQueue) {
              xQueueSend(appQueue, &ledStatus, 0);
          }
      }
      
      } // namespace App
      
      extern "C" void BOARD_USER_BUTTON_IRQ_HANDLER(void)
      {
          GPIO_PortClearInterruptFlags(BOARD_USER_BUTTON_GPIO, 1U << BOARD_USER_BUTTON_GPIO_PIN);
          bool ledStatus = 0x1 ^ GPIO_PinRead(BOARD_USER_LED_GPIO, BOARD_USER_LED_GPIO_PIN);
          if (App::appQueue)
              xQueueSendFromISR(App::appQueue, &ledStatus, NULL);
      }

      このファイルでは、シンプルなアプリスレッドと、それに関連するすべての関数を定義します。まず、appQueue を定義し、ボードの LED 状態(オンまたはオフ)を切り替えるコマンドを格納します。App::run 関数は、app_thread のメインループです。この関数は、ボード上のユーザーボタンの割り込みを有効にし、ボードのLEDの1つをオフの状態に初期化し、スレッド用のキューを作成します。 その後、スレッドはLEDの状態を切り替えるコマンドを待機する無限ループに入ります。この状態情報は、UI(Qt Quick Ultralite)スレッドに送信されます。

      次に、App::sendToThread 関数があり、これは指定されたLEDの状態をappQueue に投稿します。最後に、ユーザーボタン用のIRQハンドラがあります。ボタンが押されると、LEDの現在の状態を確認し、その状態と逆の状態をappQueue に投稿します。

    これでアプリケーションの準備は完了です。ビルドして、NXP i.MX RT1170ボードにフラッシュし、すべてが意図したとおりに動作するかどうかテストしてください。

    注: アプリケーションがタッチ操作に反応しない場合は 、ボード上のSW7/WAKEUPボタンを押してみてください。

    特定のQtライセンスの下で利用可能です。
    詳細はこちら。