このページでは

C

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

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

MCUXpresso IDEとARM GCCツールチェーンの両方を含むMCUXpresso SDKバージョン2.14.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 デバイスパッケージを選択します。プロジェクトには以下の設定が必要です:
      • Cores:cm7 core is set toStandalone Role.
      • ボード:Default board files
      • プロジェクト・タイプ:C++ Project
      • Project Options:SDK Debug ConsoleUART に設定されています。Copy sourcesImport 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 ファイルを選択します。
    • Into folder フィールドに<PROJECT_NAME>/gt911 を追加し、Finish を選択します。
    • 以下のディレクトリ(その中のファイルとサブディレクトリを含む)を<SDK_PATH>/middleware/vglite から<PROJECT_NAME>/vglite にインポートします:
      • inc
      • VGLite
      • VGLiteKernel
    • <SDK_PATH>/devices/MIMXRT1176/gcc から<PROJECT_NAME>/startupstartup_MIMXRT1176_cm7.S をインポートする。<PROJECT_NAME>/startup/startup_mimxrt1176_cm7.c/.cpp をプロジェクトから削除します。
    • <SDK_PATH>/rtos/freertos/freertos-kernel/portable/MemMang から<PROJECT_NAME>/freertos/freertos-kernel/portable/MemMangheap_4.c をインポートする。

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

  1. UIコミュニケーター構造体の作成

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

    アプリケーションのUIとバックエンド間のインタラクション。

    1. Project Explorersource フォルダーを選択したまま、または右クリックして、New > Class を選択します。
    2. Class name フィールドにUICommunicator を追加。HeaderSource の名前をそれぞれuicommunicator.huicommunicator.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 は、搭載されている LED の状態を示すled1Status プロパティを宣言している。このプロパティはQMLコンテキストからアクセス可能で、ボタンの色を決定します。

      UICommunicator クラスには、コマンドを送受信するための関数sendFromUIreceiveToUI があります。また、スレッドセーフな方法で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() 関数をオーバーライドし、commandcommandData パラメータを持つ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 を作成します。

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

    • 開くpath/to/YourProject.qmlproject
    • Project 内に以下を追加します:
      InterfaceFiles {
          files: ["path/to/mcuxpresso/project/source/uicommunicator.h"]
      }
    export QUL_ROOT=/path/to/QtMCUs/2.12.1
    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.1
    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 に指定された出力フォルダに移動します。パック ファイルはCMSIS フォルダの<YourProject>-mimxrt1170-evkb-freertos-<OS>-armgcc-cmsis.pack という名前になっているはずです。Open を選択します。CMSIS-Packs のリストにパックが表示されるはずです。
  3. Develop
    1. パースペクティブに戻ります。
  4. Project Explorer
    1. のプロジェクト名を選択したまま、または右クリックします
  5. SDK Management > Add Open-CMSIS Components
    1. に移動します
    2. 以下のコンポーネントを選択します:
  6. Graphics
      • (Variant:Qt for MCUs
    1. )
  7. Platform DeviceLink library
        • (Variant:FreeRTOS
    1. )
  8. Platform sources
        • (Variant:FreeRTOS
    1. )
  9. Qt Quick Ultralite headers
    1. Qt Quick Ultralite libraries
          • Project
            • Qt for MCUs Application
        • Qt for MCUs Application チェックボックスの隣にある小さなボタンを選択します。これで qmlprojectexporter が起動し、Qt Quick Ultralite アプリケーションをプロジェクトにエクスポートします。
        • エクスポートが終了するまで待ちます。以下のイメージのように、プロジェクトエクスプローラーにapplication.gpdscが表示されるはずです:
      1. エクスポートされたapplication.gpdscファイルがあるプロジェクトエクスプローラー。

        1. Apply and save changes を選択
      2. .

      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 configurationsAdd to all languages を選択します。このアプリケーションでは、次のインクルード・ディレクトリを追加します:
          • gt911 from workspace
        • vglite/inc
          • from workspace
        • vglite/VGLite/rtos
          • from workspace
        • vglite/VGLiteKernel
          • from workspace
        • vglite/VGLiteKernel/rtos
          • from workspace
        • 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 に空の実装を導入することで、デフォルトのmallocfree の実装を無効にします
            • 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 LocationLocation フィールドの内容をコピーする。
        • 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コマンドを処理し、UIに信号を送ってLEDの状態に基づいてボタンの色を更新する。
      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ボタンを押してみてください。


      詳細はこちらをご覧ください。