Multi Source Translation Content

キャンセル
次の結果を表示 
表示  限定  | 次の代わりに検索 
もしかして: 

Multi Source Translation Content

ディスカッション

ソート順:
HOBクイックスタートガイド <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> HOBとは? HobはBitBakeのグラフィカルユーザーインターフェースです。その主な目標は、ユーザーが一般的なタスクをより簡単に実行できるようにすることです。基本的に、グラフィックユーザーインターフェイスを表示しながら、バックグラウンドでBitbakeコマンドを実行します。 Hob は、Toaster という名前の Yocto の新しい Web ベースのインターフェイスを優先して非推奨になりつつあるため、Daisy メタデータで正しく動作しない可能性があります。 ここでは、Freescale Community BSPおよびBSP ReleaseのHobの現在のバージョンで実行できる操作について説明します。 - イメージの構築 - 既存の画像レシピの編集 - 自分だけの画像レシピを作成 手記: HOB は local.conf ファイルを書き込み、HOB の外部でイメージをベイク処理することと競合する可能性のある変更を加えます。この場合、local.conf ファイルを復元するために、環境の初期化を再実行する必要があります。 HOBの開始 環境が初期化されたら (Freescale Community BSP の setup-environment スクリプトまたは Freescale BSP リリースの fsl-setup-release を使用)、次のコマンドを使用します。 $ hob & GUIが表示されます。 次に、ビルドするマシンとプロジェクトのレイヤーを選択できます。HOB は local.conf と bblayers.conf の値を取得して更新するため、目的の BSP レイヤーがすでに選択されており、これらのレイヤーで使用可能なマシンがドロップダウン メニューに表示されます。 これらのオプションが設定されると、HOBはレシピを解析し、そのマシンで利用可能な画像を表示するための依存関係ツリーを作成します。 イメージ・ファイル・システム・タイプ 高度な設定オプションには、イメージ・ファイル・システム・タイプが含まれます。HOB は sdcard 形式をサポートしていないため、必要な場合は local.conf ファイルに手動で追加してから、HOB の外部で bitbake を実行する必要があります。HOB が local.conf ファイルを変更したため、sdcard 形式が元々利用可能であった場合でも、次の行が local.conf に追加されるまで書き換えられ、利用できなくなる可能性があります。 IMAGE_FSTYPES="tar.bz2 ext3 SDカード" レシピ画面 レシピ画面では、画像に含まれるレシピと利用可能なレシピ、次にパッケージグループを確認できます。 焼く時間です! これらの設定の後、HOBインターフェースを使用してパッケージをビルドするか、HOBの外部でBitbakeを実行できます。(SDカード形式での画像をご希望の場合は、以前の画像タイプの説明をご覧ください) 結果の画像はに保存されます /tmp/deploy/images/ 選択したカスタマイズで画像レシピを保存することもできます。 Re:HOBクイックスタートガイド <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> このドキュメントに関連する質問や問題がある場合は、コミュニティでの ディスカッション として送信してください。
記事全体を表示
Kinetisハードウェア設計のヒントとコツ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> こんにちは、皆さん。 このKinetis設計のヒントとコツは、Kinetisハードウェア設計のチェックリストまたはトラブルシューティング・ドキュメントが必要な方を対象としています。これは、必要に応じて更新される生きたドキュメントになります。 すべてお楽しみください! このフォーラムですべてのフィードバックをお寄せください。 Mike Steffen <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> こんにちは、皆さん。 このKinetis設計のヒントとコツは、Kinetisハードウェア設計のチェックリストまたはトラブルシューティング・ドキュメントが必要な方を対象としています。これは、必要に応じて更新される生きたドキュメントになります。 すべてお楽しみください! このフォーラムですべてのフィードバックをお寄せください。 Mike Steffen Re:Kinetisハードウェア設計のヒントとコツ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> こんにちは、Mikeさん これは、Kinetisマイクロコントローラの唯一の「公式」ハードウェア設計ガイドですか?Kinetisファミリ(KL17デバイス)のドキュメントのようなものを探しています。デカップリング、レイアウトの推奨事項、回路図の例など、上記のドキュメントで収集し始めたようなトピックについて説明しています。 KL17コントローラーにそのような種類のドキュメントはありますか? よろしくお願いいたします。 ピーター
記事全体を表示
TensorFlow Lite の「Hello World」 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> ゴール 私たちの目標は、値 x を取り、その正弦 y を予測できるモデルをトレーニングすることです。実際のアプリケーションでは、x の正弦が必要な場合は、直接計算すればよいのです。しかし、結果を近似するようにモデルを学習させることで、機械学習の基本を示すことができます。 TensorFlow と Keras TensorFlow は、機械学習モデルの構築、トレーニング、評価、デプロイのためのツールのセットです。もともと Google で開発された TensorFlow は、現在、世界中の何千人もの貢献者によって構築および保守されているオープンソース プロジェクトです。これは、機械学習で最も人気があり、広く使用されているフレームワークです。ほとんどの開発者は、Python ライブラリを介して TensorFlow と対話します。TensorFlow はさまざまなことを行います。この投稿では、ディープラーニングネットワークの構築とトレーニングを容易にするTensorFlowの高レベルAPIである Kerasを使用します。 モバイル デバイスや組み込みデバイスで TensorFlow を有効にするために、Google は TensorFlow Lite フレームワークを開発しました。これにより、これらの計算制限のあるデバイスは、TensorFlow Lite に変換された事前トレーニング済みの TensorFlow モデルで推論を実行できるようになります。これらの変換されたモデルは、これ以上トレーニングすることはできませんが、量子化やプルーニングなどの手法を使用して最適化できます。 モデルの構築 モデルを構築するには、以下の手順に従う必要があります。 単純なデータセットを取得します。 ディープ ラーニング モデルをトレーニングします。 モデルのパフォーマンスを評価します。 デバイス上で実行するようにモデルを変換します。 このノートブックは、 TensorFlowモデルを作成し、それをTensorFlow Liteで使用するために変換するプロセスを示すために設計されています。 RT MCU へのモードのデプロイ ハードウェアボード: MIMXRT1050 EVKボード 図1 MIMXRT1050 EVKボード テンプレート デモ コード: evkbimxrt1050_tensorflow_lite_cifar10 コード /* Copyright 2017 The TensorFlow Authors. All Rights Reserved. Copyright 2018 NXP. All Rights Reserved. Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ==============================================================================*/ #include "board.h" #include "pin_mux.h" #include "clock_config.h" #include "fsl_debug_console.h" #include #include #include #include "timer.h" #include "tensorflow/lite/kernels/register.h" #include "tensorflow/lite/model.h" #include "tensorflow/lite/optional_debug_tools.h" #include "tensorflow/lite/string_util.h" #include "Sine_mode.h" int inference_count = 0; // This is a small number so that it's easy to read the logs const int kInferencesPerCycle = 30; const float kXrange = 2.f * 3.14159265359f; #define LOG(x) std::cout void RunInference() { std::unique_ptr<tflite::FlatBufferModel> model; std::unique_ptr<tflite::Interpreter> interpreter; model = tflite::FlatBufferModel::BuildFromBuffer(sine_model_quantized_tflite, sine_model_quantized_tflite_len); if (!model) { LOG(FATAL) << "Failed to load model\r\n"; exit(-1); } model->error_reporter(); tflite::ops::builtin::BuiltinOpResolver resolver; tflite::InterpreterBuilder(*model, resolver)(&interpreter); if (!interpreter) { LOG(FATAL) << "Failed to construct interpreter\r\n"; exit(-1); } float input = interpreter->inputs()[0]; if (interpreter->AllocateTensors() != kTfLiteOk) { LOG(FATAL) << "Failed to allocate tensors!\r\n"; } while(true) { // Calculate an x value to feed into the model. We compare the current // inference_count to the number of inferences per cycle to determine // our position within the range of possible x values the model was // trained on, and use this to calculate a value. float position = static_cast<float>(inference_count) / static_cast<float>(kInferencesPerCycle); float x_val = position * kXrange; float* input_tensor_data = interpreter->typed_tensor<float>(input); *input_tensor_data = x_val; Delay_time(1000); // Run inference, and report any error TfLiteStatus invoke_status = interpreter->Invoke(); if (invoke_status != kTfLiteOk) { LOG(FATAL) << "Failed to invoke tflite!\r\n"; return; } // Read the predicted y value from the model's output tensor float* y_val = interpreter->typed_output_tensor<float>(0); PRINTF("\r\n x_value: %f, y_value: %f \r\n", x_val, y_val[0]); // Increment the inference_counter, and reset it if we have reached // the total number per cycle inference_count += 1; if (inference_count >= kInferencesPerCycle) inference_count = 0; } } /* * @brief Application entry point. */ int main(void) { /* Init board hardware */ BOARD_ConfigMPU(); BOARD_InitPins(); BOARD_InitDEBUG_UARTPins(); BOARD_BootClockRUN(); BOARD_InitDebugConsole(); NVIC_SetPriorityGrouping(3); InitTimer(); std::cout << "The hello_world demo of TensorFlow Lite model\r\n"; RunInference(); std::flush(std::cout); for (;;) {} } ‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍ テスト結果 MIMXRT1050 EVK Boardでは、入力データ( x_value )と推論された出力データ( y_value シリアルポート経由)を記録します。 図2 受信データ while ループ関数では、0 から 2π の範囲の x 値の進行に対して推論を実行し、繰り返します。実行されるたびに、新しい x 値が計算され、推論が実行され、データが出力されます。 図3 テスト結果 さらに、次の図に示すように、Excelを使用して、受信したデータを実際の値に対して表示します。 図4 ドットプロット ほとんどの場合、予測値を表すドットは、実際の値の分布の中心に沿って滑らかな正弦曲線を形成していることがわかります。一般に、私たちのネットワークは正弦曲線を近似することを学習しました。 i.MXRT 105倍
記事全体を表示
iWave Systemsのi.MX6ベースのデジタルサイネージソリューション <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> iWave Systems は、業界最新の i.MX 6プロセッサベースのデジタルサイネージソリューションを発売しました。デジタルサイネージを使用すると、ユーザーはメッセージをより動的かつ効果的に表示できます。動的な画像は、静的な画像よりも魅力的で、かなり多くの情報を伝えることができます。 iWaveの新しいデジタルサイネージソリューションは、会議室のサイネージ、デジタルメニューボード、電子ポスター、ネットワークメディアプレーヤー、その他の商用ディスプレイなどの複数のデジタルサイネージで利用できる超コンパクトでありながら高度に統合されたプラットフォームを備えた、すべての標準インターフェイスを1つのボードに統合します。 iWave Systemsの フリースケールi.MX6プロセッサ・ベースのデジタル・サイネージ・ソリューション iWaveのデジタルサイネージソリューションは 、ARM Cortex-A9™コアi.MX6 Q/D/DL/Sプロセッサに基づいており、2Dおよび3Dグラフィックプロセッサ、1080pビデオ処理、および統合電源管理で最大1GHzまで動作できます。このプラットフォームは、-20°Cから+85°Cの温度範囲で動作可能な拡張温度をサポートするように設計されています。このボードには、工業的に標準化されたPico-ITX(100 x 72mm)フォームファクタが付属しています。 デジタルサイネージアプリケーションは、Android ICS OSを搭載したPico ITXボックスでデモされました。このアプリケーションは、リモートWebブラウザからのコンテンツの更新、ビデオコンテンツ、画像、HTML Webページの再生、およびテキストメッセージのスクロールの機能を提供します。 デジタルサイネージソリューションの詳細については、次のリンクを参照してください。 iWaveのi.MX6ベースのデジタルサイネージソリューション iWaveのRainboW-G15S |iWaveシステム Website: www.iwavesystems.com Eメール: [email protected]
記事全体を表示
如何在KDS 1.1.1和KDS 2.0.0中安装KL03 SDK支持 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 本文介绍了如何在 KDS (Kinetis Design Studio) 1.1.1 中正确安装对 KL03 衍生产品的支持过程(KDS 2.0.0)以及在 FRDM-KL03Z 板上更新 GCC 编译器和调试固件的附加步骤。 KDS 1.1.1(KDS 2.0.0)安装 如果您没有 KDS 1.1.1(KDS 2.0.0),请从飞思卡尔网站获取安装包(适用于Windows和Linux)。转到Kinetis Design Studio 集成开发环境(IDE)页面,选择构建并安装。 Kinetis SDK安装 KL03Z 衍生支持作为 KL03Z 的服务包 KSDK 1.0.0 分发。 下载适用于 FRDM-KL03Z Windows 或 Linux 安装程序的 Freescale Kinetis SDK_1.0.0并安装它。 安装 KL03Z 的 KSDK 1.0.0 后,还需要安装 KL03 的 PEx 服务包。在 KDS 主菜单中选择帮助 > 安装新软件... ,单击添加...按钮,单击存档并选择 SDK 子文件夹中的 KL03Z-1.0.0-GA-SA-RC2-for-Eclipse.zip(例如c:\Freescale\KSDK_1.0.0-KL03Z\tools\eclipse_update\KL03Z-1.0.0-GA-SA-RC2-for-Eclipse.zip): 其他步骤 下一步是安装更新的 GCC 编译器。这是由于 KDS 1.1.1 中分发的 GCC 版本中的 C 标准库占用空间问题(KDS 2.0.0)。KL03Z 衍生产品包含少量 RAM 内存,因此也强烈建议执行此步骤。 有关如何更新 GCC 的详细说明,请参阅 KSDK 用户指南,该指南位于 KSDK 1.0.0 for KL03Z 安装文件夹的KSDK_1.0.0-KL03Z\doc\Kinetis SDK Freescale Freedom FRDM-KL03Z Platform User's Guide.pdf –附录 B 章:Kinetis Design Studio 环境变量修复和交换工具链中。 请注意,当您更新 GCC 时,您必须将每个新项目的链接器标志更改为“-specs=nano.specs -specs=nosys.specs”如文档中所述。(否则链接器标志的默认设置将导致 GCC 链接器错误)。 如果您还没有这样做,请更新 FRDM-KL03Z 板的固件以允许应用程序闪烁和调试。它在附录 C:OpenSDA J-Link 固件更新的同一文档中进行了描述。 您现在可以开始为 KL03 创建新的应用程序。例如,参见FRDM-KL03Z 板上的低功耗演示应用程序。
記事全体を表示
MIFARE DESFire Light读写演示 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 此演示基于 RFIDDiscover 完整版和 Pegoda EV710。您可以参考以下链接了解更多详情。 RFID发现 | 恩智浦 PEGODA 非接触式智能卡读卡器 | NXP 在开始演示之前,请通过 USB 将 Pegoda 与您的 PC 连接,并将 MIFARE DESFire Light 卡放在读卡器上。 历史记录和日志可以从附件中获取。 请参阅视频以了解更多详情。 (在 “我的视频” 中查看)   互联标签解决方案
記事全体を表示
12 MagniVミックスドシグナルMCUドローン <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Demo このクワッドロコプターのデモでは、S12 MagniVファミリの複数のMCUを使用して、高電圧アナログ統合と業界で実績のあるS12Zコアから得られる価値を示し、高速BLDC制御を効率的に実現します。今では、従来の自動車アプリケーションを超えて、ドローンなどの新しいアプリケーションもカバーしています。   BLDC/DCモータ制御、センサ、アクチュエータ向けの高性能で業界で実績のあるS12(Z)マイクロコントローラ 高電圧アナログ統合:LIN/CAN Phy、MOSFETゲートドライブユニット、LSD/HSD、OP-AMP/PGA PCBのサイズとコストを削減しながら、製造の信頼性を向上 注目のNXP製品 自動車 & 産業用ミックスド・シグナル・マイクロコントローラ |マグニV|NXPの オートモーティブ インダストリアル
記事全体を表示
问答:当前 i.MX6 BSP 是否支持 eMMC 4.5? <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 问:i.MX 6Dual/6Quad 应用处理器参考手册 Rev. D 说 i.MX6 支持 eMMC 4.5。但是当前的 BSP(L3.0.35_12.08.00)是否支持 eMMC 4.5?如果没有,飞思卡尔的发布计划中是否有它? 答:i.MX 6Dual/6Quad RM和数据表声明 uSDHC 模块“完全符合多媒体卡系统规范 v4.2/4.3/4.4/4.41 中定义的 MMC 命令/响应集和物理层,包括高容量(> 2 GB)HC MMC 卡。”因此,如果您的 eMMC4.5 卡向后兼容 eMMC4.4,你可以在eMMC4.4中使用它模式启用eMMC4.4i.MX6 平台上的功能和性能。 例如,当前的 i.MX6 Linux BSP (L3.0.35_4.1.0)已添加代码以与 eMMC4.5 卡接口,从而作为 eMMC4.4 运行卡片。请参阅 drivers/mmc/core/mmc.c 中的以下代码: 卡->ext_csd.rev = ext_csd[EXT_CSD_REV]; /* 解决方法:支持 emmc 4.5 卡在 emmc 4.4 模式下工作 */ 如果(card->ext_csd.rev>6){ printk(KERN_ERR "%s: 无法识别的 EXT_CSD 修订版本 %d\n", mmc_hostname(卡->主机),卡->ext_csd.rev);                 err = -EINVAL; 出去;         }
記事全体を表示
i.MX RTでのemWinアプリケーションのカスタマイズ <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> はじめに 要件 ユーティリティの使用量 インテグレーション 機能デモ     1. イントロダクション   このドキュメントでは、MCUXpresso SDK に含まれている emwin_temperature_control デモと emWin ユーティリティを参照として使用して、emWin アプリケーションを作成する方法について説明します。この例のカスタム アプリケーションは Tic-Tac-Toe ゲームで、emWin GUI をユーザー入力として使用し、emWin で生成されたコードにゲーム実装の適切なロジックを追加し、MIMXRT1060-EVK ボード上で実行します。 2. 応募資格   このデモのデモには、次の資料が必要です。 RK043FN02H-CT 4.3インチLCDパネル を搭載した MIMXRT1060-EVKボード 。 MCUXpresso IDE v11.0. EMWinミドルウェアを含むEVK-MIMXRT1060用のMCUXpresso SDK v2.6.2。 Segger emWin 5.38b ライブラリとユーティリティ。 emWin 5.30 のドキュメント。 3. ユーティリティの使用   このデモでは、GUIBuilderユーティリティのみを使用し、このユーティリティから、ウィンドウ、テキスト、ボタン、画像の4つのウィジェット要素のみがアプリケーションに実装されます。 最初に、1 つのウィンドウが追加され、その xSize と ySize が画面の解像度と一致する 480 x 272 に構成されます。 このウィンドウの上には、他のすべての要素が配置されます。各ウィジェットには、右クリックメニューで追加/変更できるプロパティがあります。 使用されているウィジェット要素の総数は次のとおりです。 3 つのテキスト ウィジェット (1 つはタイトル用、もう 1 つは次のターンを示す)、3 つ目は空のウィジェット (ゲームの勝者を示す (または引き分けを示す) を示すために動的に更新されるため)。 BPMファイルがロードされ、定数配列に変換される2つの画像ウィジェットには、ゲームの現在のターンを示すクロス/サークルアイコンがあります。 10個のボタンウィジェット(1つはゲームを再初期化するためのウィジェット、残りの9つはゲームに使用される3x3配列の構築用)。 完全なアプリケーション・レイアウトを次の図に示します。 次に、「File」->「Save」メニューをクリックし、「WindowDLG.c」という名前のファイルをクリックします。ファイルは、GUIBuilderユーティリティが配置されているのと同じフォルダに作成する必要があります。「WindowDLG.c」このデモのファイル、および十字/円アイコンのBMPファイルは、このドキュメントの添付ファイルにあります。さらに、「File->Open」をクリックして、ダウンロードした「WindowDLG.c」を開くこともできますファイルを作成し、自分で変更します。 4. 統合   1) まず、MCUXpresso SDK for MIMXRT1060-EVK ボードに含まれる "emwin_temperature_control" デモをインポートする必要があります。 SDK サンプルのインポート -> evkmimxrt1060 -> emwin_examples -> emwin_temperature_control 2) デモをインポートした直後に、便宜上、プロジェクトの名前と "source->emwin_temperature_control.c" を "evkmimxrt1060_emwin_tictactoe" と "emwin_tictactoe.c" に変更しました (右クリックで -> の名前を変更)。 これらの変更を適用すると、デモをエラーなしでコンパイルおよびダウンロードでき、問題なく実行できるはずです。 3)次に、「WindowDLG.c」を開きますGUIBuilderによって生成されたファイルを作成し、「Defines」セクションを見つけます。それらすべてをコピーし、「emwin_tictactoe.c」にすでに含まれているウィジェットIDの定義を置き換えますファイル。 4) 「emwin_tictactoe.c」の「Some dimension defines」セクションと「Colors」セクションも削除します。ファイル、および「Structures」、「Static data」の内容。同じファイルから、 "_aGradient"、 "_GetSelectedRoom"、 "_SetFanButtonState"、 "_cbButton"、 "_cbButtonFan"、 "_cbKnob"、 "_DrawKnob"、 "_OnRelease"のセクションも削除します。 5) 「WindowDLG.c」から「_acImage_0」配列と「_acImage_1」配列を追加します。ファイルを "emwin_tictactoe.c" の "Static data" セクションに格納します。ファイル。 6) 「emwin_tictactoe.c」の「_aDialogCreate」配列のすべての要素を置き換えます。「WindowDLG.c」のものを使用ファイル。 7) 関数「_GetImageById」を追加し、「WindowDLG.c」ファイルの「_cbDialog」関数を「emwin_tictactoe.c」ファイルに置き換えます。 😎 ここまでは、アプリケーションは問題なくコンパイルおよびダウンロードする必要がありますが、試合を実行する機能は含まれていません。ダウンロードしたレイアウトを次の画像に示します。 9)さて、ゲーム自体の実装のために、次の変数が「emwin_tictactoe.c」の「静的データ」セクションに追加されますファイル。 「player_turn」は、移動中の現在のプレーヤー(「X」または「O」)を示します。 「slots_free」は、空きスロットがいくつ残っているかを知るためのカウンターです。 「winner_player」は、誰が勝者であるか、またはゲームが引き分けであるかどうかを示します。 「slot_status」配列は、各スロットの現在のステータスを保存するために担当します U8 i, player_turn=0, slots_free=9, winner_player=0; const U32 player_colors[] = {GUI_RED, GUI_BLUE}; 列挙型 {SLOT_FREE, SLOT_X, SLOT_O, SLOT_LOCK}; U8 slot_status[] = {SLOT_FREE, SLOT_FREE, SLOT_FREE, SLOT_FREE、SLOT_FREE、SLOT_FREE、 SLOT_FREE、SLOT_FREE、SLOT_FREE}; 10) また、すべての可能なスロットの組み合わせをチェックして、勝者を定義するか、試合が引き分けかを定義する機能も実装されました。それは機能「CheckWinner」であり、「emwin_tictactoe.c」でckechされる可能性があります添付ファイルのファイルには、Tic-Tac-Toe デモを実行するために必要なすべての変更がすでに含まれています。また、その関数プロトタイプを「emwin_tictactoe.c」の「プロトタイプ」セクションに追加する必要がありますファイル。 11) 基本的に、ほとんどすべてのゲームの仕組みは、9x9 Buttons ウィジェットの "WM_NOTIFICATION_CLICKED" イベントによって定義されるため、"_cbDialog" 関数内に実装されます。以下に "ID_BUTTON_0" のコードを示します。赤い ハイライト は、各ボタンイベントで何が変わるかを示しています。 case ID_BUTTON_0: // 'Button' から送信される通知 スイッチ(NCode) { ケースWM_NOTIFICATION_CLICKED: USER START(オプションで通知メッセージに反応するコードを挿入) if (slot_status[0] == SLOT_FREE){ hItem = WM_GetDialogItem(pMsg->hWin, ID_BUTTON_0); BUTTON_SetTextColor(hItem, 0, player_colors[player_turn]); if (!player_turn){ BUTTON_SetText(hItem, "X"); slot_status[0] = SLOT_X; } それ以外の場合{ BUTTON_SetText(hItem, "O"); slot_status[0] = SLOT_O; } player_turn ^= 1; slots_free--; } ユーザーエンド 壊す; 12)再起動ボタンの場合、実装されたロジックは、すべてのスロットステータスを「空き」に戻したり、すべてのスロットの内容を消去したり、空きスロットのカウンターを9に再起動したりする役割を果たします。 13) すべてのGUIウィジェットイベントをポーリングした後、「CheckWinner」関数が呼び出され、勝者が定義され、元々空だった「Text_Winner」ウィジェット(画面の左上隅)に示されます。 14) また、移動中のプレーヤーが誰であるかに応じて、Cross/Circle アイコンの周囲に緑色の長方形を直接描画する機能 (emWin Draw 関数を使用) も実装されています (最後に "_cbDialog" 関数内にも実装されています)。 移動中のプレイヤーを示す緑色の長方形を描画します if (!player_turn) { GUI_SetColor(GUI_GREEN); GUI_DrawRoundedFrame(6、106、83、183、0、4); GUI_SetColor(GUI_BLACK); GUI_DrawRoundedFrame(6、186、83、263、0、4); } 然も無くば { GUI_SetColor(GUI_GREEN); GUI_DrawRoundedFrame(6、186、83、263、0、4); GUI_SetColor(GUI_BLACK); GUI_DrawRoundedFrame(6、106、83、183、0、4); } 15) 最後に、GUIを初期化する直前に、ウェルカムメッセージ付きのprintfが「main」 機能に追加されました。 PRINTF("三目並べのデモ i.MXRT1060.\r\n"); 5. 機能デモンストレーション   以下は、実行中のアプリケーションのキャプチャ、Cross が勝ったとき、Circle が勝ったとき、および試合が引き分けになったときのキャプチャを示しています。  
記事全体を表示
CTE on S32R274 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Hi コードを MPC5775K から S32R274 に移行します。 S32R274 EVB with S32 Design Studio for Power Architecture Version 2.1でテスト済み。     Unzip password: nxp 乾杯 オリバー
記事全体を表示
LPC804: PLU Hands-on Lab Guide <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> コミュニティの皆さん、こんにちは! このドキュメントは、ハンズオンラボガイドとして提供されています。このラボの目的は、SDK サンプルと PLU モジュール ドライバを使用して、MCUXpresso IDE で LPCXpresso804 ボードをプログラムする方法を示すことです。 PLU コンフィギュレーション ツールを使用して、PLU にプログラムされる新しい回路図デザインを作成します。 セットアップ ラボを完了するには、次の項目をコンピューターにインストールする必要があります。 ソフトウェア: •    SDK_2.4.1_LPCXpresso804: - リンクをブラウザにコピー: https://mcuxpresso.nxp.com/en/select?device=LPCXpresso804 - [ツールチェーンIDE]ドロップダウンで[MCUXpresso IDE]または[すべてのツールチェーン]を選択します - 「Download SDK」を選択します。 • MCUXpresso IDE バージョン 10.2.1: - 次のリンクからインストールできます: https://www.nxp.com/mcuxpresso/ide • PLU 設定ツール - 次のリンクからインストールできます: https://www.nxp.com/products/processors-and-microcontrollers/arm-based-processors-and-mcus/i.mx-applications-processors/i.mx-rt-series/i.mx-rt1060-crossover-processor-with-arm-cortex-m7-core:i.MX-RT1060?tab=Design_Tools_Tab   ハードウェア: •  LPCXpresso804開発ボード(OM40001): https://www.nxp.com/support/developer-resources/evaluation-and-development-boards/lpcxpresso-boards/lpcxpresso804-for-the-lpc804-family-of-mcus:OM40001?tab=Design_Tools_Tab • PLUシールドボード •1マイクロUSBケーブル このガイドがお役に立てば幸いです。どんなコメントでも大歓迎です。 よろしくお願いいたします カルロス・メンドーサ テクニカルサポートエンジニア LPC800 ペリフェラル
記事全体を表示
i.MX6 Android R13.4.1に基づくPORリブートのリカバリモードをサポートする方法 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Overview このドキュメントの目的は、MX6 Android R13.4.1に基づくPORリブートイベントのリカバリモードをサポートする方法を紹介することです。 バックグラウンド Android R13.4.1をMX6 SabreSDボードで起動した場合、再起動の理由はWatchdogです。ただし、再起動の理由がウォッチドッグからPORに変更された場合、工場出荷時のリセット後にリカバリモードに入るのに失敗します。 R13.4.1 では、SRC_GPR10 のビット 8 がリカバリ モードの永続ビットとして使用されます。このビットは、U-boot がこのビットを使用してどのモードに入るべきかを区別できるように、再起動後も保持されることが期待されます。ただし、すべての SRC レジスタは、i.MX6DQRM セクション 59.4.1.2.3 IPP_RESET_B (POR) に従って POR シーケンスでリセットされます。したがって、再起動の理由が POR の場合、ソフトウェアが再起動前に設定した場合でも、リカバリ モードの永続ビットはクリアされます。これにより、ブートローダーは再起動後にリカバリモードに入らなくなります。 ソフトウェアの変更 i.MX6DQRMによると、SNVS_LP汎用レジスタは32ビットのリードライトレジスタを提供し、パワーダウンモード中に32ビットデータを保持するために任意のアプリケーションで使用できます。したがって、POR イベントのリカバリ モードをサポートするために、SNVS_LP レジスタを使用してリカバリ モードの永続ビットを格納できます。適用するには、以下の変更が必要です(patches.tar.gz参照) Ubootパッチbootable/bootloader/uboot-imx/0001-ENGR00235817-mx6-use-SNVS-LPGPR-register-to-store-bo.patchを申請してください。 差分 --git a/cpu/arm_cortexa8/mx6/generic.cb/cpu/arm_cortexa8/mx6/generic.c インデックス257c930..BD47130 100644 --- a/cpu/arm_cortexa8/mx6/generic.c +++ b/cpu/arm_cortexa8/mx6/generic.c @@ -1146,14 +1146,14 @@ int check_and_clean_recovery_flag(ボイド) {   int flag_set = 0;   u32 reg; - reg = readl(SRC_BASE_ADDR + SRC_GPR10); + reg = readl(SNVS_BASE_ADDR + SNVS_LPGPR); flag_set=!!(reg & ANDROID_RECOVERY_BOOT); /* ここで無限にループする場合に備えて清掃してください.... */ if(flag_set){ reg &= ~ANDROID_RECOVERY_BOOT; - writel(reg, SRC_BASE_ADDR + SRC_GPR10); + writel(reg, SNVS_BASE_ADDR + SNVS_LPGPR);   } flag_setを返します。 @@ -1168,14 +1168,15 @@ int fastboot_check_and_clean_flag(無効) {   int flag_set = 0;   u32 reg; - reg = readl(SRC_BASE_ADDR + SRC_GPR10); + + reg = readl(SNVS_BASE_ADDR + SNVS_LPGPR);   flag_set = !!(reg & ANDROID_FASTBOOT_BOOT); /* ここで無限にループする場合に備えて清掃してください.... */ if(flag_set){    reg &= ~ANDROID_FASTBOOT_BOOT; - writel(reg, SRC_BASE_ADDR + SRC_GPR10); + writel(reg, SNVS_BASE_ADDR + SNVS_LPGPR);   } flag_setを返します。 差分 --git a/include/asm-arm/arch-mx6/mx6.hb/include/asm-arm/arch-mx6/mx6.h index efb90c2..45381e2 100644 --- a/include/asm-arm/arch-mx6/mx6.h +++ b/include/asm-arm/arch-mx6/mx6.h @@ -732,6 +732,8 @@ #define SRC_GPR9 0x40 #define SRC_GPR10 0x44 +#define SNVS_LPGPR 0x68 + /* ボードIDを取得 */ #define board_is_rev(system_rev, rev) (((system_rev & 0x0F00) == rev) ? 1 : 0) #define chip_is_type(system_rev、rev)\ カーネルパッチ kernel_imx/0001-ENGR00235817-mx6-use-SNVS-LPGPR-register-to-store-bo.patch の適用 差分 --git a/arch/arm/mach-mx6/system.cb/アーチ/arm/mach-MX6/system.c インデックス6d24f22..61649c5 100644 --- a/arch/arm/mach-MX6/system.c +++ b/arch/arm/mach-MX6/system.c @@ -563,7 +563,7 @@ void mxc_clear_mfgmode(void) #endif #ifdef CONFIG_MXC_REBOOT_ANDROID_CMD -/* この機能は、入力するSRC_GPR10[7-8]ビットにビットを設定します +/* この機能は、入力するSNVS_LPGPR[7-8]ビットにビットを設定します *特別なブートモード。これらのビットはウォッチドッグリセットではクリアされないため、 * ブートローダーで確認して、別のモードに入ることを選択できます。 @@ -574,18 +574,18 @@ ボイド do_switch_recovery(ボイド) {   u32 reg; - reg = __raw_readl(SRC_BASE_ADDR + SRC_GPR10); + reg = __raw_readl(MX6Q_SNVS_BASE_ADDR + SNVS_LPGPR); reg |= ANDROID_RECOVERY_BOOT; - __raw_writel(reg、SRC_BASE_ADDR + SRC_GPR10); + __raw_writel(reg, MX6Q_SNVS_BASE_ADDR + SNVS_LPGPR); } ボイドdo_switch_fastboot(ボイド) {   u32 reg; - reg = __raw_readl(SRC_BASE_ADDR + SRC_GPR10); + reg = __raw_readl(MX6Q_SNVS_BASE_ADDR + SNVS_LPGPR);   reg |= ANDROID_FASTBOOT_BOOT; - __raw_writel(reg、SRC_BASE_ADDR + SRC_GPR10); + __raw_writel(reg, MX6Q_SNVS_BASE_ADDR + SNVS_LPGPR); } #endif 差分 --git a/arch/arm/plat-mxc/include/mach/mx6.hb /アーチ/アーム/プラット-mxc /インクルード/マッハ/mx6.h index 48b04b1..bb22de0 100644 --- a/arch/arm/plat-mxc/include/mach/mx6.h +++ b/arch/arm/plat-mxc/include/mach/mx6.h @@ -302,6 +302,8 @@ #define SRC_GPR9 0x40 #define SRC_GPR10 0x44 +#define SNVS_LPGPR 0x68 + /* GPCオフセット */ #define MXC_GPC_CNTR_OFFSET 0x0 Android i.MX6_All
記事全体を表示
Hands-On i.MX 8M Mini Lab Guide <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 从 i.MX 8M Mini EVK 开始实践,我们将介绍开箱即用的支持,包括软件、工具、硬件设计指南和演示软件。参加者在完成本课程后应该能够自信地使用 i.MX 8M Mini 开始自己的设计。 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 从 i.MX 8M Mini EVK 开始实践,我们将介绍开箱即用的支持,包括软件、工具、硬件设计指南和演示软件。参加者在完成本课程后应该能够自信地使用 i.MX 8M Mini 开始自己的设计。 i.MX 应用处理器
記事全体を表示
Wandboard - フリースケールi.MX6 Cortex-A9プロセッサを搭載した超低消費電力、高性能、低コストの開発ボード <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Wandboardは 、新しい近日発売予定のFreescale i.MX6 Cortex-A9プロセッサをベースにした高性能マルチメディア機能を備えた超低電力の完全なコンピュータで、まばゆいばかりの1GHzプロセッサ、HDMIディスプレイインターフェイス、ギガビットイーサネットが付属しています。Wandboard(Wandboard DUAL)のデュアルコアバージョンは、1GBのメモリを搭載するだけでなく、Wi-FiとBluetoothも搭載しています。     Wandboard Solo Wandboard Dual プロセッサ フリースケールi.MX6 Solo フリースケールi.MX6 Duallite Cores Cortex-A9シングルコア Cortex-A9デュアルコア メモリ 512 MB DDR3 1 GB DDR3 オーディオ • • オプティカル S/PDIF • • HDMI • • カメラ・インターフェース • • microSDカード・スロット 2 2 シリアルポート • • 拡張ヘッダー • • USB • • USB OTG • • SATAコネクタ 入力されていません 入力されていません Gigabit LAN • • WI-FI(802.11n) • Bluetooth • 69米ドル 89米ドル   www.wandboard.org 担当者 : [email protected] 全般 Re:Wandboard - フリースケールi.MX6 Cortex-A9プロセッサを搭載した超低電力高性能低コスト開発ボード <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> こんにちは、Wanboard Quad BoardにはいくつのPCBレイヤーがあるのか知りたいのですが?私はただ将来のカスタム開発に関連して興味がありますか?どなたかこの情報を持っていただけると幸いです。 Re:Wandboard - フリースケールi.MX6 Cortex-A9プロセッサを搭載した超低電力高性能低コスト開発ボード <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> hi, 私はこのボードをTenet Technetronics.itsから入手しました.それはうまく動作し、Jelly BeanとUbuntuはこのボード上でスムーズに実行されています。
記事全体を表示
コネクティビティソフトウェア: FreeRTOS でティックレスモードを実装 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> FreeRTOS は、ティックをカウントすることで、システム内の経過時間を追跡します。ティック・カウントは、ホストMCUで使用可能なタイマーの1つによって生成される定期的な割り込みルーチン内で増加します。FreeRTOS がアイドルタスクフックを実行している場合、マイクロコントローラを低電力モードにすることができます。低電力モードに応じて、1つ以上の周辺機器を無効にして、可能な限り最大限のエネルギーを節約できます。FreeRTOS ティックレスアイドルモードでは、アイドル期間中のティック中断を停止できます。ティック割込みを停止すると、ウェイクアップ・イベントが発生するまで、マイクロコントローラは大幅な省電力状態を維持できます。 アプリケーションは、次のFreeRTOSタスクを実行する前にマイクロコントローラをウェイクアップするモジュール(タイマー、ADCなど)を構成する必要があります。そのため、tickless idleが有効な場合にFreeRTOSが呼び出す関数であるvPortSuppressTicksAndSleepの実行中に、ウェイクアップモジュールを適切に設定するために、MCUがスリープ状態を維持できる最大時間を入力パラメータとして渡します。MCUがウェイクアップし、FreeRTOSのティック割り込みが再開されると、MCUがスリープ状態の間に失われたティックカウントの数を元に戻す必要があります。 ティックレスモードは、接続ソフトウェア FreeRTOS デモではデフォルトでは有効になっていません。この投稿では、有効にする方法 説明します。この例では、QN9080x を使用して実装を示します。 低電力 FreeRTOS ティックレス ダニ無し 変更は、次のファイルに実装されています。 \フレームワーク\LowPower\ソース\QN908XC\PWR.c \framework\LowPower\Interface\QN908XC\PWR_Interface.h \フリートス\fsl_tickless_generic.h \ソース\共通\ApplMain.c 次のファイルがプロジェクトから削除されました fsl_tickless_qn_rtc.c PWRです。C および PWR_Interface.h このファイルの変更は、RTC タイマーを使用して QN9080 をウェイクアップするための準備を目的としています。MKW41Z などの他のパーツは、この目的のために他のモジュール (LPTMR など) を有効にする場合があり、このファイルを変更する必要がない場合があります。 *** PWR.c *** RTC用のドライバを追加します。これは、QN908xをウェイクアップするために使用するタイマーです /*Tickless: Add RTC driver for tickless support */ #include "fsl_rtc.h"‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍ ローカル変数の追加 uint64_t mLpmTotalSleepDuration;        //Tickless uint8_t mPWR_DeepSleepTimeUpdated = 0;  //Tickless: Coexistence with TMR manager‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍ プライベート機能を追加する uint32_t PWR_RTCGetMsTimeUntilNextTick (void);         //Tickless void PWR_RTCSetWakeupTimeMs (uint32_t wakeupTimeMs);   //Tickless void PWR_RTCWakeupStart (void);                        //Tickless‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍ PWR.C.で次の変更を行います。必要なすべての変更は、変更の開始位置で "Start" と、変更の終了位置で "End" というコメントとしてマークされます #if (cPWR_UsePowerDownMode && (cPWR_EnableDeepSleepMode_1 || cPWR_EnableDeepSleepMode_2 || cPWR_EnableDeepSleepMode_3 || cPWR_EnableDeepSleepMode_4)) static void PWR_HandleDeepSleepMode_1_2_3_4(void) { #if cPWR_BLE_LL_Enable     uint8_t   power_down_mode = 0xff;     bool_t    enterLowPower = TRUE;     __disable_irq(); /****************START***********************************/     /*Tickless: Configure wakeup timer */     if(mPWR_DeepSleepTimeUpdated){       PWR_RTCSetWakeupTimeMs(mPWR_DeepSleepTimeMs);       mPWR_DeepSleepTimeUpdated = FALSE;        // Coexistence with TMR Manager     }         PWR_RTCWakeupStart(); /*****************END**************************************/     PWRLib_ClearWakeupReason();     //Try to put BLE in deep sleep mode     power_down_mode = BLE_sleep();     if (power_down_mode < kPmPowerDown0)     {         enterLowPower = false; // BLE doesn't allow deep sleep     }     //no else - enterLowPower is already true     if(enterLowPower)     { /****************START**************************/         uint32_t freeRunningRtcPriority; /****************END****************************/         NVIC_ClearPendingIRQ(OSC_INT_LOW_IRQn);         NVIC_EnableIRQ(OSC_INT_LOW_IRQn);         while (SYSCON_SYS_STAT_OSC_EN_MASK & SYSCON->SYS_STAT) //wait for BLE to enter sleep         {             POWER_EnterSleep();         }         NVIC_DisableIRQ(OSC_INT_LOW_IRQn);         if(gpfPWR_LowPowerEnterCb != NULL)         {             gpfPWR_LowPowerEnterCb();         } /* Disable SysTick counter and interrupt */         sysTickCtrl = SysTick->CTRL & (SysTick_CTRL_ENABLE_Msk | SysTick_CTRL_TICKINT_Msk);         SysTick->CTRL &= ~(SysTick_CTRL_ENABLE_Msk | SysTick_CTRL_TICKINT_Msk);         ICSR |= (1 << 25); // clear PendSysTick bit in ICSR, if set /************************START***********************************/         NVIC_ClearPendingIRQ(RTC_FR_IRQn);         freeRunningRtcPriority = NVIC_GetPriority(RTC_FR_IRQn);         NVIC_SetPriority(RTC_FR_IRQn,0); /***********************END***************************************/         POWER_EnterPowerDown(0); //Nighty night! /************************START**********************************/         NVIC_SetPriority(RTC_FR_IRQn,freeRunningRtcPriority); /************************END************************************/         if(gpfPWR_LowPowerExitCb != NULL)         {             gpfPWR_LowPowerExitCb();         }         /* Restore the state of SysTick */         SysTick->CTRL |= sysTickCtrl;         PWRLib_UpdateWakeupReason();     }     __enable_irq(); #else     PWRLib_ClearWakeupReason(); #endif /* cPWR_BLE_LL_Enable */ } #endif /* (cPWR_UsePowerDownMode && cPWR_EnableDeepSleepMode_1) */ ‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍ void PWR_SetDeepSleepTimeInMs(uint32_t deepSleepTimeMs) { #if (cPWR_UsePowerDownMode)     if(deepSleepTimeMs == 0)     {         return;     }     mPWR_DeepSleepTimeMs = deepSleepTimeMs; /****************START******************/     mPWR_DeepSleepTimeUpdated = TRUE; /****************END*********************/ #else     (void) deepSleepTimeMs; #endif /* (cPWR_UsePowerDownMode) */ }‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍ ファイルの最後にある次の関数定義を追加/置換します /*--------------------------------------------------------------------------- * Name: PWR_GetTotalSleepDurationMS * Description: - * Parameters: - * Return: - *---------------------------------------------------------------------------*/ uint32_t PWR_GetTotalSleepDurationMS(void) {     uint32_t time;     uint32_t currentSleepTime;     OSA_InterruptDisable();     currentSleepTime = RTC_GetFreeRunningInterruptThreshold(RTC);     if(currentSleepTime >= mLpmTotalSleepDuration){     time = (currentSleepTime-mLpmTotalSleepDuration)*1000/CLOCK_GetFreq(kCLOCK_32KClk);     }     else{     time = ((0x100000000-mLpmTotalSleepDuration)+currentSleepTime)*1000/CLOCK_GetFreq(kCLOCK_32KClk);     }     OSA_InterruptEnable();     return time; } /*--------------------------------------------------------------------------- * Name: PWR_ResetTotalSleepDuration * Description: - * Parameters: - * Return: - *---------------------------------------------------------------------------*/ void PWR_ResetTotalSleepDuration(void) {     OSA_InterruptDisable();     mLpmTotalSleepDuration = RTC_GetFreeRunningCount(RTC);     OSA_InterruptEnable(); } /*--------------------------------------------------------------------------- * Name: PWR_RTCGetMsTimeUntilNextTick * Description: - * Parameters: - * Return: Time until next tick in mS *---------------------------------------------------------------------------*/ uint32_t PWR_RTCGetMsTimeUntilNextTick (void) {     uint32_t time;     uint32_t currentRtcCounts, thresholdRtcCounts;     OSA_InterruptDisable();     currentRtcCounts = RTC_GetFreeRunningCount(RTC);     thresholdRtcCounts = RTC_GetFreeRunningResetThreshold(RTC);     if(thresholdRtcCounts > currentRtcCounts){     time = (thresholdRtcCounts-currentRtcCounts)*1000/CLOCK_GetFreq(kCLOCK_32KClk);     }     else{     time = ((0x100000000-currentRtcCounts)+thresholdRtcCounts)*1000/CLOCK_GetFreq(kCLOCK_32KClk);     }     OSA_InterruptEnable();     return time; } /*--------------------------------------------------------------------------- * Name: PWR_RTCSetWakeupTimeMs * Description: - * Parameters: wakeupTimeMs: New wakeup time in milliseconds * Return: - *---------------------------------------------------------------------------*/ void PWR_RTCSetWakeupTimeMs (uint32_t wakeupTimeMs){     uint32_t wakeupTimeTicks;     uint32_t thresholdValue;     wakeupTimeTicks = (wakeupTimeMs*CLOCK_GetFreq(kCLOCK_32KClk))/1000;     thresholdValue = RTC_GetFreeRunningCount(RTC);     thresholdValue += wakeupTimeTicks;     RTC_SetFreeRunningInterruptThreshold(RTC, thresholdValue); } /*--------------------------------------------------------------------------- * Name: PWR_RTCWakeupStart * Description: - * Parameters: - * Return: - *---------------------------------------------------------------------------*/ void PWR_RTCWakeupStart (void){   if(!(RTC->CNT2_CTRL & RTC_CNT2_CTRL_CNT2_EN_MASK)){     RTC->CNT2_CTRL |= 0x52850000 | RTC_CNT2_CTRL_CNT2_EN_MASK | RTC_CNT2_CTRL_CNT2_WAKEUP_MASK | RTC_CNT2_CTRL_CNT2_INT_EN_MASK;   }   else{     RTC->CNT2_CTRL |= 0x52850000 | RTC_CNT2_CTRL_CNT2_WAKEUP_MASK | RTC_CNT2_CTRL_CNT2_INT_EN_MASK;   } } ‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍ PWR_Interface.h *** ファイルの末尾に次の関数宣言を追加します /*--------------------------------------------------------------------------- * Name: PWR_GetTotalSleepDurationMS * Description: - * Parameters: - * Return: - *---------------------------------------------------------------------------*/ uint32_t PWR_GetTotalSleepDurationMS(void); /*--------------------------------------------------------------------------- * Name: PWR_ResetTotalSleepDuration * Description: - * Parameters: - * Return: - *---------------------------------------------------------------------------*/ void PWR_ResetTotalSleepDuration(void); #ifdef __cplusplus } #endif #endif /* _PWR_INTERFACE_H_ */ ‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍ FSL_TICKLESS_GENERIC 次の変更は、低電力期間中に欠落したティックを回復するためにシステムを準備することを目的としています。 fsl_tickless_generic.h で次の変更を行います。必要なすべての変更は、変更の開始位置で "Start" と、変更の終了位置で "End" というコメントとしてマークされます /* QN_RTC: The RTC free running is a 32-bit counter. */ #define portMAX_32_BIT_NUMBER (0xffffffffUL) #define portRTC_CLK_HZ (0x8000UL) /* A fiddle factor to estimate the number of SysTick counts that would have occurred while the SysTick counter is stopped during tickless idle calculations. */ #define portMISSED_COUNTS_FACTOR (45UL) /* * The number of SysTick increments that make up one tick period. */ /****************************START**************************/ #if configUSE_TICKLESS_IDLE == 1     static uint32_t ulTimerCountsForOneTick; #endif /* configUSE_TICKLESS_IDLE */ /************************END*********************************/ /* * Setup the timer to generate the tick interrupts. */ void vPortSetupTimerInterrupt(void); #ifdef __cplusplus } #endif #endif /* FSL_TICKLESS_GENERIC_H */ ‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍ ApplMain.c これがメインのアプリケーションファイルです。ここでは、適切なAPIを呼び出して、低電力モードでMCUに入り、ティックリカバリシーケンスを実行します。 必要なRTCおよびFreeRTOSヘッダーファイルを含める /*Tickless: Include RTC and FreeRTOS header files */ #include "fsl_rtc.h" #include "fsl_tickless_generic.h" #include "FreeRTOS.h" #include "task.h"‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍ QN9080には、いくつかの低電力モードが含まれています。スリープモードでは、ほとんどのモジュールがアクティブに保たれます。パワーダウンモードでは、ほとんどのモジュールがオフになりますが、必要に応じてMCUをウェイクアップするために、一部のモジュールをアクティブなままに構成できます。ティックレス FreeRTOS を使用すると、次の準備完了タスクが実行される前に、何らかのタイマーでウェイクアップする必要があります。QN908xの場合、このタイマーはRTCであり、32.768kHz発振器がアクティブ状態を維持する必要があります。コネクティビティソフトウェアのPower Libを、32.768kHzの発振器をオンに維持するディープスリープモード3(QN908xの場合はPower Downモード0)を使用するように変更します。この変更は、 main_task 関数に実装されています。 #if !defined(MULTICORE_BLACKBOX)         /* BLE Host Stack Init */         if (Ble_Initialize(App_GenericCallback) != gBleSuccess_c)         {             panic(0,0,0,0);             return;         } #endif /* MULTICORE_BLACKBOX */ /*************** Start ****************/ #if (cPWR_UsePowerDownMode)     PWR_ChangeDeepSleepMode(3); #endif /*************** End ****************/     }         /* Call application task */     App_Thread( param ); }‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍ また、ティックレスFreeRTOSには、次のタスクを実行する前にMCUがスリープ状態を維持できるRTOSティックの量を入力パラメータとして取る特別なアイドル関数が必要です。次の変更により、ティックレス モードが有効になっている場合、接続ソフトウェアのデモで提供されるデフォルトのアイドル機能が無効になります。 /************************************************************************************ ************************************************************************************* * Private prototypes ************************************************************************************* ************************************************************************************/ #if (cPWR_UsePowerDownMode || gAppUseNvm_d) #if (mAppIdleHook_c)     #define AppIdle_TaskInit()     #define App_Idle_Task() #else #if (!configUSE_TICKLESS_IDLE)     static osaStatus_t AppIdle_TaskInit(void);     static void App_Idle_Task(osaTaskParam_t argument); #endif // configUSE_TICKLESS_IDLE #endif #endif‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍ /************************************************************************************ ************************************************************************************* * Private memory declarations ************************************************************************************* ************************************************************************************/ /******************************** Start ******************************/ #if ((cPWR_UsePowerDownMode || gAppUseNvm_d) && !configUSE_TICKLESS_IDLE) /******************************** End ******************************/ #if (!mAppIdleHook_c) OSA_TASK_DEFINE( App_Idle_Task, gAppIdleTaskPriority_c, 1, gAppIdleTaskStackSize_c, FALSE ); osaTaskId_t gAppIdleTaskId = 0; #endif #endif  /* cPWR_UsePowerDownMode */‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍ #if !gUseHciTransportDownward_d         pfBLE_SignalFromISR = BLE_SignalFromISRCallback; #endif /* !gUseHciTransportDownward_d */ /**************************** Start ************************/ #if ((cPWR_UsePowerDownMode || gAppUseNvm_d) && !configUSE_TICKLESS_IDLE) /**************************** End ************************/ #if (!mAppIdleHook_c)         AppIdle_TaskInit(); #endif #endif‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍ /***************************START**************************/ #if (cPWR_UsePowerDownMode && !configUSE_TICKLESS_IDLE) /******************************END***************************/ static void App_Idle(void) {     PWRLib_WakeupReason_t wakeupReason;     if( PWR_CheckIfDeviceCanGoToSleep() )     {         /* Enter Low Power */         wakeupReason = PWR_EnterLowPower(); #if gFSCI_IncludeLpmCommands_c         /* Send Wake Up indication to FSCI */         FSCI_SendWakeUpIndication(); #endif #if gKBD_KeysCount_c > 0         /* Woke up on Keyboard Press */         if(wakeupReason.Bits.FromKeyBoard)         {             KBD_SwitchPressedOnWakeUp();             PWR_DisallowDeviceToSleep();         } #endif     }     else     {         /* Enter MCU Sleep */         PWR_EnterSleep();     } } #endif /* cPWR_UsePowerDownMode */ #if (mAppIdleHook_c) void vApplicationIdleHook(void) { #if (gAppUseNvm_d)     NvIdle(); #endif /*******************************START****************************/ #if (cPWR_UsePowerDownMode && !configUSE_TICKLESS_IDLE) /*********************************END*******************************/     App_Idle(); #endif } #else /* mAppIdleHook_c */ /******************************* START ****************************/ #if ((cPWR_UsePowerDownMode || gAppUseNvm_d) && !configUSE_TICKLESS_IDLE) /******************************* END ****************************/ static void App_Idle_Task(osaTaskParam_t argument) {     while(1)     {   #if gAppUseNvm_d         NvIdle(); #endif         #if (cPWR_UsePowerDownMode)         App_Idle(); #endif         /* For BareMetal break the while(1) after 1 run */         if (gUseRtos_c == 0)         {             break;         }     } } ‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍ デフォルトのアイドル機能を無効にしたら、特別なアイドル機能を実装する必要があります。ApplMain.c の末尾に次のコードを追加しますファイル。 /*Tickless: Implement Tickless Idle */ #if (cPWR_UsePowerDownMode && configUSE_TICKLESS_IDLE) extern void vPortSuppressTicksAndSleep( TickType_t xExpectedIdleTime ) {     uint32_t time_ms = xExpectedIdleTime * portTICK_PERIOD_MS;     uint32_t tmrMgrExpiryTimeMs;     ulTimerCountsForOneTick = 160000;//VALUE OF THE SYSTICK 10 ms #if (cPWR_UsePowerDownMode)     PWRLib_WakeupReason_t wakeupReason;         //TMR_MGR: Get next timer manager expiry time     tmrMgrExpiryTimeMs = TMR_GetFirstExpireTime(gTmrAllTypes_c);     // TMR_MGR: Update RTC Threshold only if RTOS needs to wakeup earlier     if(time_ms<tmrMgrExpiryTimeMs){       PWR_SetDeepSleepTimeInMs(time_ms);     }         PWR_ResetTotalSleepDuration();     if( PWR_CheckIfDeviceCanGoToSleep() )     {         wakeupReason = PWR_EnterLowPower();                 //Fix: All the tick recovery stuff should only happen if device entered in DSM         xExpectedIdleTime = PWR_GetTotalSleepDurationMS() / portTICK_PERIOD_MS;     // Fix: ticks = time in mS asleep / mS per each tick (portTICK_PERIOD_MS)         /* Restart SysTick so it runs from portNVIC_SYSTICK_LOAD_REG         again, then set portNVIC_SYSTICK_LOAD_REG back to its standard         value. The critical section is used to ensure the tick interrupt         can only execute once in the case that the reload register is near         zero. */         portNVIC_SYSTICK_CURRENT_VALUE_REG = 0UL;         portENTER_CRITICAL();         portNVIC_SYSTICK_CTRL_REG |= portNVIC_SYSTICK_ENABLE_BIT;         vTaskStepTick( xExpectedIdleTime );         portNVIC_SYSTICK_LOAD_REG = ulTimerCountsForOneTick - 1UL;         portEXIT_CRITICAL(); #if gKBD_KeysCount_c > 0         /* Woke up on Keyboard Press */         if(wakeupReason.Bits.FromKeyBoard)         {           KBD_SwitchPressedOnWakeUp();           PWR_DisallowDeviceToSleep();         } #endif     }     else     {       /* Enter MCU Sleep */       PWR_EnterSleep();     } #endif /* cPWR_UsePowerDownMode */ } #endif  //cPWR_UsePowerDownMode && configUSE_TICKLESS_IDLE ‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍ 前の関数から、ulTimerCountsForOneTick の値を使用して、ウェイクアップ後に RTOS ティック タイマーのカウントを復元します。この値は、FreeRTOSConfig.h で定義されている RTOS ティック間隔によって異なりますは、次の式を使用して計算されます。 SYST_RNR = F_Systick_CLK(Hz) * T_FreeRTOS_Ticks(ms) ここで、 F_Systick_CLK(Hz)= AHBまたはSYST_CSR選択の32KHz T_FreeRTOS_Ticks(ms) = ティックカウント値。 FreeRTOSConfig.h 最後に、FreeRTOSConfig.h でファイルで、configUSE_TICKLESS_IDLE が 1 に設定されていることを確認します * See http://www.freertos.org/a00110.html. *----------------------------------------------------------*/ #define configUSE_PREEMPTION                    1 #define configUSE_TICKLESS_IDLE                 1 //<--- /***** Start *****/ #define configCPU_CLOCK_HZ                      (SystemCoreClock) #define configTICK_RATE_HZ                      ((TickType_t)100) #define configMAX_PRIORITIES                    (18) #define configMINIMAL_STACK_SIZE                ((unsigned short)90)‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍ ティックレスRTOSのテスト ティックレス サポートが正常に追加されたかどうかをテストするために、LED を切り替えるサンプル アプリケーションが実装されています。このアプリケーションは、500mSごとにLEDを切り替え、アイドル時間中にDSM3にMCUに入るようにRTOSタイマを設定します。この目的のために、Power Profiling デモが使用されました。 power_profiling.c 次のヘッダー ファイルが含まれていることを確認します #include "FreeRTOS.h" #include "task.h"‍‍‍‍ 500mSごとにLEDを点滅させるRTOSタスクを作成します。まず、タスク関数、タスクID、およびタスク自体を宣言します。 void vfnTaskLedBlinkTest(void* param); //New Task Definition OSA_TASK_DEFINE(vfnTaskLedBlinkTest, 1, 1, 500, FALSE ); osaTaskId_t gAppTestTask1Id = 0; // TestTask1 Id‍‍‍‍‍‍ BleApp_Init関数内に新しいタスクを作成します void BleApp_Init(void) {     PWR_AllowDeviceToSleep();     mPowerState = 0;   // Board starts with PD1 enabled     /******************* Start *****************/     gAppTestTask1Id = OSA_TaskCreate(OSA_TASK(vfnTaskLedBlinkTest), NULL); //Task Creation     /*******************  End  *****************/ }‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍ 最後に、タスク関数定義をファイルの最後に追加します。 void vfnTaskLedBlinkTest(void* param) {     uint16_t wTimeValue = 500; //500ms     while(1)     {         LED_BLUE_TOGGLE();         vTaskDelay(pdMS_TO_TICKS(wTimeValue));     } }‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍ MCUXpresso IDE の電力消費は、 Power Measurement Tool を使用して監視できます。これにより、消費された電流を確認し、実装が期待どおりに機能していることを証明できます。 電力測定ツールを構成する 消費電流 BLEソフトウェア Re:コネクティビティソフトウェア:FreeRTOSでティックレスモードを実装する <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 電力プロファイルは、ティックレスモードやベアボードモードでも、妥当な消費電力に達する可能性があります。 ただし、1つのトラップがあり、注意が必要です。 電源モードPD1から回復すると、スリープ前に32K OSCを閉じたティックレスアイドルタスクで、電源 PWRLib_LPTMR_Stopない周辺機器を操作するためにクラッシュします。 電源モードがPD0の場合、OSCが動作し、スリープ中に電源が供給されたままになっている場合に問題は発生しませんでした。 修正方法: PD1またはPD0からの回復を判断します。 Re:コネクティビティソフトウェア:FreeRTOSでティックレスモードを実装する <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 温度センサーの例は、ティックレスモードで動作するようです。 ただし、パワープロファイルの例に比べてスリープ消費量がわずかに多くなります Re:コネクティビティソフトウェア:FreeRTOSでティックレスモードを実装する <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> ティックレスフリートスと低電力動作をテストするには、どの例を使用するのが最適ですか? Re:コネクティビティソフトウェア:FreeRTOSでティックレスモードを実装する <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Hi: 最新のSDK v2.2はfreertosのticklessをサポートしており、app_preinclude.hで以下のマクロを有効にする必要があります configUSE_TICKLESS_IDLE:为1 以下定义用于计算tickless消逝时间 /* PD1ではRTCが動作していないため、PWRモジュールでRTC関連コードを無効にします */ #define cPWR_EnableLpTmrRunning 1 #define cPWR_EnablePD0RtcInterrupt 1
記事全体を表示
FTF-DES-F1149.pdf <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 在本次研讨会上,我们将深入探讨 Kinetis Design Studio IDE 的高级用法,包括如何将其与版本控制系统一起使用、自动化构建和调试会话。此外,了解如何生成覆盖范围并分析您的应用程序。 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 在本次研讨会上,我们将深入探讨 Kinetis Design Studio IDE 的高级用法,包括如何将其与版本控制系统一起使用、自动化构建和调试会话。此外,了解如何生成覆盖范围并分析您的应用程序。
記事全体を表示
人工智能和机器学习课程#4:使用S32V处理器的CNN <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 在本文中,我们将讨论以下主题: 如何配置 SBC S32V234 板以准备部署 CNN CNN 开发对主机电脑有什么要求 如何在 MATLAB 中使用预先训练的 CNN 模型 如何在 NXP S32V 微处理器上运行 MATLAB CNN 1.引言 可以使用NXP Vision Toolbox在 NXP 专有板上部署 MATLAB 脚本。工具箱提供的实用程序绕过了所有必须进行的硬件配置和初始化,并可以为 MATLAB 用户提供一种在电路板上轻松开始运行自己的代码的方法,而无需了解特定的硬件和低级软件细节。它还包括一个支持卷积神经网络部署的模块,因此用户可以: 训练在 MATLAB 中开发的自己的 CNN 模型; 使用 MATLAB 预先训练的 CNN; 利用迁移学习调整预先训练的 CNN 模型来识别新物体; 我们将在下一门课程#5 中重新讨论迁移学习并涵盖更多该主题的内容。 NXP Vision Toolbox利用 MATLAB 的功能,使用 ARM Neon 技术为 CNN 生成代码,在一定程度上可以加速这些计算密集型算法。我们正在积极致力于与恩智浦的下一代机器学习软件 AIRunner 协同工作,该软件利用集成 Vision APEX 加速器的强大功能,为部署稳定、实时的对象检测、语义分割和其他有用的算法提供支持,从而改善驾驶员的驾驶体验。 2. 启动并运行 本课程假设您已在C1:硬件和软件环境设置中设置了 MATLAB 环境。为了保证文档的完整性,此处列出的步骤如下: 首先, 应 安装 NXP Vision Toolbox ,并将 Linux Yocto 发行版写入 SD 卡(可从 此处的 NXP Vision SDK 包中下载 SD 卡映像) Debian 版本也可以使用,但是需要在主板上安装一些额外的东西,并且我们当前版本的工具箱在主板上部署脚本时不会与它集成。这很可能会在下一个版本中发生变化,届时也会获得对 Debian 的开箱即用支持 将ARM 计算库下载到主机。有关 ARM 计算库的更多详细信息、它的重要性以及它的功能,请参阅: https://community.arm.com/developer/tools-software/tools/b/tools-software-ides-blog/posts/getting-started-with-deep-learning-models-on-arm-cortex-a-with-matlab ARM 计算库可以从 https://github.com/ARM-software/ComputeLibrary 下载 NXP Vision Toolbox CNN 示例是使用版本18.03构建的,因此请下载此版本以避免任何向后或向前兼容性问题 - 向下滚动直到找到二进制部分,如下图所示:   下载并解压 ARM Compute 映像后,ARM_COMPUTELIB 系统变量应指向安装文件夹的顶部: ARM Compute 库应包含具有正确库的 linux-arm-v8a-neon 文件夹: 为了能够在工具箱中运行 CNN 示例,应安装以下 MATLAB 附加组件: 深度学习工具箱 深度学习工具箱™ GoogLeNet 网络模型 深度学习工具箱™ AlexNet 网络模型 深度学习工具箱™ SqueezeNet 网络模型 适用于深度学习库的 MATLAB Coder 接口 3. 运行示例 此时, NXP Vision Toolbox应该已准备好在板上部署脚本。 如果您不熟悉配置在 NXP SBC S32V234 评估上运行的 Linux 操作系统或 Windows 操作系统中的网络配置的概念,请参阅此主题: https://community.nxp.com/docs/DOC-335345 为了将 MATLAB 中生成和编译的任何应用程序下载到 NXP 微处理器,您只需使用开发板的 IP 地址设置配置结构,然后以以下方式调用 NXP Vision Toolbox 提供的 nxpvt_codegen 脚本: 这只是一种在板上自动化部署的机制。也可以不使用配置结构中的部署选项来编译脚本。在这种情况下,生成的.elf并且应该手动将 MATLAB 为神经网络生成的二进制文件复制到开发板上。 如果编译是通过优化完成的( config.Optimize = true ),则可以在 ../ codegen/exe/SCRIPT_NAME/build-v234ce-gnu-linux-o 中找到可执行文件(.elf 文件),如果编译是通过调试完成的( config.Optimize = false ) ,则可以在 ../ codegen/exe/SCRIPT_NAME/build-v234ce-gnu-linux-d 中找到 😞 复制可执行文件后,您可以直接在codegen /文件夹中找到文件夹中的网络二进制文件。这些文件代表编译的 Makefile、类支持的标签、网络实现以及网络的层、权重和偏差。您需要复制到板上的文件是权重、偏差和平均二进制文件: 如果您使用此手动部署方法,您还必须确保使用 LD_LIBRARY_PATH 环境变量的加载器知道libarm_compute.so和libarm_compute_core.so 。您可以将其设置为指向您复制 .so 的自定义文件夹或者您可以简单地将它们复制到/lib/ 文件夹。 如果省略此步骤,我们将收到一条错误消息,指出未找到 arm_compute so: 使用nxpvt_codegen脚本进行部署将为您完成所有复制工作,无需任何额外步骤 上一门课程https://community.nxp.com/docs/DOC-343430中提供的 3 个可立即运行的示例可在NXP Vision Toolbox中部署,无需对脚本进行任何额外更改。您可以点击下面的图片进行放大,了解网络在准确性和性能方面的表现。 部署在 S32V 板上的 AlexNet 物体检测器 部署在 S32V 板上的 GoogLeNet 物体检测器                                                                                                                                           部署在 S32V 板上的SqueezeNet物体检测器 正如预期的那样,SqueezeNet 在性能方面表现最佳,并且在准确性方面也取得了相当不错的结果。要简要介绍这 3 个预训练网络,您可以查看本教程的第二门课程C2:深度学习简介。 4. 代码洞察 正如本课程前面的文章所示,在将嵌入式世界引入 MATLAB 的背景下,编写 20 多行代码(包括显示和添加注释)来将神经网络实际部署到板上的想法是有意义的。我们将使用cnn_squeezenet.m来证明使用工具箱在S32V上运行东西是多么容易: 我们首先需要将 SqueezeNet 网络对象从 MATLAB 保存到 .mat文件以便能够从中生成代码: 然后我们应该去看看cnn_squeezenet.m脚本。     我们首先创建一个输入对象,该对象使用 第 3 行 nxpvt.webcam 的 1 个参数从 MIPI-A 连接的摄像头读取数据。我们通过传递代表实际网络和网络接受的大小的已保存的 squeezenet.mat ,使用 nxpvt.CNN 对象创建 CNN。我们加载squeezenet_classes.mat使用对象的loadClassNames方法。然后我们循环从相机获取连续流,使用nxpvt.webcam的snapper()方法获取图像对象并对该图像运行预测。预测方法将按百分比的降序返回类别和百分比。 我们显示前 5 个类别,并调用nxpvt.toc()来确定预测和显示图像所需的时间(这是根据nxpvt.tic计算的调用)来计算每秒的帧数。我们完成了! 4.结论 恩智浦视觉工具箱省去了在目标系统上直接从 MATLAB 部署卷积神经网络所需的所有麻烦和额外步骤。它还允许轻松运行 MATLAB 支持的自定义网络,从而实现顺畅的集成和轻松的执行。在下一课程中,我们将重点介绍如何使用迁移学习重新训练网络。
記事全体を表示
如何获取芯片的封装信息 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Hi,  NXP 改变了文档的结构,用户可以获得相同封装的统一信息。 例如S32R系列。 1.您应该搜索数据表以获取封装类型和文档编号,作为快照 2. 在www.nxp.com上搜索文档 98ASA00081D 3.下载文件并打开检查。 您可以随意获取包裹的信息。 干杯! 奥利弗
記事全体を表示
i.MX21多媒体应用处理器 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 产品系列特性 飞思卡尔的i.MX系列应用处理器充分展示了其在便携式手持设备市场的领导地位。 i.MX21多媒体处理器是该系列产品的最新成员,并且秉承了其低功耗、高性能的传统。 飞思卡尔已经销售了超过6000万的业界开创性应用处理器。 这意味着您可以采用任何带有恩智浦技术的产品来满足您的创造性要求。 i.MX21采用运行频率至少266 MHz的高级高能效ARM926EJ-S内核,进一步扩大了Smart Speed产品系列,这个系列主要以最低功耗实现高性能处理能力。 ARM926EJ-S™ core (16 KB I-Cache, 16 KB D-Cache) Smart Speed开关 支持SVGA 16/18位彩色LCD控制器 USB OTG (双主设备端口) MPEG-4和H.263编码/解码加速高达CIF 30 fps 其他资源 IMX21-ADS I.MX21 ADS 板闪烁 IMX21 和 iMXL Lite 套件
記事全体を表示
i.MX6のガンマ補正 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> ガンマ補正 通常、ディスプレイは非線形の明るい応答を示します。たとえば、フレーム バッファー値を 100 にすると、値 200 の半分の明るさが得られることはほとんどありません。歴史的に、これはCRTモニターの物理学によるものですが、新しいディスプレイテクノロジーはその動作をエミュレートします。これは互換性のためだけでなく、人間の視覚の科学に基づく確固たる理由によるものです。 CRT の非線形性に対する 1 次近似は、次のようになります。 L = ν ^ γ ここで、Lはディスプレイからの放射輝度(光強度)、νはCRTガンに印加される電圧(通常はフレームバッファのデジタル値に比例)、γ(ギリシャ文字の「ガンマ」)はモニターに固有の定数です。未知のパラメータがすべてを機能させます。通常、約2.0から約2.5の範囲です。有用な事実の 1 つは、ガンマ曲線が対数-対数空間で線形であることです (つまり、logL を logν の関数として表し、γ はその直線の傾きにすぎません。 ガンマ補正の例 点線は線形伝達関数 (γ=1)、フレームバッファのガンマを示します。実線は、一般的な CRT の動作を示しています。破線は逆関数、補正されたガンマを表します。 DP(ディスプレイプロセッサ)を使用して i.MX のガンマを補正する方法は? ガンマ補正は、IPU内のIC(Image Converter)またはDP(Display Processor)サブブロックで行うことができます。Freescale が提供する現在の Linux カーネル (3.10) には、Display Processor ブロック上の関連するガンマ パラメータ レジスタ DP_GAMMA_C_SYNC と DP_GAMMA_S_SYNC を変更する IOCTL があります。 次の手順は、ユーザースペースアプリケーションを使用してガンマを変更する方法を示しています。 1 - 変数を次のように宣言mxcfb_gamma。 構造体mxcfb_gamma fb_gamma; 2 - ガマ補正を有効にします。 fb_gamma.enable = 1; 3 - constk と slopek の値を設定します。ここで、i = 0 から 15 で、x と y はそれぞれ新しい constk と slopek の定数値です。 fb_gamma.constk[i]= x; fb_gamma.スロープ[i]= y; 4 - フレームバッファ デバイスを開き、MXCFB_SET_GAMMAを呼び出します。 fd_fb = open("/dev/fb0", O_RDWR, 0) ioctl(fd_fb, MXCFB_SET_GAMMA, &fb_gamma) 上記のコードを実行すると、ガンマ値がすぐに変更されます。 日時:i.MX6のガンマ補正 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Hi robinsingh‌, 私が説明したガンマ関数はすべての色を変更しますが、実際には、輝度(Y)のみが影響を受けます。 1つの色だけを変更するには、ディスプレイプロセッサのCSC配列を変更することをお勧めします。また、IOCTL を呼び出すことによって、ユーザー空間で行うこともできます。 このリンクでSWを確認してください。 i.MX6 CSC設定サンプルソースコード  ユーザー空間から、bの正しさ、コントラスト、彩度、色相、ガンマなど、多くのことを変更できます。 よろしくお願いいたします。 Rogerio 日時:i.MX6のガンマ補正 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> こんにちは著者、 あなたは私を導いてくれますか、私のステップで何が欠けていますか? 私のLCDの赤い色は少しずれています、それは正確には完全な赤のようには見えません。だから私はこのLCDを校正したいと思います。そして、私はそれを行うための提案を探しています:   これがガンマ補正の手順です、私はすでに試しましたが、良い結果は得られませんでした i.MX6のガンマ補正  ipu-examples リリースノート - v0.1    framebuffer_ex1マスター ·rogeriorps/ipu-examples ·GitHubの  上記のガンマ補正サンプルコードを試しましたが、LCDキャリブレーションがさらに悪くなります。     これが私のプラットフォームとLVDSインターフェースの設定です:[Android4.4カーネル3.10] LCDパネルは(HX8282 -Source driver / HX8696 -Gate Driver)を使用しています---SPIインターフェースが制御用のパネルから出ていないため、パネルレジスタを設定できません。 ====(ドライバー/ビデオ/MXC/mxc_lcdif.c)=================================== 静的構造体 fb_videomode lcdif_modedb[] = { { /* 液晶 1024x600 @ 60 Hz 、ピクセル clk @ 66MHz */ 「HiMAX-WSVGA」、60、1024、600、25000、155、160、8、23、4、4、 FB_SYNC_CLK_LAT_FALL、 FB_VMODE_NONINTERLACED、 0,}, }; ===( DTS ファイル ) ===========: MXCFB1: fb@0 { compatible = "fsl,mxc_sdc_fb"; disp_dev = "ldb"; interface_pix_fmt = "RGB24"; default_bpp = <24>;/*<24>;*/ int_clk = <0>; late_init = <0>; status = "大丈夫"; }; ================================================================ 問: 1)ガンマ補正にipuサンプルコードを使用しましたが、痛風アレイは次のとおりです。 int gout[16] = {0,2,4,8,16,32,64,96,128,160,192,224,255,255,255,255 }; この設定は私のLCDの色に影響を与えません、私が使用する必要がある私のプロセッサimx6dlのための他の痛風値はありますか、または私はこれらの値をどのように計算しますか、何か提案はありますか?   2)リファレンスマニュアルセクション:38.4.9.6ガンマ補正には、「特定のパネル/ディスプレイに必要なガンマ補正スロープはディスプレイメーカーが提供する必要があります」と記載されていますが、サンプルコードのガンマスロープから訴える値は何ですか?   3)データ形式に関しては、私のLCDはRGBストライプをサポートしています(LCDドキュメントはこれについての良い詳細を提供していません)、そして「RGB24」は合理的な結果で私のために働いています。Android HAL は HAL_PIXEL_FORMAT_RGB_565 .この観点から、IPU色空間変換の観点から見る必要があることはありますか?   4)LCDパネルのキャリブレーションに関する他のポインタまたはリファレンスはありますか?    ありがとうございます ロビン・シン Re: Gamma correction on i.MX6 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> OpenGL ES2.0は画像の歪みをフレームバッファに出力します 説明する: 1.下のコンピューターはレンダリングに OpenGL Es2.0 を使用します。 2.チップセレクトシェーダーはガンマ補正を使用しません。cat /dev/fb0 をファイルに保存すると、フレームバッファ内の画像が明らかになります。 3.チップセレクトシェーダーはガンマ補正(ガンマ値は2.2)を使用しています。cat /dev/fb0 でファイルにアクセスすると、フレームバッファ内の画像は元の画像とほとんど変わらず、各ピクセルの成分が1つずつ異なることがわかります。 4.フレームバッファサイズは720pです。ガンマ補正なしのフレームレートは50fps、ガンマ補正ありのフレームレートは20fpsです。テストの結果、フレームレートが低い理由は、プログラムが前面と背面のバッファのスワップ(関数:eglSwapBuffers)に多くの時間を費やしていることが分かりました。 5.質問: ガンマ補正を使用しないと画像が歪んでしまう GAMMA 補正を使用すると、eglSwapBuffers 関数に非常に長い時間がかかり、フレーム レートが非常に低くなります。 下記のリンクの方法を試してみましたが、うまくいきませんでした。何らかの情報(できれば実際の例)を提供してください。 https://community.freescale.com/docs/DOC-98062 https://github.com/rogeriorps/ipu-examples/commit/8c828cede9f3d3ef329368b2e3d06c604264ec8d
記事全体を表示