今日、SBC(シングルボードコンピューター)市場は急速に成長しており、古いものから有名なものから完全に新しく特殊なものまで、多種多様なプロセッサー上に膨大な数のシングルボードコンピューターが登場しています。 最近、モジュールMB 77.07を手に入れました。これは、国内のプロセッサK1879HB1YaのSTC "モジュール"からのシングルボードコンピューターで、プロムワッドの人々はすでに
ハブに 小さなメモを
残していました。 その投稿以来、彼らはすべての人にボードを販売し始め、ソフトウェアは会社の公式github-
http: //github.com/RC-MODULEに投稿されました
この記事では、開梱やファームウェアから、使用するDSPプロセッサに組み込まれているNeuroMatrixコアのオーディオエコー効果まで、ハードウェアとソフトウェアについて説明します。
パッケージバンドル
ボードはカラーボックスに入っています。 内部は:
- マザーボードMB 77.07
- イーサネットパッチコード
- 5V / 2A電源
- 組み込みの世界を初めて知る人のためのUSB-UART
ここでは、これらすべてが必要かどうか、またはボード付きの帯電防止バッグの形で通常のOEM供給で十分であるかどうかを議論できます。 初心者がすぐにUSB-UARTを入手し、グーグルをしたい人が少なくなり、「COMポートに接続してください、何も起こらない」という標準的な悪いアドバイスを受け、購入後初日にボードを焼き付けると便利だと思います。
鉄
今、ボード自体を検討する価値があります。 ボード上のボードはARM1176で、同じコアがRaspberry Piで使用されています。 もちろん、プロセッサで使用されているローカルIPコアのドライバーをスリップする必要があるという注意を払って、r-piのシャープな配布を実行できます。 このタスクを容易にするために、プロセッサ開発者であるSTC「モジュール」は、Debian JessieとRaspbian Wheezyの既製のイメージを提供し、パッケージは定期的に更新されます。
K1879HB1YAの近くには、128MBの2つのDDR2 RAMチップ、1GB NANDメモリ、4ポートのUSBハブ、イーサネットPHY、およびバンドルがはんだ付けされています。
ボードの両側にあるピンには、さまざまな外部インターフェイスがあります。
右側:
- JTAG
- 2xUSB-ピン配列はマザーボードとまったく同じで、ボックスからスラットを取り外します
- ブートコンソールを備えたUART
左側、IDEに似た長いコネクタ:
- 8x GPIO
- 1x トランスポートストリームインターフェイス (詳細はこちら)
- 1x I2C
- 1x SPI
- 1x I2S
- 1x SPDIF
- 1x外部割り込み
- 1.5x UART-1つのフルUART、2番目のRX
- 1xリセット
- 5V
- 3.3V-スイッチング電源の専用チャンネルがこのチャンネルを担当し、800mAを供給し、現代の中国のコンポーネントを本当に知っているので、ここに500mAを超えてハングアップしません
詳細なピン配置は、
http :
//www.module.ru/mb7707/doc/MB77.07-X9-pinout.pdfで入手できます
。これはGPIOをより詳細に検討してください。これは、あなたが自分で触れたい最初の場所だからです。 GPIOは2つの異なるタイプです。 最初のタイプは、櫛に表示されるもので、gpio-pl061ドライバー(IPコア
ARM PrimeCell™汎用入出力PL061 )によってピックアップされます。 これらのGPIOは、割り込みをARMコアにプルすることができます。これは便利な場合があります。 さらに、トランスポートストリームが不要な場合は、_D [0-7]ピンをGPIOで多重化できるため、16の制御されたレッグを取得できます。
sysfsのレッグのGPIO番号付けは、参照により上記のドキュメントに記載されており、必要に応じてsysfsを使用してそれらを調整できます。
2番目のタイプのGPIOはより単純化され、異なるIPコアによって管理され、割り込みをプルできません。 2つの有料LEDがこれらのGPIOに接続され、そのうちの1つがLinuxカーネルのLinuxフレームワークを介してハートビートとして登録され、負荷平均が表示されます。 すべてがハングしているかどうかをデバッグするときに視覚的に確認すると便利です。
ボード上の別の場所には、ブートジャンパ用の2つのピンがあります。
ダウンロードは簡単かつ確実に行われます。ジャンパーがない場合-NANDメモリからの読み込みが発生し、ジャンパーがオンの場合-ボードはJTAGまたはEDCLを介した読み込みを待機しています。 ボードがリセットされると、ジャンパーの位置が読み取られます。 後者のモードについて詳しく説明する価値があります。まだ遭遇していない可能性があります。
Edcl
EDCLまたはイーサネットデバッグ通信リンクは、イーサネットコントローラに組み込まれたハードウェア機能であり、適切に形成されたイーサネットパケットを送信することにより、物理メモリの書き込みと読み取りを可能にします。 この機能は、使用されているイーサネットコントローラーのIPコアであるgrethにバンドルされていました。 EDCL自体は非常に便利ですが、本番環境で有効にしたままにしておくと、非常に大きなセキュリティホールが生じます(本番環境に含まれるEDCLで同じイーサネットコントローラを搭載したプロセッサがいくつ動作するのでしょうか?)。
EDCLの上で、好奇心の強いedcltoolツールを実行し、luaホストAPIをedclに提供します。 このテクノロジーは、ファームウェアおよびファームウェアボードに使用されます。 Edcltool自体はもともとLinux向けに設計されたもので、ある種のライブスーツ/フェニックススーツまたはrkbatchを提供する人気のSoCメーカーとは異なります。
Windows用のバージョンがありますが、それは実験的で、mingwを使用して作成され、WinPCAPのインストールが必要です。 また、非常にゆっくりと動作します。
Linuxバージョンは標準の./bootstrap && ./configure --prefix = / usr && make && sudo make installとして設定され、lua5.1-devまたはlua5.2-devとlibelfのみを要求します。 NeuroMatrix DSPを使用する必要がある場合は、後者が必要です。これについては以下で説明します。
Edcltool自体がedclスクリプトを実行します。これは実際には通常のluaスクリプトであり、非常にシンプルで読みやすいように見えます。 たとえば、裸のARMでコードを実行するスクリプトは次のとおりです。
fw = require("fw"); edcl_init(); fw.run_code("mboot-uemd.bin");
次に、mbootブートローダーファームウェアを次に示します。
fw = require("fw"); edcl_init(); fw.run_code("mboot-uemd.bin", true);
NANDでパーティションテーブルを作成し、カーネル、dtb、およびルートファイルシステムを記述します。
fw = require("fw"); edcl_init(); fw.run_code("mboot-uemd.bin",true);
これは、裸のNeuroMatrix(略してNMC)でのコードの実行方法です。
nmc = require("easynmc"); nmc.debug = true; edcl_init(); nmc.init_core("ipl-K1879-nmc-debug.abs"); entry = nmc.upload("myfile.abs"); nmc.run(entry);
スクリプト自体の実行は非常に簡単です。
edcltool -f script.edcl -i _
インターフェイス名を忘れると、edcltoolはeth0(Windowsでは0番目のインターフェイス)を使用します。 使用可能なインターフェースをリストするedcltool –lコマンドは、Windowsで特に役立ちます。Windowsでは、どのインターフェースがシステム内のどの番号に登録されているかがコントロールパネルで明確にならない場合があります。
上記に加えて、DSP用の他のスクリプトが含まれています。実際、LinuxをロードしてDSPコードを開発することはできません。 edcltoolを使用してアーカイブにスクリプトを書き込むために、SCRIPTING.TXTファイルがあります。このファイルには、edcl環境で使用可能な機能の詳細が記述されています。
ファームウェア
次に、リリース後にプロセッサ開発者に必要とされる主なもの、つまりファームウェアとその配信キットのサポートについて話しましょう。 公式サイトの各ファームウェアには、ブートローダー、カーネル、ファームウェア用のedclスクリプト、念のためのwin-version、およびREADMEを含む完全な環境が含まれています。
現在のファームウェアパッケージの詳細な手順は各アーカイブに記載されていますが、引用することは意味がありません。
- ショートブーツ
- ボード上のリセットを押します
- edcltool –f eupgrade.edclを実行します
- お茶を飲む7-10分
- ジャンパーを取り外し、リセットを押します
環境
ボードとの本格的な作業には、ボードプロセッサとそのDSP用のソフトウェアを構築するための環境が必要です。このモジュールは、LinuxとWindowsの両方に対して既に構築されたツールチェーンを提供します。 これらのインストールは非常に簡単です。たとえば、ツールチェーンが〜/ x-toolsという名前で多くの人に馴染みのある場所に保存されているとします。 次に、そこからモジュールからダウンロードしたツールチェーンを配置する必要があり、パスの次のビンを登録することを忘れないでください:
export PATH=$PATH:~/x-tools/arm-module-linux-gnueabi/bin
分布
プロセッサの製造元は、ディストリビューションの構築において最小限であり、デフォルトでは、DebianおよびRaspbianはネットワークおよびsshをサポートする最小限の構成で提供されます。 324MHzのX11はどういうわけかゆっくり動作しますが、さらに、ブートローダーは画面に何かを描画する方法を知りません。 ボードと通信する主な方法はシリアルコンソールで、UARTが配信パッケージに含まれています。 デフォルトでは、製造元からの配布があるネットワークは、ボードのアドレス192.168.0.7、ログインルート、パスワード12345678で上昇します。
製造元リポジトリは、sources.listで次のように公開されています。
ブートシステム
NANDを使用してシステムを起動する方法について少し説明します。 IPLローダーが最初に実行され、ブートジャンパーの位置を確認します。
- ジャンパーが取り付けられている場合にジャンプするedcl / jtag 32ビットアドレスからのマジックアドレス0x00100000(最初のSRAMメモリバンクIM0の開始アドレス)を待つ
- NANDからIM0にブートローダーをロードし、md5をチェックし、ジャンパーがインストールされていない場合は実行を開始します
mbootブートローダーを最初に起動します。 これはu-bootのフォークで、少しリファクタリングされています。 これは、SRAMメモリから動作します。SRAMメモリは、プロセッサ上では驚くほど多く、IM [0-3]という名前の4つのバンクです。 各バンクは256キロバイトです。 判明したように、次のそれぞれの目的:
- IM0-ブートローダーが機能するメモリは使用されず、ロード後にアイドル状態になります。個人の目的に使用できます。
- IM1、IM3-NeuroMatrixメモリ。NMCコードの実行元であるNMCにアクセスする際に、NMCが優先されます。
- IM2-h264デコーダーによって使用されます。 デコーダーを使用しない場合は、ニーズに合わせて使用できます。
ちなみに、mbootの古いバージョンはgoogleで見つけることができます。検索時間を短縮するためのリンクであるSergey Mironovのgithubアカウントにあります:
github.com/ierton/mbootそのため、誰にとっても役立つとは考えられません。
ブートローダーについて最後に言えることは、pmgrコマンドに加えて、いくつかの更新コマンドがあります-fwupgradeおよびeupgradeは、tftpイメージをフラッシュするために設計されており、DDRボードで利用可能なメモリのサイズより大きくなる可能性があることです。 それ以外の場合、これは通常のu-bootであり、多くのユーザーが慣れています。 ブートローダーからは、ネットワークが利用可能で、NAND、SPIフラッシュ(残念ながら、MB77.07には搭載していませんでした)、およびファイルシステムをサポートしない小さなUSBで動作します。
メモリに戻りましょう。IM0がIM1になった直後のアドレス空間で、すぐにIM3になります。SRAMで動作する低レベルのコードを書くときは覚えておく価値があります。そのようなコードを書くときは、SRAMメモリがたくさんあることを覚えておく価値があります。古き良きAT91RM9200のオンチップメモリはわずか4Kでした。 このため、ここのブートローダーはSPLなしでSRAMで直接動作します。 このアプローチは非常に便利です。これは、DDR、ARM、NeuroMatrixのDDRとは対照的に、アクセス時間が数ティックに過ぎないためです。 つまり、そこからのコードは非常に高速に動作します。 さらに、NMCのコードがDDRに頼ることなく、IM1 / IM3からのみ機能する場合、NMCで非常に難しいリアルタイムパーツをねじることが可能になります。
さらに、NANDをより詳細に検討する価値があります。NANDはパーティション化されており、boot、env、dtbが最初です。 目詰まりしているため、サイズを変更できません。 1つ目はブートローダー、2つ目はその環境、3つ目はコンパイルされたデバイスツリーBLOBです。 残りは、pmgrブートローダーコマンドを使用してインタラクティブに壊れるか、edclスクリプトからイメージをフラッシュするときに自動的に壊れます。 ローダーは、指定されたセクションをカーネルに渡し、標準のmtdpartsをcmdlineに追加します。
NANDを使用すると、一般的にsomething然とすることが予想されていました。 linux-sunxiとlinux-rockchipの経験から、NANDはあちこちでひどい状態にありました。 Allwinnerは、独自の厄介なウェアレベリングアルゴリズムなどを備えた、部分的に閉じたFTL(フラッシュ変換レイヤー)を備えたNANDを独自のブロックデバイスにしました。 ロックチップは通常、クローズドモジュールrknand.koの形式でのみNANDを提供します。そのソースコードは、#linux-rockhip @ freenodeで説明したように、NDAの下で会社のパートナーにさえ渡されません。 ここで、NANDは通常のスタンドアロンmtdデバイスであり、その上にすでに標準になっているUBIFSが使用されていますが、これは喜ばしいことです。
ブート自体について説明します。 多くの人がdmesgを見てみたいと思うでしょう。
ブートシステム MBOOT (K1879 and friends): Version mboot-00063-g9302e24-dirty (Built Thu Aug 21 17:10:13 MSK 2014) OTP info: boot_source 2 jtag_stop 0 words_len 1024 Maximum bank size: 0x10000000 bytes Detected 134217728 bytes of EM0 memory MEMORY: 40000000 -> 48000000 Memory layout 0x00100010 early 0x001001C8 text 0x0011E9BC data 0x00127D40 signature 0x00127D44 bss_start 0x00135EB4 stack_start 0x00137FF8^ stack_ptr 0x00138000 malloc 0x0017F000 env mnand_read_id: flash id 0xD3 mnand_read_id: flash ext_id 0x95 mnand_read_id: CS0 NAND 1GiB 3,3V 8-bit size(1024) writesize(2048) oobsize(64) erasesize(131072) mnand_read_id: flash id 0x00 mnand_read_id: WARNING: Unknown flash ID. Using default (0xF1) mnand_read_id: flash ext_id 0x00 mnand: Chip configurations differ, ignoring CS1 greth: Setting GRETH base addr to 0x20034000 greth: Found GRETH at 0x20034000, irq 255 greth: Resetting GRETH greth: greth: 'phyaddr' not set, fall back to built-in table greth: greth: using preset PHY addr: 1f greth: Resetting the PHY greth: write_mii: 0x20034010 < 0xF809F801 [p:31 a:0 d:0xF809] greth: write_mii: 0x20034010 < 0x0000F801 [p:31 a:0 d:0x0000] greth: 10/100 GRETH Ethermac at [0x20034000] irq 255. Running 10 Mbps half duplex PHY info not available greth: greth_init greth: greth_init: enabling receiver ETH new device: name GRETH_10/100 greth: GRETH: New MAC address: 02:00:f7:00:27:0f USB thresholds: in 0x20 out 0x7e Is there an EDCL emergency? Nope edcl: Ethernet debug disabled by environment MTD Partition: boot @ 0x00000000 size 0x00040000 MTD Partition: env @ 0x00040000 size 0x00020000 MTD Partition: dtb @ 0x00060000 size 0x00020000 MTD Partition: kernel @ 0x00080000 size 0x00400000 MTD Partition: rootfs @ 0x00480000 size 0x3FB80000 Hit any key (in 2 sec) to skip autoload... Running autoload command 'tftp;bootm;' TFTP Using GRETH_10/100 device TFTP params: server 192.168.0.1 our_ip 192.168.0.7 TFTP params: filename 'uImage-3' load_address 0x40100000 TFTP Loading: T
最初に注目されるのは、「EasyNMC DSP Framework©RC Module 2014」という行です。 次に、ログには、見つかったNMCコアの数が書き込まれます。これに基づいて、ドライバーとユーティリティは、NMCコアが多くなるという事実に対応していると想定できます。 このボードのプロセッサにはNMCコアが1つしかありません。
次の多くの人は、NMCがLinuxと対話する方法を知りたいと思うでしょう。 次の情報は開発者からテストされました。3つの割り込みがARMからNMCに送られます。 マスク不可のNMI、HP(高優先度)およびLP(低優先度)。 HPおよびLPとは逆の方向に。 カーネルDSPを起動するには、初期リセットを提出し、NMIをプルする必要があります。 これにより、NeuroMatrix IPLコードが起動します。
最初の実行後、NMCはこの初期コードでスピンし、NMI割り込みを処理します。この初期コードを通じて、アプリケーションの再起動が編成されます。すべてが非常に簡単です。
DSPの時間
記事の半分は常にDSPについて言及していますが、今度はDSPの使用方法を詳細に検討するときが来ました。これを使用するには、nmc-utilsパッケージがあり、2つのユーティリティとライブラリで構成されています。- nmctl
- nmrun
- libeasynmc(ユーティリティ自体が使用)
NeuroMatrixのIPLソース、例、およびlibeasynmc-nmc(nmcで実行されるこのライブラリの一部)もソースツリーで見つかりました。発掘中にバイナリの塊は見つかりませんでした;フリーソフトウェア財団の秘密エージェントは平和に眠ることができます。nmctl
ユーティリティから始めましょう。最初はnmctlです。彼女は、ソースコードの読み込み、開始、停止、イベントの監視、割り込みの送信などの方法を知っています。Nmctlヘルプroot@shadow:~# nmctl --help
nmctl — The EasyNMC control utility
© 2014 RC Module | Andrew 'Necromant' Andrianov <andrew@ncrmnt.org>
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
License: LGPLv2
Usage: ./nmctl [options] [actions] — operate on core 0 (default)
./nmctl --core=n [options] — operate on selected core
./nmctl --core=all [options] — operate all cores
Valid options are:
--core=id — Select a core to operate on (--core=all selects all cores)
--list — list available nmc cores in this system and their state
--help — Show this help
--force — Disable internal seatbelts (DANGEROUS!)
--nostdio — Do not auto-attach stdio
--debug — print lots of debugging info (nmctl)
--debug-lib — print lots of debugging info (libeasynmc)
Valid actions are:
--boot — Load initcode and boot a core (all cores)
--reset-stats — Reset driver statistics for core (all cores)
--load=file.abs — Load abs file to core internal memory
--start=file.abs — Load abs file to core internal memory and start it
--irq=[nmi,lp,hp] — Send an interrupt to NMC
--kill — Abort nmc program execution
--mon — Monitor IRQs from NMC
--dump-ldr-regs — Dump init code memory registers
ProTIP(tm): You can supply init code file to use via NMC_STARTUPCODE env var
When no env is set nmctl will search a set of predefined paths
主な機能の1つである、システム内のNMCコアの数に関する情報の出力:nmctl --listroot@shadow:~# ./nmctl --list
0. name: K1879-nmc type: nmc3 (cold)
IRQs Recv: HP: 0 LP: 0
IRQs Sent: NMI: 0 HP: 0 LP: 0
nmrun
次に、nmrunを検討します。Nmrunヘルプroot@shadow:~# ./nmrun --help
nmrun — The EasyNMC app runner wrapper
© 2014 RC Module | Andrew 'Necromant' Andrianov <andrew@ncrmnt.org>
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
License: LGPLv2
Usage: ./nmrun [options] myapp.abs [arguments] — operate on core 0 (default)
Valid options are:
--help — Show this help
--core=id — Select a core to operate on (Default — use first usused core)
--force — Disable internal seatbelts (DANGEROUS!)
--nostdio — Do not auto-attach stdio
--nosigint — Do not catch SIGINT
--detach — Run app in background (do not attach console)
Debugging options:
--debug — Print lots of debugging info (nmctl)
--debug-lib — Print lots of debugging info (libeasynmc)
これはDSPコードのラッパーです。NMCで.absファイルを実行して、NMCを使用するすべてのprintfがこのラッパーのstdoutで発生し、stdinに送信するすべてがNMCを受信するようにします。パラメーターの受け渡しがサポートされています。.absファイルの後にパラメーターをリストすると、パラメーターは引数argvとしてNMCに渡されます。NMCで実行されているmain()からの戻り値はnmrunに渡され、nmrunは通常の戻りコードとしてシステムに戻ります。これにより、複雑なDSPプログラムが通常のコマンドラインユーティリティに即座に変わり、DSPの初心者でも処理できます。エントリのしきい値が大幅に削減され、変更や特別な処理は必要ありません。最も簡単な例を実行してみましょう。 root@shadow:~
NMCコア自体は、システム内に/ dev / nmc0ioおよび/ dev / nmc0memの形式で存在します。ここで、- / dev / nmc0mem-NMCメモリ、同じSRAMバンク-IM1 + IM3、上記で説明しました。cat / dev / nmc0mem> dump.binを実行するだけで、DSPメモリダンプを削除できます。
- / dev / nmc0io-仮想シリアルポート、stdioの書き込みと読み取りが可能。poll/ epollを介した非ブロッキング形式も含む
他のすべての操作-ioctlは、両方のデバイスで同じですが、libeasynmcによって使用されます。ユーティリティ自体はこのライブラリに基づいて構築されており、ソースコードもLGPLv2で完全に開かれています。簡単に調べてみると、内部にはかなり単純で明確な同期APIがあることがわかります。node.jsの時代になぜ同期APIが必要なのでしょうか?DSPドライバーは、stdioだけでなくepoll / selectをサポートし、NMCからのすべてのイベント(割り込み、NMIが別のプロセスによって送信されたという事実)がpoll / epollを介して受信できることが判明しました。したがって、この記述子は、お気に入りのlibevent、libuvなどによってスリップされる可能性があります。アクション
次に、これらのアクティビティを活用して、開発環境を展開し、NMC向けの何かを構築してみましょう。MB77.07で、ツールチェーンをインストールしたRaspbianをフラッシュしたとします。nmc-utilsから始めましょう。 git clone github.com/RC-MODULE/nmc-utils.git cd nmc-utils
githubでクローンしたものを見てみましょう:- libeasynmcのソースはルートにありますが、ライブラリは非常に単純なので、特に多くはありません。Nmctlのソースコードは、すべてのバリアントでlibeasynmcを操作する簡単な例として使用できます。
- libeasynmc-nmcには、NMCプロジェクトに接続するライブラリのNMC部分のソースコードが含まれています
- doc /には、ライブラリの操作方法とコンパイル方法の詳細な説明があります。初期段階で特に役立つのは、nm *ユーティリティの静的アセンブリの可能性です。
- IPLには/ NMCをオンにする初期コードのソースコードがあります
- 例/簡単な例がたくさんあります
クロスアセンブリには、次の魔法があります。 GNU_TARGET_NAME=arm-module-linux-gnueabihf make
すべてのユーティリティ(nmctl、mnrun)を静的にコンパイルする必要がある場合: GNU_TARGET_NAME=arm-module-linux-gnueabihf make STATIC=y
ボードがNFSを介してロードされ、ルートが近くのどこかにある場合は、次を実行してボードにすべてをインストールできます。 DESTDIR=/srv/rootfs/mb7707/ make install
さらに、必要に応じて、.debベースのシステムで、多数のdebパッケージを収集できます。 GNU_TARGET_NAME=arm-module-linux-gnueabihf ARCH=armhf make deb
debパッケージをビルドするときは、システムにdpkg-debが必要であり、パッケージに含まれるdebアーキテクチャを指定する必要があります:Raspbianのarmhf、Debianのarmel。出力では、ファイルを取得します。- nmc-utils-abs-0.1-armhf.deb-サンプルのバイナリは/usr/share/examples/easynmc-0.1に置かれます
- nmc-utils-bin-0.1-armhf.deb-nmctl、nmrunおよびlibeasynmc.soライブラリ自体
- nmc-utils-dev-0.1-armhf.deb-ヘッダーファイル、pkg-config .pcファイルなど
- nmc-utils-doc-0.1-armhf.deb-READMEおよびdoc /のすべての内容
- nmc-utils-ipl-0.1-armhf.deb-IPL、/ usr / share / easynmc-0.1 / ipl /に配置
モジュールのすべての最新ファームウェアにはデフォルトでこれらのパッケージがすべて含まれているため、これらすべてを手に入れる必要はありません。彼の最初のNMCプログラムでは、サウンドをいじって、NMCにエコー効果をリアルタイムで追加する何かをすることが決定されました。次のパイプラインを使用できます。 arecord | nmrun ./echo.abs | aplay
レコードがマイクからのデータを記録し、DSPに直接送信します。DSPはエコーと出力サンプルを出力に追加し、それらを再生中のプレイに転送します。サウンドをキャプチャするために、安価な中国製USBサウンドカードが使用され、何年も棚に置かれていました。この例では、通常のnmrunだけでlibeasynmcを使用する必要はありません。続行する前に、そのようなソリューションのパフォーマンスについて何かを説明する必要があります。 stdin / stdoutは、データを交換する最も簡単な方法ですが、それでもかなり遅いです。これらは2つのリングバッファーを使用します。各バイトは最初にARMカーネルによってリングバッファーに書き込まれ、次にNMCコアによってそこから別のバッファーに読み込まれ、処理され、結果が別のリングバッファーに書き込まれ、そこからARMが再びコピーされる必要があります。控えめに言っても、リングバッファがSRAMメモリにある場合でも、これはそれほど高速ではありません。したがって、最大のパフォーマンスが必要な場合は、stdioとコマンドラインを忘れてlibeasynmcを使用する必要があります。NeuroMatrixのC / C ++で開発する場合、DSPプロセッサで何も書いたことがない人の多くを文化的ショックに陥れる可能性のあるいくつかの機能を考慮する必要があります。以下は、踏むことができるレーキのリストです。- バイトアドレス指定がありません。sizeof(char)== 1、sizeof(short)==1。NMCの場合のポインターは32ビットメモリセルを指します。したがって、NMC空間のアドレスは、2ビットを右にシフトすることで取得できます。
- 前の段落から、すべてのASCIIは、必要な各文字の下位バイト、上位ゼロのuint32_t []の配列です。
- nmrunはデフォルトで、stdinとstdoutの文字列を前後に再フォーマットするようドライバーに指示します(無効にできます)
- NMCにはMMUがなく、物理メモリをアドレス指定します。したがって、アプリケーションからのデータを含むバッファーにポインターを渡すことはできません
- NMC - , Linux. , - ,
- ( , ) NMC. API nc_int_soc.h
- NeuroMatrix ,
- , , NMC, . /dev/nmc . Samsung /dev/exynos-mem
- NeuroMatrix RISC . , C, RISC , . DSP . , . ,
Cでエコーを行います。簡単にするために、再フォーマットを有効にしてサンプルをそれぞれNMC 8ビットに移動し、DSPで32ビット数の形式で取得します。hello worldプロジェクトの例を取り上げ、その内容を見てみましょう。- メイクファイル-メインのメイクファイル
- colorizer.mk-Makefileに含まれています。出力の色付け全体がここにあります。カラーリングはWindows / Linux / Mac向けに移植可能に実装されているため、非常にハッキーに見えます。Windowsでは、cechoを使用します
- easyconf.asm-io / args構成のアセンブリファイル。argc / argvの領域のサイズとstdioのリングバッファのサイズを指定するマクロがいくつか含まれています。
- K1879.cfg-リンカの構成ファイル(以下について)
- main.c-実際にはmain()を含むファイル
Makefile. - . , – EASYNMC_DIR, libeasynmc-nmc NMC libeasynmc. - , libs.
easynmc.lib – stdin/stdout, argc/argv , , C.
– mb7707brd.cfg, NeuroMatrix , gcc LD . . :
.cfg MEMORY { //-------------- NMC --------------------------------------- LOADERMEM: at 0x00000000, len = 0x00000200; IM1: at 0x00000200, len = 0x0000fe00; IM3: at 0x00010000, len = 0x00010000; //------------- ARM ---------------------------------------- INTERNAL_MEMORY0: at 0x00040000, len = 0x00010000; // 256K-IM0 ARM (ARM:0x00100000 0x0013ffff 0x4000(256kB)) INTERNAL_MEMORY2: at 0x20040000, len = 0x00010000; // 256K-IM2 ARM (ARM:0x80100000 0x8013ffff 0x4000(256kB)) //------------- DDR ---------------------------------------- EXTERNAL_MEMORY0: at 0x10000000, len = 0x10000000; // 16MB-EM0-DDR (ARM:0x40000000 0x7fffffff) EXTERNAL_MEMORY1: at 0x30000000, len = 0x10000000; // 16MB-EM1-DDR (ARM:0xc0000000 0xffffffff) } SEGMENTS { code : in IM3; data : in IM1; } SECTIONS { .text : in code; .init : in code; .fini : in code; .data : in code; .bss : in code; .stack : in code; .heap : in code; .heap1 : in code; .heap2 : in code; .heap3 : in code; }
メモリマップといえば、http://www.module.ru/mb7707/doc/K1879-memory-map.pdf で取得できます。ビルドコマンドがビルドされた後、出力は2つのファイルhello.absとhello.dumpを生成します。 absファイルは、NMCアドレス空間に絶対アドレスを持つELFです。ボード上のLinuxから作業する場合、IM1またはIM3バンクにロードできます。これは、Linuxカーネルが残りのすべてのメモリを担当するためです。一方、edclを使用すると、ルールが簡単になり、アドレス空間全体にセクションを配置できますダンプは、NMCでアセンブラーを知っている人に役立つかもしれない逆アセンブルされたリストです。次に、1つのアセンブラファイルがプロジェクトに接続されます-easyconf.asm。ここのアセンブラは非常に洗練されており、マクロやその他の人生の喜びがあります。easyconfには、stdioと引数の設定があります。これは、文字通り2つのマクロによって行われます。.asm import from "easynmc/easynmc.mlb"; /* Declare 2 circular buffers for stdio */ const EASYNMC_IOBUFLEN = 128; EASYNMC_CBUF(".easynmc_stdin", _easynmc_stdin_hdr, _easynmc_stdin_data, EASYNMC_IOBUFLEN); EASYNMC_CBUF(".easynmc_stdout", _easynmc_stdout_hdr, _easynmc_stdout_data, EASYNMC_IOBUFLEN); /* Reserve 128 32-bit words for arguments */ EASYNMC_ARGS(128);
このコードは、引数とリングバッファ用にabsファイル内の場所を予約します。128バイトがstdioと引数に出力されることがわかります。このプログラムの起動時にnmrunが128文字を超える引数を渡すと、nmrunはエラーをスローします。最後に、非常にシンプルに見えるmain.cを検討します。main.c #include <math.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <easynmc/easynmc.h> int main(int argc, char** argv) { printf(); return 0; }
これは標準的なHello Worldプロジェクトでしたが、今度はタスクに合わせて変更します。次のように進めます。約1600サンプルのサンプリング周波数で、遅延バッファーのサイズを約200msのどこかに指定します。2の累乗の最も近い値に切り上げて2048を取得します。浮動小数点のNMCはおそらく強力ではないため(コンパイラは浮動小数点数を消費しますが)、整数ですべてを実行し、減衰ビットをシフトします。あなたはこの精神で何かを得ます:main.c #include <math.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <easynmc/easynmc.h> #define SIZE 2048 static unsigned int delaybuf[SIZE]; static unsigned int pos; int main() { while(1) { unsigned int in = getc(); unsigned int out = in + (delaybuf[pos] >> 2); if (out >255) out = 255; delaybuf[pos++] = in; pos &= (SIZE -1); putc(out); } }
組み立て、absをボードにコピーします。デフォルトでは、ボードには1つのALSAデバイス(HDMI)しかありません。USBサウンドカードからの出力/入力を使用します。ALSAでその名前が必要です。これは非常に簡単に行われ、-Lを使用して記録または再生します。結果は次のようになります。 arecord -D default:CARD=Device | nmrun echo.abs | aplay -D default:CARD=Device
マイクとヘッドフォンを接続して楽しんで、国内のDSPプロセッサの最初のアプリケーションを作成しました。おわりに
おそらくこれが今日のすべてです。結論を出すために残っています。もちろん、かなり弱いARMに目を向けると、MB77.07は肯定的な印象を残します。一般的な長所と短所をリストします。+ブートローダーからDSPプロセッサのIPLコードまで、可能なすべての公式なオープンソース。チップメーカーのgithubで。他のメーカーの中でも、これはFreescaleおよびQualcomm(Code Aurora)でのみ可能です。通常、すべてはせいぜいftpでrar tar'ovに詰め込まれたサーバーの形でGPLソースドロップの形でダンプされますが、それは特別な喜びです。それでも、巨大なフォルダーと.gitインデックスを使用してすべてを破棄します。+ DSPカーネル、コンパイラー、およびツールキット。最初は、初心者にとっては非常に簡単に作業できるように考案されました。最初は、K&R対角線で読むだけで十分です。特に、この構成のNMCはタフなリアルタイムを簡単に提供できることを考慮してください。ロボット工学や工作機械にとっては、それは天の恵みです。+ドライバー。 Allwinner(libnand)、Rockchip(rk_fb、rknand)、Mediatek(一般的にはすべて)などの理想的な、しかし率直な恐怖に気づいたわけではありません。どこでも、標準のカーネルサブシステムを使用しようとします。コミュニティや開発者の要望がある場合、それらのほとんどは簡単にメインラインに参加できます。コアには独自のブロブはありません。+カーネルバージョン。現在、3.10 LTSがあり、秋に、開発者は次のLTSについて考えることにしました。比較のために、linux-sunxiコミュニティのカーネルは3.4ですが、アップストリームにはほとんどマルチメディアがありません。 Rockchipは、非常に大きなきしみ音でrk3288のみを対象に3.10.xを絞り出しました。人気のrk3188でこのビジネスを開始しようとしても失敗しました-MMCコントローラーは動作しません。 HardKernel ODROIDは3.8.y linux-stable + ubuntu mergeにありますが、メインラインでのサポートへの動きがあります。+不滅。 NANDやハンダを物理的に殺しても、MB77.07は復活し、EDCL経由でダウンロードできます。したがって、このようなボードは、ベアメタルでブートローダーやオペレーティングシステムなどを持ち上げる方法を学習したい初心者に役立ちます。あなたはボードを殺すことを恐れることはできません。 RK3188のようなジャムの場合、ここでブートローダーをフラッシュするためにNANDレッグを短くする必要はありません。+ debパッケージ、リポジトリなど。コミュニティの登場を待たずに多くのことが行われましたが、まだ多くのことが行われています。+興味深いことに、片側のすべてのコネクタはr-piよりもはるかに便利です。-価格。この事実は、もちろん、ラズベリーを台無しにします(しゃれを意図)-RTCなし。多くのプロジェクトでは、それは重要ではないかもしれませんが、必要かもしれません。さらに、システムは最初にntpを上げる必要があります。-パフォーマンス。はい、324MHz ARM1176は特に楽しいものではありません。それは、ARMとNMCの両方がオンチップメモリからコードを実行できるという事実によって部分的に補償されています。後でもっと面白くなり、モジュールがOpenSourceを終了せず、次のプロジェクトが既に生産的なソリューションで行われることを期待しましょう。-注文の複雑さ。純粋に利便性の問題がすでにあり、エンジニアよりもマーケティングの方が問題である可能性が高いです。モジュールのウェブサイトには、分割画面に巨大な太いボタン「購入」とqiwiによる即時支払いがありません。参照資料