国内シングルボードコンピューターMB 77.07の概要:開梱からファームウェア、最初のDSPプログラムの作成まで

今日、SBC(シングルボードコンピューター)市場は急速に成長しており、古いものから有名なものから完全に新しく特殊なものまで、多種多様なプロセッサー上に膨大な数のシングルボードコンピューターが登場しています。 最近、モジュールMB 77.07を手に入れました。これは、国内のプロセッサK1879HB1YaのSTC "モジュール"からのシングルボードコンピューターで、プロムワッドの人々はすでにハブに 小さなメモ残していました。 その投稿以来、彼らはすべての人にボードを販売し始め、ソフトウェアは会社の公式github- http: //github.com/RC-MODULEに投稿されました

この記事では、開梱やファームウェアから、使用するDSPプロセッサに組み込まれているNeuroMatrixコアのオーディオエコー効果まで、ハードウェアとソフトウェアについて説明します。

パッケージバンドル


ボードはカラーボックスに入っています。 内部は:


ここでは、これらすべてが必要かどうか、またはボード付きの帯電防止バッグの形で通常の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、およびバンドルがはんだ付けされています。

ボードの両側にあるピンには、さまざまな外部インターフェイスがあります。

右側:


左側、IDEに似た長いコネクタ:


詳細なピン配置は、 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を使用してそれらを調整できます。

#   sysfs,  ,    gpio cd /sys/class/gpio #  23-  echo 23 > export #     out echo out > gpio23/direction #    echo 1 > gpio23/value 

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); -- start in slave mode fw.write_bootloader("mboot-signed.bin") 

NANDでパーティションテーブルを作成し、カーネル、dtb、およびルートファイルシステムを記述します。

 fw = require("fw"); edcl_init(); fw.run_code("mboot-uemd.bin",true); -- start in slave mode fw.write_bootloader("mboot-signed.bin") -- save signed loader in NAND -- all sizes are in bytes partition_table = { { "kernel", 4*1024*1024 }, { "rootfs", "-" }, } fw.partition(partition_table); -- prepare and erase all nand fw.mboot_cmd("parterase kernel y y") fw.mboot_cmd("parterase rootfs y y") fw.flash_part("kernel", "uImage", false); fw.flash_part("dtb", "mb77.07.dtb", false); fw.flash_part("rootfs", "filesystem.ubifs", false); fw.mboot_cmd("setenv bootargs console=ttyS0,38400n8 earlyprintk=serial ubi.mtd=4,2048 root=ubi0:rootfs rootfstype=ubifs"); fw.mboot_cmd("setenv bootfdt 1") fw.mboot_cmd("save"); 

これは、裸の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); -- Warning: nmc stdio, arguments and return code are NOT yet supported -- when running nmc prog via edcltool. Use linux libeasynmc. -- Expect these implemented in future updates. Sorry. 

スクリプト自体の実行は非常に簡単です。

 edcltool -f script.edcl -i _ 

インターフェイス名を忘れると、edcltoolはeth0(Windowsでは0番目のインターフェイス)を使用します。 使用可能なインターフェースをリストするedcltool –lコマンドは、Windowsで特に役立ちます。Windowsでは、どのインターフェースがシステム内のどの番号に登録されているかがコントロールパネルで明確にならない場合があります。

上記に加えて、DSP用の他のスクリプトが含まれています。実際、LinuxをロードしてDSPコードを開発することはできません。 edcltoolを使用してアーカイブにスクリプトを書き込むために、SCRIPTING.TXTファイルがあります。このファイルには、edcl環境で使用可能な機能の詳細が記述されています。

ファームウェア


次に、リリース後にプロセッサ開発者に必要とされる主なもの、つまりファームウェアとその配信キットのサポートについて話しましょう。 公式サイトの各ファームウェアには、ブートローダー、カーネル、ファームウェア用のedclスクリプト、念のためのwin-version、およびREADMEを含む完全な環境が含まれています。

現在のファームウェアパッケージの詳細な手順は各アーカイブに記載されていますが、引用することは意味がありません。


環境


ボードとの本格的な作業には、ボードプロセッサとその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で次のように公開されています。

 # RC Module's repository with MB77.07 packages deb http://www.module.ru/mb7707/ stable updates 

ブートシステム


NANDを使用してシステムを起動する方法について少し説明します。 IPLローダーが最初に実行され、ブートジャンパーの位置を確認します。


mbootブートローダーを最初に起動します。 これはu-bootのフォークで、少しリファクタリングされています。 これは、SRAMメモリから動作します。SRAMメモリは、プロセッサ上では驚くほど多く、IM [0-3]という名前の4つのバンクです。 各バンクは256キロバイトです。 判明したように、次のそれぞれの目的:


ちなみに、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 ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################################################# ################################ TFTP done Linux preparing to boot the kernel: machid 0xcd1 Using Flatterned Device Tree boot method IMG moving image: type 2 from 0x40100040 to 0x40008000 HINT: To optimize boot time adjust loadaddr to: 0x40007fc0 Linux entry 0x40008000 USB thresholds: in 0x20 out 0x7e Uncompressing Linux... done, booting the kernel. [ 0.000000] Booting Linux on physical CPU 0x0 [ 0.000000] Linux version 3.10.28-shadow1-00032-gb8b1a50 (necromant@sylwer) (gcc version 4.8.1 (crosstool-NG 1.19.0) ) #141 Thu Aug 21 14:23:26 MSK 2014 [ 0.000000] CPU: ARMv6-compatible processor [410fb767] revision 7 (ARMv7), cr=00c5387d [ 0.000000] CPU: PIPT / VIPT nonaliasing data cache, VIPT nonaliasing instruction cache [ 0.000000] Machine: Module MB77.07, model: Module MB77.07 [ 0.000000] bootconsole [earlycon0] enabled [ 0.000000] Memory policy: ECC disabled, Data cache writeback [ 0.000000] On node 0 totalpages: 24128 [ 0.000000] free_area_init_node: node 0, pgdat c050df84, node_mem_map c0596000 [ 0.000000] Normal zone: 288 pages used for memmap [ 0.000000] Normal zone: 0 pages reserved [ 0.000000] Normal zone: 24128 pages, LIFO batch:3 [ 0.000000] pcpu-alloc: s0 r0 d32768 u32768 alloc=1*32768 [ 0.000000] pcpu-alloc: [0] 0 [ 0.000000] Built 1 zonelists in Zone order, mobility grouping on. Total pages: 23840 [ 0.000000] Kernel command line: debug console=ttyS0,38400n8 earlyprintk=serial ubi.mtd=4,2048 root=ubi0:rootfs rootfstype=ubifs mtdparts=mnand:0x40000@0x0(boot),0x20000@0x40000(env),0x20000@0x60000(dtb),0x400000@0x80000(kernel),0x3FB8000) [ 0.000000] PID hash table entries: 512 (order: -1, 2048 bytes) [ 0.000000] Dentry cache hash table entries: 16384 (order: 4, 65536 bytes) [ 0.000000] Inode-cache hash table entries: 8192 (order: 3, 32768 bytes) [ 0.000000] Memory: 94MB 0MB = 94MB total [ 0.000000] Memory: 89208k/89208k available, 41864k reserved, 0K highmem [ 0.000000] Virtual kernel memory layout: [ 0.000000] vector : 0xffff0000 - 0xffff1000 ( 4 kB) [ 0.000000] fixmap : 0xfff00000 - 0xfffe0000 ( 896 kB) [ 0.000000] vmalloc : 0xc8800000 - 0xff000000 ( 872 MB) [ 0.000000] lowmem : 0xc0000000 - 0xc8000000 ( 128 MB) [ 0.000000] modules : 0xbf000000 - 0xc0000000 ( 16 MB) [ 0.000000] .text : 0xc0008000 - 0xc04af9cc (4767 kB) [ 0.000000] .init : 0xc04b0000 - 0xc04d31d4 ( 141 kB) [ 0.000000] .data : 0xc04d4000 - 0xc0515d50 ( 264 kB) [ 0.000000] .bss : 0xc0515d50 - 0xc0595990 ( 512 kB) [ 0.000000] SLUB: HWalign=32, Order=0-3, MinObjects=0, CPUs=1, Nodes=1 [ 0.000000] NR_IRQS:128 [ 0.000000] regs = 0xf8000000, irq_start = 0 [ 0.000000] VIC @f8000000: id 0x00041192, vendor 0x41 [ 0.000000] regs = 0xf8010000, irq_start = 32 [ 0.000000] VIC @f8010000: id 0x00041192, vendor 0x41 [ 0.000000] UEMD: Firing up timer system [ 0.000000] Clocksource: rate 54000000 mult 19418074 shift 20 [ 0.000000] Clockevent: rate 54000000 mult 231928233 shift 32 [ 0.000000] sched_clock: 32 bits at 100 Hz, resolution 10000000ns, wraps every 4294967286ms [ 0.000000] Console: colour dummy device 80x30 [ 0.020000] Calibrating delay loop... 215.04 BogoMIPS (lpj=1075200) [ 0.100000] pid_max: default: 32768 minimum: 301 [ 0.110000] Mount-cache hash table entries: 512 [ 0.120000] CPU: Testing write buffer coherency: ok [ 0.130000] Setting up static identity map for 0xc03417b8 - 0xc03417f0 [ 0.150000] devtmpfs: initialized [ 0.160000] NET: Registered protocol family 16 [ 0.170000] DMA: preallocated 256 KiB pool for atomic coherent allocations [ 0.240000] OTP ROM is not flashed [ 0.250000] msvdhd: configuring memory [ 0.260000] hw-breakpoint: found 6 breakpoint and 1 watchpoint registers. [ 0.270000] hw-breakpoint: maximum watchpoint size is 4 bytes. [ 0.410000] bio: create slab <bio-0> at 0 [ 0.430000] SCSI subsystem initialized [ 0.440000] ssp-pl022 2002e000.ssp: ARM PL022 driver, device ID: 0x00041022 [ 0.450000] ssp-pl022 2002e000.ssp: BUSNO: 0 [ 0.460000] pl022: mapped registers from 0x2002e000 to f802e000 [ 0.470000] ssp-pl022 2002e000.ssp: registered master spi0 [ 0.480000] spi spi0.0: allocated memory for controller's runtime state [ 0.490000] ssp-pl022 2002e000.ssp: SSP Target Frequency is: 25000000, Effective Frequency is 13500000 [ 0.500000] ssp-pl022 2002e000.ssp: SSP cpsdvsr = 2, scr = 1 [ 0.510000] spi spi0.0: 4 <= n <=8 bits per word [ 0.520000] spi spi0.0: DMA mode NOT set in controller state [ 0.530000] spi spi0.0: setup mode 1, 8 bits/w, 25000000 Hz max --> 0 [ 0.540000] ssp-pl022 2002e000.ssp: registered child spi0.0 [ 0.550000] ssp-pl022 2002e000.ssp: probe succeeded [ 0.570000] usbcore: registered new interface driver usbfs [ 0.580000] usbcore: registered new interface driver hub [ 0.590000] usbcore: registered new device driver usb [ 0.600000] media: Linux media interface: v0.10 [ 0.610000] Linux video capture interface: v2.00 [ 0.620000] Advanced Linux Sound Architecture Driver Initialized. [ 0.630000] Switching to clocksource uemd_timer1 [ 0.730000] NET: Registered protocol family 2 [ 0.740000] TCP established hash table entries: 1024 (order: 1, 8192 bytes) [ 0.750000] TCP bind hash table entries: 1024 (order: 0, 4096 bytes) [ 0.760000] TCP: Hash tables configured (established 1024 bind 1024) [ 0.780000] TCP: reno registered [ 0.790000] UDP hash table entries: 256 (order: 0, 4096 bytes) [ 0.800000] UDP-Lite hash table entries: 256 (order: 0, 4096 bytes) [ 0.810000] NET: Registered protocol family 1 [ 0.820000] RPC: Registered named UNIX socket transport module. [ 0.830000] RPC: Registered udp transport module. [ 0.840000] RPC: Registered tcp transport module. [ 0.850000] RPC: Registered tcp NFSv4.1 backchannel transport module. [ 0.930000] squashfs: version 4.0 (2009/01/31) Phillip Lougher [ 0.950000] NFS: Registering the id_resolver key type [ 0.960000] Key type id_resolver registered [ 0.970000] Key type id_legacy registered [ 0.980000] msgmni has been set to 174 [ 1.000000] alg: No test for stdrng (krng) [ 1.010000] io scheduler noop registered (default) [ 1.020000] fj_gpio: Added 32 gpio lines at base -981095888 [ 1.040000] module_vdu 80173000.vdu: found VDU device at 80173000, id <ebebab01> [ 1.070000] Console: switching to colour frame buffer device 90x36 [ 1.090000] fb0: Module VDU frame buffer device [ 1.140000] Serial: 8250/16550 driver, 3 ports, IRQ sharing disabled [ 1.150000] 2002b000.uart: ttyS0 at MMIO 0x2002b000 (irq = 7) is a 8250 [ 1.160000] console [ttyS0] enabled, bootconsole disabled [ 1.160000] console [ttyS0] enabled, bootconsole disabled [ 1.170000] 20022000.uart: ttyS1 at MMIO 0x20022000 (irq = 9) is a 8250 [ 1.180000] 2002c000.uart: ttyS2 at MMIO 0x2002c000 (irq = 8) is a 8250 [ 1.200000] [drm] Initialized drm 1.1.0 20060810 [ 1.240000] loop: module loaded [ 1.250000] msvdhd 80180000.video_decoder: found device at 0x80180000, id 0x0025300b [ 1.300000] EasyNMC Unified DSP Framework. (c) RC Module 2014 [ 1.310000] easynmc-nmc3: imem at phys 0x140000 virt 0xc8900000 size 0x80000 bytes [ 1.320000] easynmc-nmc3: HP IRQ 14 LP IRQ 15 [ 1.330000] easynmc: registering core K1879-nmc (nmc3) with id 0 [ 1.350000] flash ext_id 0x95 [ 1.360000] mnand CS0 Samsung size(1024) writesize(2048) oobsize(64) erasesize(131072) [ 1.370000] mnand: Bad chip id or no chip at CS1 [ 1.380000] mnand: Detected 1073741824 bytes of NAND [ 1.390000] 5 cmdlinepart partitions found on MTD device mnand [ 1.400000] Creating 5 MTD partitions on "mnand": [ 1.410000] 0x000000000000-0x000000040000 : "boot" [ 1.430000] 0x000000040000-0x000000060000 : "env" [ 1.450000] 0x000000060000-0x000000080000 : "dtb" [ 1.470000] 0x000000080000-0x000000480000 : "kernel" [ 1.510000] 0x000000480000-0x000040000000 : "rootfs" [ 6.500000] libphy: greth-mdio: probed [ 9.590000] ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver [ 9.600000] uemd-ehci 10040000.ehci: UEMD EHCI [ 9.610000] uemd-ehci 10040000.ehci: new USB bus registered, assigned bus number 1 [ 9.630000] uemd-ehci 10040000.ehci: irq 35, io mem 0x10040000 [ 9.660000] uemd-ehci 10040000.ehci: USB 2.0 started, EHCI 1.00 [ 9.680000] hub 1-0:1.0: USB hub found [ 9.690000] hub 1-0:1.0: 2 ports detected [ 9.700000] ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver [ 9.710000] usbcore: registered new interface driver usb-storage [ 9.720000] usbcore: registered new interface driver usbserial [ 9.730000] mousedev: PS/2 mouse device common for all mice [ 9.740000] i2c /dev entries driver [ 9.770000] module_hdmi: module_hdmi: Device ID: 0x9132 [ 9.780000] usbcore: registered new interface driver i2c-tiny-usb [ 9.800000] ledtrig-cpu: registered to indicate activity on CPUs [ 9.850000] usbcore: registered new interface driver usbhid [ 9.860000] usbhid: USB HID core driver [ 9.900000] TCP: cubic registered [ 9.910000] Key type dns_resolver registered [ 9.920000] VFP support v0.3: implementor 41 architecture 1 part 20 variant b rev 5 [ 9.950000] UBI: attaching mtd4 to ubi0 [ 10.020000] usb 1-1: new high-speed USB device number 2 using uemd-ehci [ 10.180000] hub 1-1:1.0: USB hub found [ 10.190000] hub 1-1:1.0: 4 ports detected [ 25.560000] UBI: scanning is finished [ 25.640000] UBI: attached mtd4 (name "rootfs", size 1019 MiB) to ubi0 [ 25.650000] UBI: PEB size: 131072 bytes (128 KiB), LEB size: 126976 bytes [ 25.660000] UBI: min./max. I/O unit sizes: 2048/2048, sub-page size 2048 [ 25.670000] UBI: VID header offset: 2048 (aligned 2048), data offset: 4096 [ 25.680000] UBI: good PEBs: 8141, bad PEBs: 15, corrupted PEBs: 0 [ 25.690000] UBI: user volume: 1, internal volumes: 1, max. volumes count: 128 [ 25.700000] UBI: max/mean erase counter: 4/1, WL threshold: 4096, image sequence number: 23379108 [ 25.710000] UBI: available PEBs: 0, total reserved PEBs: 8141, PEBs reserved for bad PEB handling: 145 [ 25.720000] mvdu: will allocate buffers [ 25.730000] mvdu: did allocate buffers cc000000 [ 25.740000] UBI: background thread "ubi_bgt0d" started, PID 620 [ 25.750000] ALSA device list: [ 25.760000] #0: Module MB7707 [ 25.860000] UBIFS: recovery needed [ 26.940000] UBIFS: recovery deferred [ 26.950000] UBIFS: mounted UBI device 0, volume 0, name "rootfs", R/O mode [ 26.960000] UBIFS: LEB size: 126976 bytes (124 KiB), min./max. I/O unit sizes: 2048 bytes/2048 bytes [ 26.970000] UBIFS: FS size: 1013395456 bytes (966 MiB, 7981 LEBs), journal size 9023488 bytes (8 MiB, 72 LEBs) [ 26.980000] UBIFS: reserved for root: 0 bytes (0 KiB) [ 26.990000] UBIFS: media format: w4/r0 (latest is w4/r0), UUID D7B60B07-E5DE-408F-886D-5EACF67535FC, small LPT model [ 27.010000] VFS: Mounted root (ubifs filesystem) readonly on device 0:11. [ 27.020000] devtmpfs: mounted [ 27.030000] Freeing unused kernel memory: 140K (c04b0000 - c04d3000) Mount failed for selinuxfs on /sys/fs/selinux: No such file or directory INIT: version 2.88 booting [info] Using makefile-style concurrent boot in runlevel S. [info] Setting the system clock. head: cannot open '/etc/adjtime' for reading: No such file or directory hwclock: Cannot access the Hardware Clock via any known method. hwclock: Use the --debug option to see the details of our search for an access method. [....] Unable to set System Clock to: Thu Jan 1 00:00:33 UTC 1970 ... (warning). [....] Activating swap...done. [ 33.700000] UBIFS: completing deferred recovery [ 33.830000] UBIFS: background thread "ubifs_bgt0_0" started, PID 870 [ 33.850000] UBIFS: deferred recovery completed [....] Activating lvm and md swap...done. [....] Checking file systems...fsck from util-linux 2.20.1 done. [....] Cleaning up temporary files... /tmp. ok [....] Mounting local filesystems...done. [....] Activating swapfile swap...done. [....] Cleaning up temporary files.... ok [....] Setting kernel variables ...done. [....] Configuring network interfaces...done. [....] Cleaning up temporary files.... ok INIT: Entering runlevel: 2 [info] Using makefile-style concurrent boot in runlevel 2. [....] Starting OpenBSD Secure Shell server: sshd. ok Debian GNU/Linux jessie/sid shadow ttyS0 shadow login: root Password: Last login: Thu Jan 1 00:16:23 UTC 1970 from 192.168.0.1 on pts/0 Linux shadow 3.10.28-shadow1-00032-gb8b1a50 #141 Thu Aug 21 14:23:26 MSK 2014 armv6l The programs included with the Debian GNU/Linux system are free software; the exact distribution terms for each program are described in the individual files in /usr/share/doc/*/copyright. Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law. root@shadow:~# uname -a Linux shadow 3.10.28-shadow1-00032-gb8b1a50 #141 Thu Aug 21 14:23:26 MSK 2014 armv6l GNU/Linux root@shadow:~# 


最初に注目されるのは、「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つのユーティリティとライブラリで構成されています。


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 --list
root@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:~# nmrun /usr/share/examples/easynmc-0.1/arguments.abs hello world Application now started, hit CTRL+C to stop it Hello world! I am the NMC blinking ledz! I have been given 3 arguments Argument 0 is nmrun Argument 1 is hello Argument 2 is world App terminated with result 3, exiting root@shadow:~# echo $? 3 

NMCコア自体は、システム内に/ dev / nmc0ioおよび/ dev / nmc0memの形式で存在します。ここで、


他のすべての操作-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でクローンしたものを見てみましょう:


クロスアセンブリには、次の魔法があります。

 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プログラムでは、サウンドをいじって、NMCにエコー効果をリアルタイムで追加する何かをすることが決定されました。次のパイプラインを使用できます。
 arecord | nmrun ./echo.abs | aplay 

レコードがマイクからのデータを記録し、DSPに直接送信します。DSPはエコーと出力サンプルを出力に追加し、それらを再生中のプレイに転送します。サウンドをキャプチャするために、安価な中国製USBサウンドカードが使用され、何年も棚に置かれていました。この例では、通常のnmrunだけでlibeasynmcを使用する必要はありません。

続行する前に、そのようなソリューションのパフォーマンスについて何かを説明する必要があります。 stdin / stdoutは、データを交換する最も簡単な方法ですが、それでもかなり遅いです。これらは2つのリングバッファーを使用します。各バイトは最初にARMカーネルによってリングバッファーに書き込まれ、次にNMCコアによってそこから別のバッファーに読み込まれ、処理され、結果が別のリングバッファーに書き込まれ、そこからARMが再びコピーされる必要があります。控えめに言っても、リングバッファがSRAMメモリにある場合でも、これはそれほど高速ではありません。したがって、最大のパフォーマンスが必要な場合は、stdioとコマンドラインを忘れてlibeasynmcを使用する必要があります。

NeuroMatrixのC / C ++で開発する場合、DSPプロセッサで何も書いたことがない人の多くを文化的ショックに陥れる可能性のあるいくつかの機能を考慮する必要があります。以下は、踏むことができるレーキのリストです。


Cでエコーを行います。簡単にするために、再フォーマットを有効にしてサンプルをそれぞれNMC 8ビットに移動し、DSPで32ビット数の形式で取得します。
hello worldプロジェクトの例を取り上げ、その内容を見てみましょう。


Makefile. - . , – EASYNMC_DIR, libeasynmc-nmc NMC libeasynmc. - , libs.

Makefile
 # # This is a basic Makefile template for a Neuromatrix DSP project # to be run on Module MB77.07. To compile it you need: # * Latest NMSDK installed with utilities in your $PATH # * NEURO environment variable pointing to NMSDK directory # * Host GCC (Since nmcpp doesn't support generating deps, # we use gcc for that) # # For verbose build run 'make VERBOSE=y' # -include colorizer.mk -include *.dep .SUFFIXES: OBJECTS := \ main.o \ easyconf.o TARGET=helloworld # Set this to libeasynmc-nmc dir. Relative or absolute. # Make sure you build it prior to building the actual project. EASYNMC_DIR = ../../libeasynmc-nmc CROSS_COMPILE = NMCPP_FLAGS = -DNEURO -OPT2 -inline -I$(EASYNMC_DIR)/include ASM_FLAGS = -soc -Sc -Stmp -Xq -I$(EASYNMC_DIR)/include C2ASM_FLAGS = -soc -q #BIG FAT WARNING: easynmc.lib MUST go BEFORE libc #BIG FAT WARNING: Otherwise argc/argv won't work LIBS = easynmc.lib libc05.lib BUILDER_FLAGS = -cK1879.cfg -m -heap=0 -heap1=0 -heap2=0 -heap3=0 -stack=20000 \ -full_names IDIRS = -I. -I"$(NEURO)/include" LIBDIR = -l"$(NEURO)/lib" -l"$(EASYNMC_DIR)" .DEFAULT_GOAL=all all: $(TARGET).abs %.asmx: %.cpp $(SILENT_DEP)gcc -E -MM $(<) -o$(@).dep $(SILENT_NMCPP)$(CROSS_COMPILE)nmcpp -Tp $(NMCPP_FLAGS) $(<) -O$(@) $(IDIRS) %.asmx: %.c $(SILENT_DEP)gcc -E -MM $(<) -o$(@).dep $(SILENT_NMCPP)$(CROSS_COMPILE)nmcpp -Tc99 $(NMCPP_FLAGS) $(<) -O$(@) $(IDIRS) %.o: %.asmx $(SILENT_ASM)$(CROSS_COMPILE)asm $(C2ASM_FLAGS) $(<) -o$(@) %.o: %.asm $(SILENT_DEP)gcc -E -MM -xassembler-with-cpp $(<) -o$(@).dep $(SILENT_ASM)$(CROSS_COMPILE)nmcc $(ASM_FLAGS) $(<) -o$(@) $(TARGET).lib: $(OBJECTS) -$(SILENT_LIBRARIAN)$(CROSS_COMPILE)libr -c $(@) $(^) > /dev/null $(TARGET).abs: $(OBJECTS) -$(SILENT_LINKER)$(CROSS_COMPILE)linker $(BUILDER_FLAGS) -o$(@) $(^) $(LIBS) $(LIBDIR) $(TARGET).dump: $(TARGET).abs -$(SILENT_NMDUMP)$(CROSS_COMPILE)nmdump -f $(^) > $(@) run: $(TARGET).abs edcltool -f run_nmc_code.edcl -i eth1 clean: -$(SILENT_CLEAN)rm -f *.asmx; rm -f *.o; rm -f $(TARGET).abs $(TARGET).dump *.dep \ *.ac *.map *~ *.abs *.lib 


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("Hello world from NeuroMatrix! I am the NMC printf'ing to you!\n"); 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による即時支払いがありません。

参照資料


Source: https://habr.com/ru/post/J234541/


All Articles