Multi Source Translation Content

cancel
Showing results for 
Show  only  | Search instead for 
Did you mean: 

Multi Source Translation Content

Discussions

Sort by:
HSE_IP核无法添加 Hello nxp的技术支持, 我在使用S32DS IDE3.6.2版本,RTD6.0.0版本,我无法在外设配置的界面添加HSE的IP核,可能会导致配置文件无法自动生成hse_mu的driver,请问一下这个问题该怎么解决? BR/chenyuhang Re: HSE_IP核无法添加 Hi @lukaszadrapa , 感谢您的回复,我目前已经安装了6.0.0 QLP01的包并且已经可以在外设中添加HSE的IP核了。我还有一个疑问想问您,就是我在使用HSE的时候,已经将 C:\NXP\HSE_FW_S32K344_0_2_55_0\hse_full_mem\interface 下的全部文件添加到工程中了,那么 Framework 和 services 文件夹应该如何添加?(附录的图中展示的工程结构是C:\NXP\S32K3_HSE_DemoExamples_1_0_0\S32K3_HSE_DemoExamples\Key Management\S32K344_DemoApp_SessionKeys 的示例工程),是否可以通过外设配置界面添加到工程中?还是说需要手动将这两个文件夹粘贴到我自己的工程中?另外我有查阅到nxp的中国团队有做过HSE_Lib2.0的内容,这些资料我应该如何获取? BR/chenyuhang Re: HSE_IP核无法添加 你好@chenyuhang 可能会出现并非所有模块都包含在 RTD 软件包中的情况。RTD 6.0.0 就是这种情况,当时还没有 Crypto 驱动程序。它后来在 6.0.0 QLP01 软件包中提供: 在版本说明文件中,您可以发现该软件包仅提供 Crypto 驱动程序,因此您可以将其安装在 6.0.0 软件包之上: 此致, Lukas Re: HSE_IP核无法添加 该框架只是纯 C 代码,不能通过外设配置界面添加。应手动将其添加到项目中。 让我分享一下我之前写给另一位客户的答案--可能是数据缓存出了问题: "我可以看到,该框架尚未完全准备好无缝实施 RTD 项目。我刚刚发现,我在这里的所有项目实际上都禁用了缓存。 该框架使用一个描述符数组,在运行时根据需要选择这些描述符。有一个定义 HSE_ENABLE_SHARED_MEM,可用于将数组强制转入共享区域。但是,默认情况下并不使用这个地址,而且我可以看到,它可能因为使用了一些奇怪的地址而无法工作。 那么,看看 hse_host.c 中的实现吧并将描述符数组也强制设置为 no_cachable 区域"。 关于 HSE_Lib,这是中国应用程序团队的一个项目,目前尚未公开。请与当地的恩智浦 FAE 或分销 FAE 讨论。 此致, Lukas
View full article
ls1028aのセキュアデバッグ こんにちは、 ls1028a ベースのカスタム ボードで Secure Debug をテストしたいと思います。今のところ、次の手順を実行しました。 1. fuse_fipと次のinput_fuse_fileを使用してレジスタをヒューズする /* * 著作権 2018 NXP */ --------------------------------------------------- プラットフォーム= LS1028 --------------------------------------------------- POVDD_GPIO = --------------------------------------------------- OTPMK_FLAGS =0010 OTPMK_0 =11111111 OTPMK_1 =22222222 OTPMK_2 =33333333 OTPMK_3 =44444444 OTPMK_4 =aab702d7 OTPMK_5 =f9506757 OTPMK_6 =cfb3b401 OTPMK_7 =b5462445 --------------------------------------------------- SRKH_0 =9f05646d SRKH_1 =eb7e034b SRKH_2 =a5c8da66 SRKH_3 =0215ce65 SRKH_4 =34bec8dd SRKH_5 =500d48bb SRKH_6 =665582c0 SRKH_7 =8b826a4f --------------------------------------------------- OEM_UID_0 =11223344 OEM_UID_1 =55667788 OEM_UID_2 =99001122 OEM_UID_3 =33445566 OEM_UID_4 =77889900 --------------------------------------------------- DCV_0 =68686868 DCV_1 =67676767 DRV_0 =6168745f DRV_1 =5f726e6e --------------------------------------------------- DBG_LVL =001 --------------------------------------------------- WP = ITS = NSEC = ZD = K0 = K1 = K2 = K3 = K4 = K5 = K6 = FR0 = FR1 = --------------------------------------------------- OUTPUT_FUSE_FILENAME =fuse_scr.bin --------------------------------------------------- gen_drv_drbg で作成された DRV λ ./gen_drv_drbgA2 6168745f5f726e6e #-----------------------------------------------------# #------- -------- -------- -------# #------- CST (コード署名ツール) バージョン 2.0 -------# #------- -------- -------- -------# #-----------------------------------------------------# ハミングコード後のDRV[63:0]は次のようになります。 6168745f5f726e6e 名前 | ビット | 値 _______ __|__ __________ __|__ __________ ドライブ 0 | 63 - 32 | 6168745f ドライブ 1 | 31 - 0 | 5f726e6e ブートしてU-Bootシェルから確認することで、それらが正しく融合されていることを確認できます。 ハミングコードエラーなし 0x1e80024 1 01e80024: 00000000 .... dblev が 1 に設定され、dcvr も融合されています => md 0x1e80204 3 01e80204: 00000001 68686868 67676767 ....うぅうぅううう drvr を 1 に設定 => md 0x1e80210 2 01e80210: ffffffff ffffffff ........ しかし、接続できません。コード ウォリアー (バージョン: 11.5.12;) で試してみると、ビルドID: 221209)、ターゲット接続構成で「セキュアデバッグキー:」を設定し、そこにキー「0x6e6e725f5f746861」(逆エンディアン)を指定して検査しようとすると、情報でエラーが発生しました。 [CCS: マルチコア動作中のサブコアエラー] 私はSecure_boot.pptxプレゼンテーション(リンク: https://community.nxp.com/t5/Layerscape-Knowledge-Base/Secure-boot-Fuse-Provisioning-Secure-debug/ta-p/1988564 )に従ってCCSからテストしようとしましたが、次のようになりました。 (ビン)54%すべて削除 (bin) 55 % config cc cwtap:192.168.0.32 (ビン)56%ccを表示 0: コードウォリアーTAP (cwtap:192.168.0.32)CC ソフトウェア バージョン{0.0} (ビン)57% (bin) 57 % ccs::config_chain {ls1028a dap} SAP2: セキュアデバッグ違反 (bin) 58 % ccs::get_config_chain を表示 チェーン位置0: LS1028A チェーンポジション1: DAP チェーン位置2: SAP2 (ビン)59% (bin) 59 % ccs::config_chain {ls1028a dap sap2} LS1028A: std::bad_alloc (bin) 60 % ccs::config_chain {ls1028a dap} SAP2: セキュアデバッグ違反 (bin) 61 % ccs::get_config_chain を表示 チェーン位置0: LS1028A チェーンポジション1: DAP チェーン位置2: SAP2 (bin) 62 % ディスプレイ ccs::read_reg 0 sdcr 1 8 SAP2 エラー - SAP_STATUS を読み取ります SAP2 エラーとは何ですか?それに関していかなる情報も見つけることができません。 何か間違ったことをしているのでしょうか? QorIQ LS1デバイス Re: Secure Debug on ls1028a 他に試せることはありますか?あるいは、チャレンジ/レスポンス手順は ls1028a では実行できないのでしょうか?現時点では、JTAG を閉じたように動作しますが、input_fuse_file で使用される IIUC 構成では、通知なしで条件付きで閉じるように設定する必要があります。また、U-Boot シェルから読み取られたレジスタも同じ情報を伝えます。 Re: Secure Debug on ls1028a @LFGP私はhttps://www.nxp.com/part/LS1027AXE7NQAを使用していますSO、そこには E という文字があります。 Re: Secure Debug on ls1028a @LFGP 私の記憶では、部品番号に E が付いている SoC は、セキュリティがオンになっていることを意味しますか?明日確認しますが、セキュア ブート手順を実行できるため、E が搭載されているはずだとほぼ確信しています。 デバッグレベルに関しては..元の投稿で書きましたが、私は現在レベル001です。 # 001 -> 通知なしで、チャレンジレスポンスを介して条件付きで開きます。 以下は U-Boot シェルからの出力です。 => md 0x1e80204 3 01e80204: 00000001 68686868 67676767 ....うぅうぅううう したがって、0x1e80204 は 00000001 -> DB_LVL は 001 に設定されます。 @LFGP他に何が間違っているのでしょうか?これをさらにデバッグするにはどうすればいいでしょうか? Re: Secure Debug on ls1028a 親愛なる@tomzy_0様、 デバイスの部品番号命名法に文字 E が含まれていることを確認してください。 一方、「デバッグレベル」レジスタが閉じられていないことを確認してください。以下を参照してください。 -------------------------------------------------- # デバッグ レベルをバイナリ形式で指定します。[オプション] # 000 -> 完全にオープン: デバッグ ポータルは無条件に有効になります。 # 001 -> 通知なしで、チャレンジレスポンスを介して条件付きで開きます。 # 01x -> 通知付きでチャレンジレスポンス経由で条件付きで開きます。 # 1xx -> クローズしました。すべてのデバッグ ポータルが無効になっています。 DBG_LVL= ---------------------------------------------------   よろしくお願いいたします LFGP Re: Secure Debug on ls1028a @LFGP素早い返信ありがとうございます。残念ながら、あなたが言及したスレッドで提供されている手順にすでに従いました。私の投稿でリンクしたプレゼンテーションにも同じ手順が書かれていました。このようなコマンドを実行した結果も投稿しました。返される印刷エラー ログで DCV を CCS として読み取ることもできません。 @yipingwangこんにちは。直接言及して申し訳ありませんが、Threadに返信したのはあなただとわかりました。私が間違っていなければ、セキュア ブートのプレゼンテーションの作成も担当されていましたね。 お手伝いいただけますか?プレゼンテーションと私のケースの違いは、私が ls1028a を使用していることです。 チェーンは異なる構成にする必要があります ({ls1028a dap/sap2} と {ls1043a dap sap2})。しかし、これが本当に問題であるかどうかを判断するのは困難です。CCS ドキュメントというものは存在しないと思います。これがなければ、さらにデバッグを行うことさえ困難です。 質問の一つに戻ります。セキュアデバッグが動作するために追加の条件が必要ですか?ITSは設定されていますか?SB_ENだけで十分でしょうか?RCWの他のビットを設定する必要があるでしょうか? Re: Secure Debug on ls1028a 親愛なる@tomzy_0様、 SAP2 の意味は何ですか?回答:セキュア アクセス ポートです。   デバイスが JTAG ポートを開くように設定されている場合、チャレンジ/レスポンス イベントによって認証されるまで SAP2 はロックされたままになります。 チャレンジ/レスポンス イベントを通過する前に列挙またはアクセスを試みると、 「セキュア デバッグ違反」が発生します。そのため、CCS ログ メッセージ「セキュア デバッグ違反」および「SAP2 エラー - SAP_STATUS を読み取り」が表示されます。   次のケースを確認してください。それはあなたのケースに関連しています。 https://community.nxp.com/t5/CodeWarrior-for-QorIQ/JTAG-デバッグチャレンジ応答-in-CodeWarrior-connection-server/mp/1281386   BR LFGP Re: Secure Debug on ls1028a セキュア デバッグが機能するための追加条件はありますか?セキュアブートで起動する必要がありますか?何らかの SECMON 状態にありますか? Re: Secure Debug on ls1028a 親愛なる@tomzy_0様、 SB_EN = 1に設定し、 IT_S =0 SECリファレンス・マニュアルをダウンロードする https://www.nxp.com/webapp/sps/download/preDownload.jsp?render=true 次のアプローチを試すことができます(LS1028aに合わせて調整してください)。 SecMon_HP ステータス レジスタ (位置 0x1e90014) をチェックして、ビット OTPMK_ZERO、OTMPK_SYNDROME、および PE が 0 になっていることを確認してください。そうでない場合は、ユーザーが切断した OTPMK ヒューズに何らかのエラーがあります。 b.OTMPK ヒューズが正しい場合 (手順 1 を参照)、SCRATCHRW2 (0x1ee0204) レジスタにエラーがないか確認します。 紀元前手順 b のエラー コードが 0 の場合は、HPSR のシステム セキュリティ モニターの状態フィールドを確認します。 システムセキュリティモニターの状態 (0x9) ITS ヒューズ = 1 の場合、ISBC コードがボードをリセットしたことを意味します。これには次の理由が考えられます。 ESBC u-boot の署名に使用された公開鍵のハッシュが SRK Hash Fuse の値と一致しません または 画像の署名検証に失敗しました。 SSM_STATE (0xd) または非セキュア状態 (0xb) ESBC ヘッダーのエントリ ポイント フィールドを確認します。 エントリ ポイントが正しい場合は、u-boot イメージが必要なセキュア ブート構成でコンパイルされていることを確認します。 BR LFGP Re: Secure Debug on ls1028a @LFGP こんにちは、返信が遅くなって申し訳ありません。以下はU-Bootシェルからの出力です。 「`」 => md 0x1e90014 1 01e90014: 80002900 .).. 「`」 つまり、SecMonの状態は「チェック」に設定されます。OTPMK_ZEROは0です。OTPMK_SYNDROMまたはPEが何なのか分かりません。 「`」 => md 0x1ee0204 1 01ee0204: 00000000 .... 「`」 SCRATCHRW2 を 0 に設定することで、エラーは発生しません。ちなみに、ハミング符号もゼロなので、すべて問題ないはずです。 「`」 => md 0x1e80024 01e80024: 00000000 .... 「`」 セキュアモニターは別の状態であるべきでしょうか? Re: Secure Debug on ls1028a CodeWarrior GUIからCCSログをDEBUGに設定して接続を確認したところ、以下のことが分かりました。 ccs_get_config_chain serverh = 0 デバイスリスト: (サイズ = 3) ccs_get_config_chain; ccs_error = 0 ccs_get_config_chain serverh = 0 デバイスリスト: (サイズ = 3) device[0]:: core_type=LS1028A(301) device[1]:: core_type=DAP(232) device[2]:: core_type=SAP2(272) ccs_get_config_chain; ccs_error = 0 ccs_read_register coreh = [serverh:0;cc_index:0;chain_pos:0] インデックス = 8192 カウント = 1 サイズ = 8 値: (サイズ = 😎 00000000 00000000 ccs_read_register; ccs_error = 56 エラーメッセージ: SAP2 エラー - SAP_STATUS の読み取り ccs_get_config_chain serverh = 0 デバイスリスト: (サイズ = 3) ccs_get_config_chain; ccs_error = 0 ccs_get_config_chain serverh = 0 デバイスリスト: (サイズ = 3) device[0]:: core_type=LS1028A(301) device[1]:: core_type=DAP(232) device[2]:: core_type=SAP2(272) ccs_get_config_chain; ccs_error = 0 ccs_write_register coreh = [serverh:0;cc_index:0;chain_pos:0] インデックス = 8193 カウント = 1 サイズ = 8 値: (サイズ = 😎 6168745F 5F726E6E ccs_write_register; ccs_error = 56 エラーメッセージ: SAP2 エラー - SAP_STATUS の読み取り チャレンジ値を読み取るとすべて0が返され、SAP2エラーが発生するようです。本来であれば、U-Bootシェルから読み取れるチャレンジ値が返されるはずです。なぜそのようなことが起こるのでしょうか?
View full article
密钥延期 S32编译器 3.4和2.2版本 Re: 密钥延期 S32编译器 3.4和2.2版本 你好、 如果您指的是 S32DS 的激活密钥,那么看起来两个许可证都有效。您使用的激活密钥正确吗? F4DA-AC30-917F-C0B1 用于 S32DS v3.4,FCF9-575D-D74C-E86D 用于 v2.2
View full article
TapLinx Package Key & DESFire EV3 Default PICC Key Clarification I recently procured MIFARE DESFire EV3 cards and would like to confirm whether they use a known factory-default PICC master key (e.g. all-zero AES/2K3DES/DES), or if the key is card-vendor dependent. My intention is to verify this via the TapLinx Android sample application by authenticating to the PICC (KeyNo 0). However, to build the sample APK, a valid TapLinx packageKey must be defined in the code:   static final String packageKey = ""; Before proceeding with building the test app, could you please confirm: Whether there is a documented default PICC master key for DESFire EV3 cards, and How to generate or obtain the appropriate TapLinx packageKey for my application. Thank you for your guidance. Code examples Example code Getting Started Licensing Re: TapLinx Package Key & DESFire EV3 Default PICC Key Clarification Hello, Thank you for your interest in our products. As you may already know, MIFARE DESFire is a restricted product and requires to have an NDA in order to get further information. My recommendation is to please contact any of our Distributors. Answering your second question, please take a look at the TapLinx site: TapLinx SDK for MIFARE, NTAG, ICODE and UCODE | NXP Semiconductors In the Documentation section, you will find the relevant User Guide for your development platform. Each document explains how to create your own user and register your application.
View full article
CIFAR10 TFLM Quick Build Guide catalogs I. Overview II. Environment Preparation 2.1 Virtual environment 2.2 Using Google Colab III. Core Steps 3.1 CIFAR10 dataset 3.2 Model creation 3.3 Model Training 3.4 Model Transformation 3.5 Inference Validation 3.6 Benchmark Performance 3.7 Full Implementation 3.7 Simplified version (Colab) IV. TFLite Micro Deployment V. Quick Verification Application Examples VII. Conclusion Reference Spoiler (Highlight to read) more details, please see the attachment. more details, please see the attachment. I. Overview CIFAR-10 : Alex Krizhevsky, University of Toronto The CIFAR-10 public dataset, and one of the most classic and commonly used entry-level benchmark datasets in computer vision, contains 60,000 32x32 color images (50,000 training, 10,000 testing) in 10 categories, such as airplanes, cars, birds, cats, and more. tflm_cifar10 : Demonstrates how to run a CIFAR-10 image classification model in real-time on a microcontroller from NXP using the TensorFlow Lite Micro framework. That is, a pre-trained convolutional neural network model for the CIFAR-10 dataset is deployed to the MCU, giving it the ability to recognize 10 classes of common objects (airplanes, cars, birds, cats, etc.). Model: a lightweight CNN model with 3 convolutional layers, ReLU activation layer, pooling layer and a fully connected layer. Input: 32x32 pixel color image. Output: probability that an image belongs to one of the 10 categories in CIFAR-10. This document: provides the complete process of building for the CIFAR10 dataset, from the dataset, model training transformation, deployment of inference of the rapid implementation of the program, can be used as an example of the tflm_cifar10 (inference-based) front complement, this paper does not involve the deployment and optimization of the end-side. ... """ CIFAR10 快速训练、测试、部署与推理完整流程 """ import os os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' # 减少TensorFlow日志 import tensorflow as tf import numpy as np import time import matplotlib.pyplot as plt print(f"TensorFlow版本: {tf.__version__}") print(f"NumPy版本: {np.__version__}") class CIFAR10QuickPipeline: def __init__(self): """初始化管道""" self.model = None self.tflite_model = None def load_data(self, sample_size=1000): """加载简化数据集""" print("\n1. 加载CIFAR10数据集...") (x_train, y_train), (x_test, y_test) = tf.keras.datasets.cifar10.load_data() # 预处理 x_train = x_train.astype('float32') / 255.0 x_test = x_test.astype('float32') / 255.0 # 使用少量数据(快速训练) x_train_small = x_train[:sample_size] y_train_small = y_train[:sample_size] x_test_small = x_test[:200] y_test_small = y_test[:200] # 转换为独热编码 y_train_onehot = tf.keras.utils.to_categorical(y_train_small, 10) y_test_onehot = tf.keras.utils.to_categorical(y_test_small, 10) print(f"训练数据: {x_train_small.shape}") print(f"测试数据: {x_test_small.shape}") return (x_train_small, y_train_onehot), (x_test_small, y_test_onehot) def create_simple_model(self): """创建简化CNN模型""" print("\n2. 创建简单CNN模型...") model = tf.keras.Sequential([ # 输入层 tf.keras.layers.Input(shape=(32, 32, 3)), # 卷积层1 tf.keras.layers.Conv2D(8, (3, 3), padding='same', activation='relu'), tf.keras.layers.MaxPooling2D((2, 2)), # 卷积层2 tf.keras.layers.Conv2D(16, (3, 3), padding='same', activation='relu'), tf.keras.layers.MaxPooling2D((2, 2)), # 全连接层 tf.keras.layers.Flatten(), tf.keras.layers.Dense(32, activation='relu'), tf.keras.layers.Dropout(0.2), tf.keras.layers.Dense(10, activation='softmax') ]) model.compile( optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'] ) model.summary() self.model = model return model def train_model(self, x_train, y_train, x_test, y_test, epochs=10): """训练模型""" print("\n3. 训练模型...") # 回调函数:早停 callbacks = [ tf.keras.callbacks.EarlyStopping( monitor='val_loss', patience=3, restore_best_weights=True ) ] history = self.model.fit( x_train, y_train, epochs=epochs, batch_size=32, validation_data=(x_test, y_test), callbacks=callbacks, verbose=1 ) # 评估模型 test_loss, test_acc = self.model.evaluate(x_test, y_test, verbose=0) print(f"\n测试准确率: {test_acc:.4f}") return history def convert_to_tflite(self): """转换为TFLite格式""" print("\n4. 转换为TFLite格式...") # 转换为TFLite converter = tf.lite.TFLiteConverter.from_keras_model(self.model) # 优化配置 converter.optimizations = [tf.lite.Optimize.DEFAULT] converter.target_spec.supported_types = [tf.float32] # 转换 tflite_model = converter.convert() # 保存模型 with open('cifar10_model.tflite', 'wb') as f: f.write(tflite_model) # 保存为字节数组(用于嵌入式部署) self.save_as_c_array(tflite_model) self.tflite_model = tflite_model model_size = len(tflite_model) / 1024 print(f"模型大小: {model_size:.1f} KB") return tflite_model def save_as_c_array(self, tflite_model): """保存为C数组格式""" c_array = '// 自动生成的CIFAR10模型数组\n' c_array += '#include \n\n' c_array += 'const unsigned char cifar10_model_tflite[] = {\n' # 每行显示12个字节 for i in range(0, len(tflite_model), 12): line_bytes = tflite_model[i:i+12] c_array += ' ' + ', '.join(f'0x{b:02x}' for b in line_bytes) + ',\n' c_array += '};\n\n' c_array += f'const unsigned int cifar10_model_tflite_len = {len(tflite_model)};\n' with open('cifar10_model_array.h', 'w') as f: f.write(c_array) print("C数组已保存: cifar10_model_array.h") def test_tflite_inference(self, x_test, y_test, num_tests=10): """测试TFLite推理""" print(f"\n5. 测试TFLite推理 ({num_tests}个样本)...") if self.tflite_model is None: with open('cifar10_model.tflite', 'rb') as f: self.tflite_model = f.read() # 加载TFLite模型 interpreter = tf.lite.Interpreter(model_content=self.tflite_model) interpreter.allocate_tensors() input_details = interpreter.get_input_details() output_details = interpreter.get_output_details() # 类别名称 class_names = ['飞机', '汽车', '鸟', '猫', '鹿', '狗', '青蛙', '马', '船', '卡车'] correct = 0 times = [] for i in range(min(num_tests, len(x_test))): # 准备输入 input_data = x_test[i:i+1] # 推理 start_time = time.perf_counter() interpreter.set_tensor(input_details[0]['index'], input_data) interpreter.invoke() inference_time = time.perf_counter() - start_time times.append(inference_time) # 获取输出 output = interpreter.get_tensor(output_details[0]['index']) predicted_class = np.argmax(output[0]) actual_class = np.argmax(y_test[i]) # 检查是否正确 if predicted_class == actual_class: correct += 1 print(f"样本 {i+1}: 预测={class_names[predicted_class]:<5} " f"实际={class_names[actual_class]:<5} " f"时间={inference_time*1000:.1f}ms " f"{'✓' if predicted_class == actual_class else '✗'}") accuracy = correct / num_tests avg_time = np.mean(times) * 1000 print(f"\n推理统计:") print(f" 准确率: {accuracy:.1%} ({correct}/{num_tests})") print(f" 平均推理时间: {avg_time:.1f}ms") print(f" 推理速度: {1000/avg_time:.0f} FPS") return accuracy, avg_time def benchmark_performance(self, x_test): """性能基准测试""" print("\n6. 性能基准测试...") interpreter = tf.lite.Interpreter(model_content=self.tflite_model) interpreter.allocate_tensors() input_details = interpreter.get_input_details() # 预热 test_input = x_test[0:1] for _ in range(10): interpreter.set_tensor(input_details[0]['index'], test_input) interpreter.invoke() # 基准测试 num_runs = 100 start_time = time.perf_counter() for _ in range(num_runs): interpreter.invoke() total_time = time.perf_counter() - start_time avg_time = total_time / num_runs * 1000 print(f"基准测试结果:") print(f" 总推理次数: {num_runs}") print(f" 总时间: {total_time*1000:.1f}ms") print(f" 平均推理时间: {avg_time:.1f}ms") print(f" 推理速度: {1000/avg_time:.0f} FPS") return avg_time def save_model_summary(self): """保存模型摘要""" summary = [] self.model.summary(print_fn=lambda x: summary.append(x)) with open('model_summary.txt', 'w') as f: f.write('\n'.join(summary)) f.write(f"\n\n模型信息:") f.write(f"\n参数数量: {self.model.count_params():,}") f.write(f"\n保存时间: {time.ctime()}") print("模型摘要已保存: model_summary.txt") def main(): """主函数""" print("=" * 60) print("CIFAR10 快速训练、测试、部署管道") print("=" * 60) # 创建管道 pipeline = CIFAR10QuickPipeline() # 1. 加载数据 (x_train, y_train), (x_test, y_test) = pipeline.load_data(sample_size=2000) # 2. 创建模型 pipeline.create_simple_model() # 3. 训练模型 history = pipeline.train_model(x_train, y_train, x_test, y_test, epochs=15) # 4. 保存模型摘要 pipeline.save_model_summary() # 5. 转换为TFLite pipeline.convert_to_tflite() # 6. 测试推理 pipeline.test_tflite_inference(x_test, y_test, num_tests=20) # 7. 性能测试 pipeline.benchmark_performance(x_test) print("\n" + "=" * 60) print("流程完成!生成的文件:") print(" 1. cifar10_model.tflite - TFLite模型") print(" 2. cifar10_model_array.h - C数组格式") print(" 3. model_summary.txt - 模型摘要") print("=" * 60) if __name__ == "__main__": main() ... VII. Conclusion The purpose of this paper is to take a common image classification scenario (CIFAR10) as an example, so that readers can quickly understand the complete process from data building, model creation, training, inference and validation, which can be used as an example of the tflm_cifar10 (end-side inference-based) front complement, this paper does not involve the end-side deployment and optimization.
View full article
RT1170 以太网中的自由缓冲区超出范围问题 您好, 我正在尝试从自定义板上的自定义项目中执行基本的以太网测试。作为该项目(该项目集成了不同的模块,如SD卡、CAN、GPIO、ADC、以太网和EEPROM)的一部分,基本的以太网发送和接收有待验证。但我在 ping 发送前遇到"freed buffer out of range 错误" 。我已经完成了与以太网有关的所有基本初始化和配置。我看到出现错误的原因是函数"ethernetif_rx_free" (enet_ethernetif_kinetis.c) 中的 LWIP_ASSERT("Freed buffer out of range", ((idx>= 0)&& (idx< ENET_RXBUFF_NUM))); 其中的 idx 值为负数。这一完整的功能可在 EVK 套件上使用。 还能缺少什么?请提出建议。 Re: Freed Buffer out of Range Issue in Ethernet for RT1170 大家好 这个问题也发生在我的 RT1024 客户板上,当我在某个地方放了一个断点然后它就停止了,然后恢复正常运行更有可能导致这个错误。 此致敬礼! Ping Re: Freed Buffer out of Range Issue in Ethernet for RT1170 如果示例项目在您的自定义板中运行良好,则问题似乎出在软件方面。 您使用的不是 FreeRTOS 对吗? 似乎有什么东西干扰了示例的行为,可能是缺少某些配置,或者只是示例流程受到应用程序其他部分的影响。 我建议你尝试使用最新的软件开发工具包版本,即2.15.000。如果您的问题在此版本中仍然出现,那么恐怕您的应用程序流程出现了问题。 此致, 丹尼尔 Re: Freed Buffer out of Range Issue in Ethernet for RT1170 您好, 是的,在自定义板中实现合并的源代码时会出现问题。但是,没有与其他接口合并的 Ethernet_PING 的单个来源在自定义板中运行良好。当以太网的单个源与其余接口合并时,就会出现问题。 Re: Freed Buffer out of Range Issue in Ethernet for RT1170 如果我没有理解错的话,当您运行 SDK 示例时,它是可以工作的。但当您添加自定义应用程序时,问题就出现了。你能确认吗? 此致, 丹尼尔 Re: Freed Buffer out of Range Issue in Ethernet for RT1170 您好, 实际上,以太网的各个源代码在自定义板中运行良好。当我尝试集成代码时,以太网无法正常工作。我观察到EIR 寄存器的第 25 (RXF)、26 (TXB) 和 27 (TXF) 位被设置为 0,RDAR 寄存器的第 24 位被更新为 0,但在以太网的工作代码中,这些寄存器被设置为 "1"。 我怀疑这些寄存器更新是由中断处理的,但我无法在自定义项目代码库中找到负责这些更新的特定处理程序。请帮帮我。 Re: Freed Buffer out of Range Issue in Ethernet for RT1170 请仔细检查是否有任何外围更改(例如:......)。为了让 EVK 示例在您的定制硬件中运行,您的项目中需要哪些外围实例? 如果您已经验证了这一点,看来问题出在硬件方面。 您是否已经用 HDG 验证了您的设计? 此致, 丹尼尔 Re: Freed Buffer out of Range Issue in Ethernet for RT1170 您好, 我使用的是 SDK 11.6.1 版。我正在尝试测试 lwip_ping_bm_cm7 示例。在 EVK 中运行正常。 但是,当尝试将所有源代码与以太网连接时,它在自定义板上不起作用。如果我们面临"Freed Buffer out of range" ,可能会出现什么问题?请帮我解决这个问题。 Re: Freed Buffer out of Range Issue in Ethernet for RT1170 您好, 您使用的是哪个版本的 SDK? 您用来测试的 SDK 示例是什么? 如果我理解正确,应用程序在 EVK 中运行正常,对吗? 此致, 丹尼尔
View full article
PCIe: i.MX 95: 複数の MSI IRQ ベクトルを割り当てる こんにちは、 PCIe2 インスタンス経由でコネクテッドされた i.MX95 ベースのシステムで ATH12K Wi-Fi モジュールを使用しています。 linux-imx lf‑6.12.y ベースのカーネルではこのセットアップは失敗しますが、lf‑6.6.y ベースのカーネルでは期待どおりに動作します。 カーネル ドライバは 16 個の MSI 割り込みを正常に要求し、受信します。しかし、その後、Wi-Fi モジュールの起動に失敗します。 [ 5.888139] ath12k_pci 0001:01:00.0:iommuグループ5に追加 [ 5.888506] ath12k_pci 0001:01:00.0:BAR 0 [mem 0xa10000000-0xa101fffff 64bit]: 割り当て済み [ 5.888553] ath12k_pci 0001:01:00.0:有効化デバイス (0000 -> 0002) [ 5.889315] ath12k_pci 0001:01:00.0:MSIベクター: 16 [ 5.889334] ath12k_pci 0001:01:00.0:ハードウェア名: wcn7850 hw2.0 [ 6.475718] ath12k_pci 0001:01:00.0:チップID 0x2 チップファミリー 0x4 ボードID 0xff soc_id 0x40170200 [ 6.475743] ath12k_pci 0001:01:00.0:fw_version 0x110cffff fw_build_timestamp 2025-06-25 09:26 fw_build_id QC_IMAGE_VERSION_STRING=WLAN.HMT.1.1.c5-00302-QCAHMTSWPL_V1.0_V2.0_SILICONZ-1.115823.3 [ 7.647106] ath12k_pci 0001:01:00.0:制御応答完了、ポーリングを受信できませんでした。 [ 8.675241] ath12k_pci 0001:01:00.0:サービス接続タイムアウト [ 8.681002] ath12k_pci 0001:01:00.0:HTTへの接続に失敗しました: -110 [ 8.692180] ath12k_pci 0001:01:00.0:コアの起動に失敗しました: -110 カーネルメーリングリスト[1]では別のPCIeデバイスに関する関連した議論がありましたが、まだ私たちのシステムで動作する構成には至っていません。 どうすれば最善の進め方でしょうか? 再開まで今しばらくお待ちください。 最大 [1] https://lore.kernel.org/all/1819305.VLH7GnMWUR@steina-w/ Re: PCIe: i.MX 95: Allocate Multiple MSI IRQ Vectors こんにちは、 i,MX95 はまだ初期段階であり、一部の構成はデザインされていません。しかし、PCIe2経由でATH12Kを搭載したi.MX95は lf-6.12.y ですが、 lf-6.6.y で作業中ですこれは、新しいカーネルの PCIe または Wi-Fi スタックにおける回帰またはドライバー相互作用の変更を示唆しており、PCIe パワーマネージメント (ASPM)、MSI マッピング、または ATH12K の特定の PCIe エンドポイントの癖に関係している可能性があります。多くの場合、カーネル パッチを適用するか、新しいカーネルのブート引数で ASPM を無効にすることで解決できます。dmesg で PCIe エラーを確認し、デバイスツリーを比較し、NXP/Linux カーネル メーリング リストで関連するコミットを探します。  考えられる原因とトラブルシューティングの手順を次に示します。 1. カーネルログを確認する ( dmesg ) PCIe エラーを探す: 障害が発生した lf-6.12.y カーネルの dmesg で、「PCI」、「MSI」、「ATH12K」、「Error」、「Firmware」、または「Timeout」メッセージを検索します。 ファームウェアのロード: ath12k ファームウェアが正しくロードされているかどうか、および初期化中にエラーが発生していないかどうかを確認します。  2. PCIe電源管理(ASPM) 一般的な問題:新しいカーネルでは、多くの場合、Active State パワーマネージメント (ASPM) がデフォルトで有効になっています。これにより、組み込みシステム上の ATH12K などの PCIe デバイス、特に古いファームウェア/ハードウェアで問題が発生する可能性があります。 ASPM を無効にしてみてください:カーネル ブート引数 (U-Boot または GRUB など) に pcie_aspm=off を追加して、再度テストします。  3. Devicetree/DTBの違い DTB の比較:両方のカーネル ( .dtb ファイル) で使用されるデバイス ツリー BLOB (DTB) を生成して比較します。特に割り込み、電源ドメイン、または互換性プロパティに関連する、 pci2 の PCIe ノードの変更を探します。  4. カーネルドライバー/ファームウェアの回帰 特定のコミット: ATH12K ドライバ ( ath12k )、 mac80211 、または lf-6.12.y のコア PCIe/Arm コードによって、セットアップを壊す変更が導入された可能性があります。 メーリング リストを検索: ath12k 、 i.MX95 、およびそれ以降のカーネル (6.12+) に関するパッチやディスカッションについては、Linux カーネル メーリング リスト (LKML) および NXP のリストを確認してください。  5. MSIの取り扱い 割り込み再マッピング:割り込みを受信すると、その処理方法 (MSI-X と MSI、割り込み再マッピング) が微妙に変わる場合があります。 proc/interrupts で割り込みをチェックします。カーネル間で割り込みの分布またはカウントが異なるかどうかを確認します。  6. ファームウェアブロブ ファームウェア バージョン:新しいカーネルのドライバと互換性のある、ATH12K 用の正しいファームウェアを使用していることを確認します。新しいドライバには新しいファームウェアが必要になる場合があります。  要約すると、 dmesg から始めてASPMを無効にしてみてください。これらは、組み込みプラットフォームの新しいカーネルでPCIe Wi-Fiの障害が発生する最も一般的な原因です。   よろしくお願いします。 Re: PCIe: i.MX 95: Allocate Multiple MSI IRQ Vectors 提案は問題をデバッグするための良い指針でしたが、解決策を見つけることができませんでした。つまり、すべての MSI IRQ ベクトルがドライバ内の IRQ ルーチンをトリガーしたわけではありません。 最終的には、ath12k ドライバーを変更して、1 つの MSI IRQ のみを要求するようにすることで、この問題を回避しました。 現在の Linux マスターにはこの問題は発生しないことに注意してください。 よろしくお願いします。 最大
View full article
如何安装"S32ZE_R52_NXP_RTOS_4_7_181_RTM_1_1_0_D2412_DesignStudio_updatesite.zip" 您好, 我从 GreenVIP 安装了"S32ZE_R52_NXP_RTOS_4_7_181_RTM_1_1_0_D2412_DesignStudio_updatesite" ,但在下面的截图中找不到它。 如果我再次安装,就会出现错误提示。 请帮帮我。 谢谢! Re: How to install "S32ZE_R52_NXP_RTOS_4_7_181_RTM_1_1_0_D2412_DesignStudio_updatesite.zip" 你好,Lvyang508 感谢您的回复。 您是否安装了 SW32ZE_RTD_R21-11_2.0.1_D2505_? 在 S32DS IDE 中使用 DesignStudio_updatesite.zip? BR 乔伊 Re: How to install "S32ZE_R52_NXP_RTOS_4_7_181_RTM_1_1_0_D2412_DesignStudio_updatesite.zip" S32DS IDE:S32DS for Platform 3.6.5 我下载了相应的软件包并根据 UG_S32ZE_GreenVIP.pdf 进行了安装 Re: How to install "S32ZE_R52_NXP_RTOS_4_7_181_RTM_1_1_0_D2412_DesignStudio_updatesite.zip" 你好,Lvyang508 请检查您的 RTD 版本,RTD 和 RTOS 软件包之间似乎存在冲突。 另外,您使用的是什么版本的 S32DS 集成开发环境? BR 乔伊 Re: How to install "S32ZE_R52_NXP_RTOS_4_7_181_RTM_1_1_0_D2412_DesignStudio_updatesite.zip&&&& 嗨,乔伊、 我已经安装了 SW32ZE_RTD_R21-11_2.0.1_D2505_。 S32DS 集成开发环境中的 DesignStudio_updatesite.zip 文件。 谢谢您! Re: How to install "S32ZE_R52_NXP_RTOS_4_7_181_RTM_1_1_0_D2412_DesignStudio_updatesite.zip&&&& 你好,Lvyang508 感谢您的回复。 这个问题可能是由版本冲突引起的。请尝试使用 S32DS IDE 3.6.1 参考 UG_S32ZE_GreenVIP.pdf。 BR 乔伊 Re: How to install "S32ZE_R52_NXP_RTOS_4_7_181_RTM_1_1_0_D2412_DesignStudio_updatesite.zip&&&& 嗨,乔伊、    感谢您的回复。 我已经安装了 S32IDE 3.6.1、但问题依然存在。 BR、
View full article
What is the meaning of FLEXIO_CTRL[DBGE] The reference manual wording on DBGE is a bit short with only "Enables the FLEXIO operation in Debug mode" What happens if it is disabled and you debug code? Trying to figure out what debug operations are safe when using FLEXIO and debugging FLEXIO drivers. I guess it is NOT safe to let the debugger read SHIFTBUFn in receive mode or any other hardware register with read sideeffect, not even by accidently howering over it in the debugger. Re: What is the meaning of FLEXIO_CTRL[DBGE] Hi @Henrik-Wires  If the "Enable FLEXIO operation in debug mode" is disabled, the FLEXIO module stops when the debugger stops the CPU. All FIexIO activity is freeze until execution resumes. This topic has also been discussed in the following thread: Does it means that flexio can't work in debug mode? BR, VaneB Re: What is the meaning of FLEXIO_CTRL[DBGE] Does that also mean that it is safe to access the FLEXIO registers using the debugger if DBGE is disabled, or will reading SHIFTBUFn with the debugger disturb the Shift Status Flag SHIFTSTAT[SSF] Re: What is the meaning of FLEXIO_CTRL[DBGE] Hi @Henrik-Wires  As stated in the S32K3 reference manual, the SHIFTBUFn register must be read only when the corresponding SHIFTSTAT[SSF] flag is set. Re: What is the meaning of FLEXIO_CTRL[DBGE] Hi @Henrik-Wires  Could you please clarify what this will be used for or what kind of analysis you are trying to achieve? Re: What is the meaning of FLEXIO_CTRL[DBGE] Can I somehow block S32DS from attempting to access registers? Only briefly howering over a pointer to SHIFTBUFn makes the debugger access the value which disturbs the FLEXIO state by clearing SHIFTSTAT[SSF] Re: What is the meaning of FLEXIO_CTRL[DBGE] Hi @Henrik-Wires  The IDE itself does not block access to registers. That kind of protection can be implemented using the MPU or XRDC; however, I do think that approach aligns with what you are trying to achieve. Instead, you could monitor when SHIFTSTAT[SSF] is set and then verify whether the corresponding SHIFTBUFn register contains the expected value. Re: What is the meaning of FLEXIO_CTRL[DBGE] I am exploring, writing and debugging a custom low level FLEXIO driver. Experienced odd results while debugging which I suspect is due to S32DS fetching SHIFTBUFn register values while stepping thru the driver, disturbing the SHIFTSTAT[SSF] state and resulting in lost events. Re: What is the meaning of FLEXIO_CTRL[DBGE] The driver obviously monitors SHIFTSTAT and access SHIFTBUFn accordingly. My issue is that it that stepping over the driver code with S32DS can trigger a debug read of SHIFTSTAT, which seems to disturb the state held in that register. For example when howering with the mouse over a pointer to SHIFTSTAT. If I carefully avoid touching any such pointers with the debugger then the driver works. I had hope that disabling DBGE would allow the debugger to access SHIFTSTAT without disturbing the **bleep**FSTAT register state, but from your response this is not the case. Re: What is the meaning of FLEXIO_CTRL[DBGE] Hi @Henrik-Wires  Disabling the DBGE bit does not prevent the debugger from disturbing registers such as SHIFTSTAT, because DBGE does not control debug read behavior. Instead, DBGE controls whether the peripheral keeps running when the core is halted.
View full article
S32K396-BGA-DC1 イーサネット コネクティビティ S32K396 でイーサネットを使用することを検討し、コネクテッドのオプションを調査しています。 S32X-MB で利用可能な T1S PHY を使用できるという前提で、S32K396-BGA-DC1 を S32X-MB とともに購入しましたが、S32K396-BGA-DC1 はデフォルトで PHY 信号を MB コネクタではなく別の PHY 接続に配線するため、偶然にも SPI などの提供されている例の多くも破壊されてしまいます。 S32K396-BGA-DC1 ボード上のストラップ抵抗器が、代わりに MB 接続を使用するために再配線される場所にあるかどうかは完全には明らかではありません。デザインリソースではガーバーのみが提供されており、ネットとコンポーネントの情報が欠落しているため、ボード設計の操作が不必要に困難になっています。ボード用の、もっと簡単に理解できるデザインリソースはありますか? あるいは、S32K396-BGA-DC1 の PHY コネクタで動作する PHY ボードはどれですか? Re: S32K396-BGA-DC1 ethernet connectivity はい、100BASE-T1 を意味しました。 抵抗器を見つけることができました。検索可能なメタデータがない状態でボードを視覚的に検索する必要がある場合、非常に時間がかかります。 TJA1103-SDBR ボードの入手可能性は少し低いです。MACSEC を使用していない場合でも、TJA1104-SDBR は動作すると思われます。 Re: S32K396-BGA-DC1 ethernet connectivity こんにちは@Henrik-Wiresさん、 念のためお伝えしますが、 S32X-MBにはT1S PHYはありません。100BASE-T1のTJA1103が搭載されています。 はい、S32K396 の EMAC はデフォルトで SABRE コネクタにルーティングされます。PCBに関しては、利用できるファイルはもうありません。ただし、PCB 上の白いラベルのおかげで、ストラップ抵抗器の位置を特定することができます。 または、 https://www.nxp.com/part/TJA1103-SDBRS32K396-BGA-DC1 の SABRE コネクタに適合します。 TJA1103-SDBR は、TXC でクロックを生成するために rev-RMII モードにする必要があります -> ジャンパー 2-3 を CONFIG4 に追加します。 よろしくお願いいたします。 パベル Re: S32K396-BGA-DC1 ethernet connectivity こんにちは@Henrik-Wiresさん、 はい、 TJA1104-SDBR は TJA1103-SDBR と同様に動作するはずです。 よろしくお願いいたします。 パベル Re: S32K396-BGA-DC1 ethernet connectivity CONFIG を確認するようお知らせいただきありがとうございます。配信時のデフォルト構成は「異なります」。
View full article
回复:Freemaster 无法检测任何指定的 UART 通信端口 Hi  iulian 我的目标是:使用MBDT工具在Matlab中进行编程,通过UART或CAN自动将代码刷入开发板,然后使用Freemaster进行观察。基于此,我有几个问题: 关于使用 S32 和 MPC574xP_S32DS_UART0_CAN0_OpenSDA_RevE.rbf 进行闪存,我是否需要使用 S32 再次配置 Freemaster 驱动程序环境?如何配置Freemaster环境(请提供完整教程),或者可以直接使用Matlab中的Freemaster配置模块吗? 针对我的使用目的,能否提供相应的分步操作?我目前可以从 Matlab 进行闪存,但无法与 Freemaster 通信。 MBDT 是否支持 XCP/CCP? 如果您需要专门从事 MBDT 的同事的支持,请将他们添加到此问题中或帮助我为他们创建相应的问题。 回复:Freemaster 无法检测任何指定的 UART 通信端口 您好,感谢您对 MBDT 产品的关注, 1)配置FreeMASTER主要包括配置FreeMASTER要使用的UART/CAN外设的实例。 此配置完全由FreeMaster_Config块完成,无需在 S32 Design Studio 中进行进一步配置。 2) 如上所述配置的 UART / CAN 实例不能用于除使用 FreeMASTER 进行调试之外的用途。因此,应用程序本身需要使用不同的 UART / CAN 实例。 3) MBDT 不支持 XCP,无论是通过 UART 还是 CAN。但 FreeMASTER 在大多数情况下可以实现相同的目的。 回复:Freemaster 无法检测任何指定的 UART 通信端口 Hi  iulian 我看了第一个视频并阅读了第二篇文章。 我按照视频里的步骤操作,使用相同的模型编译然后刻录,但是还是无法连接Freemaster。 关于第二篇文章,我不确定是否需要在使用 Matlab 之前先使用 S32 配置 UART,或者是否可以直接使用 Matlab。 回复:Freemaster 无法检测任何指定的 UART 通信端口 Hi @Renjie-Wang, 以下 2 篇文章是一个很好的起点: https://www.nxp.com/design/design-center/training/TIPS-ENHANCING-EMBEDDED-APP 通过 UART 发送数据并使用 FreeMASTER 监控信号 我将您的问题移至此社区空间,以便 MBDT 专家可以进行解答。
View full article
2014年飞思卡尔杯全球规则 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 全球飞思卡尔杯官方规则! 2014 年新内容——联赛推出: 根据地区的不同,现在将有三个联赛。全球比赛将仅使用普通联赛车辆。 股票联赛 -使用认可的部件进行比赛,允许较少的定制 自定义联赛 -限制较少且配备自定义硬件的比赛 创新联盟 -不止于竞速。完成目标或任务即可获得积分,赢得胜利。 说明 您可以使用操作菜单栏以 PDF 格式查看此文档。 此规则适用于全球挑战。在此处查找您所在地区的规则 目前,全球挑战赛仅对普通(未修改)挑战者开放。 如果您对这些规则有任何疑问,请在下方评论区留言。如果您对区域规则有任何疑问,请在您所在区域的群组中提问。 第 1 部分:团队要求 地区冠军球队必须参加“普通”(未修改)联赛才有资格。 团队规模最多为四人。 一个团队只能有一名研究生。 汽车将仅由学生设计和制造。 希望参与者、顾问和观众表现出良好的体育精神。任何不当行为或作弊行为都可能导致取消资格。 第二部分:活动注册 参加全球挑战赛的参赛者必须获得邀请。每个地区冠军队伍都会收到一份邀请。 地区冠军队伍中的一人必须在地区决赛结束后两周内为整个队伍报名参加全球挑战赛。 第 3 节:设备要求 每支队伍应使用如下所述的相同基本零件套件。为了保证公平的比赛环境,以下要求已到位。您必须使用经批准的控制器和电机驱动板。如果赛车模型的任何标准部件损坏,则应使用相同的替换部件。 机械的 参赛时必须使用原始且未经改动的设备。 外轮胎胎面和轮辋 驱动 - 直流电机 驱动电机传动比 Servo Motor 允许的修改和限制: 您不得更改轮距(车轮之间的距离) 车辆的任何部件尺寸不得超过 250 毫米/9.85 英寸(宽)x 400毫米/15.75英寸(长)x 305毫米/12英寸(高) 您可以在底盘上钻孔并安装辅助部件,假设它包含在上述尺寸范围内。 您可以改变伺服电机和相关连杆的方向。 您可以为汽车添加“外壳”,但在检查期间必须是可拆卸的。 您可以调整或移除弹簧、连杆和其他非必要部件。 您可以将胎面粘到轮辋上。 电气 电池(单独购买) 7.2V,<=3000mAh,可充电镍镉电池或镍氢电池  每次只能使用一 (1) 块电池为车辆及其连接硬件供电 您必须使用下面其中一个经过批准的电路板来控制您的汽车。 控制系统 FRDM系列电路板 FRDM-KL25Z包含在内,但不是强制使用。 TRK系列 基于 Kinetis 的 TWR - 系列 高压电机控制和接口 TFC-屏蔽 包含 TFC-SHIELD,但不是强制使用。 Landzo 技术的双电机控制板。 允许的修改和限制: 一个处理器 – 不允许使用辅助处理器或其他可编程设备。 汽车必须使用光学传感器来导航 DC-DC升压电路不得超过电池电压。 所有电容器的总容量不应超过 2000 uF。 传感器限值 您可以使用额外的相机。 最多十六 (16) 个传感器 传感器数量示例:  红外发射器/接收器对为 1 个传感器 CCD 传感器是 1 个传感器 提供的线扫描相机是 1 个传感器 两个后轮上的霍尔效应传感器是2个传感器 安装在一个车轮上的编码器是1个传感器 显示器(允许)不算作传感器 第四部分:车辆检验 比赛前,裁判将对所有参赛作品进行技术检查。这包括第 3 部分列出的车辆规格、尺寸和设备要求。 所有车辆必须在指定时间或之前进入检查区。 一旦进入检查区,您就不能触摸赛车,直到被叫去比赛! 如有违反,组委会可取消相应队伍的参赛资格。 第五节:计时赛流程 比赛顺序将通过随机抽签决定。 当您的团队被叫到时,您可以将您的车从检查区域移走。您将有两 (2) 分钟的时间来准备汽车。 已批准的调整 -您可以: 通过板载接口配置参数。(开关、旋钮等) 改变相机的角度 更换电池  不允许的调整 - 您不得: 重新编程你的处理器 通过有线或无线通信配置参数。 任何时候都只能有一名队员在赛道上。(不包括测试时间) 2 分钟时间到之前,您必须向裁判发出“准备就绪”的信号,然后才能启动车辆。 裁判确认“就绪”后,车辆应在30秒内驶离起跑区。 每个队伍有三次机会完成一圈。将记录第一个(不是最好的)完成时间。 示例: 尝试 1 – 车辆在弯道上行驶过快并偏离轨道。沒有記錄時間。 第二次尝试——车辆成功绕轨道行驶。时间被记录下来。 尝试 3 – 因第一次(尝试 2)已被记录,因此被判失败。 每次尝试后,您有两分钟的时间对车辆进行批准(见上文)的调整。 尝试结束后,车队应将车辆送回检查区。 赛事显示屏将在每场团体赛结束后公布成绩。 第六部分:比赛日程安排 练习时间 - 在决赛之前,将提供测试赛道。此时可以进行最终校准。这将通过团队时段和/或“空闲时间”来组织。 2.将练习跑道重新配置为最终跑道。 车辆检验(参见第 4 部分) 计时赛 颁奖典礼 第 7 部分:活动人员 组委会——由资深评委和飞思卡尔活动组织者组成的委员会。负责协调活动当天的活动,并调解和解决任何争议。 裁判- 负责赛道活动。包括赛道管理,例如车辆启动和停止,以及计时和记分。裁判员由教职员工、学生和/或飞思卡尔及行业员工组成。 评委——负责解释并强制执行比赛规则。评委由飞思卡尔员工和行业赞助商成员组成。 赛事人员不得协助任何特定队伍。沟通应向所有队伍公开,不得泄露任何可能损害比赛公平性的信息。 第 8 节:犯规、失败和取消资格 本规则由飞思卡尔和活动组委会负责解释。 犯规,是一种轻微犯规,会导致罚时。 失败,则不记录当前尝试时间。允许后续尝试。 取消资格是一种严重违规行为,会导致所有时间都不被记录。 裁判将判定赛车是否冲出赛道并判罚时间。 下列任何一种情况都将被视为犯规,并会导致加时处罚: 比赛开始后,赛车未能在 30 秒内离开起跑区 [+1 秒]。 赛车越过终点线后未能在 2 米/6 英尺处停下或离开赛道 [+1 秒]。 下列任何一种情况都将被视为失败并且不会给予时间: 三个或更多车轮离开赛道表面。 赛车队未能在规定的两 (2) 分钟内做好准备。 选手在技术检查后未经裁判同意触碰赛车。 赛车离开起跑区后120秒内未能完成比赛。 在开始和结束之间的任何时间触摸汽车。 “开始”——一旦车辆越过起跑线。 “完成”——一旦车辆越过终点线。 有下列情况之一者,视为取消资格:   任何可能影响或阻碍车辆的赛道外设备或行为。 检查后随时 进行不允许的 修改。 比赛场地上有多名队员。 比赛期间有任何作弊行为。 未通过技术检验。 在切实可行的条件下,尽量保证公平、公正。争议将由飞思卡尔、组委会成员和评委投票解决。 第 9 节:计时/计分 将使用电子门和/或手持计时器来记录时间。 当赛车的第一部分冲出起跑线/终点线时,时间开始和结束。 犯规将导致赛车的单圈时间被加长。 取消资格和失败将导致没有分数。 第十节 赛道参数 在决赛前一天,将提供一条采用与最终赛道相同材料制成的测试赛道,用于校准和设计修改。 直到比赛当天,参赛者才会知道最终赛道的实际布局。 赛道宽度不得小于 600 毫米/23.65 英寸。 材料和尺寸规格可以在社区中找到。 赛道表面为哑光白色,赛道每条边缘都有一条连续的黑线(25 毫米/1 英寸宽)。 赛道可以90°交叉角相交。 赛道可以有上坡、下坡和隧道。 如有必要,飞思卡尔可能会更改这些规则和条件。飞思卡尔保留随时自行取消、暂停和/或修改飞思卡尔杯比赛的权利。这些官方规则是用英语制定的。如果这些官方规则以任何其他语言提供且文本存在冲突,则以英语文本为准。 Freescale 和 Freescale 徽标是飞思卡尔半导体公司在美国和其他国家的商标或注册商标。所有其他产品或服务名称均为其各自所有者的财产。©飞思卡尔半导体公司,2014 年 飞思卡尔杯内容 回复:2014年飞思卡尔杯全球规则 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 由于赛道的布局事先并不清楚,所以我无法透露全球总决赛期间是否会有隧道。确保您的车辆符合规则允许的尺寸(高度、宽度和长度),以便您能够顺利进入隧道(如果有)。 回复:2014年飞思卡尔杯全球规则 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Hi FlavioStiffan 今年的全球大赛会有隧道吗? 根据2014 年马来西亚飞思卡尔杯比赛规则,隧道也不会被纳入全球比赛项目。谢谢。 回复:2014年飞思卡尔杯全球规则 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 你好,做信号调节是可以的。只要您没有其他 MCU 部件并且您通过授权板控制伺服器和电机就可以了。请确保您使用 BOM(物料清单)和示意图记录您的额外开发,以防技术检查期间出现任何问题。 回复:2014年飞思卡尔杯全球规则 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 好的,谢谢您的回答,关于模拟放大器,它将用于调节来自传感器或摄像机的信号,我提到的模拟比较器将用于相同的目的。例如,我们有一个红外传感器,其输出电压为 0 至 250 mV,我们想将信号放大到 3.3V 左右,或者希望比较器仅检查传感器是否在白色区域或黑线...诸如此类。 回复:2014年飞思卡尔杯全球规则 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 你好JoseManuelSandovalChavez我认为规则对可以使用的内容已经说得很清楚了。对于电路的 MCU 和电机控制部分,只允许使用经批准的电路板。关于小型模拟放大器,它与什么相关?它的功能是什么? 回复:2014年飞思卡尔杯全球规则 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 你好, FlavioStiffan,所以只是为了确保这意味着在比赛中我们不能使用我们自己用模拟元件构建的电机控制板和 FRDM 板,所以为了控制直流电机,我们只能使用提到的两块板(TFC-SHIELD 和 Landzo 技术的双电机控制板)对吗? 此外我还有一个问题,我们可以使用自己构建的小型模拟电路吗?例如,用运算放大器构建的模拟放大器或用运算放大器构建的模拟比较器 回复:2014年飞思卡尔杯全球规则 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 你好,Jose Manuel,对于全球飞思卡尔杯挑战赛,我们要求学生只使用经批准的电路板。您无法开发自己的定制板。这是为了公平起见,也为了避免团队在技术检查时遇到困难,因为团队的定制板被“隐藏”或无法访问以验证板子是否符合规则(例如:没有第二个处理组件或任何其他受限制的组件)。这些规则每年都会进行审查,因此请继续关注 2015 赛季的任何变化。 回复:2014年飞思卡尔杯全球规则 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 你好,已停用的用户,我有一个问题,对于库存联盟,当它提到“批准的组件”时,具体是什么意思?这是否意味着在比赛中我们只能使用“机械”和“电气”部分列出的组件?例如,对于“高压电机控制和接口”,是否意味着我们只能使用上述两个板中的一个(Landzo 技术的 TFC-SHIELD 和双电机控制板)或者我们可以为电机控制阶段构建自己的板? 回复:2014年飞思卡尔杯全球规则 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 已停用用户 约翰,看看这些问题。您是否有 Landzo 双电机控制板的链接?您能确认所用控制板的限制吗? 谢谢! 回复:2014年飞思卡尔杯全球规则 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 你好,我对这些规则有一些疑问。 关于第 3 节的电气限制“您必须使用下面其中一个经批准的电路板来控制您的汽车。”。 问题 1:规则是否说我们不能使用自制的最小系统板(使用 kinetis MCU,链接)或一些自制的高压控制板(链接)? --- 关于“一个处理器 - 不允许使用辅助处理器或其他可编程设备”这一行。 Q2:一些传感器,如相机,具有内置电路,可以在硬件中进行二值化(链接),或者带有 fifo 芯片的相机(链接)。 规则中提到的“其他可编程设备”是否包括这些相机? 或者“可编程设备”仅仅指 MCU 或 FPGA 设备? ---- 关于“Landzo 技术的双电机控制板”。 Q3:那是这个吗? 非常感谢! 回复:2014年飞思卡尔杯全球规则 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 你好,约翰,下一届全球比赛什么时候举办?
View full article
介绍 eRPC 本教程介绍eRPC(嵌入式远程过程调用)开源项目。 eRPC(嵌入式远程过程调用)是由恩智浦创建的远程过程调用(RPC)系统。RPC是一种机制,用于通过简易本地函数调用远程系统上的调用软件例程。远程系统可以是通过通信信道连接的任何CPU:例如,网络中的服务器、多核系统中的另一个CPU内核,等等。对客户端而言,这就像在应用中调用某个库中的函数一样。唯一的区别在于通信信道引入的任何延迟或不可靠性。 重要链接: 所有与 eRPC 开发相关的内容都位于:GitHub - eRPC base eRPC开发数据位于GitHub - eRPC development。 eRPC 发布版本位于:GitHub - eRPC Releases eRPC文档位于Github - eRPC wiki eRPC已作为Python软件包发布至pypi eRPC支持多核和多处理器类型的应用。 在哪里可以找到 eRPC 示例 在 NXP MCUXpressoSDK 软件包中可以找到大量 eRPC 多核和多处理器示例。访问 https://mcuxpresso.nxp.com 可配置、构建并下载这些软件包。 要获取支持多核(包含 eRPC)的开发板列表,请基于 “中间件 (Middleware)” 进行筛选,并搜索 “multicore” 关键词。下载包含多核中间件的选定软件包后,可参考以下路径: /boards/ /multicore_examples :eRPC 多核示例(使用 RPMsg_Lite 或消息单元传输)或者 /boards/ /multiprocessor_examples :eRPC 多处理器示例(使用 UART 或 SPI 传输)。 eRPC 示例均以 “erpc_” 为名称前缀。 获取 NXP MCUXpressoSDK 的 eRPC 多核和多处理器示例的另一种方法是使用 mcux-sdk 的 GitHub 代码库。请按照 README 概述部分中关于如何使用 West 工具克隆和更新 mcuxsdk 代码库的说明操作。完成后,armgcc 版本的 eRPC 示例可以在以下文件夹中找到: mcuxsdk/examples/ /multicore_examples or in mcuxsdk/examples/ /multiprocessor_examples folders. 例如,你可以使用 evkmimxrt1170 作为 board_name。与 MCUXpressoSDK 软件包类似,这些 eRPC 示例都使用 “erpc_” 作为名称前缀。 Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Kunal,您好!您的问题似乎已在此得到解答:需要帮助——在iMx6sx中实现eRPC的分步过程?· 问题#5 · EmbeddedRPC/erpc-imx-demos · GitHub Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> HI [email protected]‌, 我不知道 eRPC 在 MPC5748G 上的官方使用方式。只是提醒一下:eRPC 取决于编程语言、操作系统和传输层。它没有特定于电路板的文件。所以,如果使用的是 FreeRTOS 和 C 语言,那几乎就成功了,你只需要移植你想用的传输层(如果还没有移植的话)。 Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Hi Dusan,       eRPC是否已移植到恩智浦MPC5748G?有没有可供参考的示例代码? 顺祝商祺! Alex Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Hi [email protected], 我在这方面没有太多经验。最近,当从多个任务中调用多个 eRPC 调用时,我们不得不添加一些互斥锁。不过我喜欢你的想法。 我快速浏览了一下源代码。你需要说明你的用例。但我认为是 i.MX Linux 与使用 RPMsg 的 M 核之间的通信。在这种情况下,我认为你可以像我们那样添加互斥锁(这将使 eRPC 调用序列化。你需要在 performRequest 函数的某个地方添加它们)。为每个线程创建端点在我看来是个好主意,但我发现有更多问题需要解决。一个更简单的解决方案可能是:传输初始化函数将初始化更多端点(基于任务数量),客户端的 eRPC rpmsg 发送 / 接收函数改为使用未使用的端点进行发送,并使用相同的端点接收消息,服务器上的 eRPC rpmsg 接收函数需要等待所有端点上的消息。 我不知道这对你来说是简单的任务还是更复杂的任务。但恐怕如果不修改代码,你将无法进行多线程调用。 Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Hi Dusan, 我目前在Cubic与Chandini共事。我只是想了解一下从多个线程调用eRPC的额外信息。当前我们采用单一端点进行即止型调用,每次调用完成后才发起下一次调用。现在我们希望通过多个线程发起多次调用,因此想了解实现该功能的最佳方案。 其实由于我对这方面了解不足,我们尝试过并发进行其他调用,不过直到出现问题,我们才意识到正在这么做。 我们已观测到eRPC返回的通信故障错误代码。 是否可以使用单一端点来实现这一点,也就是说客户端这边是否应该是线程安全的? 如果不建议执行此操作,是否应该为每个线程配置独立的端点, 或者我们应该做别的事情吗? 此致 李 Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Hi [email protected]‌, 感谢您告知我们。真有趣,我今天因为另一项目刚刚研读过相关方案:smileygrin: Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Hi Dusan, 感谢您的快速回复。 通过在客户端和服务器端的套接字连接中禁用Nagle算法,并使用以下API调用,我可以在TCP中实现更好的性能(响应时间以微秒为单位)。 int result = setsockopt(sock, /* 受影响的套接字 */                         IPPROTO_TCP,     /* 在TCP级别设置选项 */ TCP_NODELAY, /* 选项名称 */ (char *) &flag, /* 类型转换是历史遗留问题 */ sizeof(int)); /* 选项值的长度 */ 参考资料:TCP_NODELAY:2018 年 TCP 优化最佳实践 | ExtraHop 谢谢! 萨西达兰。 Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Hi [email protected]‌, 或许您可以询问GitHub的相关用户(在同一主题下,或创建新主题)。至少有两名用户正在执行与TCP相关的任务: github: GitHub - EmbeddedRPC/erpc: Embedded RPC 线程1:使用具备TCP传输功能的多连接处理服务器 · 问题#32 · EmbeddedRPC/erpc · GitHub 讨论帖 2:TCP Example client /server code・Issue #39・EmbeddedRPC/erpc・GitHub 就个人而言我建议这个方案,但不确定是否适用于您的情况:linux - Ubuntu上的低延迟TCP设置 Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Hi Dusan, 我想要将eRPC移植到TCP套接字上。 我在虚拟串口(Linux 系统内)上运行了你的示例测试代码 (test_arrays),串口的响应时间不到 1 毫秒。 当我通过TCP运行同一示例代码时,TCP的响应时间约为90毫秒。 有没有办法像优化串口那样,降低 TCP 的延迟并提升其性能呢? 谢谢! 萨西达兰。 Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Hi, Dusan. 这很有帮助。顺便说一下,示例的头文件中提到了这一点。 来自A9的函数调用运行良好,M4则可返回数据。 但当前问题出现在M4调用函数时。A9中显示如下错误:“MU传输缓冲等待清空超时!imx_mu_rpmsg_send()失败,错误码:-5”。 在出现此错误之后,数据函数调用也无法在另一端正常运行:“rpmsg_multiept rpmsg0: virtqueue_add_outbuf失败,错误码:-5” 我应该检查什么? 感谢您的帮助。 Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Hi Vadim, 通常情况下,您需要执行两项任务。一项针对客户端,另一项则针对服务器。问题还在于erpc_arbitrated_client_init的输出结果应作为参数传递给初始化服务器。 Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 嗨,Dusan、Marek、社区。 我已经使用eRPC创建多个应用,M4(客户端)-A9(服务器)或M4(服务器)-A9(客户端)均能正常运行,但我希望在各端使用客户端/服务器应用。不过它现在无法正常工作或运行,只要从一端执行一次,应用就会挂起。 我想检查一下代码的整体结构。 我哪里做错了呢? 是不是应该在 M4 上为客户端和服务器分别使用两个独立的 FreeRTOS 任务? M4 . . erpc_transport_t transport = erpc_transport_rpmsg_lite_rtos_remote_init(.....); erpc_mbf_t message_buffer_factory = erpc_mbf_rpmsg_init(transport); erpc_server_init(transport, message_buffer_factory); erpc_add_service_to_server(create_TEST_service()); erpc_arbitrated_client_init(transport, message_buffer_factory); while (true) { erpc_server_poll(); function1(....); } A9 . . erpc_transport_t transport = erpc_transport_rpmsg_linux_init(......); erpc_mbf_t message_buffer_factory = erpc_mbf_dynamic_init(); erpc_server_init(transport, message_buffer_factory); erpc_add_service_to_server(create_TEST_service()); erpc_arbitrated_client_init(transport, message_buffer_factory); while (true) { erpc_server_poll(); function2(....); } Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> vadimfilippenko,您好!如果您仍然对使用Python版本的话题感兴趣,可以查看此线程:将MPU补丁添加到内核中 - 我无法查看新模块 · 问题#2 · EmbeddedRPC/erpc-imx-demos · GitHub。来自mhanuel26 的最后两条消息值得您关注,因其已成功使用python应用。 Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Dusan, Marek, 我终于成功启动了修改后的 eRPC 示例。不过在 Linux 端我用的是 C 语言,且在 M4 端使用的是 eRPC 1.5.0 版本,其中 rpmsg 初始化函数带 6 个参数(这是杜尚在 GitHub 上提到的关于第 6 个参数的提示)。感谢你们的帮助。准备好迎接新的问题吧) Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 您需要在运行python应用之前运行M4应用。 Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Hi Vadim, 请在这里贴出:ls /sys/class/rpmsg 的结果 看起来 M4 没有发送命名服务(M4 是否运行了正确的固件?)。正因为如此,没有创建来自 M4 的动态宣告通道的文件夹,因此 Python 无法创建 rpmsg 传输... 请检查你的 M4 内核打印输出。 此致, Marek Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Hi Vadim,  正如你在其他评论中看到的,我一直努力尽快回复。但这周(可能还有下周)我比较忙。 不过,从你遇到的错误来看,你应该对比一下 transport.py 中 RpmsgTransport 类里的初始化函数, 以及erpc-imx-demos/sysfs.py at master · EmbeddedRPC/erpc-imx-demos · GitHub   - class RpmsgEndpoint 请确保 GitHub - EmbeddedRPC/erpc-imx-demos: eRPC demos for i.MX devices 是最新版本,且子仓库已根据与 erpc-imx-demos 匹配的提交进行了检出 也许mareknovak能更准确地指出问题所在。 看起来 如果self.id == -1: raise Exception() 返回 -1 Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 有人能帮我解决以下问题吗? 我正在 iMX6COM 开发板上使用 erpc-imx-demos 中的 eRPC 演示示例。 在M4侧启动演示应用程序: "硬件已初始化 eRPC已初始化 MatrixMultiply服务已添加" 在 Linux 中添加驱动: "root@imx6sxea-com:~# modprobe -v rpmsg_multiept insmod /lib/modules/4.1.15-2.0.3+geb0b90b/kernel/drivers/rpmsg/rpmsg_multiept.ko" (系统并未反馈关于rpmsg通道已创建的信息,并且sys/class/rpmsg目录下的rpmsg文件夹为空) 在 Linux 上启动 appl 演示: 回溯(最近一次调用在最后): 文件"example.py",第111行,在 transport = erpc.transport.RpmsgTransport() 文件"build/bdist.linux-armv7l/egg/erpc/transport.py",第 199 行,在 __init__ 文件 "build/bdist.linux-armv7l/egg/rpmsg/sysfs.py" 中,第 116 行,在__init__ 异常 异常类型错误:'需要整数' 在 <绑定方法 RpmsgEndpoint.__del__ of > 被忽略 附言: 我已构建M4 eRPC演示应用,所用平台为cmake和eclipse。 M4 rpmsg演示应用运行良好。 Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Hi Vakul, 抱歉,我错过了您的评论。目前我们不支持任何加密传输。但由于eRPC是模块化的,我认为您可以轻松地将此功能添加到您的eRPC项目中。 Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Hi eRPC 通信能否通过某种加密传输方式(例如 TLS)来保障安全? 此致 Vakul Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 嗨,Evgeny,目前我们对此还没有预估。但我认为你可以通过编写自己的 erpc_malloc/erpc_free 函数实现来编写/使用自己的分配器。 Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Hi Dusan, 是否计划在其他部分(例如erpcMatrixMultiply_shim 的生成等效实现)中增加更多静态内存分配?每个输入参数是否都需要动态分配内存(从编解码器填充数据后,在函数调用结束时释放)? 比如将预先分配的内存(由用户应用静态分配)传递给框架? 谢谢! Evgeny Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 嗨,Evgeny,这看起来像是 MCUExpresso 项目文件/ IDE 的问题。顶层文件夹名称应该是虚拟目录,未来这些目录将不会存在。你磁盘上的软件包中,eRPC 的目录结构应该与 GitHub 上的类似。GitHub 的目录结构更为推荐。 Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Hi Dusan, 我注意到ERPC在运行时使用了大量动态内存分配。是否有计划使其更适合嵌入式系统,并添加静态内存分配方案? 编辑: 很抱歉我刚才的问题,我确实在代码仓库中看到了 erpc_setup_mbf_static.cpp 文件。问题在于,我的代码是基于 MCUXpresso SDK 中提供的示例 ——frdmk66f_multiprocessor_examples_erpc_server_matrix_multiply_spi 和 frdmk66f_multiprocessor_examples_erpc_client_matrix_multiply_spi。这些示例的目录结构与代码仓库中的代码大不相同。 所以我的问题再问一次,应该使用 SDK 示例的目录结构还是代码仓库中的呢?它们为什么会有这么大的差异? 谢谢! Evgeny  Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Hi Evgeny, 首先:您是否正在使用 develop 分支中的 smac.erpc(并且应用程序是从该分支构建的)?对我来说,这个版本是可以正常工作的。 目前erpcgen应用版本和其余eRPC代码已连接。这意味着如需使用您从github构建的新版erpcgen应用,则必须将github上的github erpc_c/*文件复制至您的示例中。然后,您可以使用新版erpcgen应用重新生成代码,更新应用(erpc初始化 + 传输)功能,其他部分即可正常运行。否则,如果您不更新erpc_c文件,则必须使用提供的erpcgen应用。 查看这个页面的底部内容:入门指南・EmbeddedRPC/erpc Wiki・GitHub,对于较新的 erpcgen 版本来说,该内容应该是相当新的。 我不确定最新提交是否已修改spi,建议您暂时使用旧版实现。 Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Hey Dusan, 当我使用自己编译的 erpcgen.exe 时,我在 smac.erpc 示例中遇到了相同的错误: error: file smac.erpc:135:5: syntax error, unexpected identifier, expecting '}' 我之前提到的目录结构是存储库中的erpc_c目录,并且: 来自SDK示例。哪个目录结构是“正确”的?结合使用我生成的文件与SDK示例代码是否安全? 谢谢! Evgeny Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Hey dusancervenka-b51352, 感谢您的快速回复!我克隆了开发分支。我注意到erpc_c目录结构与Kinetis SDK提供的示例有很大不同。哪一个更合适? 谢谢! Evgeny Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Hi evgenyerlihman‌, 实际上,我们正在进行更频繁地更新。您需要切换到开发分支。GitHub - EmbeddedRPC/erpc at develop。最后一次代码更新是昨天。但您需要在该此构建erpcgen应用。有了smac IDL,就能正常运行。 Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Hi dusancervenka-b51352, 我正在考虑将 eRPC 框架用于我正在开发的一款新产品,该产品使用多个 NXP 的 Kinetis 器件。我注意到 eRPC 的 GitHub 仓库最后一次更新是在 6 个月前。我的问题是,这个框架目前还在维护、修复和开发吗?我尝试了 GitHub 上的示例: erpcgen.exe smac.erpc 并且它未能生成 cpp 源代码,出现了错误。 erpcgen可执行文件来自MCUXpresso SDK。 谢谢! Evgeny Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 您好,Chandini, 没关系。我也刚休完长假,希望您度过了一段美好时光。 我已通过社区消息系统(私信)给你发了邮件。 我们可以通过邮件详细讨论。大致流程是,你需要在 GitHub 上创建分支,切换到开发分支,应用你的修改,创建提交记录,再发起拉取请求。我们会审核你的修改,提出修改建议,之后将其合并到开发分支。 Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Hi Dusan , 非常抱歉回复迟了,我刚结束长假回来。已与团队成员进行内部沟通,请提供您的电子邮箱地址以便我们转发资料。根据公司政策,我们无法直接将任何内容直接上传至您的github。 谢谢 Chandini Re: Introducing eRPC 嗨,杜桑 、 当然,我会与我的前辈讨论并创建拉取请求。目前我正在度假,抱歉迟复。 谢谢 Chandini Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 嗨,Chandini。很高兴你成功了。我有一个特别的提议,你能否在 eRPC 的 GitHub 开发分支上,就你新创建的传输层提交一个拉取请求(基于开发分支)?或许还需要做些工作才能让它与更新版本的 eRPC 兼容。但如果你不想更新的话,我可以来做:)通过在 GitHub 上提交拉取请求,你将成为有价值的贡献者,并且会永远出现在贡献者历史记录中。 希望 eRPC 能成为你的理想解决方案。我们会一直在这儿(或 GitHub 上)为你提供帮助:) Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Hi dusancervenka-b51352 , b50844 , novakma7   终于恢复正常运行,演示程序现可在Linux上配合我的c++代码运行。 非常感谢各位回答了我所有的问题。:) 特别感谢Dusan:smileyhappy 谢谢 Chandini Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> HI Dusan , 由于我昨天忙于其他任务,所以未能进行任何尝试。今天我会进行尝试,并及时通知您。 我觉得我得稍微修改一下我的函数,再进行尝试。因为到目前为止,我在发送和接收函数中只传递了 char * 类型的数据。 很快会回来找您。 谢谢 Chandini Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Chandini,您好!是的,没错。我当时不在公司,所以无法获知具体功能的名称。此功能是否能正常运行? Re: Introducing eRPC 你好,杜桑 感谢您的答复: write(fd、 >getBuffer(), >getUsed()😞 我可以看到getused函数(位于erpc/message_buffer.h at 9e18d069aeae19a6e80a5e8783903bc63bd9b567 · EmbeddedRPC/erpc · GitHub中),但找不到getbuffer函数。 我想我必须用下面这个函数来获取我的缓冲区,对吗? /*! * @brief This function returns pointer to buffer to read/write. * * @return Pointer to buffer to read/write. */ uint8_t *get() { return m_buf; } 因此函数为如下形式: send :erpc_status_t send(MessageBuffer *message) { write(fd, message->get, message->getUsed())};  谢谢 chandini Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 您好,chanidi,您需要以不同的方式来做:您必须使用 transport.h。如果您不使用它,它将无法正常工作。 也许您可以使用我上面提到的 ioctl 命令: erpc_status_t receive(MessageBuffer *message) {int fd = open("/dev/rpmsg_ept1024.1", O_RDWR);} 发送:erpc_status_t send(MessageBuffer *message) { write(fd, message->getBuffer(), message->getUsed())}; 读取:erpc_status_t receive(MessageBuffer *message){size_t size = read(fd, message->getBuffer(), 500); message->setUsed(size)}; novakma7您能否确认操作步骤? Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Dusan , Marek 是的,我也参考了那些文件,但是 我正在使用trasport.h创建传输层。但面临参数不匹配的问题 transport.h中的发送和接收函数以消息缓冲区作为参数,          virtual erpc_status_t receive(MessageBuffer *message) = 0;          virtual erpc_status_t send(MessageBuffer *message) = 0; 根据 example.py 我已经创建了我的 RpmsgEndpoint 类,该类需要以下参数       RpmsgEndpoint::receive(int maxlen) RpmsgEndpoint::send(char *buffer,int dst) 根据我的理解,我们只需要从 Linux 中读取和写入 /dev/rpmsg_ept1024.1 设备即可。   所以我在想,与其使用 transport.h,或许我需要创建自己的 transport.h 版本? 感谢大家 Chandini Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 不客气。您可以从/erpc-imx-demos/middleware/erpc/transport/文件夹汲取灵感。有多种传输方式。 Re: Introducing eRPC 非常感谢 Dusan 的快速回复 ,我将继续沿着这条路走下去,不久后再来找你。 Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 您好,Chandini。您是对的。这些步骤是正确的。您需要创建继承自transport.h的类 Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Hi Marek 我还有一个问题。 目前我的工作状态: 我已在c++中实现RpmsgEndpoint类 我正在研究如何让我的客户端应用程序现在正常运行。 erpc-imx-demos/MPU/example_erpc at master · EmbeddedRPC/erpc-imx-demos · GitHub中的 Python example.py调用继承自Transport类的 RpmsgTransport。 我的问题是,我是否应该使用transport.h(位于/erpc-imx-demos/middleware/erpc/erpc_c/infra)来确保应用正常运行。 以便我创建RpmsgTransport类,并在客户端应用中调用它。 我这样想对吗? 先感谢您 Chandini Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 是的,你说得对。 Python 所做的一切都只是对文件的 IO 操作(读/写)。这在任何语言中都可以实现,包括 C/C++。 选择 Python 来演示是因为它在 Linux 用户空间中很受欢迎,但你完全可以将其移植到 C 语言中。 我想我们现在的理解是一致的了。 祝您好运! 祝好, Marek Re: Introducing eRPC 你好,马雷克 感谢您的答复,它消除了我的一些疑惑。 我们不打算在两边都使用 FreeRTOS。 我们的计划是   M4 核 - 运行 FreeRTOS—— 这一点在你们的演示中已经实现了 A7 核 - 运行 Linux—— 你们的演示中有 Python 代码,用于利用内核的 RPMSG 实现   我们只需要用C或C++来代替Python。 我认为我们可以轻松地将 Python 代码移植到 C 或 C++,对吗? 谢谢 Chandini Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 您好,Chandini Indavara Basavaraju, RPMSg-Lite是RPMsg协议的实现,仅适用于运行 FreeRTOS或裸机的M4端。 在Linux/A7端,您可以放心使用内核中的RPMsg实现。(例如:GitHub - EmbeddedRPC/erpc-imx-demos:i.MX设备的eRPC演示) 或者你是打算在 M4 和 A7 两个内核上都运行 FreeRTOS?这种情况下它是可以工作的,但这并非标准用例。这需要你为 A 内核创建一个移植层,并让 FreeRTOS 在那里运行。 希望这能给你一些方向, Marek Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Hi Marek 不知怎的,我漏掉了你的消息,对此我很抱歉 非常感谢 。我会尽快尝试您的最新版本。 您能否回答我关于RPMSG传输层的最后一个问题? 谢谢 Chandini Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 您好,我理解您。 您需要新建一个(此外还可根据需求,通过github上的拉取请求将其添加到我们的存储库)。 在 Linux 端,您可以使用 /dev/ttyRPMSG(如果系统中存在)。   例如,在此处创建新的传输erpc_c/transports with: 初始化可以像这样: int fd = open("/dev/ttyRPMSG", O_RDWR); 发送:write(fd, buffer, buffer_size); read:size_t size = read(fd, buffer, expected size); 如果没有这样命名的设备,你可以从 Python 代码中获取灵感。RPMSG 不是我的专长。我不知道在 Linux 上应该如何使用它。我会把你的问题转发给 Marek。 Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Hi Dusan , Marek 我计划的是: 在 M4(freertos)和 A7(Linux)上使用rpmsg-lite 我需要: RPMSG C 包装器(在 erpc_c/setup 下),可在 M4 和 A7 侧使用 RPMSG 传输层(在 erpc_c/transports 下),可在 M4 和 A7 侧使用 我有以下问题: 请问,您是否有适用于该场景的传输层? 或 我们是否需要参考 rpmsg-python 并写出类似的内容? 任何建议都会非常有帮助 感谢大家 Chandini Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 您好,我不确定是否有您需要的信息(Linux端的c传输)。但新建一个也很简单。您可以从/dev/ttyRPMSG(如果系统中存在)读取和写入。 例如: 初始化操作如下: int fd = open("/dev/ttyRPMSG", O_RDWR); 发送:write(fd, buffer, buffer_size); 读取:size_t size = read(fd, buffer, expected size); mareknovak或许能就该问题分享更多专业见解。 Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Hi Dusan , 感谢您告知我此次更新。 我想现在我对ERPC有了初步的了解。一旦我让RPMSG客户端应用程序正常运行,我就可以更新ERPC版本。 我开始研究rpmsg-lite,其中包含M4平台文件。 我想知道是否有适用于A7平台的方案?任何相关信息都将大有帮助。我的主要目标是使用C语言获取客户端应用,并使用RPMSg作为传输层 谢谢 Chandini Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 我很高兴您能够独立解决问题(对我们而言,这意味着该问题对开发人员来说并不复杂)。此外,正如mareknovak在上述评论中提到的那样, 他已经在存储库中更新其imx演示应用。您在进行下一步操作可以使用该版本,因其已采用新的rpc功能 Re: Introducing eRPC 感谢您的回复 这正是我想要的信息,我已经为 TCP 创建了 C 语言包装器,在对 eRPC 做了几处修复后,它运行得很顺利。 我的下一步是将TCP层替换为rpmsg。 再次感谢 Chandini Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 您好,Chandini Indavara Basavaraju, 我刚刚更新了 GitHub 上的 erpc-imx-demos 仓库(链接:GitHub - EmbeddedRPC/erpc-imx-demos: eRPC demos for i.MX devices),使其适配 eRPC 1.4.0 和 RPMSg-Lite 1.1.0。 你可以下载预编译的 erpcgen 应用程序,它用于代码生成,下载地址是:Release v1.4・EmbeddedRPC/erpc・GitHub,在下载部分选择适合你的架构即可。 然后你可以这样调用它:./erpcgen -gpy 接口定义语言文件名.erpc,这会为你生成 Python 的序列化和反序列化垫片代码。如果你省略 - gpy 参数或指定 - gc,将会得到 C 语言的垫片代码。 erpc-imx-demos 仓库的最新提交中也更新了序列化 / 反序列化垫片代码,你可以放心使用。 欢迎以拉取请求的形式提交你的修改, 感谢你使用 eRPC 和 RPMsg-Lite! Marek Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 您好,目前我们在 GitHub 仓库中没有示例。但是我们在那里有 C(c++) 测试。如果您熟悉 Linux 或 Mac,您可以以此为例。其他选项如上所述: 1. 下载支持的开发板的 SDK -> 多核/多处理器 C/Python 示例。 2. 阅读这篇文章:入门指南・EmbeddedRPC/erpc Wiki・GitHub Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Hi Dusan 请问你们有 C 语言的客户端应用示例吗?不是 Python 的那种。或者你们有计划编写一个吗?如果已经有的话,那会非常有用,能帮上大忙。 先感谢您 Chandini Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 终于成功了,非常感谢你的帮助:)Dusan 抱歉未找到附件选项以上传补丁,故将内容粘贴如下: 来自 7a5b152524a3c82b5bced4a72ed396f21860b666 2001年9月17日星期一00:00:00 日期:2017年5月8日星期一11:33:05 +0100 主题:[补丁]修复问题以运行eRPC_demo演示 --- erpc_c/infra/transport.h | 4 +- erpc_c/setup/erpc_server_setup.cpp | 36 ++++- erpc_c/setup/erpc_server_setup.h | 2 +- erpc_c/setup/erpc_setup_rpmsg_lite_rtos_remote.cpp | 54 +++++++ erpc_c/setup/erpc_transport_setup.h | 18 ++- erpc_c/transports/rpmsg_lite_rtos_transport.cpp | 158 ++++++++++++++++++ erpc_c/transports/rpmsg_lite_rtos_transport.h | 177 +++++++++++++++++++++ erpc_c/transports/rpmsg_rtos_transport.h | 147 +++++++++++++++++ erpc_python/erpc/transport.py | 21 +++ 9 files changed, 602 insertions(+), 15 deletions(-) create mode 100644 erpc_c/setup/erpc_setup_rpmsg_lite_rtos_remote.cpp create mode 100644 erpc_c/transports/rpmsg_lite_rtos_transport.cpp create mode 100644 erpc_c/transports/rpmsg_lite_rtos_transport.h create mode 100644 erpc_c/transports/rpmsg_rtos_transport.h diff --git a/erpc_c/infra/transport.h b/erpc_c/infra/transport.h index eb7ec71..fd4862a 100644 --- a/erpc_c/infra/transport.h +++ b/erpc_c/infra/transport.h @@ -48,7 +48,7 @@ //////////////////////////////////////////////////////////////////////////////// namespace erpc { - +class MessageBuffer; /*! * @brief 传输层的抽象接口。 * @@ -89,7 +89,7 @@ public: * * @return基于发送实现。 */ - virtual erpc_status_t send(MessageBuffer *message) = 0; + virtual erpc_status_t send(const MessageBuffer *message) = 0; /*! * @brief 轮询传入消息。 diff --git a/erpc_c/setup/erpc_server_setup.cpp b/erpc_c/setup/erpc_server_setup.cpp index 51fa799..5cd4346 100644 --- a/erpc_c/setup/erpc_server_setup.cpp +++ b/erpc_c/setup/erpc_server_setup.cpp @@ -33,8 +33,10 @@ #include "basic_codec.h" #include "manually_constructed.h" #include "simple_server.h" -#include +#include "message_buffer.h" +#include "erpc_config_internal.h" #include +#include #if !(__embedded_cplusplus) using namespace std; @@ -43,6 +45,29 @@ using namespace std; using namespace erpc; //////////////////////////////////////////////////////////////////////////////// +// 类 +//////////////////////////////////////////////////////////////////////////////// + +class BasicMessageBufferFactory : public MessageBufferFactory +{ +public: + virtual MessageBuffer create() + { + uint8_t *buf = new (nothrow) uint8_t[ERPC_DEFAULT_BUFFER_SIZE]; + return MessageBuffer(buf, ERPC_DEFAULT_BUFFER_SIZE); + } + + virtual void dispose(MessageBuffer *buf) + { + assert(buf); + if (*buf) + { + delete[] buf->get(); + } + } +}; + +//////////////////////////////////////////////////////////////////////////////// // 变量 //////////////////////////////////////////////////////////////////////////////// @@ -50,29 +75,32 @@ using namespace erpc; static ManuallyConstructed s_server; SimpleServer *g_server; +static ManuallyConstructed s_msgFactory; static ManuallyConstructed s_codecFactory; //////////////////////////////////////////////////////////////////////////////// // 代码 //////////////////////////////////////////////////////////////////////////////// -void erpc_server_init(erpc_transport_t transport, erpc_mbf_t message_buffer_factory) +void erpc_server_init(erpc_transport_t transport) { // 初始化工厂。 + s_msgFactory.construct(); s_codecFactory.construct(); // 使用提供的传输初始化服务器。 s_server.construct();s_server->setTransport(reinterpret_cast (transport)); + s_server->setMessageBufferFactory(s_msgFactory); s_server->setCodecFactory(s_codecFactory); - s_server->setMessageBufferFactory(reinterpret_cast (message_buffer_factory)); g_server = s_server; } - void erpc_server_deinit() { + s_msgFactory.destroy(); s_codecFactory.destroy(); s_server.destroy(); + } void erpc_add_service_to_server(void *service) diff --git a/erpc_c/setup/erpc_server_setup.h b/erpc_c/setup/erpc_server_setup.h index 8e6a6ef..e4e9eaa 100644 --- a/erpc_c/setup/erpc_server_setup.h +++ b/erpc_c/setup/erpc_server_setup.h @@ -60,7 +60,7 @@ extern "C" { * * 此函数用于初始化服务器,且包含运行服务器所需的所有组件。 */ -void erpc_server_init(erpc_transport_t transport, erpc_mbf_t message_buffer_factory); +void erpc_server_init(erpc_transport_t transport); /*! * @brief 此函数用于取消初始化服务器。 diff --git a/erpc_c/setup/erpc_setup_rpmsg_lite_rtos_remote.cpp b/erpc_c/setup/erpc_setup_rpmsg_lite_rtos_remote.cpp new file mode 100644 index 0000000..b480d42 --- /dev/null +++ b/erpc_c/setup/erpc_setup_rpmsg_lite_rtos_remote.cpp @@ -0,0 +1,54 @@ + /* + * Copyright (c) 2014-2016, Freescale Semiconductor, Inc. + * + * 允许以源代码或二进制形式重新分发和使用,无论是否修改, + * 只要满足以下条件: + * + * o 重新分发的源代码必须保留上述版权声明、本 + * of 条件列表以及以下免责声明。 + * + * o 以二进制形式重新分发时,必须在随分发提供的 + * 提供的文档和/或 + * 其他材料中复制上述版权声明、此条件列表和以下免责声明。 + * + * o 未经事先书面许可,不得使用Freescale Semiconductor, Inc.的名称或其 + * 贡献者的姓名来认可或推广由此 + * 软件衍生的产品。 + * + * 本软件由版权所有者和贡献者“按原样”提供,并且 + * 不提供任何明示或暗示的担保,包括但不限于 + * 对适销性和针对特定用途的适用性的暗示担保 + * 免责声明。在任何情况下,版权所有者或贡献者均不对 + * 任何直接、间接、偶然、特殊、惩戒性或后果性的损害 + *(包括但不限于采购替代商品或服务; + * 使用、数据或利润损失;或业务中断)负责,无论其由 + * 何种原因引起,也无论其基于何种责任理论,无论是在合同、严格责任还是侵权行为 + *(包括疏忽或其他行为)中,以任何方式因使用本 + *软件而引起,即使已被告知可能发生此类损害。 + */ + +#include "manually_constructed.h" +#include "rpmsg_lite_rtos_transport.h" +#include "erpc_transport_setup.h" + +using namespace erpc; + +//////////////////////////////////////////////////////////////////////////////// +// 变量 +//////////////////////////////////////////////////////////////////////////////// + +static ManuallyConstructed s_transport; + +//////////////////////////////////////////////////////////////////////////////// +// 代码 +//////////////////////////////////////////////////////////////////////////////// + +erpc_transport_t erpc_transport_rpmsg_lite_rtos_remote_init( + unsigned long src_addr, unsigned long dst_addr, void *start_address, int rpmsg_link_id, void (*ready_cb)(void), bool send_nameservice) +{ + s_transport.construct(); + s_transport->init(src_addr, dst_addr, start_address, rpmsg_link_id, ready_cb, send_nameservice); + return reinterpret_cast (s_transport.get()); +} + + diff --git a/erpc_c/setup/erpc_transport_setup.h b/erpc_c/setup/erpc_transport_setup.h index 798d92f..6c3959e 100644 --- a/erpc_c/setup/erpc_transport_setup.h +++ b/erpc_c/setup/erpc_transport_setup.h @@ -34,6 +34,7 @@ #include "erpc_version.h" #include +#include /*! * @addtogroup transport_setup @@ -48,7 +49,7 @@ //! @brief 不透明传输对象类型。 typedef struct ErpcTransport *erpc_transport_t; //! @brief RPMsg-Lite传输就绪回调对象类型。-typedef void (*rpmsg_ready_cb)(void); +//typedef void (*rpmsg_ready_cb)(void); //////////////////////////////////////////////////////////////////////////////// // API @@ -106,21 +107,21 @@ erpc_transport_t erpc_transport_rpmsg_lite_master_init(unsigned long src_addr, /*! * @brief 创建RPMsg-Lite零拷贝传输。 */ -erpc_transport_t erpc_transport_rpmsg_lite_zc_master_init(unsigned long src_addr, - unsigned long dst_addr, - int rpmsg_link_id); +//erpc_transport_t erpc_transport_rpmsg_lite_zc_master_init(unsigned long src_addr, +// unsigned long dst_addr, +// int rpmsg_link_id); /*! * @brief 创建RPMsg-Lite传输。 */ erpc_transport_t erpc_transport_rpmsg_lite_remote_init( - unsigned long src_addr, unsigned long dst_addr, void *start_address, int rpmsg_link_id, rpmsg_ready_cb ready); + unsigned long src_addr, unsigned long dst_addr, void *start_address, int rpmsg_link_id, void (*ready_cb)(void), bool send_nameservice); /*! * @brief 创建RPMsg-Lite零拷贝传输。 */ -erpc_transport_t erpc_transport_rpmsg_lite_zc_remote_init( - unsigned long src_addr, unsigned long dst_addr, void *start_address, int rpmsg_link_id, rpmsg_ready_cb ready); +//erpc_transport_t erpc_transport_rpmsg_lite_zc_remote_init( +// unsigned long src_addr, unsigned long dst_addr, void *start_address, int rpmsg_link_id, rpmsg_ready_cb ready); /*! * @brief 创建RPMsg-Lite RTOS传输。 @@ -133,7 +134,8 @@ erpc_transport_t erpc_transport_rpmsg_lite_rtos_master_init(unsigned long src_ad * @brief 创建RPMsg-Lite RTOS传输。 */ erpc_transport_t erpc_transport_rpmsg_lite_rtos_remote_init( - unsigned long src_addr, unsigned long dst_addr, void *start_address, int rpmsg_link_id, rpmsg_ready_cb ready); + unsigned long src_addr, unsigned long dst_addr, void *start_address, int rpmsg_link_id, void (*ready_cb)(void), bool send_nameservice); + //@} diff --git a/erpc_c/transports/rpmsg_lite_rtos_transport.cpp b/erpc_c/transports/rpmsg_lite_rtos_transport.cpp new file mode 100644 index 0000000..e04ae91 --- /dev/null +++ b/erpc_c/transports/rpmsg_lite_rtos_transport.cpp @@ -0,0 +1,158 @@ +/* + * Copyright (c) 2015, Freescale Semiconductor, Inc. + * + * 允许以源代码或二进制形式重新分发和使用,无论是否修改, + * 只要满足以下条件: + * + * o 重新分发的源代码必须保留上述版权声明、本 + *条件列表以及以下免责声明。 + * + * o 以二进制形式重新分发时,必须在随分发提供的 + * 提供的文档和/或 + * 其他材料中复制上述版权声明、此条件列表和以下免责声明。 + * + * o 未经事先书面许可,不得使用 + * Freescale Semiconductor, Inc.的名称或其贡献者的姓名来认可或推广由此 + * 软件衍生的产品。 + * + * 本软件由版权所有者和贡献者“按原样”提供,并且 + * 不提供任何明示或暗示的担保,包括但不限于 + * 对适销性和针对特定用途的适用性的暗示担保 + * 免责声明。在任何情况下,版权所有者或贡献者均不对 + * 任何直接、间接、偶然、特殊、惩戒性或后果性的损害 + *(包括但不限于采购替代商品或服务; + * 使用、数据或利润损失;或业务中断)负责,无论其由 + * 何种原因引起,也无论其基于何种责任理论,无论是在合同、严格责任还是侵权行为 + *(包括疏忽或其他行为)中,以任何方式因使用本 + *软件而引起,即使已被告知可能发生此类损害。 + */ + +#include "rpmsg_lite_rtos_transport.h" +#include + +#if !(__embedded_cplusplus) +using namespace std; +#endif + +using namespace erpc; + +//////////////////////////////////////////////////////////////////////////////// +// 变量 +//////////////////////////////////////////////////////////////////////////////// +uint8_t RPMsgRTOSTransport::s_initialized = 0; +struct rpmsg_lite_instance *RPMsgRTOSTransport::s_rpmsg; + +//////////////////////////////////////////////////////////////////////////////// +// 代码 +//////////////////////////////////////////////////////////////////////////////// + +RPMsgRTOSTransport::RPMsgRTOSTransport() +: Transport() +, m_dst_addr(0) +{ +} + +RPMsgRTOSTransport::~RPMsgRTOSTransport() +{ + rpmsg_lite_deinit(s_rpmsg); + s_initialized = 0; +} + +erpc_status_t RPMsgRTOSTransport::init( + unsigned long src_addr, unsigned long dst_addr, void *base_address, unsigned long length, int rpmsg_link_id) +{ + if (!s_initialized) + { + s_rpmsg = rpmsg_lite_master_init(base_address, length, rpmsg_link_id, RL_NO_FLAGS); + s_initialized = 1; + } + + m_rpmsg_queue = rpmsg_queue_create(s_rpmsg); + m_rpmsg_ept = rpmsg_lite_create_ept(s_rpmsg, src_addr, rpmsg_queue_rx_cb, m_rpmsg_queue); + + m_dst_addr = dst_addr; + return m_rpmsg_ept == RL_NULL ? kErpcStatus_InitFailed : kErpcStatus_Success; +} + +erpc_status_t RPMsgRTOSTransport::init( + unsigned long src_addr, unsigned long dst_addr, void *base_address, int rpmsg_link_id, void (*ready_cb)(void), bool send_nameservice) +{ + if (!s_initialized) + { + s_rpmsg = rpmsg_lite_remote_init(base_address, rpmsg_link_id, RL_NO_FLAGS); + + /* Signal the other core we are ready */ + if (ready_cb != NULL) + { + ready_cb(); + } + + while (!rpmsg_lite_is_link_up(s_rpmsg)) + { + } + + s_initialized = 1; + } + + m_rpmsg_queue = rpmsg_queue_create(s_rpmsg); + m_rpmsg_ept = rpmsg_lite_create_ept(s_rpmsg, src_addr, rpmsg_queue_rx_cb, m_rpmsg_queue); + + if(send_nameservice) + { + rpmsg_ns_announce(s_rpmsg, m_rpmsg_ept, + "rpmsg-openamp-demo-channel", + 0); + } + + m_dst_addr = dst_addr; + return m_rpmsg_ept == RL_NULL ? kErpcStatus_InitFailed : kErpcStatus_Success; +} + +erpc_status_t RPMsgRTOSTransport::receive(MessageBuffer *message) +{ + int ret_val = rpmsg_queue_recv(s_rpmsg, m_rpmsg_queue, &m_dst_addr, (char *)message->get(), kRpmsgMessageBufferSize, + NULL, RL_BLOCK); + return ret_val != RL_SUCCESS ? kErpcStatus_ReceiveFailed : kErpcStatus_Success; +} + +erpc_status_t RPMsgRTOSTransport::send(const MessageBuffer *message) +{ + int ret_val = + rpmsg_lite_send(s_rpmsg, m_rpmsg_ept, m_dst_addr, (char *)message->get(), message->getUsed(), RL_BLOCK); + return ret_val != RL_SUCCESS ? kErpcStatus_SendFailed : kErpcStatus_Success; +} + +MessageBuffer RPMsgMessageBufferFactory::create() +{ + uint8_t idx = 0; + while (((m_freeBufferBitmap & idx) == 0) && (idx < kInitCountMessageBuffers)) + { + idx++; + } + + assert(idx < kInitCountMessageBuffers); + + m_freeBufferBitmap &= ~(1 << idx); + + uint8_t *buf; + buf = m_buffers[idx]; + + assert(NULL != buf); + return MessageBuffer(buf, kRpmsgMessageBufferSize); +} + +void RPMsgMessageBufferFactory::dispose(MessageBuffer *buf) +{ + assert(buf); + uint8_t *tmp = buf->get(); + + if (tmp) + { + uint8_t idx = 0; + while ((tmp != m_buffers[idx]) && (idx < kInitCountMessageBuffers)) + { + ++idx; + } + m_freeBufferBitmap |= 1 << idx; + } +} diff --git a/erpc_c/transports/rpmsg_lite_rtos_transport.h b/erpc_c/transports/rpmsg_lite_rtos_transport.h new file mode 100644 index 0000000..f1aec8a --- /dev/null +++ b/erpc_c/transports/rpmsg_lite_rtos_transport.h @@ -0,0 +1,177 @@ +/* + * Copyright (c) 2015-2016, Freescale Semiconductor, Inc. + * + * 允许以源代码或二进制形式重新分发和使用,无论是否修改, + * 只要满足以下条件: + * + * o 重新分发的源代码必须保留上述版权声明、本 + *条件列表以及以下免责声明。 + * + * o 以二进制形式重新分发时,必须在随分发提供的 + * 提供的文档和/或 + * 其他材料中复制上述版权声明、此条件列表和以下免责声明。 + * + * o 未经事先书面许可,不得使用 + * Freescale Semiconductor, Inc.的名称或其贡献者的姓名来认可或推广由此 + * 软件衍生的产品。 + * + * 本软件由版权所有者和贡献者“按原样”提供,并且 + * 不提供任何明示或暗示的担保,包括但不限于 + * 对适销性和针对特定用途的适用性的暗示担保 + * 免责声明。在任何情况下,版权所有者或贡献者均不对 + * 任何直接、间接、偶然、特殊、惩戒性或后果性的损害 + *(包括但不限于采购替代商品或服务; + * 使用、数据或利润损失;或业务中断)负责,无论其由 + * 何种原因引起,也无论其基于何种责任理论,无论是在合同、严格责任还是侵权行为 + *(包括疏忽或其他行为)中,以任何方式因使用本 + *软件而引起,即使已被告知可能发生此类损害。 + */ + +#ifndef _EMBEDDED_RPC__RPMSG_LITE_RTOS_TRANSPORT_H_ +#define _EMBEDDED_RPC__RPMSG_LITE_RTOS_TRANSPORT_H_ + +#include "transport.h" +#include "message_buffer.h" +#include "rpmsg_lite.h" +#include "rpmsg_queue.h" +#include "rpmsg_ns.h" + +/*! + * @addtogroup rpmsg_lite_rtos_transport + * @{ + * @file + */ + +//////////////////////////////////////////////////////////////////////////////// +// 定义 +//////////////////////////////////////////////////////////////////////////////// + +enum +{ + kRpmsgMessageBufferSize = RPMSG_BUFFER_SIZE, + kInitCountMessageBuffers = 2, +}; + +//////////////////////////////////////////////////////////////////////////////// +// 类 +//////////////////////////////////////////////////////////////////////////////// + +namespace erpc +{ +/*! + * @brief 使用RPMsg RTOS API进行进程间消息传递的传输。 + * + * @ingroup rpmsg_lite_rtos_transport + */ +class RPMsgRTOSTransport : public Transport +{ +public: + /*! + * @brief 构造函数。 + * + * 此函数用于初始化对象属性。 + */ + RPMsgRTOSTransport(); + + /*! + * @brief RPMsgRTOSTransport析构函数 + */ + virtual ~RPMsgRTOSTransport(); + + /*! + * @brief 此函数调用RPMsg rtos初始化函数 - 作为RPMsg主服务器 + * + * @Param[in] src_addr 源地址。 + * @Param[in] dst_addr 目标地址。 + * @Param[in] base_address 共享内存中的RPMsg基地址。 + * @Param[in] length RPMsg共享内存区域长度。 + * @Param[in] rpmsg_link_id 选择通信将在哪些内核之间进行。 + * + * @retval kErpcStatus_Success 当rpmsg初始化函数成功执行时。 + * @retval kErpcStatus_InitFailed 当rpmsg初始化函数未成功执行时。 + */ + virtual erpc_status_t init( + unsigned long src_addr, unsigned long dst_addr, void *base_address, unsigned long length, int rpmsg_link_id); + + /*! + * @brief 此函数调用RPMsg rtos初始化函数 - 作为RPMsg远程 + * + * @Param[in] src_addr 源地址。 + * @Param[in] dst_addr 目标地址。 + * @Param[in] base_address 共享内存中的RPMsg基地址。 + * @Param[in] rpmsg_link_id 选择通信将在哪些内核之间进行。 + * @Param[in] ready_cb 在RPMsg初始化完成且内核就绪后调用的回调函数。 + * @Param [in] send_nameservice 如果为true,RPMsg主服务器会收到域名服务通知。 + * + * @retval kErpcStatus_Success 当rpmsg初始化函数成功执行时。 + * @retval kErpcStatus_InitFailed 当rpmsg初始化函数未成功执行时。 + */ + virtual erpc_status_t init( + unsigned long src_addr, unsigned long dst_addr, void *base_address, int rpmsg_link_id, void (*ready_cb)(void), bool send_nameservice); + + /*! + * @brief 将传入消息存储于消息缓冲区。 + * + * 在无消息传入时进行循环。 + * + * @Param[in] message 消息缓冲区,用于存储传入的消息。 + * + * @retval kErpcStatus_ReceiveFailed 无法接收消息缓冲区。 + * @retval kErpcStatus_Success 成功接收所有数据。 + */ + virtual erpc_status_t receive(MessageBuffer *message); + + /*! + * @brief 函数用于发送就绪消息。 + * + * @Param[in] message 传递要发送的消息缓冲区。 + * + * @retval kErpcStatus_SendFailed 无法发送消息缓冲区。 + * @retval kErpcStatus_Success 成功发送所有数据。 + */ + virtual erpc_status_t send(const MessageBuffer *message); + +protected: + /* 远程设备 */ + struct remote_device *m_rdev; /*!< 代表第二个内核的设备。*/ + struct rpmsg_channel *m_app_rp_chnl; /*!< 代表两台设备(两个内核)间的连接。*/ + unsigned long m_dst_addr; /*!< rpmsg使用的目标地址。*/ + rpmsg_queue_handle m_rpmsg_queue; /*!< 处理RPMsg队列。*/ + struct rpmsg_lite_endpoint *m_rpmsg_ept; /*!< 指向RPMsg Lite端点结构的指针。*/ + + static struct rpmsg_lite_instance *s_rpmsg; /*!< 指向RPMSG lite实例的指针。*/ + static uint8_t s_initialized; /*!< 表示rpmsg-lite是否已初始化的信息。*/ +}; + +class RPMsgMessageBufferFactory : public MessageBufferFactory +{ + uint8_t m_freeBufferBitmap; + uint8_t m_buffers[kInitCountMessageBuffers][kRpmsgMessageBufferSize]; + +public: + /*! + * @brief 构造函数。 + */ + RPMsgMessageBufferFactory() + : m_freeBufferBitmap(0xFF) + { + } + /*! + * @brief RPMsgMessageBufferFactory destructor + */ + virtual ~RPMsgMessageBufferFactory() {} + /*! + * @brief 此函数可创建用于设备间通信的消息缓冲区。 + */ + virtual MessageBuffer create(); + /*! + * @brief 此函数可处理用于设备间通信的消息缓冲区。 + */ + virtual void dispose(MessageBuffer *buf); +}; + +} // 命名空间erpc + +/*! @} */ + +#endif // _EMBEDDED_RPC__RPMSG_LITE_RTOS_TRANSPORT_H_ diff --git a/erpc_c/transports/rpmsg_rtos_transport.h b/erpc_c/transports/rpmsg_rtos_transport.h new file mode 100644 index 0000000..ad1d229 --- /dev/null +++ b/erpc_c/transports/rpmsg_rtos_transport.h @@ -0,0 +1,147 @@ +/* + * Copyright (c) 2015, Freescale Semiconductor, Inc. + * + * 允许以源代码或二进制形式重新分发和使用,无论是否修改, + * 只要满足以下条件: + * + * o 重新分发的源代码必须保留上述版权声明、本 + *条件列表以及以下免责声明。 + * + * o 以二进制形式重新分发时,必须在随分发提供的 + * 提供的文档和/或 + * 其他材料中复制上述版权声明、此条件列表和以下免责声明。 + * + * o 未经事先书面许可,不得使用Freescale Semiconductor, Inc.的名称或其 + * 贡献者的姓名来认可或推广由此 + * 软件衍生的产品。 + * + * 本软件由版权所有者和贡献者“按原样”提供,并且 + * 不提供任何明示或暗示的担保,包括但不限于 + * 对适销性和针对特定用途的适用性的暗示担保 + * 免责声明。在任何情况下,版权所有者或贡献者均不对 + * 任何直接、间接、偶然、特殊、惩戒性或后果性的损害 + *(包括但不限于采购替代商品或服务; + * 使用、数据或利润损失;或业务中断)负责,无论其由 + * 何种原因引起,也无论其基于何种责任理论,无论是在合同、严格责任还是侵权行为 + *(包括疏忽或其他行为)中,以任何方式因使用本 + *软件而引起,即使已被告知可能发生此类损害。 + */ + +#ifndef _EMBEDDED_RPC__RPMSG_RTOS_TRANSPORT_H_ +#define _EMBEDDED_RPC__RPMSG_RTOS_TRANSPORT_H_ + +#include "transport.h" +#include "message_buffer.h" + +extern "C" { +#include "rpmsg.h" +#include "rpmsg_rtos.h" +#include "rpmsg.h" +} + +/*! + * @addtogroup rpmsg_rtos_transport + * @{ + * @file + */ + +//////////////////////////////////////////////////////////////////////////////// +// 定义 +//////////////////////////////////////////////////////////////////////////////// + +enum +{ + kRpmsgMessageBufferSize = RPMSG_BUFFER_SIZE, +}; + +//////////////////////////////////////////////////////////////////////////////// +// 类 +//////////////////////////////////////////////////////////////////////////////// + +namespace erpc +{ +/*! + * @brief 使用RPMsg RTOS API进行进程间消息传递的传输。 + * + * @ingroup rpmsg_rtos_transport + */ +class RPMsgRTOSTransport : public Transport +{ +public: + /*! + * @brief 构造函数。 + * + * 此函数用于初始化对象属性。 + */ + RPMsgRTOSTransport(); + + /*! + * @brief RPMsgRTOSTransport析构函数 + */ + virtual ~RPMsgRTOSTransport(); + + /*! + * @brief 此函数用于调用rpmsg rtos初始化函数。 + * + * @Param[in] dev_id 设备ID号。 + * @Param[in] role 设备角色编号。 + * + * @retval kErpcStatus_Success 当rpmsg初始化函数成功执行时。 + * @retval kErpcStatus_InitFailed 当rpmsg初始化函数未成功执行时。 + */ + virtual erpc_status_t init(int dev_id, int role); + + /*! + * @brief 将传入消息存储于消息缓冲区。 + * + * 在无消息传入时进行循环。 + * + * @Param[in] message 消息缓冲区,用于存储传入的消息。 + * + * @retval kErpcStatus_ReceiveFailed 无法接收消息缓冲区。 + * @retval kErpcStatus_Success 成功接收了所有数据。 + */ + virtual erpc_status_t receive(MessageBuffer *message); + + /*! + * @brief 用于发送就绪消息的函数。 + * + * @Param[in] message 传递要发送的消息缓冲区。 + * + * @retval kErpcStatus_SendFailed 无法发送消息缓冲区。 + * @retval kErpcStatus_Success 成功发送所有数据。 + */ + virtual erpc_status_t send(const MessageBuffer *message); + +protected: + /* 远程设备 */ + static struct remote_device *m_rdev; /*!< 代表第二个内核的设备。*/ + static struct rpmsg_channel *m_app_rp_chnl; /*!< 代表两台设备(两个内核)之间的连接。*/ +}; + +class RPMsgMessageBufferFactory : public MessageBufferFactory +{ +public: + /*! + * @brief 构造函数。 + */ + RPMsgMessageBufferFactory() {} + /*! + * @brief RPMsgMessageBufferFactory destructor + */ + virtual ~RPMsgMessageBufferFactory() {} + /*! + * @brief 此函数可创建用于设备间通信的消息缓冲区。 + */ + virtual MessageBuffer create(); + /*! + * @brief 此函数可处理用于设备间通信的消息缓冲区。 + */ + virtual void dispose(MessageBuffer *buf); +}; + +} // 命名空间erpc + +/*! @} */ + +#endif // _EMBEDDED_RPC__RPMSG_RTOS_TRANSPORT_H_ diff --git a/erpc_python/erpc/transport.py b/erpc_python/erpc/transport.py index 0765e9f..c335943 100644 --- a/erpc_python/erpc/transport.py +++ b/erpc_python/erpc/transport.py @@ -31,6 +31,8 @@ import struct import serial +from rpmsg.sysfs import RpmsgEndpoint +import time import socket import threading from .crc16 import crc16 @@ -107,6 +109,25 @@ class SerialTransport(FramedTransport): class ConnectionClosed(Exception): pass +class RpmsgTransport(Transport): + def __init__(self): + self.ept = RpmsgEndpoint( + RpmsgEndpoint.rpmsg_openamp_channel, + RpmsgEndpoint.LOCAL_DEFAULT_ADDRESS, + RpmsgEndpoint.Types.DATAGRAM) + + def send(self, message): + self.ept.send(message, RpmsgEndpoint.REMOTE_DEFAULT_ADDRESS) + + def receive(self): + while True: + ret = self.ept.recv(2048) + if len(ret[1]) != 0: + return ret[1] + else: + time.sleep(0.001) + return ret[1] + class TCPTransport(FramedTransport): def __init__(self, host, port, isServer): super(TCPTransport, self).__init__() -- 2.7.4 Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Dusan,谢谢 。一旦演示程序正常运行,我将创建拉取请求。 再次感谢你的回复,我已经拿到了 Python 文件。我会运行演示,很快再跟你说。 Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 嗨,做得真棒:)如果你愿意的话,可以为 i.MX 演示代码库创建一个拉取请求来修复这个问题。mareknovak 可以审核并将其合并到代码库中。 要生成python代码:与其他应用一样,您可以在命令行中输入"erpcgen --help"(-h也应有效)。 python -gpy idl_file -> gpy 表示生成 python。 Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 太好了,在更新之前我可以继续使用这个稳定版本。 经过几次修复,我的 MCU 演示现在可以正常构建和运行。感谢您的信息。 Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Hi Dusan 我已修复此问题,现在MCU演示程序恢复正常运行......感谢您推荐的稳定版本...... 你能告诉我如何使用 erpcgen 工具生成 Python 代码吗? 谢谢 Chandini Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 嗨,最早也要到明天。但我不能保证一定是明天。我的同事 mareknovak 今天没来上班。不过应该很快就会处理。 Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 请问您能告诉我,您什么时候会更新? Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 您好,感谢您的关注。erpc似乎使用不同的erpcgen生成文件,且与Marek提交时的版本不一致(这是我们的失误)。最佳解决方案是将该演示程序更新为erpc和erpcgen的最新稳定版本。您可以从主分支GitHub - EmbeddedRPC/erpc: Embedded RPC(且已部署预构建erpcgen 1.4.0)尝试此操作。但我不知道您需要完成多少变更。或者您可以等待我们进行更新。 mareknovak Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Hi Dusan 我正在使用您推荐的同一个eRPC库 我遵循的步骤如下: 克隆 erpc-imx-demos(包含子模块,该子模块会克隆 eRPC 库,对应链接为 GitHub - MarekNovakNXP/erpc at 232afb209f0a0cfceb25a1be11879f7d1934e065) 1. git clone --recursive https://github.com/EmbeddedRPC/erpc-imx-demos.git 2. 进入 erpc-imx-demos/middleware/erpc 文件夹,然后像这样构建 erpcgen: 安装所需的 flex、bison 和 boost 包 make eprc 生成eprcgen sudo make install 成功获取 erpcgen 3. 尝试使用相同的 erpc_matrix_multiply.erpc 文件创建我自己的输出文件,命令如下: erpcgen -I erpc-imx-demos/MCU/example_erpc/service -o test/erpc-imx-demos/MCU/example_erpc/service erpc_matrix_multiply.erpc 成功获取以下文件: erpc_matrix_multiply.h erpc_matrix_multiply_server.cpp erpc_matrix_multiply_server.h erpc_matrix_multiply_client.cpp 4. 尝试构建 MCU/example_erpc/build/armgcc/imx7d_sdb_m4/build_all.sh。 失败并出现错误: /home/basavarajuc/test/erpc-imx-demos/MCU/example_erpc/service/erpc_matrix_multiply_server.cpp:在函数 'void* create_MatrixMultiplyService_service()' 中: /home/basavarajuc/test/erpc-imx-demos/MCU/example_erpc/service/erpc_matrix_multiply_server.cpp:168:56:错误:抽象类类型“MatrixMultiplyService_service”的 new-expression 无效 返回 new(nothrow) MatrixMultiplyService_service(); 很抱歉再次询问,只是为了澄清我的理解。 如果我使用的是 GitHub - MarekNovakNXP/erpc at 232afb209f0a0cfceb25a1be11879f7d1934e065 这个 eRPC 库,那我是否需要更新演示程序才能成功运行演示? 2. 您能否告知我erpc-imx-demos/MCU/example_erpc/service at master · EmbeddedRPC/erpc-imx-demos · GitHub中的输出文件是由哪个erpcgen版本生成的? 这样我就能暂时使用旧版本的 erpcgen 来创建我自己的文件了。 非常感谢。很抱歉打扰您 Chandini   Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> 您好,感谢您的评论。 您提到的示例版本早于当前erpcgen构建版本。mareknovak也因当时官方eRPC版本未包含某些细微改动,而创建了官方eRPC存储库的分支版本。如果您点击中间件文件夹下erpc-imx-demos存储库中的eRPC引用,将重定向到其eRPC存储库。您需要借助该版本构建erpcgen。我们计划在未来更新演示。 希望我的回答对你有帮助。如果你有任何疑问,欢迎随时向我们咨询。 Re: 介绍 eRPC <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> Hi 抱歉,如果我问的是基本问题。 我正在尝试理解如何使用恩智浦的erpcgen工具。 参考 https://github.com/EmbeddedRPC/erpc-imx-demos,我成功运行了示例演示。 我的下一步计划是构建 erpcgen,然后使用相同的 erpc_matrix_multiply.erpc 文件创建自己的输出文件,再次运行相同的演示,以便熟悉 erpcgen 工具的使用方法。 我得到了输出文件,但即使我使用了相同的erpc_matrix_multiply.erpc文件,我的文件与示例文件不同。 变更如下: 示例演示中的输出文件显示(erpc_matrix_multiply_server.h): erpc_status_t erpcMatrixMultiply_shim(erpc::Codec * in, erpc::Codec * out, uint32_t sequence); 我的文件 (erpc_matrix_multiply_server.h): erpc_status_t erpcMatrixMultiply_shim(erpc::Codec * codec, uint32_t sequence); 为什么文件会不同呢?我是不是漏掉了什么配置? 我是否需要手动编辑 erpc_matrix_multiply_server.h 和 erpc_matrix_multiply_server.cpp 文件? 先感谢您 Chandini
View full article
Single channel ABS SB0401 Monitoring Module Issue Hello @nxp , I’m using the SB0401 Single-Channel ABS module IC with an NXP S32K31xEVB-Q48 MCU as the SPI master. I transmit the monitoring/module data once every 10 ms, but the SB0401 monitoring module appears to reset/restart repeatedly (about once every 50 ms). Along with this, my SPI “error count” increases on every SPI transfer. Below are the setup and my specific questions. HW/SW setup MCU (SPI Master): S32K31xEVB-Q48 (S32K31x family) Device: SB0401 (Single-Channel ABS module IC) Interface: SPI (LPSPI) (DMA based transfers) Periodic transmission: every 10 ms Observed issue: SB0401 monitoring module reset/restart every ~50 ms (see attached logs) Observed behavior The error counter increments for every SPI byte/word transfer. I read AR (seed) from SB0401 message 18 and calculate MR based on that AR. Despite sending frames periodically, the SB0401 monitoring module resets/restarts. Questions MR calculation vs AR (Message 18) My error count increases on every SPI transfer. I calculate MR using the AR value received from SB0401 message 18. Is it expected that an error counter would increment on every transfer in this condition, or does it indicate MR/AR logic is incorrect? Please confirm the correct MR computation flow/timing relative to AR (message 18) and any common pitfalls (e.g., using stale AR, wrong byte/bit extraction, timing window, counter alignment). ACK position when writing Message 0 If I write data into Message 0 at TxBuf[0], where should I check the acknowledgement? Example: For a write in TxBuf[0], does the ACK appear in RxBuf[0] (same word) or in RxBuf[1] (next word)? If there is a defined “ACK occurs in the following SPI word/frame” rule, please share the exact mapping. Reference SW / CDD driver Is there any reference CDD / example driver for SB0401 (C source or AUTOSAR-style CDD integration) that can be shared for guidance? If not shareable, can you recommend the official SB0401 software package / app note / reference implementation details to follow? Re: Single channel ABS SB0401 Monitoring Module Issue Hi Is possible to show your company and project information here? Re: Single channel ABS SB0401 Monitoring Module Issue Hi @guoweisun     yeah ok.     Company:  Ettiksoft technologies Pvt ltd.     project:  Two-wheeler single channel ABS.  Re: Single channel ABS SB0401 Monitoring Module Issue This part doesn't have CDD or other software drive and the reference schematic also need customer sign NDA then share. Re: Single channel ABS SB0401 Monitoring Module Issue Let me check again for the reference code about this special part. Re: Single channel ABS SB0401 Monitoring Module Issue For the example code I can't post here, could you please submit ticket from case port? Home Re: Single channel ABS SB0401 Monitoring Module Issue hello @guoweisun    ok.  Any other reference code is there, like this module behaviour. 
View full article
I.MX8M Plus – Booting U-Boot, Kernel, DTB, and Initramfs from 32 MB QSPI Flash (Kernel Hangs) Hi, We are working with a custom i.MX8M Plus DDR4 board that includes 32 MB QSPI NOR flash. Our objective is to boot U-Boot, Linux kernel, device tree, and initramfs (rootfs.img) entirely from QSPI flash, without using SD/eMMC. We are able to successfully boot up to U-Boot (flash.bin) from QSPI flash. -----Flash Layout and Image Sizes---------------- QSPI flash size: 32 MB flash.bin (U-Boot + SPL) ~2.4 MB Image.gz (Kernel) ~15 MB imx8mp-evk.dtb ~85 KB rootfs.img ~12.6 MB ----QSPI Offset Layout---------- flash.bin @ 0x00000000 Image.gz @ 0x0024D000 imx8mp-evk.dtb @ 0x010A6B00 rootfs.img @ 0x010BB800 U-Boot Environment Setup After booting into U-Boot from QSPI, we configure the following environment variables to load the kernel, device tree, and initramfs from flash: sf probe 0 setenv loadaddr 0x40480000 // kernel setenv fdt_addr 0x43000000 //dtb setenv initrd_addr 0x43800000 //rootfs (minimal initramfs) setenv kernel_comp_addr_r 0x50000000 setenv kernel_comp_size 0x04000000 Reading Images from QSPI Flash sf read ${loadaddr} 0x0024D000 0x00E59A6F sf read ${fdt_addr} 0x010A6B00 0x00014BBA sf read ${initrd_addr} 0x010BB800 0x00C04DB0 Boot Command setenv bootargs console=${console},${baudrate} earlycon=${earlycon},${baudrate} rdinit=/dev booti ${loadaddr} ${initrd_addr} ${fdt_addr} Issue Observed The kernel starts executing but hangs at “Starting kernel …”. Please refer to the attached kernel boot log (kernel_bootlog1). When using the following boot arguments: setenv bootargs setenv bootargs "console=ttymxc1,115200 earlycon root=/dev/ram0 rw rdinit=/sbin/init loglevel=8" The kernel progresses further but hangs midway during boot. Please refer to the attached kernel boot log (kernel_bootlog2). Attached the kernel DTS and kernel defconfig for reference. Kindly let us know if any modifications are required. Questions: 1. Are there any recommended changes required in the kernel DTS for booting initramfs entirely from QSPI on a custom i.MX8M Plus DDR4 board? 2. Are there any additional boot arguments recommended by NXP for initramfs-based boot on i.MX8MP from QSPI flash? 3. What could be the possible reason for the kernel not booting correctly? We followed the same procedure that works successfully on the i.MX8MP LPDDR4  EVK, where the kernel and root filesystem boot properly from QSPI flash. The only differences in our setup are the flash.bin and device tree, which were modified according to the DDR configuration of our custom board. thank you. Re: I.MX8M Plus – Booting U-Boot, Kernel, DTB, and Initramfs from 32 MB QSPI Flash (Kernel Hangs) Hi @Bhardwaj  1. Please add size for booti. The booti needs initrd size. booti ${loadaddr} ${initrd_addr}:0x00C04DB0 ${fdt_addr} booti command — Das U-Boot unknown version documentation 2. The bootlog2 shows that the kernel can't find correct mount point, this should be related to the rootfs parameter you passed in. Best Regards, Zhiming Re: I.MX8M Plus – Booting U-Boot, Kernel, DTB, and Initramfs from 32 MB QSPI Flash (Kernel Hangs) @Bhardwaj  I follow this doc, it works fine.  I just use the ramdisk of the demo.  https://community.nxp.com/t5/i-MX-Processors-Knowledge-Base/all-bootloader-device-tree-Linux-kernel-rootfs-in-spi-nor-demo/ta-p/1663994 Re: I.MX8M Plus – Booting U-Boot, Kernel, DTB, and Initramfs from 32 MB QSPI Flash (Kernel Hangs) HI @Zhiming_Liu , We are still facing the same issue on our i.MX8M Plus DDR4 custom board and would appreciate your guidance. We have attached the detailed kernel boot log for your review. The same procedure and images work correctly on the i.MX8M Plus LPDDR4 EVK. The same procedure doing as same as EVK ,But the kernel does not fully boot on our custom DDR4 board. Question : 1.After giving setenv bootargs "console=ttymxc1,115200 earlycon root=/dev/ram rw rdinit=/sbin/init loglevel=8"  going forward , WHY? rather then thos loglevel not moving forwad as said in kernel_bootlog1. 2.Are there any mandatory changes required in the Linux device tree (linux-imx) specifically for a custom DDR4 configuration on i.MX8M Plus, beyond updating DDR timing and memory size? 3.The same kernel image, initramfs, and boot flow work correctly on the i.MX8M Plus LPDDR4 EVK, but fail on our custom DDR4 board. 4.What are the possible reasons for this behavior? Could this be related to DDR configuration, memory mapping, or reserved memory differences? Re: I.MX8M Plus – Booting U-Boot, Kernel, DTB, and Initramfs from 32 MB QSPI Flash (Kernel Hangs) I think you should check the device tree to see if there are any address conflicts with the ramdisk. Alternatively, use a higher address for the ramdisk, or use a smaller ramdisk as the one in the demo Hogole mentioned. Re: I.MX8M Plus – Booting U-Boot, Kernel, DTB, and Initramfs from 32 MB QSPI Flash (Kernel Hangs) You can try booting without mounting the ramdisk first to see if it works. This would mean only the root filesystem is not mounted. This can help narrow down the problem. booti ${loadaddr} - ${fdt_addr} Re: I.MX8M Plus – Booting U-Boot, Kernel, DTB, and Initramfs from 32 MB QSPI Flash (Kernel Hangs) Hi @gehimiy , As suggested, we tried booting the kernel without an initramfs using the command:   booti ${loadaddr} - ${fdt_addr} However, there is no response from the kernel, and the system still hangs at “Starting kernel …”. The below are the Ram address and flash address using to load the files.  setenv loadaddr 0x40480000 // kernel setenv fdt_addr 0x43000000 //dtb setenv initrd_addr 0x43800000 //rootfs (minimal initramfs) setenv kernel_comp_addr_r 0x50000000 setenv kernel_comp_size 0x04000000 Reading Images from QSPI Flash sf read ${loadaddr} 0x0024D000 0x00E59A6F sf read ${fdt_addr} 0x010A6B00 0x00014BBA sf read ${initrd_addr} 0x010BB800 0x00C04DB0 Questions: Where should we check for possible address conflicts between: Kernel load address Initramfs (ramdisk) address Reserved memory regions If the issue is related to ramdisk address overlap, where can we: Change the ramdisk load address in U-Boot and kernel ? Adjust or reserve memory regions in the device tree? Is there a recommended higher memory address range for loading the ramdisk on i.MX8M Plus DDR4 Custom Board systems? With same address and files working fine for IMX8MPLUS LPDDR4 EVK. We have attached the current DTS file for your reference. Please let us know what changes are required. Thanks in advance for your support.
View full article
EB Tresos: 「DriverConfig」の複数の定義 こんにちは、 EB Tresos で BMS SDK Gen2 を使用しています。初期化中に Bjb_D1xx ドライバと Bcc_774a ドライバに構成構造体を渡したいので、両方のモジュールで「Config Variant: VariantPostBuild」を選択する必要があります。 ただし、各ドライバは DriverConfig 変数を含めて生成されるため、コンパイル エラーが発生します。 [ビルド] /workspaces/template/EBTresosProjectFiles/NextGen_RevA/generate/include/CDD_Bjb_D1xx_Cfg.h:48 からインクルードされたファイルで、 [ビルド] /workspaces/template/S32DSProjectFiles/BMS_GEN2_0.9.1_CD01/Bjb_D1xx_TS_TxDxM9I1R0/include/CDD_Bjb_D1xx.h:46 から、 [ビルド] /workspaces/template/S32DSProjectFiles/BMS_GEN2_0.9.1_CD01/Bms_common_TS_TxDxM9I1R0/src/CDD_Bms_common.c:60 から: [ビルド] /workspaces/template/EBTresosProjectFiles/NextGen_RevA/generate/include/CDD_Bjb_D1xx_PBcfg.h:85:44:エラー: 'DriverConfig' の型が競合しています [ビルド] 85 | extern const Bjb_D1xx_DriverConfigType DriverConfig; [ビルド] | ^~~~~~~~~~~~~ [ビルド] /workspaces/template/EBTresosProjectFiles/NextGen_RevA/generate/include/CDD_Bjb_D1xx_PBcfg.h:85:44:注: マクロ 'BJB_D1XX_INITCONFIG_PB' の定義内 [ビルド] 85 | extern const Bjb_D1xx_DriverConfigType DriverConfig; [ビルド] | ^~~~~~~~~~~~~ [ビルド] /workspaces/template/S32DSProjectFiles/BMS_GEN2_0.9.1_CD01/Bjb_D1xx_TS_TxDxM9I1R0/include/CDD_Bjb_D1xx.h:1013:1:注: マクロ 'BJB_D1XX_CONFIG_EXT' の展開 [ビルド] 1013 | BJB_D1XX_CONFIG_EXT [ビルド] | ^~~~~~~~~~~~~~~~~~~~~ [ビルド] /workspaces/template/EBTresosProjectFiles/NextGen_RevA/generate/include/CDD_Bcc_774a_Cfg.h:49 からインクルードされたファイルで、 [ビルド] /workspaces/template/S32DSProjectFiles/BMS_GEN2_0.9.1_CD01/Bcc_774a_TS_TxDxM9I1R0/include/CDD_Bcc_774a.h:46 から、 [ビルド] /workspaces/template/S32DSProjectFiles/BMS_GEN2_0.9.1_CD01/Bms_common_TS_TxDxM9I1R0/src/CDD_Bms_common.c:54 から: [ビルド] /workspaces/template/EBTresosProjectFiles/NextGen_RevA/generate/include/CDD_Bcc_774a_PBcfg.h:86:44:注: 'DriverConfig' の以前の宣言はここにありました [ビルド] 86 | extern const Bcc_774a_DriverConfigType DriverConfig; [ビルド] | ^~~~~~~~~~~~~ [ビルド] /workspaces/template/EBTresosProjectFiles/NextGen_RevA/generate/include/CDD_Bcc_774a_PBcfg.h:86:44:注: マクロ 'BCC_774A_INITCONFIG_PB' の定義内 [ビルド] 86 | extern const Bcc_774a_DriverConfigType DriverConfig; [ビルド] | ^~~~~~~~~~~~~ [ビルド] /workspaces/template/S32DSProjectFiles/BMS_GEN2_0.9.1_CD01/Bcc_774a_TS_TxDxM9I1R0/include/CDD_Bcc_774a.h:851:1:注: マクロ 'BCC_774A_CONFIG_EXT' の展開 [ビルド] 851 | BCC_774A_CONFIG_EXT [ビルド] | ^~~~~~~~~~~~~~~~~~~~~ コンパイル エラーを発生させずにビルド後のパラメータ化を可能にするために、両方のドライバを構成するにはどうすればよいでしょうか? Re: EB Tresos: Multiple definitions of "DriverConfig" クリスマス休暇期間中は、サポートの応答時間は通常より長くなる場合がありますのでご了承ください。場合によっては、ご要望への対応が新年以降になることもあります。ご理解のほどよろしくお願いいたします。 Re: EB Tresos: Multiple definitions of "DriverConfig" こんにちは@PhilippH 、 個人的にお伝えしたとおり、このCASEは開発チームによって検討中でした。 彼らは次のような回答をしました。 この問題を解決するには、これらの変数の前にモジュール名を付けます(例:生成されたコードには、 Bcc_774a_とBjb_D1xx_が含まれます。この変更はテスト目的でのみ使用され、本番環境では使用されないことに注意してください。 よろしくお願いいたします。 ダニエル
View full article
使用 FLEXIO_SPI 从站进行奇数数据传输 我正试图让 MBDT 示例 s32k3xx_spi_async_interr_s32ct 在 s32k396_bga_dc1 + MB 上工作,使用 lpspi2(主设备)+ flexio_spi_0(从设备),但得到的结果非常奇怪。 lpspi2 配置为带外部缓冲器的异步模式。无 DMA。 flexio_spi_0 配置为在带 DMA 的异步模式下使用 IB。 尝试模仿默认 K344 我的 SPI 配置与 S32 DS 示例 Spi_Transfer_S32K396 相结合。 lpspi2 运行正常。如果我将 sout 循环到 sin,那么就会像预期的那样循环回完全相同的值。 但从属模式下的 flexio_spi_0 表现非常糟糕,只能随机更新。输入和输出表现都很奇怪。在两次更新之间,它会不断重复相同的值,直到突然更新。有时,它甚至表现得很好。我找不到任何一致的模式,也不知道是什么原因导致了这种行为。 在修正 LPSPI2 引脚布局并调整缓冲区大小以匹配后,同样的配置在 S32DS 示例 Spi_Transfer_S32K396 中也能正常工作。 I/O 完成时的回调在两者上都会像时钟一样被调用。但是,当定期运行仅传输 1 字节时,进出/传出 flexio_spi_0 的数据表现不佳。 附上我正在使用的 mex 文件。 板的接线方式就像 通道 CLK DI do CS LPSPI2 P23-15 P23-13 P27-8 P23-9 FLEXIO_SPI_0 P13-7 P18-12 P10-8 P17-4 P23-15<-> P13-7 P23-13<-> P10-8 P27-8<-> P18-12 P23-9<-> P17-4 如果我调整模型优先级,以便在主传送之前触发信号从属传输,那么它的效果会好一些,但远非可靠。 最终目标是在flexio_spi上自动定期重复主交易,从计时串行设备收集测量值。每次传输少于 13 位,因此除了 flexio 硬件模块提供的缓冲区外,根本不需要任何缓冲区。但首要目标是理解数据并让数据可靠地流动起来。
View full article
使用 jLink Segger 探针 RESET MIMXRT1176-EVKB 您好, 我正试图使用 Segger JLink 探头对评估套件(MIMXRT1176-EVKB,修订版"55139 REV C3" )进行编程。 为此,我在 JP5 上添加了一个跳线,以断开嵌入式 MCU 链接,从而使探针能够对闪存编程。 尝试对二进制文件进行编程后,探测器似乎无法正确RESET CPU。编程完成后,CPU无法RESET,我必须手动RESET。 这让我觉得探头和 CPU 之间有问题,可能缺少了什么东西(跳线?其他?) 这是一个已知问题吗?我是否遗漏了文件中的某些内容? 感谢您的帮助、 布伦丹 Re: Reset MIMXRT1176-EVKB with JLink Segger Probe 嗨,@BrendanLT、 您是否还短接了 JP4?正如 MIMXRT1170-EVKB 板硬件用户指南中所述: BR, Edwin.
View full article
i.mx8mm QSPI 启动和分区 您好, 我们有基于 imx8mm-EVK 的自定义板, 我们更换了 Qspi 内存芯片 mt25qu02g。在 u-boot 和 linux 中进行检测时没有问题。 我们正在尝试移植镜像并从 QSPI 启动,请参考下面的图片。 Re: i.MX8MM QSPI booting and partition 你好@Dhruvit、 我们使用的是 i.MX8M Plus EVK,它有 32 MB QSPI 闪存。 我们的目标是完全从 QSPI 闪存启动 U-Boot、Linux 内核、设备树和 initramfs (rootfs.img)。 我们能够成功启动: U-Boot(来自 flash.bin) Linux 内核(Image.gz) 设备树 (imx8mp-evk.dtb) 但是,我们在从 QSPI 闪存加载和使用 initramfs/rootfs 映像时遇到了问题。内核启动成功,但内核在 Waiting for removable media(等待可移动媒体)处挂起....,请参阅下面附带的日志。 -----Flash 布局和图像大小---------------- QSPI 闪存大小:32 MB flash.bin (U-Boot + SPL) ~2.3 MB Image.gz (内核) ~13.5 MB imx8mp-evk.dtb ~86 KB rootfs.img ~12.6 MB ----QSPI 偏移布局---------- flash.bin @ 0x00000000 Image.gz @ 0x00240000 imx8mp-evk.dtb @ 0x01000000 rootfs.img @ 0x01080000 ------ 将文件编入 QSPI(来自 SD 卡)--------- sf probe 0 sf erase 0x0 0x2000000 fatload mmc 1${loadaddr} flash.bin sf 写${loadaddr} 0x0${filesize} fatload mmc 1${loadaddr} Image.gz sf 写${loadaddr} 0x240000${filesize} fatload mmc 1${loadaddr} imx8mp-evk.dtb sf 写${loadaddr} 0x1000000${filesize} fatload mmc 1${loadaddr} rootfs.img # initramfs (cpio.gz) sf 写${loadaddr} 0x1080000${filesize} ------闪烁后,重启板------------------ 从 u-boot 启动后,为 Linux 内核 (Image.gz)、设备设置环境变量树 (imx8mp-evk.dtb),rootfs.img。 sf probe 0 setenv loadaddr 0x40480000 // 核心 setenv fdt_addr 0x43000000 //dtb setenv initrd_addr 0x43800000 //rootfs setenvkernel_comp_addr_r 0x50000000 setenv kernel_comp_size 0x04000000 sf read${loadaddr} 0x240000 0xCD3CE2 sf read${fdt_addr} 0x1000000 0x14360 sf read${initrd_addr} 0x1080000 0xC04DB0 setenv bootargs"console=ttymxc1,115200 root=/dev/ram0 rw" setenv bootcmd 'sf probe 0; sf read${loadaddr} 0x240000 0xCD3CE2; sf read${fdt_addr} 0x1000000 0x14360; sf read${initrd_addr} 0x1080000 0xC04DB0; booti${loadaddr} ${initrd_addr} ${fdt_addr} ' saveenv ----------------------------------------------------------------------- 1. 使用 SD 卡 Wic 文件在分区(启动/根目录)上运行良好。 2.We genarated Two yocto images ==> 1.bitbake core-image-minimal-initramfs (generated initramfs.cpio.gz)这个 cpio.gx 使用这个 cmd mkimage-A arm-O linux-T ramdisk-d (来自 linux 用户指南)== > 2. 还从 yocto 中生成了使用 bitbake core-image-tiny 生成的微小 rootfs。 core-image-tiny-imx8mp-evk.tar.zst,该 tar 已解压缩到 SD 卡中的 EXT4 分区,并成功加载了微小的 rootfs。 3.但正如第二点所说,rootfs.img 也被放入了 SD 卡的 EXT4 根分区,但却无法加载 rootfs。 ------------------------------------------------------------------------------------------- 1. 这是启动 initramfs (rootfs.img) 的正确方法吗从 QSPI 直接连接 i.MX8M Plus EVK? ----------------------------------------------------------------------------------------------- 3. 有没有推荐的恩智浦参考镜像用于在 i.MX8MP(Linux 内核 (Image.gz)、设备上完全从 QSPI 启动内核和 initramfs树 (imx8mp-evk.dtb),rootfs.img)? 谢谢! Re: i.MX8MM QSPI booting and partition 你好@德鲁维特 感谢您的支持。 Re: i.MX8MM QSPI booting and partition 嗨,@vignesh-baskaran、 希望你一切都好。 很高兴知道这个问题已经解决了。 我可以将此案标记为 "接近 "吗? 感谢& , Dhruvit Vasavada。 Re: i.MX8MM QSPI booting and partition 你好@Dhruvit、 谢谢您的建议。它对我们有用。 如果有人面临同样的问题。这是因为在 Sf 探测期间选择了 SPI 模式。 谢谢。 Re: i.MX8MM QSPI booting and partition 嗨,@Dhruvit、 我们认为 sf 读取和 sf 写入没有按照我们的预期运行。 我们将图像从 SD 加载到 RAM,然后检查 => fdt addr${fdt_addr} => fdt print${fdt_addr}. 它工作得非常好。 但当我们尝试从 QSPI 加载到 RAM 时 我们收到错误信息 libfdt fdt_check_header(): FDT_ERR_BADMAGIC 我们认为这可能是装载尺寸的问题。我们进行了交叉验证,这不是问题所在。 注:我们在写入 sf 之前尝试了擦除操作。 你能与我们联系这个问题吗? Re: i.MX8MM QSPI booting and partition 嗨,@vignesh-baskaran、 希望你一切都好。 可以按照以下步骤在 u-boot 中将图像加载到 QSPI 闪存中。 1.使用 fatload 命令将 Image 和 dtb 载入 RAM。 #fatload mmc ${mmcdev}:${mmcpart} ${loadaddr} ${image} #fatload mmc ${mmcdev}:${mmcpart} ${fdt_addr_r} ${fdtfile} 2.使用 sf write 在闪存中闪存映像和 dtb。 #sf write ${loadaddr} # sf write ${fdt_addr_r} - 在将 Image 和 dtb 写入闪存& 时,请确保使用正确的偏移量和长度,确保它们不会互相覆盖。 使用以下命令可以找到正确的长度(尺寸 # fatls mmc ${mmcdev}:${mmcpart} 请分享上述命令的输出结果。 请擦除闪存后再试。 感谢& , Dhruvit Vasavada。 Re: i.MX8MM QSPI booting and partition 嗨,@Dhruvit、 1) 请参考附件中的printenv . 2) u-boot=> fdt addr ${fdt_addr_r} libfdt fdt_check_header(): FDT_ERR_BADMAGIC u-boot=> fdt print No FDT memory address configured. Please configure the FDT address via "fdt addr " command. Aborting! 3) 可以在 u-boot 中使用写入命令刷新 Image 和 fdt,而不是使用 dd。 你建议用 Sf write 写入 qspi、 假设我有 SD 卡中的图像,并想复制到 QSPi,我该如何操作? 请与我们联系,告诉我们该怎么做。会有帮助的。 谢谢! Re: i.MX8MM QSPI booting and partition 嗨,@vignesh-baskaran、 希望你一切都好。 所附图像中的错误表明设备树未正确加载。请确保您使用了正确的偏移量和尺寸。 可以在 u-boot 中使用写入命令刷新 Image 和 fdt,而不是使用 dd。 请提供printenv命令的输出结果。 加载设备树后,请共享以下命令的输出(使用 sf read) => FDT Addr${fdt_addr_r} => fdt 打印 感谢& , Dhruvit Vasavada。 Re: i.MX8MM QSPI booting and partition 您好, 谁能调查一下这个问题?
View full article
[S32K311][MultiPartition]:在 S32K311 上设置多分区时 SPI 初始化失败 你好,团队、 李尔的问题如下 ------------------------------------------------------------------------------------- 我们正在单核 ECU (S32K311) 上实施多分区,在 SPI 驱动程序初始化过程中遇到了一个问题。 观察结果: SPI 驱动程序调用 OsIf_timer.c 中的 OsIf_GetPartitionID(),以获取当前分区 ID 并将其用作 SpiID。但是,该 ID 与 SpiCorePartitionUse 中的值不匹配,尽管两者都是为同一个 ECUC 分区配置的。由于这种不匹配,驱动程序会触发信号 DET 错误,无法初始化外围设备。 调试时发现的问题: 函数 OsIf_apxMultiPartitionPredefinedConfig 返回一个 SPI 驱动程序不期望的值。这似乎是造成不匹配的原因。 初步分析表明,该问题可能与 Vector DaVinci/Tresos 工具的配置生成有关。 影响 SPI 在多分区模式下无法完成初始化,导致通信功能受阻。 ------------------------------------------------------------------------------------- BR Stefano RTD Re: [S32K311][MultiPartition] : SPI initialization fails in MultiPartition setup on S32K311 你好@StefanoGattazzo、 因为他们提到了OsIf_apxMultiPartitionPredefinedConfig,所以我认为他们使用的是 ASR OS。 那么,在这种情况下,函数 GetApplicationID() 返回的是什么值? 请将它们的配置发送给我,包括EcuC、Os、Spi、BaseNXP。 生成以下结构的输出 他们使用的是什么软件包? 顺祝商祺! Nhi Re: [S32K311][MultiPartition] : SPI initialization fails in MultiPartition setup on S32K311 你好@StefanoGattazzo、 请帮助我读取 SPI_Init() 函数中的以下参数: - SpiId? - 他们向函数 Spi_Init() 传递了什么配置? 像这样: 顺祝商祺! Nhi Re: [S32K311][MultiPartition] : SPI initialization fails in MultiPartition setup on S32K311 您好 Nhi_Nguyen, 请告诉我附件是否足够。 BR Stefano Re: [S32K311][MultiPartition] : SPI initialization fails in MultiPartition setup on S32K311 您好 Nhi_Nguyen, 李尔回答道: Spi_Init(&Spi_Config_EcucPartition_C0_B); 这是我们在 Init 函数中传递的信息,SPI_ID 从分区 ID api 中读取,但没有正确链接到操作系统应用程序 ID。 BR Stefano Re: [S32K311][MultiPartition] : SPI initialization fails in MultiPartition setup on S32K311 你好@StefanoGattazzo、 这是他们申请中的操作系统: 他们将Spi_Config_EcucPartition_C0_B传递给了Spi_Init(),因此 SPI_ID 必须是下面的值: 在这种情况下,u32AppId 必须为 1 才不会出现 Det 错误。但 OS_GetApplicationID() 函数属于 RTOS 而非 RTD,因此请标记 RTOS,以便有人能帮助获取该函数。 顺祝商祺! Nhi Re: [S32K311][MultiPartition] : SPI initialization fails in MultiPartition setup on S32K311 您好 Nhi_Nguyen, 下面是李尔的答复: 在我们的案例中,SPI ID 和操作系统应用程序不匹配。我们认为,就 ASIL 而言,它应该返回 1,但它却返回 0,导致配置不匹配。请看下面的快照。 如果你愿意,我们可以开个短会,我可以向你详细介绍。 BR Stefano Re: [S32K311][MultiPartition] : SPI initialization fails in MultiPartition setup on S32K311 你好@StefanoGattazzo、 我不知道 RTOS 是如何工作的,也不知道在 RTOS 中如何从函数 GetCurrentApplicationID() 返回值。但如果想保持 u32AppID = 0 为当前值,避免出现 Det 错误,则可以按下面的方法操作: 然后,生成的文件是 这意味着,如果 u32AppId = 0,SpiID = 0; u32AppId = 1,SpiID = 1; 在 SPI 中,生成的文件是 这意味着 Spi_Config_EcucPartition_C0_QM->u32SpiCorePartitionUse = 1; Spi_Config_EcucPartition_C0_B->u32SpiCorePartitionUse = 0; 在另一种情况下,他们想将 u32AppID 更改为其他值,那么@StefanoGattazzo请添加 RTOS 标记并移除 RTD 标记,以便 RTOS 的人员可以帮助您。 顺祝商祺! Nhi Re: [S32K311][MultiPartition] : SPI initialization fails in MultiPartition setup on S32K311 你好@StefanoGattazzo、 抱歉,我对此一无所知。 顺祝商祺! Nhi Re: [S32K311][MultiPartition] : SPI initialization fails in MultiPartition setup on S32K311 HI Nhi_Nguyen, 我能问谁? BR Stefano Re: [S32K311][MultiPartition] : SPI initialization fails in MultiPartition setup on S32K311 你好@StefanoGattazzo、 请删除 RTD,我看到您添加了 RTOS 标签,我们团队会有人回答您的问题。 顺祝商祺! Nhi Re: [S32K311][MultiPartition] : SPI initialization fails in MultiPartition setup on S32K311 您好 Nhi_Nguyen, 如果您认识某个人,我可以直接询问--现在情况紧急。 BR Stefano Re: [S32K311][MultiPartition] : SPI initialization fails in MultiPartition setup on S32K311 你好,团队、 李尔正在写作: 不,我们使用的不是恩智浦操作系统,而是矢量操作系统。OSIF 参考来自基础元器件。 我们目前正在开发一个 POC,其中 SPI 驱动程序被分区,这样 LPSPI2 是专用的,用于质量管理应用程序,而其余的 LPSPI 模块则用于 ASIL B 应用程序。 根据 RTD 用户手册,这要求每个分区分别调用两次 Spi_Init()。因此,我们首先从 ASIL B Os Application 调用 Spi_Init()函数,然后再从 QM Os Application 调用 Spi_Init()函数,并为每个函数传递正确的配置指针。 我们看到,在 Spi_Init()函数中调用了 Spi_GetID(),然后又调用了 GetCurrentApplicationID()(如下截图所示) 下面是 Os 生成的枚举。ASIL B Os 应用程序调用 GetCurrentApplicationID() 时,返回 0。 QM Os 应用程序调用 GetCurrentApplicationID() 时,返回 1。 在 OsIf_GetPartitionID 中,Os 返回的值用于获取在数组 OsIf_apxMultiPartitionPredefinedConfig 中配置的分区编号。 OsIf_apxMultiPartitionPredefinedConfig 中的值如下 当 QM 应用程序调用 Spi_Init()时,Spi_GetID() 返回的值为 1(GetCurrentApplicationID() 返回 1,OsIf_apxMultiPartitionPredefinedConfig 的索引 1 也是 1)。 但生成的 SPI 配置不符合预期值,Det 会收到错误报告。 是什么影响了 MCAL 在 Spi_Config 和 OsIf_apxMultiPartitionPredefinedConfig 中生成的值? BR Stefano Re: [S32K311][MultiPartition] : SPI initialization fails in MultiPartition setup on S32K311 你好@StefanoGattazzo、 以下是我从您所附项目中获得的配置 Spi、Ecu、Os。 EcuC 用于定义分区 ID,例如在他们的配置中,QM 是 0 分区,C0_B 是 1 分区,System 是 2 分区。 然后,Os 选择从 EcuC 获取分区 ID 的分区。例如 SPI:C0_B 为分区 1,C0_M 为分区 0。 操作系统:结构 OsIf_apxMultiPartitionPredefinedConfig 也指 EcuC 中的分区 ID。例如,在他们的配置中: 应用程序 0 - 系统 - 分区 2; 应用 1 - C0_B - 分区 1; 应用 2 - C0_M - 分区 0; 因此,如果要将 C0_B 传递给 Spi_Init(),也就是将分区 1 传递给 Spi_Init(),那么 OsIf_apxMultiPartitionPredefinedConfig[x] = 1; 或者 x = 1; x = GetCurrentApplicationID(); 所以,有了他们在最新回复中展示的照片: 在 Spi 中,C0_B 是分区 1; C0_M 是分区 2; 这意味着,在 EcuC 中,索引 0 是系统分区;索引 1 是 C0_B 分区;索引 2 是 C0_M 分区。 总之,根据 Os、Spi、EcuC 的上述定义,他们可以调整分区配置以避免 Det 错误。 顺祝商祺! Nhi
View full article