囜内シングルボヌドコンピュヌタヌ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による即時支払いがありたせん。



参照資料






All Articles