Multi Source Translation Content

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

Multi Source Translation Content

ディスカッション

ソート順:
基于BLE的手势控制PPT 1 简介 两块开发板通过ble传输控制信息。一块开发板连接paj7620,通过IIC总线提供手势信息。另一块开发板使用ble和USB HID。使用ble接收数据,使用USB HID模拟键盘输入,控制ppt 图 1 2 准备 我们需要两块开发板qn908x和手势控制装置paj7620。我们使用IAR作为开发环境,我们使用的示例是温度传感器, 温度收集器。SDK版本为2.2.3   3 代码 3.1 温度传感器代码 我们要实现IIC从paj7620读取手势信息并发送数据。 IIC使用的引脚是PA6和PA7 简单将IIC读写代码封装在代码中创建i2c_operation.c和 i2c_operation.h。在其中实现IIC初始化和读/写寄存器功能 图 2 图3   3.1.1有了这些函数之后,我们开始编写手势识别代码。首先,我们在我们的项目中添加两个空文件paj7620.c和paj7620.h。   选择银行登记区域 图4   唤醒paj7620读取设备状态 图5   初始化设备 图6 手势测试功能 图 7   3.1.2当您准备读取设备信息时, 您应该在 BleApp_Init 函数中初始化 IIC 和 paj7620 图8 原则上,我们需要为 PAJ 设备创建一个自定义服务,但我们将温度数据替换为我们的手势控制数据。如果您想创建自定义服务,请参阅此链接自定义配置文件   3.1.3创建一个定期发送手势数据的计时器。 在文件 temerature_sensor.c 中 定义一个定时器, static tmrTimerID_t dataTimerId; 分配一个定时器,dataTimerId = TMR_AllocateTimer(); 定义此定时器的回调函数 图 9 启动计时器 图 10 关闭低功耗模式。#定义 cPWR_UsePowerDownMode 0 3.2 temperature_collector代码 这里最重要的是将 USB HID 移植到我们的项目中。USB示例 我们使用的是USB键盘和鼠标。 3.2.1将例子下的OSA和USB文件夹添加到工程目录下,并按照原例子的文件结构将文件复制到相应文件夹下。 图 11 3.2.2完成后添加头文件目录 图 12 同时,在这个选项卡中,添加两个宏定义 USB_STACK_FREERTOS_HEAP_SIZE=16384 USB_STACK_FREERTOS   3.2.3接下来我们需要修改usb示例中的main函数。打开composite.c文件。 图 13 它调用 APP_task。所以这个函数也需要修改。 图 14 3.2.4找到 hid_mouse.c ,注释掉函数 USB_DeviceHidMouseAction 找到 hid_keyboard.h。定义手势信息。 图 15 找到 hid_keyboard.c。我们需要修改函数USB_DeviceHidKeyboardAction如下图所示。 图 16   其中我们还需要实现如下函数。当检测到向上手势时,将播放上一个 ppt。向下手势为下一个PPT,左手势为退出PPT,向前手势为播放PPT 图 17 它还引用了外部变量gesture_from_server。变量定义 在文件 temperature_collocation.c 中。     3.2.5之后我们进入BleApp_Statemachinehandler函数 在 temperature_colloctor.c 中。 在mApppRunning_c中,我们将调用usb_main来初始化USB HID 图 18 3.2.6在BleApp_PrintTemperature中,我们将手势数据保存到gesture_from_server 图 19 我们完成了所有步骤。   (在 “我的视频” 中查看)       BLE软件 量子
記事全体を表示
了解 DDRV 工具!(测试版) <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 它终于发布了用于 处理器专家 应用程序的 双倍数据速率 RAM 内存验证工具(DDRv) 的 BETA 版本! 这个软件是干什么的?嗯,它主要帮助您解决在使用双倍数据速率时调整和调整设置的挑战性任务,因此它使您的设置能够以多个时钟周期工作。 进一步解释一下,在 DDR 的世界中,有许多设置可以使 DDR 通过所有测试并在测试台上工作。但是,在测试台上起作用的设置在应用程序中可能只比不起作用的时间少 1/8(或更少)个时钟周期。这就是我们大多数人所说的“微薄利润”。 DDRv 工具将帮助您找到所有有效的设置,并将它们显示在可视化地图上,以便您选择一个在应用程序中的工作设置和非工作设置之间提供尽可能多余裕度的设置。 这个过程极其困难,通常需要专门的软件在非常大的内存上运行大型详尽的测试。在运行这些测试时,您需要根据其他不同的设置来改变每个设置 - 基本上设置一个非常耗时、复杂且充满问题的几何级数。 此外,您必须跟踪哪些方法有效,哪些方法无效,然后从所有数据中找到一些有意义的方法。但你猜怎么着?DDRv 工具可以为您完成此操作!当然这意味着节省时间和精力,使一切变得更容易、更快捷! 其特点: 与 Freescale QorIQ 配置套件无缝协作 帮助您设置下列非常敏感和非常关键的设置: 有效终止值(读和写) 时钟调节值 时钟延迟值 选择要使用的DDR测试 控制测试顺序 深入分析错误 Eclipse插件(Eclipse 3.6及更新版本) 想尝试一下吗?点击此链接下载DDRV BETA ! 组件开发环境
記事全体を表示
i.MX Yocto Project: 既存のパッケージをイメージに追加するにはどうすればいいですか? <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 次の 2 つの方法があります。 1. ビットベイク。パッケージを IMAGE_INSTALL 変数に追加します。だがしかし すべてのイメージに パッケージ が必要な場合は、 conf/local.conf ファイルに行を追加してください IMAGE_INSTALL_append = " パッケージ" パッケージ名の前にスペースを入れてください。他のパッケージを追加できますが、間にスペースを置くだけです。 パッケージを特定のイメージにしたい場合、例えばfsl-image-gui,、meta-fsl-demos/recipes-fsl/images/fsl-image-gui.bb に追加してください。 IMAGE_INSTALL += " \     ${SOC_IMAGE_INSTALL} \     cpufrequtils \     nano \ パッケージグループ-FSL-gstreamer \ パッケージ グループ FSL ツール テスト アプリ \ パッケージグループ-fsl-tools-benchmark \ パッケージグループqt-in-use-demos \ qt4-plugin-phonon-backend-gstreamer \     qt4-demos \ qt4-examples \     fsl-gui-extrafiles \     パッケージ\ " 2. コンロ。そのグラフィカルな性質により、ベースイメージにパッケージを追加することは、 bitbake の方法よりも簡単です。ビルドフォルダで hob アプリを実行し、マシンとイメージを選択してから、後で編集します( [イメージの編集 ]ボタンをクリックします) パッケージが利用できない場合は、パッケージを作成する必要があります。出発点として、この 例を見てください。主流の リポジトリに存在するのに十分であると思われる場合は、 パッチをmeta-freescale メーリングリストに送信してください。 Yocto Project Re: i.MX Yocto Project: 既存のパッケージをイメージに追加するにはどうすればいいですか? <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Hello Daiane, たとえば、すべてのgstプラグインをインストールする場合は、これを追加する必要があります。 .... gst-plugins-good-meta \ ..... 詳細については、以下を参照してください。 ~/tmp/work/armv7a-vfn-neon-poky-linux-gnueabi/gst-plugins-good/0.10.31-r8/gst-plugins-good.spec. Re: i.MX Yocto Project: 既存のパッケージをイメージに追加するにはどうすればいいですか? <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> ベイトマン・カイは書きました: レオさん、ありがとうございました。 はい、 Daiane Angolini のこのドキュメントは、画像に醜い/悪いプラグインを追加する方法を教えてくれます。ただし、すべてのプラグインをインストールする場合は、すべてのプラグインをリストして指定する必要があります??? はい:smileycry: *すべて*のgstreamerプラグインをインストールする方法がわかりません。もしわかったら、ぜひ世界に知らせてください。誰もがそれを望んでいます Re: i.MX Yocto Project: 既存のパッケージをイメージに追加するにはどうすればいいですか? <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> レオさん、ありがとうございました。 はい、 DaianeAngolini のこのドキュメントは、画像に醜い/悪いプラグインを追加する方法を教えてくれます。ただし、すべてのプラグインをインストールする場合は、すべてのプラグインをリストして指定する必要があります??? Re: i.MX Yocto Project: 既存のパッケージをイメージに追加するにはどうすればいいですか? <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 特定の要素を指定する必要があります。たとえば、 このドキュメントでは 、いくつかの醜い要素や悪い要素が最終的な画像に追加されています Leo Re: i.MX Yocto Project: 既存のパッケージをイメージに追加するにはどうすればいいですか? <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> cdビルド/ tmp / deploy / rpm ls all  armv7a_vfp_neon  imx6qsabresd 私は見つけることができます:armv7a_vfp_neonのフォルダにいくつかの「gst-plugins-bad」ライブラリリストがあります。しかし、imx6qsabresdのフォルダにはありません Re: i.MX Yocto Project: 既存のパッケージをイメージに追加するにはどうすればいいですか? <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 親愛なるレオへ: この投稿であなたのギルドをフォローしてください。pkg "gst-plugins-bad" を rootfs に追加しようと試みましたが、何度も失敗します。 私の追加ステップ:      まず、"fsl-image-test"を何も変更せずにビルドしました。      2 つ目は、bitbake -s |grep gst-plugins-bad ====> "gst-plugins-bad" 文字列を表示します。      3番目、だから、私はvim build / conf / local.conf以下のように何かを追加します。 IMAGE_INSTALL_append = "gst-plugins-bad" CORE_IMAGE_EXTRA_INSTALL += "gst-plugins-bad" または、meta-fsl-demos/recipes-fsl/images/fsl-image-test.bb の vim IMAGE_INSTALL += " \ パッケージグループ-FSL-gstreamer \ パッケージ グループ FSL ツール テスト アプリ \ パッケージグループ-fsl-tools-benchmark \     gst-plugins-bad \ " 最後に、コマンド "bitbake fsl-image-test" で再構築します。 エラーログはありませんが、build/tmp/work/imx6qsabresd-poky-linux-gnueabi/fsl-image-test/1.0-r0 にある rootfs フォルダに変更はありません つまり、rootfs/usr/lib/gstreamer.0.10/ には、作成すべき "gst-plugins-bad" ライブラリは見つかりませんでした。 あなたはplsがいくつかのアドバイスを与えるか、私を修正しますか? よろしくお願いいたします。 BM
記事全体を表示
NXP Model-Based Design Toolbox for RADAR - バージョン 1.0.0 製品リリースのお知らせ オートモーティブ・プロセッシング NXPモデルベース設計ツールボックス レーダー用–バージョン1.0.0 NXP SemiconductorsのAutomotive Embedded Systems, Model-Based Design Tools Teamは、Model-Based Design Toolbox for RADARバージョン1.0.0のリリースを発表しました。このリリースでは、NXP S32R45 Automotive Microprocessors 用の MATLAB からの ARM Cortex-A53、NXP SPT Accelerator、および NXP LAX Accelerator コアの自動コード生成がサポートされています。このリリースでは、両方の LAX コアでのコード生成と実行、for ループの並列実行のための OpenMP コード生成、およびプロセッサインザループ (PIL) シミュレーションのサポートが追加され、コード生成とレーダー処理のデモが改善され、新しい指数、対数、最小、最大、およびしきい値処理の LAX カーネルのサポートが追加されています。この製品には 60+ の例が付属しており、MATLAB API からサポートされている RSDK SPT および LAX カーネルをカバーし、MATLAB 環境から LAX アクセラレータのプログラミングを実証しています。 対象読者: この製品は、Automotive SW – Model-Based Design Toolboxの一部です。 FlexNetの場所: https://nxp.flexnetoperations.com/control/frse/download?element=6450491 テクニカル・サポート: レーダー問題用のNXPモデルベースデザインツールボックスは、NXPモデルベースデザインツールコミュニティスペースを通じて追跡されます。 https://community.nxp.com/community/mbdt リリース内容: MATLAB® から NXP S32R45 の C コードの自動生成: ARM Cortex-A53 NXP LAXアクセラレータ 両方の LAX コアでのコード生成と実行 RSKSKSPTカーネルの実行のサポート: 範囲FFT, ドップラーFFT, NonCohComb Linuxアプリケーションのビルドと実行をサポート S32R45用のNXPオートリナックスBSP 37.0 LAX アクセラレータ用に高度に最適化された追加の RSDK LAX カーネル用の MATLAB API を含む add, sub, mul, div, times, cT, inv abs, abs2, sqrtAbs, conj, norm, norm2 diag、目、ゼロ、1、検索、ソート exp、log、log2、log10、min、max、thresbit cospi, sinpi, tanpi, cispi, sincpi acospi, asinpi, atanpi, atan2pi Processor-in-the-Loop(PIL)シミュレーション・モード コード生成の改善とメモリ使用量の削減 Radar SDK バージョン 1.2.0 のサポート MATLABバージョンのサポート: R2023a R2023b R2024aの R2024b サポートされている機能を示す 60 以上の例: コレスキー ガウス・ニュートン Eigen (new) カルマンフィルター 線形回帰 大行列乗算 ナビエ・ストークス QRファクタライゼーション(更新) MUSIC DoA (更新) レーダー処理のデモ – Automated Driving Toolbox のシナリオ (更新) スタンドアロンおよび Processor-in-the-Loop(PIL)シミュレーション 範囲FFT、ドップラーFFT、および非コヒーレント結合をNXP SPTアクセラレータにオフロード MUSIC DoAをNXP LAXアクセラレータにオフロード レーダー処理のデモ – RoadRunner Toolbox シナリオ (新規) プロセッサインザループ(PIL)シミュレーション   詳細、機能、および新機能の使用方法については、添付のリリースノートおよびクイックスタートガイドのドキュメントを参照してください。 MATLAB® 統合: NXP Model-Based Design Toolboxは、NXPのS32R45プロセッサおよび評価ボードソリューションからARM Cortex-R52コア、NXP SPTアクセラレータ、NXP LAXアクセラレータを評価および使用できるようにすることで、MATLAB®のエクスペリエンスを拡張します。NXP Model-Based Design Toolbox for RADARバージョン1.0.0は、MATLAB®環境と完全に統合されています。   ターゲット: このリリース(1.0.0)は、NXP S32R45プロセッサおよび評価ボードでの技術デモンストレーション、評価目的、およびプロトタイピングを目的としています。 役立つリソース: 例、トレーニング、サポート:https://community.nxp.com/community/mbdt
記事全体を表示
MPL3115A2 - FIFO フィル モードのサンプル コード <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> ねえ皆さん ここでは、NXP FRDM-KL25Zプラットフォーム と FRDMSTBC-P3115シールドボード を使用して MPL3115A2 用に作成した例の1つを共有したいと思います。これは、組み込みFIFOバッファを使用して、I2Cインターフェースを介した割り込み手法を使用してFIFOから読み取られる圧力/温度または高度/温度データを収集する方法を示しています。FIFO は、最大サンプル数 (32) を格納するように設定されています。各サンプルは、3 バイトの圧力 (または高度) データと 2 バイトの温度データで構成されます。したがって、FIFOがいっぱいになり、FIFO割り込みがアサートされると、合計160バイト(32 x (3 + 2))がFIFOから読み取られます。 MPL3115A2は次のように初期化されます。 /****************************************************************************** * MPL3115A2 initialization function ****************************************************************************** void MPL3115A2_Init (void) { I2C_WriteRegister(MPL3115A2_I2C_ADDRESS, CTRL_REG1, 0x04); // Reset all registers to POR values Pause(0x631); // ~1ms delay I2C_WriteRegister(MPL3115A2_I2C_ADDRESS, F_SETUP_REG, 0xA0); // FIFO Fill mode, 32 samples I2C_WriteRegister(MPL3115A2_I2C_ADDRESS, CTRL_REG4, 0x40); // Enable FIFO interrupt I2C_WriteRegister(MPL3115A2_I2C_ADDRESS, CTRL_REG5, 0x40); // Route the FIFO interrupt to INT1 - PTA5 I2C_WriteRegister(MPL3115A2_I2C_ADDRESS, CTRL_REG2, 0x00); // Time step = ~1s I2C_WriteRegister(MPL3115A2_I2C_ADDRESS, CTRL_REG3, 0x00); // Push-pull, active low interrupt I2C_WriteRegister(MPL3115A2_I2C_ADDRESS, CTRL_REG1, 0x39); // Active barometer mode, OSR = 128 //I2C_WriteRegister(MPL3115A2_I2C_ADDRESS, CTRL_REG1, 0xB9); // Active altimeter mode, OSR = 128 }‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍ ISR では、割り込みフラグのみがクリアされ、FIFO_DataReady 変数は FIFO がいっぱいであることを示すように設定されます。 /****************************************************************************** * PORT A Interrupt handler ******************************************************************************/ void PORTA_IRQHandler() { PORTA_PCR5 |= PORT_PCR_ISF_MASK; FIFO_DataReady = 1; }‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍ FIFO_DataReady変数が設定されると、STATUSレジスタ(0x00)が読み取られ、FIFO割り込みステータスビットがクリアされ、INT1ピンがディアサートされます。その後、FIFOは、OUT_P_MSBレジスタ(0x01)から始まる160バイト(5 x 32バイト)のバースト読み取りを使用して読み取られます。次に、生の圧力(または高度)と温度のデータが実際の値に変換されます。 if (FIFO_DataReady) { FIFO_DataReady = 0; FIFO_Status = I2C_ReadRegister(MPL3115A2_I2C_ADDRESS, STATUS_REG); // Read the Status register to clear the FIFO interrupt status bit I2C_ReadMultiRegisters(MPL3115A2_I2C_ADDRESS, OUT_P_MSB_REG, 5*Watermark_Val, RawData); // Read the FIFO using a burst read for (i = 0; i < Watermark_Val; i++) { /* Get pressure, the 20-bit measurement in Pascals is comprised of an unsigned integer component and a fractional component. The unsigned 18-bit integer component is located in OUT_P_MSB, OUT_P_CSB and bits 7-6 of OUT_P_LSB. The fractional component is located in bits 5-4 of OUT_P_LSB. Bits 3-0 of OUT_P_LSB are not used. */ Pressure[i] = (float) (((RawData[0 + i*5] << 16) | (RawData[1 + i*5] << 8) | (RawData[2 + i*5] & 0xC0)) >> 6) + (float) ((RawData[2 + i*5] & 0x30) >> 4) * 0.25; /* Get temperature, the 12-bit temperature measurement in °C is comprised of a signed integer component and a fractional component. The signed 8-bit integer component is located in OUT_T_MSB. The fractional component is located in bits 7-4 of OUT_T_LSB. Bits 3-0 of OUT_T_LSB are not used. */ Temperature[i] = (float) ((short)((RawData[3 + i*5] << 8) | (RawData[4 + i*5] & 0xF0)) >> 4) * 0.0625; /* Get altitude, the 20-bit measurement in meters is comprised of a signed integer component and a fractional component. The signed 16-bit integer component is located in OUT_P_MSB and OUT_P_CSB. The fraction component is located in bits 7-4 of OUT_P_LSB. Bits 3-0 of OUT_P_LSB are not used */ //Altitude[i] = (float) ((short) ((RawData[0 + i*5] << 8) | RawData[1 + i*5])) + (float) (RawData[2 + i*5] >> 4) * 0.0625; } } ‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍ STATUSレジスタを読み取った後のINT1ピンのディアサート(0x00)。 この例では、自動集録の時間ステップは可能な限り低い値 (1s) に設定されているため、FIFO は ~32 秒ごとに読み取られます。 計算された値は、デバッグパースペクティブの右上にある「変数」ウィンドウで確認できます。 添付されている完全なソースコードを見つけることができます。この簡単なサンプルプロジェクトに関して質問がある場合は、以下でお気軽にお問い合わせください。フィードバックや提案も大歓迎です。 よろしくお願いします。 Tomas 圧力センサ
記事全体を表示
视频 - iWave Systems 在 i.MX6 Quad 上通过 WEC7 进行双克隆显示演示 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> iWave 的 i.MX6 四核/双核开发套件 Rainbow-G15D 将所有标准接口集成到高度集成的 Nano ITX 外形中,可用于多种嵌入式 PC、系统和工业设计。它具备嵌入式应用所需的所有必要功能。 i.MX6 Quad/Dual 开发套件搭载 Windows Embedded Compact 7 板级支持包,其中包含 i.MX6 CPU 支持的所有主要外设和设备。该 BSP 支持 UART 调试、CAN 和以太网,提供高效的调试和通信支持。此外,该 BSP 还支持 SD/MMC、USB 和 SATA 接口,提供高效的存储接口。OpenGL 和 OpenVG 提供丰富的图形处理能力,并通过 i.MX6 处理器的 2D 和 3D 硬件加速器进一步加速。用户可以使用 Silverlight 3.0 和 Expression Blend 开发丰富的图形用户界面。此外,还提供主动同步功能,用于同步设备。 iWave Systems 在 Rainbow G15D 上实现了双显示功能,可在两个不同的 LVDS 显示面板上显示相同的克隆内容。此处,我们利用两块 XGA 分辨率的 LVDS LCD 显示屏,在 Rainbow G15D 平台上显示 WEC7 桌面。两块 10.4 英寸 LVDS LCD 显示屏连接到 i.MX6 四核 CPU。现在,您可以在两个 LCD 屏幕上观看 1080p MPEG4 视频回放。 Video: http://www.youtube.com/watch?v=BlVOPSjjJq8 视频链接:1413 概述 回复:视频 - iWave Systems 在 i.MX6 Quad 上与 WEC7 上的双克隆显示演示 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 你好,斯科特,请提供您的电子邮件 ID 或发送电子邮件至mktg@iwavesystems.com ,以便我们讨论并更好地了解您的要求。 回复:视频 - iWave Systems 在 i.MX6 Quad 上与 WEC7 上的双克隆显示演示 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 我注意到您正在克隆显示。我们对 i.MX6 WEC7 解决方案很感兴趣,它可以通过硬件加速轻松驱动两个不同的 720P MPEG-4 视频流。您是否测试过该场景?飞思卡尔的 WEC7 BSP 和 SDK 能否利用 i.MX6 硬件来解码视频,从而驱动两个不同的视频流(MPEG-4)?我们目前可以使用 i.MX6 Dual 和嵌入式 Linux 同时处理两个视频流。我们希望支持 WEC7,但担心 WEC7 和 Freescale SDK 可能存在限制,因此需要 CPU 进行有限的处理。i.MX6 硬件(GPU/IPU/VPU)用于完成处理视频流的繁重工作。
記事全体を表示
S32 Design Studio 3.2 - 更新 191219 已发布! <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />       产品发布公告 汽车微控制器和处理器 S32设计工作室3.2  Update 191219          新增内容 适用于 S32V234 RTM 1.0.1 包的 S32 SDK(仅限 Windows) 安装说明 此更新可在线获取 (通过 Eclipse Updater)或 离线安装(直接下载链接) 在线安装: 前往菜单“帮助” -> “S32DS 扩展和更新”对话框 从可用项目中选择并点击 "Install/Update" 按钮   离线安装: 转到 S32 Design Studio 产品页面 -> 下载部分或使用 直接链接下载更新存档 zip 文件 启动 S32 Design Studio,然后转到"Help" → "S32DS Extensions and Updates" 通过“Add..” 添加新的 S32DS 软件站点,浏览选择在上一步中下载的更新存档 .zip 文件         从可用项目中选择并单击“安装/更新”按钮。 此时将启动更新安装过程。
記事全体を表示
S32S247 バージョン 2019.07 のプラットフォーム ソフトウェア統合 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 製品リリースのお知らせ 車載用マイクロコントローラ/マイクロプロセッサ プラットフォームソフトウェアの統合 S32S247バージョン2019.07の場合   NXP Semiconductorsの プラットフォームソフトウェアインテグレーションチーム であるAutomotive Microcontrollers and Processorsは 、 S32S247バージョン2019.07の Platform Software Integration のリリースを発表できることを嬉しく思います。 このリリースには、S32S247プラットフォーム用の一連の参照統合例が含まれています。詳細については、添付のリリースノートをご覧ください。   FlexNetの場所: https://www.nxp.com/webapp/swlicensing/sso/downloadSoftware.sp?catid=SW32S2XX-PTFM01D 参考例
記事全体を表示
i.MX6用のLinphone Androidをビルドする <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Linphoneは、インターネット電話またはVoice Over IP電話(VoIP)です。 Linphoneを使用すると、 音声、ビデオ、テキストのインスタントメッセージングを使用して、インターネットを介して人々と自由にコミュニケーションをとることができます。 Linphoneは、インターネット電話のオープンスタンダードであるSIPプロトコルを利用しています。Linphoneは、 無料のSIPオーディオ/ビデオサービス を含む 、任意のSIP VoIPオペレーターで使用できます 。 Linphoneは フリーソフトウェア (またはオープンソース)であり、 無料でダウンロードして再配布できます。 Linphoneは、デスクトップコンピューター(Linux、Windows、Mac OSX)、および携帯電話(Android、iPhone、Blackberry)で使用できます。 Linphone-androidは、Android SDKに基づくJavaコードとネイティブCODEC、ネットワークプロトコルの統合を示す良い例です。XBMC-Androidとは異なり、ほぼ完全なc ++ / cプロジェクトです。 linphone-android プロジェクトをビルドするには、次の手順を実行します。 1. git clone git://git.linphone.org/linphone-android.git --recursive 2. sudo apt-get install autoconf automake libtool pkg-config 3. "cd" を "git clone" のルートに移動 : cd /home/user/linphne-android // git の linphone-android は 4. export PATH=/home/user/android-ndk:$PATH //android-ndk、android-sdkツール、platform-tools、ANTが保存されている場所ならどこでも。 例えば、私のPCで。      export PATH=/home/alanz/android-ndk-r8d:/home/alanz/android-sdk-linux/tools:/home/alanz/android-sdk-linux/platform-     tools:/home/alanz/bin/apache-ant-1.8.4/bin:$PATH 注: PATH には、ndk、sdk、および ant が含まれています。 5. ネットワークが機能していることを確認してから、linphone-android ルートで "./prepare_sources.sh" を実行します 6.その後、「/home/alanz/android-ndk-r8d/ndk-build」を実行すると、終了するまでに時間がかかります 7. Makefile を次の例のように変更し、それに応じて変更します。      NDK_PATH=/home/alanz/android-ndk-r8d      SDK_PATH=/home/alanz/android-sdk-linux/tools SDK_PLATFORM_TOOLS_PATH=/home/alanz/android-sdk-linux/platform-tools      ..................... generate-libsを使用します。 $(NDK_PATH)/ndk-build の.......(このコマンドラインの最後に -j$(NUMCPUS) を削除してください) 8. 「make」を実行すると、終了後、apkファイルはbin /サブディレクトリの下にあります。 Android i.MX53 i.MX6DL i.MX6Quad Re:i.MX6用のLinphone Androidをビルドする <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Hi, アナログ電話アダプタの設計にi.MX6を使用できるかどうかについて、どなたかご存知ですか?i.MX6DにはどのようなSWアプリケーションを実装する必要がありますか? Re:i.MX6用のLinphone Androidをビルドする <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> VPU は使用しません。ハードウェアエンコーダーを使用するプラグインを作成する必要があります。gstreamer appsrcプラグインを使用して、それを新しいmediastreamer2プラグインと組み合わせてみることができます Re:i.MX6用のLinphone Androidをビルドする <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> CPUのハードウェアエンコーダーを使用するAndroid用のLinphoneはありますか? imx53またはimx6で使用すると、VPUが使用されますか? Re:i.MX6用のLinphone Androidをビルドする <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 最新のlinphone-androidソースには prepare_sources.sh ファイルはありません。linphone-android gitソースのREADMEの指示に従ってlinphoneをビルドし、Androidフォンで実行することができました。 Re:i.MX6用のLinphone Androidをビルドする <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> こんにちはあなたの助けに感謝しますが、 "./prepare_sources.sh"を実行している間、私は5番目のステップでエラーを下回っています =========================================================================== cp ./patch_pic.diff SILK_SDK_SRC_v1.0.9/SILK_SDK_SRC_ARM_v1.0.9 cd SILK_SDK_SRC_v1.0.9/SILK_SDK_SRC_ARM_v1.0.9 & /usr/bin/patch -p0 < patch_pic.diff パッチ適用ファイル Makefile ハンク#1は26で失敗しました。 1 hunk FAILED -- リジェクトをファイル Makefile.rej に保存します Makefile:420: ターゲット 'SILK_SDK_SRC_v1.0.9/SILK_SDK_SRC_ARM_v1.0.9' のレシピが失敗しました メーカー: *** [SILK_SDK_SRC_v1.0.9/SILK_SDK_SRC_ARM_v1.0.9]エラー 1 SILK オーディオ プラグインの準備状態に失敗しました。 ./prepare_sources.sh: 41 行目: xxd: コマンドが見つかりません ./prepare_sources.sh: 47行目: xxd: コマンドが見つかりません ===================================================================== 主な問題は、これらのエラーが発生した場合、すべての手順を完了し、先に進んでEclipseでコードをインポートし、実行して、このコードをコメントするとGCMRegisterクラスでjava.lang.NoClassDefFoundExceptionが発生することです。このコードにコメントすると、LinphoneActivity.javaに対して同じエラーが発生します。このエラーを取り除き、このコードを正常に実行してテストする方法をガイドしてください。よろしくお願いいたします。
記事全体を表示
飞思卡尔 BLE Beacon 用户指南 V1.0 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 1. Overview BLE 信标是低功耗蓝牙的常见用途,它会以一定的间隔广播广告。飞思卡尔 BLE 信标演示使用飞思卡尔 Kinetis KL16 低功耗 MCU 和 EMC EM9301 蓝牙控制器实现信标参考设计。飞思卡尔 BLE 信标具有低功耗的特点,平均功耗为 50uA,间隔为 600ms。 Freescale Kinetis KL16通过SPI接口与EM9301配合。 查看附件以了解更多信息
記事全体を表示
i.MX Yocto 项目:我如何为社区做出贡献? <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Yocto 项目是开源的,因此任何人都可以做出贡献。无论您的贡献是什么(修复错误或新的元数据),贡献都会通过补丁发送到社区列表。许多人会注视着你的补丁,在某个时候它要么被拒绝,要么被接受。请按照以下步骤进行贡献: 确保您之前已配置您的个人信息 $ git config --global user.name "此处输入您的名字" $ git config --global 用户.email " your_email@example.com " 订阅飞思卡尔 Yocto 项目邮件列表 下载 `master` 分支 fsl社区bsp$repo init\ -u https://github.com/Freescale/fsl-community-bsp-platform \ -b 主服务器 Update fsl-community-bsp$repo 同步 创建本地分支,这样你的工作就不会在主分支上完成 fsl-community-bsp $ repo start --all 其中 ` ` 是您想要赋予本地分支的任何名称(例如`fix_uboot_recipe`、`new_gstreamer_recipe` 等) 在任何与 Freescale 相关的文件夹中进行更改(例如来源/meta-fsl-arm)。如果您修改了配方(.bb)或包含(.inc)文件,请不要忘记*bump*(增加 值减一)`PR` 或 `INC_PR` 值 使用“git”提交您的更改。在这个例子中,我们假设您的更改是在“meta-fsl-arm”文件夹上 sources/meta-fsl-arm $ git add 源/meta-fsl-arm$git提交 在提交日志中,标题必须以文件名更改或引入的内容开头,然后是补丁目标的简要描述,最后是详细描述。确保遵守标准 (输入 ` git log --pretty=oneline` 来查看之前的提交) 创建补丁 源/meta-fsl-arm $ git format-patch -s --subject-prefix='<meta-fsl-arm> 最后一个参数(`-1`)表示修补最后一次提交。如果您想为较旧的提交创建补丁,只需指出正确的索引。 如果您的补丁是在其他文件夹中完成的,只需确保更改“--subject-prefix”值。 发送您的补丁或补丁 git 发送电子邮件——至 meta-freescale@yoctoproject.org 其中 ` ` 是由 `git format-patch` 创建的文件。 在邮件列表中跟踪补丁的响应。如果您需要重新制作补丁,请重复这些步骤,但这次补丁的主题更改为“--subject-prefix='<meta-fsl-> 一旦你的补丁被批准,你就可以删除你的工作分支 fsl-community-bsp $ repo abandon Linux Yocto Project
記事全体を表示
i.MX6 VDD_SNVS_CAP 组件推荐 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> SNVS LDO 输出 (VDD_SNVS_CAP) 需要外部电容器。飞思卡尔的最新建议是,这应该是一个 0.22 uF 电容器。 飞思卡尔正在努力使文件保持一致。截至 2013 年 2 月,一些文档(例如原理图或用户指南)显示单个 0.22 uF 电容器,而其他文档则没有。 i.MX6DL i.MX6 双核 i.MX6 四核 i.MX6S
記事全体を表示
【S32K144】RTD に LinIf.xdm がありません。Tresos でモジュール LinIf を作成できない Hello, TresosのRTDからのLinIfプラグインの使用について質問があります。 Tresos に LinIf モジュールを追加しようとすると、次のエラーが返されます。 モジュール "LinIf_TS_T40D2M30I0R0" (プラグイン "LinIf_TS_T40D2M30I0R0" で定義) は、スキーマ ファイル "config/LinIf.xdm" を定義します。見つからない (ファイルが署名または暗号化されている場合は、META-INF\CRYPTOMANIFEST で参照する必要があります。MF)です。 他のモジュールとは異なり、LinIf フォルダには LinIf.xdm があるべき場所に config フォルダがありません これは間違ったインストールですか、それともLinIf.xdmを何らかの方法で個別に生成する必要がありますか? 古い RTD インストールにも LinIf.xdm はありません。 ありがとうございます! Re: [S32K144] RTD に LinIf.xdm がありません。Tresos でモジュール LinIf を作成できない Hi @nbgddddd, RTD リリース (バージョン 3.0.0) のリリース ノートを参照してください。「サポートおよび配信されたドライバー」セクションでは、RTDに付属のLinIfドライバーはスタブのみであり、構成をサポートしていないことがわかります。 これは、私たちの側からのテスト目的のみを目的としています。Elektrobit(EB)、VectorなどのサードパーティプロバイダーのCanIf、EthIf、およびLinIfを使用する必要があります。 よろしくお願いいたします ジュリアン
記事全体を表示
S32 Design Studio 3.3 - 适用于 S32V234 1.2.0 的视觉扩展包现已推出!         产品发布公告 汽车微控制器和处理器 S32 Design Studio 适用于 S32V234 1.2.0 的 v3.3 视觉扩展包          新增内容 集成VSDK 1.6.0 安装说明 该更新可用于在线安装(通过 S32DS 扩展和更新)或离线安装(直接下载链接)  安装: 进入菜单"帮助" -> "S32DS 扩展和更新" 对话框 从可用项目中选择,然后点击“安装/更新”按钮 离线安装: 前往 S32 Design Studio for S32 Platform 产品页面 -> 下载部分或使用直接链接下载更新存档 zip 文件       启动 S32 Design Studio,转到“帮助”->“S32DS 扩展和更新”,然后单击“转到首选项”链接 通过“添加...”新增仓库,浏览以选择上一步中下载的更新压缩包文件       选择“S32 Design Studio for Power Architecture Device Package”和“使用 S32 SDK 3.0.2 更新”对于 Power Architecture 包并单击“安装/更新”按钮。   此时将启动更新安装过程。 激活 | 安装 | 许可 | 安装程序下载 概述 SDK
記事全体を表示
PN7642のホストインターフェイスを介してユーザーファームウェアを更新するためのステップバイステップガイド 一部のお客様は、ホストインターフェイスと「DownloadLibEx1」デモを使用してPN7642のユーザーファームウェアを更新しようとしており、SFWUMakerを使用して.esfwuを作成しています.binのファイルreadmeファイルに従いましたが、ファームウェアの更新に失敗しました。これがそのためのステップバイステップガイドです。SDK主導のブリンキーデモを使用して、Esfwuファイルを生成し、LPC5516ホストを搭載したPN7642ボードにプログラムします。LEDブリンキーのデモはpn7642_MCUXpresso_SDK_02-15-00_Pubにあります。PN7642の製品ページからダウンロードできます。高性能NFCリーダー、カスタマイズ可能なMCU、セキュリティツールボックスを備えたシングルチップソリューション | NXPセミコンダクターズ ステップ1:pnev7642fama_led_blinkyデモをコンパイルします フラッシュサイズが180KBであることを確認してください。デフォルトでは、MCUXpresso IDEを使用した場合の出力フラッシュサイズは180KBです。 ステップ2:ビンファイルの生成 バイナリ(.bin)ファイルはデフォルトでは生成されませんが、次の手順で手動で生成できます。 ターゲットアプリケーションを構築してください MCUXpressoでデバッグ/リリースフォルダを開きます *.axf ファイルを右クリックします。 メニューで「バイナリユーティリティ」→「バイナリの作成」を選択してください .binが表示されるはずです ステップ3: ESFWUファイルを作る binファイルをESFWUファイルに変換するには、ESFWUメーカーユーティリティ(sw810311)を使用できます。PN7642の製品ページからダウンロードできます。これは安全なファイルで、入手するには有効なNDAが必要です。 このユーティリティを実行するには、tomlファイルが非常に重要です。プロジェクトに合わせて出力名とバイナリ名を変更し、正しいaes_root_keyを使用する必要があります。他のパラメータについては、そのままにしておきました。 3.1 出力名とバイナリ名を変更してください 3.2 正しいaes_root_keyを設定します SWDでフラッシュされたアプリケーションはbinファイルで、暗号化されておらず、ブートローダーでもフラッシュされません。ホストインターフェイス経由の.esfwuファイルは、独自のブートローダーによって暗号化され、フラッシュされます。キーは有効でなければなりません。有効でないと、ブートローダーは受信したファイルを復号化できません。 ユーザーアプリケーションのファームウェアを作成するために正しいキーを使用していることを確認してください。これは非常に重要であり、それがなければ、いずれにせよ機能しません。デフォルトのキーは、データシートにトランスポート キーとして記載されています。下の写真を参照してください。ただし、独自のキーをプロビジョニングすることを強くお勧めします。詳細については、セキュアキーモードのアプリケーションノートをご覧ください。 ルートキーをプロビジョニングしたかどうかわからない場合は、SKM demo を実行して SKM の状態を確認できます。ルートキーがプロビジョニングされている場合は、プロビジョニングされたルートキーを使用してください。下の図から、app_root_keyがプロビジョニングされていないため、デフォルトのトランスポートキーを使用していることがわかります。   3.3 EsfwuMaker コマンドを使用して Esfwu ファイルを生成します。 このコマンドを実行すると、esfwuファイルを取得できます。 ステップ4: 安全なファームウェアのダウンロード ファームウェアのダウンロード例を使用して、PN7642ファームウェアを更新します。ホストソフトウェアパッケージに含まれており、PN7642と対話するためにLPC55S16およびMCUXpressoで使用する例を保持しています。LPC55S16ホストソフトウェアは、PN7642製品ページからダウンロードできます。 LPC55S16ホストソフトウェアバージョン02.01.00(nxp.com) デモを実行するには、ファームウェアの場所を編集する必要があります。Libex1.cのファイルダウンロード60行目について。 以下のように正しいハードウェア設定を行ってください。PNEV7642A Rev-B開発ボードをLPC55S16-EVKボードの上に積み重ねなければなりません。 PNEV7642A Rev-B開発ボードのJ36のピン1をLPC55ボードのJ9のピン1に合わせます。LPCボードのJ12の最後の4ピン(17〜20)は接続されていません。また、J10のピン1-4は、下の写真に示すように未接続のままです。 lPC55s16でファームウェアのダウンロードデモを実行します。以下のログ出力を参照してください。オプション「6」を選択して、アプリケーションのファームウェアを更新してください。更新にはしばらく時間がかかるかもしれません。最後に、「ファームウェアのアップロードに成功しました」というプロンプトが表示され、アップデートが成功したことが示されます。 正常に終了したことを確認するために、このデモを行います。J65を開いたままにしてください。D7(赤いLED)が点滅します(レート0.5HZ)。pnev7642fama_led_blinky.esfwuが必要な場合は、教えてください。 NFCコントローラーソリューション NFCフロントエンド・ソリューション NFCリーダー・ライブラリ
記事全体を表示
GStreamer RTPストリーミング <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> メモ: 最初に再生パイプラインを実行し、次にストリーミング パイプラインを実行します。 上記の例では、H263 ビデオと AMR オーディオ データをストリーミングしています。必要に応じてコーデック形式を変更します。 iMXがストリーミングマシンの場合、オーディオエンコーダー「amrnbenc」 を事前にインストールする必要があります。このシナリオはテストされていません シェル変数とパイプライン 再生機(受信機) # プレイバックマシンで、IMX2PCまたはPC2IMX変数を設定し、パイプラインを実行します ## IMX2PC:PCが再生を行う場合 AUDIO_DEC_SINK="rtpamrdepay !AMRNBDEC !アルサシンク " VIDEO_CAPS="\"application/x-rtp,media=(string)video,clock-rate=(int)90000,encoding-name=(string)H263-1998\"" VIDEO_DEC_SINK="rtph263pdepay !ffdec_h263 !オートビデオシンク」 ## IMX2PC設定終了 ## PC2IMX:iMXが再生を行う場合 AUDIO_DEC_SINK="rtpamrdepay !mfw_amrdecoder !アルサシンク " VIDEO_CAPS="\"application/x-rtp,media=(string)video,clock-rate=(int)90000,encoding-name=(string)H263-1998\"" VIDEO_DEC_SINK="rtph263pdepay !vpudec!mfw_v4lsink " ## PC2IMX設定終了 PLAYBACK_AUDIO="udpsrc caps=\"application/x-rtp,media=(string)audio,clock-rate=(int)8000,encoding-name=(string)AMR,encoding-params=(string)1,octet-align=(string)1\" \             port=5002 ! rtpbin.recv_rtp_sink_1 \         rtpbin. ! $AUDIO_DEC_SINK \      udpsrc port=5003 ! rtpbin.recv_rtcp_sink_1 \ rtpbin.send_rtcp_src_1!udpsink port=5007 sync=false async=false" PLAYBACK_VIDEO="udpsrc caps=$VIDEO_CAPS port=5000 !rtpbin.recv_rtp_sink_0\         rtpbin. ! $VIDEO_DEC_SINK \         udpsrc port=5001 ! rtpbin.recv_rtcp_sink_0 \ rtpbin.send_rtcp_src_0!udpsink port=5005 sync=false async=false" PLAYBACK_AV="$PLAYBACK_VIDEO $PLAYBACK_AUDIO" # 再生パイプライン gst-launch -v gstrtpbin name=rtpbin $PLAYBACK_AV ストリーミングマシン(送信者) # ストリーミングマシンで、IMX2PCまたはPC2IMX変数を設定し、パイプラインを実行します ## IMX2PC: iMXがストリーミングを行う場合 IP=x.x.x.x # 再生マシンのIPアドレス VIDEO_SRC="mfw_v4lsrc" VIDEO_ENC="vpuenc codec=h263 !RTPH263PPAY " AUDIO_ENC="audiotestsrc !AMRNBENCの!rtpamrpay」 ## IMX2PC設定の終了 ## PC2IMX: PCがストリーミングを行う場合 IP=y.y.y.y # 再生マシンのIPアドレス     VIDEO_SRC="v4l2src" VIDEO_ENC="ffenc_h263 !RTPH263PPAY " AUDIO_ENC="audiotestsrc !AMRNBENCの!rtpamrpay」 # END PC2PC設定 STREAM_AUDIO="$AUDIO_ENC !rtpbin.send_rtp_sink_1\ rtpbin.send_rtp_src_1!udpsink ホスト=$IP ポート=5002 \ rtpbin.send_rtcp_src_1!udpsink host=$IP port=5003 sync=false async=false \ udpsrc ポート=5007 !rtpbin.recv_rtcp_sink_1」 STREAM_VIDEO="$VIDEO_SRC ! $VIDEO_ENC ! rtpbin.send_rtp_sink_0 \         rtpbin.send_rtp_src_0 ! queue ! udpsink host=$IP port=5000 \ rtpbin.send_rtcp_src_0!udpsink host=$IP port=5001 sync=false async=false \ udpsrc ポート=5005 !rtpbin.recv_rtcp_sink_0」 STREAM_AV="$STREAM_VIDEO $STREAM_AUDIO" # ストリームパイプライン gst-launch -v gstrtpbin name=rtpbin $STREAM_AV i.MX6_All Linux マルチメディア 日時:GStreamer RTPストリーミング <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Hi, UDPプロトコルに基づいて、iMXからAndroidへの電話RTPストリーミングビデオ伝送を構築したいと考えています。これを試しましたか?アドバイスする人もいますか?      感謝!      キーレルズ 日時:GStreamer RTPストリーミング <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Hi Leonardo, 上記のgstreamerコマンドをimx6で使用しようとしていますが、次のエラーが発生します-誤ったパイプライン:要素 "amrnbenc"がありません Yocto 1.6を使用しています。これを修正する方法を教えていただけますか? 日時:GStreamer RTPストリーミング <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> フレームレートを半分に落とすか、エンコード前に1080から720にスケーリングする推奨される方法は何でしょうか?できれば、ハードウェアアクセラレータを活用するアプローチ。 日時:GStreamer RTPストリーミング <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> PCからiMXへのストリーミングを機能させるのに運が良かった人はいますか?4.1.0で約0.8fpsになっていますBSPの 日時:GStreamer RTPストリーミング <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 「gstreamer を使用した RTP ストリーミングが失敗する - gstrtpbin 要素がありません」を参照してください。何らかの形の紛争があったようです 日時:GStreamer RTPストリーミング <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> gst-plugin-good プラグイン内にあるその要素を含める必要があります。 日時:GStreamer RTPストリーミング <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> これはどのバージョンの BSP でテストされましたか?im6をレシーバーとして使用すると、「no element name gstrtpbin」というエラーが表示されます。BSP 4.1.0
記事全体を表示
基于 MCUXPresso 工具的 MCXN 系列装配项目 大多数情况下,生成并使用C项目。但是汇编项目有它自己的优势,有了汇编项目,您可以直接使用汇编语言编程,可以使用汇编助记符测试汇编指令。一般来说,C语言效率较低,所以为了测试内核的性能,或者得到外设的最高性能,需要汇编工程。 该文档讨论了创建汇编语言项目的过程,最后给出了一个切换 LED 的示例,演示了如何用汇编语言初始化 NVIC、CTimer、GPIO。并给出了子程序的例子。 1.基于 MCUXPresso 工具创建汇编语言项目的步骤 1.1 加载 MCUXPresso 工具并将 SDK 拖到已安装的 SDK 菜单 然后点击“创建一个新的C/C++项目” 1.2 选择主板或处理器,然后点击“下一步”软件按钮 1.3 命名项目并选择驱动程序。 在菜单中,使用默认配置即可,然后单击“完成” 1.4 使用 C 语言创建一个名为 MCXN947_project 的新项目 1.5 删除MCXN947_project.c并添加 main.s 右键点击“源”组,点击“新建”->“源文件” 1.6 添加main.s如下图,点击“完成” 1.7 最终项目如下: 2.0在 main.s 中编写汇编代码 这是 main.s 中的代码 /* 该汇编文件使用 GNU 语法 */ .equ SYSCON_ANGCLKCTRLSET0,0x40000220 .equ SYSCON_AHBCLKCTRLSET1,0x40000224 .equ SYSCON_AHBCLKCTRLSET2,0x40000228 .equ SYSCON_CTIMER4CLKSEL,0x4000027C .equ SYSCON_CTIMER4CLKDIV,0x400003E0 /*PIO3_4 LED 蓝色*/ .equ PORT3_PCR_BASE,0x40119000 .equ PORT3_PCR4,PORT3_PCR_BASE+0x90 .equ GPIO3_BASE,0x4009C000 .equ GPIO3_PDDR,GPIO3_BASE+0x54 .equ GPIO3_PDOR,GPIO3_BASE+0x40 /*PIT配置*/ .equ CTIMER4_BASE,0x40010000 .equ CTIMER4_IR,CTIMER4_BASE+0x00 .equ CTIMER4_TCR,CTIMER4_BASE+0x04 .equ CTIMER4_MCR,CTIMER4_BASE+0x14 .equ CTIMER4_MR0,CTIMER4_BASE+0x18 .equ CTIMER4_MSR0,CTIMER4_BASE+0x78 .equ CTIMER4_PWMC,CTIMER4_BASE+0x74 /*NVIC配置*/ /*参考Cortex-M4通用用户指南.pdf中的4.2嵌套向量中断控制器*/ .equ NVIC_ISER0,0xE000E100 .equ NVIC_ISER1,0xE000E104 .equ NVIC_ICPR0,0xE000E284 .equ NVIC_ICPR1,0xE000E288 .equ NVIC_IPR12,0xE000E430 .equ NVIC_IPR14,0xE000E438 .全局__user_mem_buffer1,__user_mem_buffer2 。文本 .section .rodata     .align  2 .LC0: 。文本     .thumb     .align  2 .global main .全局CTIMER0_IRQHandler .type主要功能 主要的: 推 {r3, lr}     add r3, sp, #4     nop BL 外设初始化     nop     nop     nop     nop     NOP     /*cpsie i*/ 环形: b 环 mov r3, #0 mov r0, r3 弹出 {r3, pc} /*子程序1*/ /* 从一个地方复制 10 个单词到另一个地方 */ .type MyFunc 函数 .函数 MyFunc: 推 {r0,r1,r2,lr} MOV R2,#0x00 LDR R0,=USER_MEM_BUFFER1 MOV R1,#0x00 循环1:     NOP 力量 R1,[R0] 添加 R1,#0x10 添加 R0,#4 添加 R2,#1 CMP R2,#0x10 BNE 环路1 并且 R5,R1,R5; ASR R3,R2,#1     ORR R5,R1,R5 添加 R3,R2,R3 ADC R3、R2、R3 AND R2,R1,R2 ; /*#0x0F*/ LDR R0,=0x1234 /*LDR R0,[R1],#4*/     nop 弹出 {r0,r1,r2,pc} .endfunc /***************************************/ /*子程序2*/ .type peripheralInit 函数 .函数 外设初始化: //启用CTimer4门控时钟 LDR R0,=0x400000 LDR R1,=SYSCON_AHBCLKCTRLSET2     nop 力量 R0, [R1] MOV R0,#0x03 //选择 LDR R1,=SYSCON_CTIMER4CLKSEL     nop 力量 R0, [R1] MOV R0,#0x09 //选择 LDR R1,=SYSCON_CTIMER4CLKDIV     nop 力量 R0, [R1] /*设置CTimer0*/ //设置Ctimer0_IR MOV R3,#0x01 LDR R1,=CTIMER4_IR     Nop LDR R2,[R1]     ORR R2,R2,R3 力量 R2,[R1] //设置CTIMER4_MCR MOV R3,#0x03 LDR R1,=CTIMER4_MCR LDR R2,[R1]     ORR R2,R2,R3 力量 R2,[R1] LDR R0,=6000000 LDR R1,=CTIMER4_MR0 力量 R0,[R1] LDR R0,=6000000 LDR R1,=CTIMER4_MSR0 力量 R0,[R1] MOV R0,#00 LDR R1,=CTIMER4_PWMC 力量 R0,[R1]     nop     nop //lop1: //  b lop1 /*设置中断,Ctimer4 IRQ 56*/ LDR R1,=NVIC_ISER1 LDR R0,[R1] LDR R3,=0x01000000     ORR R0,R0,R3 力量 R0,[R1] LDR R1,=NVIC_ICPR1 LDR R0,[R1] LDR R3,=0x01000000     ORR R0,R0,R3 力量 R0,[R1] MOV R0,#0x00 LDR R1,=NVIC_IPR14 力量 R0,[R1] /*引脚复用设置*/ /*启用PORT3和GPIO3门控时钟*/ LDR R0,=0x410000 LDR R1,=SYSCON_ANGCLKCTRLSET0     nop 力量 R0, [R1] /*设置GPIO3_4为GPIO输出模式*/ LDR R0,=#0x1000 LDR R1,=PORT3_PCR4 力量 R0,[R1]     LDR R1,=GPIO3_PDDR LDR R0,[R1] LDR R3,=0x10     ORR R0,R0,R3 力量 R0,[R1] /*CTimer4启动*/ MOV R3,#0x01 LDR R1,=CTIMER4_TCR LDR R0,[R1]     ORR R0, R0,R3 力量 R0,[R1]     nop     nop     nop     /*cpsid i*/ BX LR .endfunc /*********************************************/ /*子程序 3*/ 。文本 .type testcal 函数 .函数 测试校准: LDR R0,=0x12345678 MOV R1,#0x0F AND R0,R1 /*测试饱和函数*/ LDR R0,=0x8234 LDR R1,=0x8234 /*添加 R5,R0,R1*/ QADD16 R6,R0,R1 /*饱和发生,R6将变为负最小值0x8000*/     nop     /***8888888*/ LDR R0,=0x6234 LDR R1,=0x6234 /*添加 R5,R0,R1*/ SADD16 R6,R0,R1     nop QADD16 R6,R0,R1 /*饱和发生,R6将变为负最小值0x7FFF*/     nop SMUAD R6,R0,R1 BX LR .endfunc /*********************************************/ /*中断服务程序*/ .全局 CTIMER4_IRQHandler 。文本     .align 2     .type CTIMER4_IRQHandler function .函数 CTIMER4_IRQ处理程序: /*清除中断*/ 推 {R0,R1,LR}     nop     nop     nop LDR R1,=CTIMER4_IR LDR R0,[R1] /*虚拟读数*/ MOV R4,#0x10;     ORR R0,R0,R4 力量 R0, [R1] /*切换 LED*/     LDR R1,=GPIO3_PDOR LDR R0,[R1] LDR R3,=0x10 EOR R0、R0、R3 力量 R0,[R1]     NOP 弹出 {R0,R1,PC} .endfunc /******************************************************/ /*中断服务程序*/     .global SVC_Handler 。文本     .align 2 .type SVC_Handler 函数 .函数 SVC_Handler: 推 {R0,R1,LR}            NOP 弹出 {R0,R1,PC} /******************************************************/     .align  2 .L3:     .word     .align 4 .section .contantData 你好_TXT: .space 0x100 Hello_END:     .ALIGN 4   /*.lcomm */ .lcomm USER_MEM_BUFFER1 0x100 .lcomm USER_MEM_BUFFER2 0x100     .end 3.0代码解释 在代码中,必须定义主函数,在核心执行完在 startup_mcxn847_cm33_core0.c 中定义的代码 ResetISR(void) 后,它会跳转到 main() 函数 示例代码实现了初始化CTimer、GPIO和NVIC、SYSCON模块的功能,使得CTimer可以产生中断,在CTimer的ISR中,LED会进行切换。 运行代码后,你可以看到 LED 被切换了。 peripheralInit子程序用于初始化 CTimer、NVIC、GPIO、SYSCON 模块,以便 CTimer 可以触发中断并切换 LED。CTIMER4_IRQHandler是 CTimer4 的 ISR,它在 startup_mcxn847_cm33_core0 中定义。   MyFunc函数和testCal子程序只是为了测试特定的汇编指令,以及测试如何创建和调用子程序,它们没有特定的目标。
記事全体を表示
TfLite NPU 実行エラー op_layout_inference.cc:MapAxis:177 マップ軸が失敗しました みなさん ごめんなさい。私は、Pythonから変換されたプログラムである独自のC ++プログラムを構築して、私のボードimx8m plusの人々を検出するための簡単なモデルを実行しようとしました。 コード: 1. main.cpp // main.cpp #include "detector.h" #include int main(int argc, char* argv[]) { if (argc != 2) { std::cerr << "Usage: " << argv[0] << " " << std::endl; return 1; } std::string image_path = argv[1]; std::string model_path = "model.tflite"; std::string delegate_path = "/usr/lib/libvx_delegate.so"; cv::Size input_size(192, 192); float score_th = 0.5; float nms_th = 0.4; Detector detector(model_path, delegate_path, input_size, score_th, nms_th); if (!detector.init_model()) { return 1; } cv::Mat image = cv::imread(image_path); if (image.empty()) { std::cerr << "Failed to load image from " << image_path << std::endl; return 1; } auto [bboxes, scores] = detector.detect(image); for (size_t i = 0; i < bboxes.size(); ++i) { cv::rectangle(image, bboxes[i], cv::Scalar(0, 255, 0), 2); std::cout << "Detected bbox: " << bboxes[i] << " with score: " << scores[i] << std::endl; } // cv::imshow("Detections", image); cv::waitKey(0); return 0; } 2. 検出器.h // detector.h #ifndef DETECTOR_H #define DETECTOR_H #include #include #include #include #include #include #include #include "delegate_main.h" class Detector { public: Detector(const std::string& model_path, const std::string& delegate_path, const cv::Size& input_shape, float score_th, float nms_th); bool init_model(); std::pair<:vector><:rect>, std::vector > detect(const cv::Mat& image); private: std::string model_path_; std::string delegate_path_; cv::Size input_shape_; float score_th_; float nms_th_; std::unique_ptr<:interpreter> interpreter_; std::pair<:mat> preprocess(const cv::Mat& image, const cv::Size& input_size); std::tuple<:vector><:rect>, std::vector , std::vector > postprocess(cv::Mat& outputs, const cv::Size& img_size, float ratio, float score_th, float nms_th); void meshgrid(const cv::Range& x_range, const cv::Range& y_range, cv::Mat& xv, cv::Mat& yv); std::tuple<:vector><:rect>, std::vector , std::vector > nms(const std::vector<:rect>& bboxes, const std::vector & scores, float score_th, float nms_th); }; #endif // DETECTOR_H 3. detector.cpp // detector.cpp #include "detector.h" #include Detector::Detector(const std::string& model_path, const std::string& delegate_path, const cv::Size& input_shape, float score_th, float nms_th) : model_path_(model_path), delegate_path_(delegate_path), input_shape_(input_shape), score_th_(score_th), nms_th_(nms_th) {} bool Detector::init_model() { auto model = tflite::FlatBufferModel::BuildFromFile(model_path_.c_str()); if (!model) { std::cerr << "Failed to load model from " << model_path_ << std::endl; return false; } auto ext_delegate_option = TfLiteExternalDelegateOptionsDefault(delegate_path_.c_str()); auto ext_delegate_ptr = TfLiteExternalDelegateCreate(&ext_delegate_option); if (!ext_delegate_ptr) { std::cerr << "Failed to create external delegate" << std::endl; return false; } tflite::ops::builtin::BuiltinOpResolver resolver; resolver.AddCustom(kNbgCustomOp, tflite::ops::custom::Register_VSI_NPU_PRECOMPILED()); tflite::InterpreterBuilder builder(*model, resolver); builder(&interpreter_); if (!interpreter_) { std::cerr << "Failed to build interpreter" << std::endl; return false; } interpreter_->ModifyGraphWithDelegate(ext_delegate_ptr); if (interpreter_->AllocateTensors() != kTfLiteOk) { std::cerr << "Failed to allocate tensors" << std::endl; return false; } return true; } std::pair<:mat> Detector::preprocess(const cv::Mat& image, const cv::Size& input_size) { float ratio = std::min(static_cast (input_size.width) / image.cols, static_cast (input_size.height) / image.rows); cv::Size new_size(static_cast (image.cols * ratio), static_cast (image.rows * ratio)); cv::Mat resized_image; cv::resize(image, resized_image, new_size, 0, 0, cv::INTER_LINEAR); cv::Mat padded_image = cv::Mat::ones(input_size, CV_8UC3) * 114; resized_image.copyTo(padded_image(cv::Rect(0, 0, resized_image.cols, resized_image.rows))); std::vector<:mat> channels(3); cv::split(padded_image, channels); cv::Mat chw_image(3, input_size.height * input_size.width, CV_32F); for(int i = 0; i < 3; ++i) { channels[i].convertTo(channels[i], CV_32F); std::memcpy(chw_image.ptr (i), channels[i].data, channels[i].total() * sizeof(float)); } cv::Mat reshaped_image = chw_image.reshape(1, {1, 3, input_size.height, input_size.width}); return std::make_pair(reshaped_image, ratio); } std::tuple<:vector><:rect>, std::vector , std::vector > Detector::postprocess(cv::Mat& outputs, const cv::Size& img_size, float ratio, float score_th, float nms_th) { std::vector<:rect> bboxes; std::vector scores; std::vector class_ids; std::vector strides = {8, 16, 32}; std::vector<:mat> grids; std::vector<:mat> expanded_strides; for (int stride : strides) { int hsize = img_size.height / stride; int wsize = img_size.width / stride; cv::Mat xv, yv; meshgrid(cv::Range(0, wsize - 1), cv::Range(0, hsize - 1), xv, yv); cv::Mat grid; cv::hconcat(xv.reshape(1, 1), yv.reshape(1, 1), grid); grids.push_back(grid.reshape(2, 1)); expanded_strides.push_back(cv::Mat(grid.size(), CV_32F, cv::Scalar(stride))); } cv::Mat grid_cat, stride_cat; cv::vconcat(grids, grid_cat); cv::vconcat(expanded_strides, stride_cat); outputs.colRange(2, 4).convertTo(outputs.colRange(2, 4), CV_32F); cv::Mat exp_colRange(outputs.colRange(2, 4).size(), CV_32F); cv::exp(outputs.colRange(2, 4), exp_colRange); outputs.colRange(0, 2) = (outputs.colRange(0, 2) + grid_cat) * stride_cat; outputs.colRange(2, 4) = exp_colRange.mul(stride_cat); cv::Mat predictions = outputs.row(0); cv::Mat bboxes_mat = predictions.colRange(0, 4); cv::Mat scores_mat = predictions.col(4).mul(predictions.colRange(5, predictions.cols)); scores.assign(scores_mat.begin (), scores_mat.end ()); std::vector<:rect> bboxes_xyxy(bboxes_mat.rows); for (int i = 0; i < bboxes_mat.rows; ++i) { float x_center = bboxes_mat.at (i, 0); float y_center = bboxes_mat.at (i, 1); float width = bboxes_mat.at (i, 2); float height = bboxes_mat.at (i, 3); float x_min = x_center - width / 2.0; float y_min = y_center - height / 2.0; float x_max = x_center + width / 2.0; float y_max = y_center + height / 2.0; bboxes_xyxy[i] = cv::Rect(cv::Point(x_min / ratio, y_min / ratio), cv::Point(x_max / ratio, y_max / ratio)); } return nms(bboxes_xyxy, scores, score_th, nms_th); } void Detector::meshgrid(const cv::Range& x_range, const cv::Range& y_range, cv::Mat& xv, cv::Mat& yv) { cv::Mat x_coords = cv::Mat(x_range.size(), 1, CV_32F); cv::Mat y_coords = cv::Mat(y_range.size(), 1, CV_32F); for (int i = 0; i < x_range.size(); ++i) { x_coords.at (i,0) = x_range.start + i; } for (int i = 0; i < y_range.size(); ++i) { y_coords.at (i,0) = y_range.start + i; } cv::repeat(x_coords, 1, y_range.size(), xv); cv::repeat(y_coords.t(), x_range.size(), 1, yv); } std::tuple<:vector><:rect>, std::vector , std::vector > Detector::nms(const std::vector<:rect>& bboxes, const std::vector & scores, float score_th, float nms_th) { std::vector<:rect> bboxes_filtered; std::vector scores_filtered; std::vector class_ids_filtered; std::vector indices; cv::dnn::NMSBoxes(bboxes, scores, score_th, nms_th, indices); for(int idx : indices) { bboxes_filtered.push_back(bboxes[idx]); scores_filtered.push_back(scores[idx]); class_ids_filtered.push_back(0); } return std::make_tuple(bboxes_filtered, scores_filtered, class_ids_filtered); } std::pair<:vector><:rect>, std::vector > Detector::detect(const cv::Mat& image) { cv::Mat temp_image = image.clone(); auto [preprocessed_image, ratio] = preprocess(temp_image, input_shape_); std::cout << "Preprocess Completed"<<:endl>tensor(interpreter_->inputs()[0]); const uint input_width = input_data->dims->data[3]; const uint input_height = input_data->dims->data[2]; const uint input_channels = input_data->dims->data[1]; const uint batch_size = input_data->dims->data[0]; std::cout << "Expected dimension: "<< batch_size << "x" << input_channels << "x" << input_height << "x" << input_width << std::endl; const uint image_width = preprocessed_image.size[3]; const uint image_height = preprocessed_image.size[2]; const uint image_channels = preprocessed_image.size[1]; const uint image_batch_size = preprocessed_image.size[0]; std::cout << "Image dimension: "<< image_batch_size << "x" << image_channels << "x" << image_height << "x" << image_width << std::endl; if(input_data->type !=kTfLiteFloat32){ std::cerr << "input tensor is not of type float" << std::endl; return std::make_pair(std::vector<:rect>(), std::vector ()); } if(input_data->data.f == nullptr) { std::cerr << "input tensor data pointer is null" << std::endl; return std::make_pair(std::vector<:rect>(), std::vector ()); } std::memcpy(input_data->data.f, preprocessed_image.ptr (0), batch_size * input_width * input_height * input_channels * sizeof(float)); if(memcmp(input_data->data.f, preprocessed_image.ptr (0),batch_size * input_width * input_height * input_channels * sizeof(float)) != 0){ std::cerr << "data copy to input tensor failed" << std::endl; return std::make_pair(std::vector<:rect>(), std::vector ()); } else{ std::cout << "Set up Input Tensor Completed"<<:endl>Invoke(); std::cout << "Inference Completed"<<:endl>typed_output_tensor (0); size_t output_size = interpreter_->tensor(interpreter_->outputs()[0])->bytes / sizeof(float); cv::Mat results(1, output_size, CV_32F, output_tensor); std::cout << "Get Results Completed"<<:endl> result_rect_list; for (size_t i = 0; i < bboxes_xyxy.size(); ++i) { result_rect_list.push_back(bboxes_xyxy[i]); } // Returning the list of rectangles and the associated scores return {result_rect_list, scores}; } 私のボードイメージはNanbield 6.6.3_1.0.0フルイメージです VX DelegateとNPUを使用して実行しようとしましたが、コードを実行すると問題が発生しました root@imx8mpevk:/run/media/SD CARD-sda1/test_npu# ./detector_app lena_color_512.tif INFO: Vx delegate: allowed_cache_mode set to 0. INFO: Vx delegate: device num set to 0. INFO: Vx delegate: allowed_builtin_code set to 0. INFO: Vx delegate: error_during_init set to 0. INFO: Vx delegate: error_during_prepare set to 0. INFO: Vx delegate: error_during_invoke set to 0. Preprocess Completed Expected dimension: 1x3x192x192 Image dimension: 1x3x192x192 Set up Input Tensor Completed E [/usr/src/debug/tim-vx/1.1.88-r[ 126.612163] audit: type=1701 audit(1695250801.923:18): auid=4294967295 uid=0 gid=0 ses=4294967295 pid=1270 comm="detector_app" exe=2F72756E2F6D656469612F534420434152442D736461312F746573745F6E70752F6465746563746F725F617070 sig=6 res=1 0/src/tim/transform/ops/op_layout_inference.cc:MapAxis:177]Map axis failed. detector_app: /usr/src/debug/tim-vx/1.1.88-r0/src/tim/transform/ops/op_layout_inference.cc:178: uint32_t tim::transform::OpLayoutInfer::MapAxis(const std::vector &, uint32_t): Assertion `false' failed. Aborted (core dumped) また、gdb debugを実行しようとしましたが、次のようなものが返されます。 (gdb) set args lena_color_512.tif (gdb) run Starting program: /run/media/SD CARD-sda1/test_npu/detector_app lena_color_512.tif [Thread debugging using libthread_db enabled] Using host libthread_db library "/usr/lib/libthread_db.so.1". INFO: Vx delegate: allowed_cache_mode set to 0. INFO: Vx delegate: device num set to 0. INFO: Vx delegate: allowed_builtin_code set to 0. INFO: Vx delegate: error_during_init set to 0. INFO: Vx delegate: error_during_prepare set to 0. INFO: Vx delegate: error_during_invoke set to 0. Preprocess Completed Expected dimension: 1x3x192x192 Image dimension: 1x3x192x192 Set up Input Tensor Completed [New Thread 0xfffff146cf00 (LWP 1660)] E [/usr/src/debug/tim-vx/1.1.88-r0/src/tim/transform/ops/op_layout_inference.cc:MapAxis:177]Map axis failed. detector_app: /usr/src/debug/tim-vx/1.1.88-r0/src/tim/transform/ops/op_layout_inference.cc:178: uint32_t tim::transform::OpLayoutInfer::MapAxis(const std::vector &, uint32_t): Assertion `false' failed. Thread 1 "detector_app" received signal SIGABRT, Aborted. __pthread_kill_implementation (threadid= , signo=signo@entry=6, no_tid=no_tid@entry=0) at pthread_kill.c:44 44 pthread_kill.c: No such file or directory. (gdb) bt #0 __pthread_kill_implementation (threadid= , signo=signo@entry=6, no_tid=no_tid@entry=0) at pthread_kill.c:44 #1 0x0000fffff69c0568 in __pthread_kill_internal (signo=6, threadid= ) at pthread_kill.c:78 #2 0x0000fffff697acd0 in __GI_raise (sig=sig@entry=6) at /usr/src/debug/glibc/2.38+git-r0/sysdeps/posix/raise.c:26 #3 0x0000fffff6966ef0 in __GI_abort () at abort.c:79 #4 0x0000fffff69743f8 in __assert_fail_base (fmt=0xfffff6a8a8e8 "%s%s%s:%u: %s%sAssertion `%s' failed.\n%n", assertion=assertion@entry=0xfffff1ffdcf0 "false", file=file@entry=0xfffff1fff568 "/usr/src/debug/tim-vx/1.1.88-r0/src/tim/transform/ops/op_layout_inference.cc", line=line@entry=178, function=function@entry=0xfffff1fff5d8 "uint32_t tim::transform::OpLayoutInfer::MapAxis(const std::vector &, uint32_t)") at assert.c:92 #5 0x0000fffff6974470 in __assert_fail (assertion=0xfffff1ffdcf0 "false", file=0xfffff1fff568 "/usr/src/debug/tim-vx/1.1.88-r0/src/tim/transform/ops/op_layout_inference.cc", line=178, function=0xfffff1fff5d8 "uint32_t tim::transform::OpLayoutInfer::MapAxis(const std::vector &, uint32_t)") at assert.c:101 #6 0x0000fffff1fa5f74 in tim::transform::OpLayoutInfer::MapAxis(std::vector > const&, unsigned int) () from /usr/lib/libtim-vx.so #7 0x0000fffff1f6a1b0 in ?? () from /usr/lib/libtim-vx.so #8 0x0000fffff1f4e5f4 in tim::transform::layout_inference_impl::HandleLayoutInfer(std::shared_ptr<:transform::layout_inference_impl::layoutinfercontext>&, std::shared_ptr<:vx::operation> const&) () from /usr/lib/libtim-vx.so #9 0x0000fffff1f531f4 in tim::transform::LayoutInference(std::shared_ptr<:vx::graph> const&, std::shared_ptr<:vx::context>&, std::map<:shared_ptr><:vx::tensor>, std::shared_ptr<:transform::ipermutevector>, std::less<:shared_ptr><:vx::tensor> >, std::allocator<:pair><:shared_ptr><:vx::tensor> const, std::shared_ptr<:transform::ipermutevector> > > >) () from /usr/lib/libtim-vx.so #10 0x0000fffff23d85ac in vx::delegate::Delegate::Invoke(vx::delegate::OpData const&, TfLiteContext*, TfLiteNode*) () from /usr/lib/libvx_delegate.so #11 0x0000fffff7be9d9c in tflite::Subgraph::InvokeImpl() () from /usr/lib/libtensorflow-lite.so.2.14.0 #12 0x0000fffff7bea388 in tflite::Subgraph::Invoke() () from /usr/lib/libtensorflow-lite.so.2.14.0 #13 0x0000fffff7bd440c in tflite::impl::Interpreter::Invoke() () from /usr/lib/libtensorflow-lite.so.2.14.0 #14 0x0000aaaaaaaa62e0 in Detector::detect (this=this@entry=0xfffffffff890, image=...) at /home/ubuntu/imx-yocto-bsp/sdk/sysroots/armv8a-poky-linux/usr/include/c++/13.2.0/bits/unique_ptr.h:199 #15 0x0000aaaaaaaa35b0 in main (argc= , argv= ) at /home/ubuntu/imx-yocto-bsp/tflite_test/build_minim/main.cpp:29 誰かが何が間違っているのか手がかりを持っていますか?ここで何が起こったのかわからないからです。しかし、私が知っているのは、op_layout_inference.cc:MapAxis:177 Map axisのアサーションがアサーションエラー(? よろしくお願いいたします i.MX 8ファミリ | i.MX 8QuadMax (8QM) | 8QuadPlus Re:TfLite NPU実行エラー op_layout_inference.cc:MapAxis:177マップ軸が失敗しました 問題の原因を見つけました。どうやらこの行がエラーの原因となったようです。 resolver.AddCustom(kNbgCustomOp, tflite::ops::custom::Register_VSI_NPU_PRECOMPILED()); だから今のところ、私はそれを無効にするだけで、魔法のように機能します。誰かがなぜそれがエラーを引き起こすのかを説明できるかもしれませんが、今のところ、私はついに私のアプリ開発を続けることができます。 モデルについては、Pythonコードを使用してチェックしますが、エラーは発生していないようですので、モデル自体はNPUの実行と互換性があります。 ありがとうございます Re:TfLite NPU実行エラー op_layout_inference.cc:MapAxis:177マップ軸が失敗しました モデルが NPU/VX デリゲート実行と互換性がない可能性はありますか? bc CPUで実行しようとすると、別のエラーが発生しました(StridedSliceレイヤーの1つに関連していますが、CPUの実行についてまだ適切にチェックしていません) Re:TfLite NPU実行エラー op_layout_inference.cc:MapAxis:177マップ軸が失敗しました Hello, あなたが知っている限り、ゼロ引数コンストラクタを呼び出すことを不可能にしたという主張は、プライベートであるため、呼び出しが発生した場合、そのアサーションはエラーごとに違反されていると言うためにそこにあるように見えます。 よろしくお願いします。
記事全体を表示
探索 MCU-Link Pro 的功能 探索 MCU-Link Pro 的功能 MCU-Link Pro是恩智浦最新的ARM Cortex-M系列核心调试工具。它的一些功能是从过去的LPC-LINK2继承而来的。但总体而言,它经过重新设计并引入了许多新功能。这些附加功能使 MCU-Link Pro 成为一个非常强大的调试工具。本文将探讨这些功能并重点介绍一些有趣且有用的功能。这些功能主要包括以下几个方面。 社工工作+社工工作 电流和功耗的测量 MCU-Link pro 获得新 blhost 支持 适用于 Windows、Ubuntu Linux 和 MacOS 的 LIBUSBSIO 库 板上有辅助芯片LPC804   社工工作+社工工作 MCU-Link Pro 仅支持 SWD。它不支持JTAG。开发板的主控制器是LPC55S69。端口和LPC55S69之间有电平转换电路。使得电路板可以调试目标板在1.2V至5V下工作。它具有参考电压跟踪电路,用于跟踪目标板电压。它可以自动跟踪端口,无需任何设置。MCU-Link Pro 还可以提供 1.8V/3.3V到目标板。最大电流为350mA。这是通过连接 J6 并通过 J5 选择来完成的。 SWO的最大速度为9.6Mbit/s。 与 电流和功耗的测量 MCU-Link pro提供了非常有趣的电流和电压测量实时功能。它可以以高达 100ksps 的速度捕获目标电流使用情况、目标电源电压、屏蔽电流、模拟输入、调试接口参考电压或目标功耗的突发样本。该信息以图表形式显示,也可以导出以供进一步分析。还可以显示所收集数据的平均值。并且根据电流和电压数据,还可以计算出功耗并以图表形式显示。下图中画红线的地方就是鼠标所在时间点的实时电压。 更有趣的是,能量测量功能不需要激活调试来捕获数据,它是离线的,并且具有单独的数据通道。但如果存在这样的调试会话,它也可以链接到会话。这对于调试各种低功耗应用非常有用。不仅可以看到每一步命令下的功耗变化,还可以查看系统运行时较长一段时间内的功耗变化规律。由于有单独的数据通道,您甚至可以在 KEIL 中调试程序并在 MCUXpresso 中观察当前的变化。 MCU Link Pro 有两种电流测量配置,每种配置都有一个最大可测量电流。这是为了针对各种不同的目标实现最高的测量精度。每种配置都有两个自动控制范围,以提供更高的精度。从低电流测量到高电流测量的自动切换完全由硬件控制。 每次 MCU Link Pro 通电时,测量电路都会自行校准。由于使用晶体管将传感电路与目标电源隔离以避免争用并确保在校准期间向系统施加已知电压,因此校准前无需断开/重新连接 MCU Link Pro。 在高采样率下,MCUXpresso IDE 可能无法捕获所有数据,因此可能需要使用工具中的能量测量配置设置中的配置选项来调整采样率。 如果目标电流超过所选范围内的最大电流,测量将会饱和并截止,因此不准确。 Blhost 和 MCU-Link Pro MCU Link Pro最值得关注的是其USB转SPI和I2C桥接功能。这使得计算机能够直接通过 USB 发送 I2C 和 SPI 信号。 blhost也没有忽视这个强大的功能。新版本的blhost可以支持该功能,并增加了新的命令参数‘-L’。具体来说,“- L SPI”指的是SPI接口,“- L I2C”指的是I2C接口。下图是在frdm-k64f上的测试结果。图中可以清楚看到MCU Link Pro的SPI接口可以与k64上的mcuboot固件进行通信,将加密程序下载到flash中。 除了KINETIS,这个功能最适合i.MXRT600和i.MXRT500。这两款芯片都支持串行ISP模式,可以通过SPI或者I2C口把程序下载到RAM中,然后直接运行,很多用户都有这种用法。之前SDK里的例子中,需要用到一块twr-kv46或者twr-k65或者frdm-kl25的板子,用来接收UART的命令和数据,并转换成SPI和I2C的命令。由于这些板子没有直接的接口,需要飞线,非常麻烦。而且NXP只提供了这三块板子的固件,如果要用其他芯片或者板子,也必须移植固件,也非常麻烦。但是有了MCU Link Pro,一切都变得非常轻松愉快。 LIBUSBSIO 库 为了更好地扩展桥接功能的使用,NXP提供了libusbsio库。通过调用此库,您可以在自己的应用程序中实现USB转SPI\I2C\GPIO的功能。还根据NXP提供的libusbsio库制作了烧写kinetis ezport和flash的上位机工具。我在上一篇文章中详细介绍了这一点。有兴趣的朋友可以看看我的文章。 提供基于windows和linux的库是不够的。NXP 还提供了一个 python 库。该库基于python3,可以通过以下命令安装 >pip 安装 libusbsio libusbsio 文档中没有详细描述它的用法。这里做一个大概的介绍。以下是libusbsio的初始化过程。 import logging import logging.config from libusbsio import * # enable basic console logging logging.basicConfig() # load DLL from default directory sio = LIBUSBSIO(loglevel=logging.DEBUG) # the main code # calling GetNumPorts is mandatory as it also scans for all connected USBSIO devices numports = sio.GetNumPorts() print("SIO ports = %d" % numports) if numports > 0 and sio.Open(0): print("LIB version = '%s'" % sio.GetVersion()) print("SPI ports = %d" % sio.GetNumSPIPorts()) print("Max data size = %d" % sio.GetMaxDataSize()) if(sio.GetNumSPIPorts() > 0): spi = sio.SPI_Open(1000000, portNum=0, dataSize=8, preDelay=100) if spi: data, ret = spi.Transfer(spi_ssel[0], spi_ssel[1], b"Hello World") sio.Close() else: print("No USBSIO device found") ​ 第9行是打开libusbsio库的实例; 第14行:获取所有USB桥接器的usbsio端口数量; 第18、19、20行分别是读取的版本信息、SPI端口数量以及SPI缓存的最大大小; 第22行:打开SPI接口; 第24行,开始传输数据。 从上面可以看出使用过程比较简单。并且这些命令与C语言库的命令非常相似。 板上有一个辅助控制器 LPC804 MCU Link Pro 板上还有一个 lpc804。这个芯片在这里很令人困惑。它是用来做什么的?其UART、SPI、I2C端口均连接外部使用。但这有什么用呢?一种可以想象的应用是,UART端口连接到新添加的vcom2,然后SPI或I2C以从属模式工作。它作为监听器,监听需要调试的SPI或者I2C总线,并显示在计算机终端上。 LPC804调试接口与MCU Link Pro的调试端口相同。也许该板本身就是一个开发板,以便用户可以开发lpc804程序?另外,它的UART-ISP端口连接到LPC55S69的UART端口。看来以后可以通过新版本的CMSIS-DAP固件互相通信了。让我们期待未来新的玩法。 Freedom开发平台
記事全体を表示
i.MX8QM 音频 mclk 未启用 Hello, 我有一块带有 i.MX8QM 的定制板,我注意到 mclk0 输出未启用。这在 Linux 5.15 上运行良好,但现在我升级到 Linux 6.1 后,mclk0 不再工作。请参阅下面的时钟摘要...时钟频率是正确的,但未启用。如何启用 mclk? cat /sys/kernel/debug/clk/clk_summary enable prepare protect duty hardware clock count count count rate accuracy phase cycle enable ------------------------------------------------------------------------------------------------------- audio_rec_clk0_clk 0 0 0 24576000 0 0 50000 Y aud_rec_clk0_lpcg_clk 0 0 0 24576000 0 0 50000 ? acm_aud_clk0_sel 0 0 0 24576000 0 0 50000 Y acm_aud_clk1_sel 0 0 0 24576000 0 0 50000 Y acm_mclkout0_sel 0 0 0 24576000 0 0 50000 Y mclkout0_lpcg_clk 0 0 0 24576000 0 0 50000 ? acm_mclkout1_sel 0 0 0 24576000 0 0 50000 Y mclkout1_lpcg_clk 0 0 0 24576000 0 0 50000 ? 设备树: sound_card: sound-card { compatible = "simple-audio-card"; simple-audio-card,name = "PCM3168A"; simple-audio-card,aux-devs = <&>; simple-audio-card,widgets = "Speaker", "Channel1out", "Speaker", "Channel2out", "Speaker", "Channel3out", "Speaker", "Channel4out", "Speaker", "Channel5out", "Speaker", "Channel6out", "Speaker", "Channel7out", "Speaker", "Channel8out", "Microphone", "Channel1in", "Microphone", "Channel2in", "Line", "Channel3in", "Line", "Channel4in", "Microphone", "Channel5in", "Microphone", "Channel6in"; simple-audio-card,routing = "Channel1out", "AOUT1L", "Channel2out", "AOUT1R", "Channel3out", "AOUT2L", "Channel4out", "AOUT2R", "Channel5out", "AOUT3L", "Channel6out", "AOUT3R", "Channel7out", "AOUT4L", "Channel8out", "AOUT4R", "Channel1in", "AIN1L", "Channel2in", "AIN1R", "Channel3in", "AIN2L", "Channel4in", "AIN2R", "Channel5in", "AIN3L", "Channel6in", "AIN3R"; simple-audio-card,dai-link@0 { format = "left_j"; bitclock-master = <&snd_cpu>; frame-master = <&snd_cpu>; mclk-fs = <512>; snd_cpu: cpu { sound-dai = <&sai0>; clocks = <&mclkout0_lpcg 0>; dai-tdm-slot-num = <8>; dai-tdm-slot-width = <32>; }; pcm3168_dac: codec { sound-dai = <&pcm3168a 0>; dai-tdm-slot-num = <8>; dai-tdm-slot-width = <32>; }; }; simple-audio-card,dai-link@2 { format = "left_j"; bitclock-master = <&mic_cpu>; frame-master = <&mic_cpu>; mclk-fs = <512>; mic_cpu: cpu { sound-dai = <&sai0>; clocks = <&mclkout0_lpcg 0>; dai-tdm-slot-num = <8>; dai-tdm-slot-width = <32>; }; pcm3168_adc: codec { sound-dai = <&pcm3168a 1>; dai-tdm-slot-num = <8>; dai-tdm-slot-width = <32>; }; }; }; &sai0 { #sound-dai-cells = <0>; assigned-clocks = <&clk IMX_SC_R_AUDIO_PLL_0 IMX_SC_PM_CLK_PLL>, <&clk IMX_SC_R_AUDIO_PLL_0 IMX_SC_PM_CLK_SLV_BUS>, <&clk IMX_SC_R_AUDIO_PLL_0 IMX_SC_PM_CLK_MST_BUS>, <&sai0_lpcg 0>; assigned-clock-rates = <786432000>, <49152000>, <12288000>, <49152000>; clock-names = "bus", "mclk0", "mclk1", "mclk2", "mclk3"; pinctrl-names = "default"; pinctrl-0 = <&pinctrl_sai0>; status = "okay"; }; &i2c0 { #address-cells = <1>; #size-cells = <0>; clock-frequency = <100000>; pinctrl-names = "default"; pinctrl-0 = <&pinctrl_i2c0>; status = "okay"; // Audio Codec (8-channel output, 6-channel input) pcm3168a: audio-codec@44 { compatible = "ti,pcm3168a"; reg = <0x44>; reset-gpios = <&lsio_gpio4 24 GPIO_ACTIVE_LOW>; clocks = <&mclkout0_lpcg 0>; clock-names = "scki"; clock-frequency = <24576000>; assigned-clocks = <&clk IMX_SC_R_AUDIO_PLL_0 IMX_SC_PM_CLK_PLL>, <&clk IMX_SC_R_AUDIO_PLL_0 IMX_SC_PM_CLK_SLV_BUS>, <&clk IMX_SC_R_AUDIO_PLL_0 IMX_SC_PM_CLK_MST_BUS>, <&mclkout0_lpcg 0>; assigned-clock-rates = <786432000>, <49152000>, <24576000>, <49152000>; #sound-dai-cells = <1>; VDD1-supply = <&reg_3v3>; VDD2-supply = <&reg_3v3>; VCCAD1-supply = <&reg_5v0>; VCCAD2-supply = <&reg_5v0>; VCCDA1-supply = <&reg_5v0>; VCCDA2-supply = <&reg_5v0>; pinctrl-names = "default"; pinctrl-0 = <&pinctrl_codec_clk &pinctrl_audio_reset>; }; }; pinctrl_codec_clk: codec_clk { fsl,pins = < IMX8QM_MCLK_OUT0_AUD_ACM_MCLK_OUT0 0xc0000020 >; }; 回复:i.MX8QM 音频 mclk 未启用 我明白了问题所在。在音频放大器节点中,我在 6.1 内核中设置不正确,导致它无法工作。奇怪的是,dmesg 中没有错误,但是在修复这个错误配置后,mclk 开始工作。感谢您的帮助! 回复:i.MX8QM 音频 mclk 未启用 Hi @joanxie, 以下是 5.15 版时钟和 dmesg 的输出: root@neuralplex:~# cat /sys/kernel/debug/clk/clk_summary enable prepare protect duty hardware clock count count count rate accuracy phase cycle enable ------------------------------------------------------------------------------------------------------- audio_rec_clk0_clk 1 1 0 24576000 0 0 50000 Y aud_rec_clk0_lpcg_clk 1 1 0 24576000 0 0 50000 ? acm_aud_clk0_sel 0 0 0 24576000 0 0 50000 Y acm_aud_clk1_sel 0 0 0 24576000 0 0 50000 Y acm_mclkout0_sel 1 1 0 24576000 0 0 50000 Y mclkout0_lpcg_clk 1 1 0 24576000 0 0 50000 ? acm_mclkout1_sel 0 0 0 24576000 0 0 50000 Y mclkout1_lpcg_clk 0 0 0 24576000 0 0 50000 ? 回复:i.MX8QM 音频 mclk 未启用 谢谢你的信息,你介意分享一下 5.15 bsp 的转储时钟和日志文件吗?让我再确认一下。 回复:i.MX8QM 音频 mclk 未启用 Hi @joanxie, 没错。在 5.15 上运行的相同设备树在 6.1 上无法运行。由于兼容性(主要是 pcie),6.1 设备树中有细微的变化,但除此之外,设备树基本相同。我已附上 dmesg 的输出。 回复:i.MX8QM 音频 mclk 未启用 相同的设备树在 5.15 上运行,但在 6.1 上失败?你介意分享你的日志文件吗?
記事全体を表示