たけおか ぼちぼち日記

たけおか ぼちぼち日記

思いついたらメモ

Tang Primer FPGA ボードが安い。
中華FPGAだが、悪くない。
RISC-V のソフトコアが入る。
ボードのドキュメント(英語)
ボードに載っているFPGA は Anlogic社の EG4S20というチップ。純粋 中華製らしい。FPGAならバックドアの心配は少ないだろう。(開発環境は、バックドアに注意する)



秋月電子などで安定して買える。
秋月 Sipeed Tang Primer FPGA Dev. ボードSwitch ScienceShige Zone
(私は、このボード1枚とJTAG 冶具は、Seeedstudio.comから 買いました)
なお、FPGAの開発を行うだけならば、JTAG 冶具は不要。

Sipeed は、中華 深セン系のチップを使用したボードをたくさん出している。そして、どれも安い。
このFPGAボードも悪いところは無い。

ここでは、Ubuntu 18.04.4 LTS での開発について述べる。




ボードを購入すると、RISC-V コアが焼かれていて、RISC-Vマイコンとして使用することもできる。
焼かれているのは、Humming bird, e-203コア。
また、FlashROMには、RISC-VでLEDを白でチカチカさせるプログラムが焼かれている。

このHumming bird, e-203コアだと、SiFive の開発環境などを、だいたい流用できる。

Humming bird core解説

RISC-V e-203 CPUのソフトウェア開発は、下記のツール・チェーン(バイナリ)をget&展開すれば、gcc, as, ld, gdb, objdumpなど使える。
RISC-V 32bit 開発環境

開発環境を展開した
sirv-e-sdk/
にて
$ make software PROGRAM=demo_gpio BOARD=sirv-e203-lichee
とすれば、
sirv-e-sdk/software/demo_gpio/
が、makeされ、RISC-V 実行バイナリが
sirv-e-sdk/software/demo_gpio/demo_gpio
としてできる。
これを、FlashROMに焼けば、Hummingbird e-203コアで実行できる。



FlashROMにRISC-Vアプリケーションを書き込むには、Sipeed JTAG(治具)ハードウェアが必要。

DigiKey
RobotShop
などで購入可能。

このJTAG治具は、FTDI 2232Hが入っているだけで、OpenOCDではフツーの構成。ST32やARMなどにも使用できるメジャー系。



e-203が入っている本ボードとの接続は表のとおり。
Tang PrimerRV Debugger
U0_RX (Pin H13) TX
U0_TX (Pin J13)RX
E_TMS (Pin C9)TMS
E_TDI (Pin B6)TDI
E_TCK (Pin C5)TCK
E_TDO (Pin A4)TDO
GND (Pin G)GND


ただし、本ボード用としてリリースされているOpenOCDそのままでは、コンパイル&リンクの終わったRISC-Vの実行バイナリをFlash ROMに書くことができない。
本ボード用としてリリースされているOpenOCDが、本ボードのFlashROMに対応していないのであった(涙)。

あたくしは、脳みそを使わず、悩んだフリをしていたが…

解決法を、教えてくれているWebページを発見した。
@Nanchite4618 さんの、
「TangPrimer(RISC-V)をArduinoIDEで開発する」というページである。

たいへん、感謝しております。

LicheeTang_openocdをダウンロード&展開し、次のパッチをあてる。
---
*** LicheeTang_openocd/src/flash/nor/spi.c.org 2020-04-04 15:53:17.000000000 +0900
--- LicheeTang_openocd/src/flash/nor/spi.c 2020-06-26 05:46:31.686017310 +0900
***************
*** 83,87 ****
--- 83,88 ----
FLASH_ID("gd gd25q16c", 0xd8, 0xc7, 0x001540c8, 0x100, 0x10000, 0x200000),
FLASH_ID("gd gd25q32c", 0xd8, 0xc7, 0x001640c8, 0x100, 0x10000, 0x400000),
FLASH_ID("gd gd25q128c", 0xd8, 0xc7, 0x001840c8, 0x100, 0x10000, 0x1000000),
+ FLASH_ID("xtx xt25f08", 0xd8, 0xc7, 0x0014400b, 0x100, 0x10000, 0x100000),
FLASH_ID(NULL, 0, 0, 0, 0, 0, 0)
};
---

その後、
$ cd LicheeTang_openocd/
$ ./configure
$ make
で、OpenOCDができる。
新しい OpenOCD一式は、
sirv-e-sdk/work/build/openocd/prefix/bin/
にコピーする。

FTDI 2232HをUbuntuに認識させるために、
/etc/udev/rules.d/45-dt2232.rules ぐらいとして
--
ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6010", TAG+="uaccess", TAG+="udev-acl"
--

を書いて、
$ sudo service udev restart
とする。

FlashROMの焼き込みは
sirv-e-sdk/

$ make upload PROGRAM=demo_gpio BOARD=sirv-e203-lichee
する。


JTAG対応のRISC-V コアが無いと、FlashROMの書き直しができない。
万一、RISC-Vコアを消してしまった場合は、
このバイナリhttps://dl.sipeed.com/TANG/Primer/SDK/LicheeTangNewIoMap_BitStream.bit をFPGAに焼き直すべし。



FPGAであるから、論理回路を開発したい。

FPGAの開発環境は、https://dl.sipeed.com/TANG/Primer/IDE/TD1909_linux.rar
展開して、コマンド・サーチ・パスを通して…
$ td -gui
とやれば、GUIで開発環境が起動。

FPGAの例題は、
https://github.com/Lichee-Pi/Tang_FPGA_Examples からget

FPGA開発は、ボード上のUSBポートと Ubunu マシンをUSBケーブルでつなぐだけ。(FTDIの JTAG治具は不要)

Humming bird e-203コアの FPGA ソース
は、問題なくシンセサイズできて、FPGAに流し込んで実行できる。
RISC-Vコアはすんなりと動いて、たいへん ありがたい。


ただし、OpenOCD JTAG でFlashROMを焼くためには、下記のパッチをあてる必要あり。
--
*** Tang_E203_Mini-master/project/e203egmini_new.sdc.org 2019-07-10 19:34:04.000000000 +0900
--- Tang_E203_Mini-master/project/e203egmini_new.sdc 2020-06-27 03:34:35.549449857 +0900
***************
*** 6,12 ****
#create_clock -name CLK25MHZ -period 40 -period 40 -waveform {0 20} [get_ports {CLK25MHZ}]

create_clock -name clk_8388 -period 119.218 [get_nets {clk_8388}]
! create_clock -name clk_16M -period 62.5 [get_nets {CLKIN}]

create_generated_clock -name slowclk -source [get_nets {clk_8388}] -master_clock clk_8388 -divide_by 256 [get_nets {slowclk}]
set_false_path -from [get_clocks "clk_16M"] -to [get_clocks "slowclk"]
--- 6,13 ----
#create_clock -name CLK25MHZ -period 40 -period 40 -waveform {0 20} [get_ports {CLK25MHZ}]

create_clock -name clk_8388 -period 119.218 [get_nets {clk_8388}]
! #create_clock -name clk_16M -period 62.5 [get_nets {CLKIN}]
! create_clock -name clk_16M -period 62.5 [get_nets {clk_16M}]

create_generated_clock -name slowclk -source [get_nets {clk_8388}] -master_clock clk_8388 -divide_by 256 [get_nets {slowclk}]
set_false_path -from [get_clocks "clk_16M"] -to [get_clocks "slowclk"]
--



他のHumming bird e-20xコアの FPGA ソース



aitendo 福袋2020 の自分用メモ

・DSPラジオ 2つ


私の興味をすごく引いたのは以下


作ってもいい、と思えた基板。

ラジオばっかり。
トランジスタみたいな3端子 AM ラジオとかええかも、基板やたらデカいけど…
ESP32ボードもIchigoJam も、もうお腹一杯どす〜(^^;

ラジオ基板


マイコン基板


LCD




★特売品★Bluetoothモジュール [WML-C69] ※詳細不明なので、結局はゴミ
http://aitendo.com/product/13076





longan nano という RISC-V が載った大変安いボードを買った。

秋月で830円。(今は、メモリの少ない版しか入手できないであろう)

http://longan.sipeed.com/en/
--
メモリ:チップ内蔵128 KBフラッシュ、32 KB SRAM
汎用16ビットタイマー × 4、基本16ビットタイマー × 2、高度16ビットタイマー × 1
CPU:GD32VF103CBT6(RISC-V 32 bitコア)
ストレージの拡張:小型TFカードスロット
ディスプレイ:160 × 80 IPSディスプレイ(SPIインタフェース)

USB-Cで、PCと接続して、バイナリを書き込める。
DFUというプロトコル(?)で書く。
--





とりあえず、開発環境は、PlatformIO という甘っちょろい IDE で試用。

ホストは Ubuntu 18.04.03 LTS。( Linux 4.15.0-72-generic)

まず、VS CodeというIDEを入れ、そこに PlatformIO を入れる。
VS Codeって、Visual Studioなんだなぁ…
(Visual Studioとか大嫌い。IDEがそもそも嫌い)

PlatformIOに、longan nanoの開発ツールを入れる。
下記の通りでうまく行く。
(多少、変なことが起きた気がするが、VS Codeを再起動してやり直すと、うまく行ったり…)


https://longan.sipeed.com/en/get_started/pio.html


そして、example で、「longan-nano-blink」を開く。

ここからが、Ubuntuで DFU 書き込みのために重要。
https://bbs.sipeed.com/t/topic/1338/14 からの引き写し。


プロジェクト中の
platform.ini ファイルに
--
upload_protocol = dfu
--

という行を書く。
全体としては、
-- platform.ini
[env:sipeed-longan-nano]
platform = gd32v
framework = gd32vf103-sdk
board = sipeed-longan-nano
monitor_speed = 115200
upload_protocol = dfu
; change microcontroller
;;board_build.mcu = GD32VF103CBT6
; change MCU frequency
;;board_build.f_cpu = 108000000L
--

とした。
これで、ビルド。


DFUを使用するために、dfu-util を入れる。

$ sudo apt-get install dfu-util

そして、longan nanoの DFU デバイスを、アクセス・モード 666 にするために、
/etc/udev/rules.d/99-platformio-udev.rules として、下記を書く。
--
# Longan Nano
ATTRS{idVendor}=="28e9", ATTRS{idProduct}=="0189", MODE="0666"
--

上記を有効にするためには、Ubuntuを reboot 。


longan nanoを、Ubuntu に接続するときには、
1) Boot0ボタンを押下したまま、USB接続
2) Boot0を押下したままで、
3) Resetを押下し、離す
4) Boot0 ボタンを離す
以上で、アプリケーションが走行していなければOK。

DFUデバイスは、
lsusb で、表示されないこともあるが、気にしない。

以上で、Platformio から、longan nano に DFU で書き込める。



手動で、DFUデバイスを探すには、

$ sudo dfu-util -l

として、存在していればそれが表示される。

DFUデバイスのパスを知るためには、strace で、openatを捕まえる。
そして、「28e9」などをサーチすると、その直前の行にパスが見えることが多い。
(openat で、捕まらない場合もある)

# sudo strace -e trace=openat dfu-util -l
:
openat(AT_FDCWD, "/dev/bus/usb/002/016", O_RDWR) = 9
Found DFU: [28e9:0189] ver=1000, devnum=16, cfg=1, intf=0, path="2-2", alt=1, name="@Option Bytes /0x1FFFF800/01*016 g", serial="??"
Found DFU: [28e9:0189] ver=1000, devnum=16, cfg=1, intf=0, path="2-2", alt=0, name="@Internal Flash /0x08000000/512*002Kg", serial="??"
+++ exited with 0 +++


以上で、Ubuntu で、楽に使えるようになった。


だが、
書き込みする時に、いちいち、儀式と共にUSBを抜-挿しなければならないのが、大変、面倒臭い。(^^;
(これは、Windowsでも同様と思われる)


2020/JAN/03 追記

CLI(command line interface, shell)から platformio を使う方法。

・参考:

https://docs.platformio.org/en/latest/installation.html
を読んだ。


・インストール法
--
$ sudo pip install -U platformio
--

※自分用だけの場合は、上記の参考ページをよく読む。


・使用方法

プロジェクトのあるディレクトリで。
(私のプロジェクトは、 ~/Documents/PlatformIO/Projects/200102-105158-longan-nano-blink/ にあった)

## Build project
$ platformio run

## Build , platform.ini 中の envを明示指定
$ platformio run -e sipeed-longan-nano


## Upload firmware
$ platformio run --target upload

## Upload firmware, platform.ini 中の envを明示指定
$ platformio run --target upload -e sipeed-longan-nano

# Clean build files
$ platformio run --target clean

これで VS Code IEDは不要になった


これは、 Lisp SETF Advent Calendar 2018 - Qiita の DEC/21 の記事として書きました。


setcar! でググると、レンタカー屋さん と、バスなどを作ってる会社 が出てきた(^^;
なるほどっ!


純粋関数型が好きな 意識の高い人々からは、極めてバカにされている Lisp の setf などですが…
実際、副作用は良くないよね。並列化の邪魔だ。
(私は、TK80で遊び始めた頃から並列計算が好きです)

だが…
私は、setcar! (rplaca), setcdr! (rplacd) を使う。断じて使う。
(私はCommon Lispを書くことが多いので、rplaca/rplacd/setf を使う)


Lispで、プログラミング言語の実行系をつくるのは、誰もが、しばしば(バシバシと)行っているであろう。

・いにしえの素朴なLisp インタープリタを作るとき…
変数などのバインディング状況を環境として作り、その環境をリストでつないでいくであろう。

バインディングの表現方法によるが、変数の内容が更新された時、setcdr! (か、setcar!) を使うことになるであろう。
実現方法が素朴であり、それなりの実行速度を求め、かつ、プログラマが楽をしたければ。(^^;

また、関数呼び出しから戻るとき、
(C言語的な表現ならば、スタックを巻き戻すとき)
環境リストの新しいものを切り捨てて、古い方の環境を最新にする。
これも、環境リストの表現方法によるが…
環境リストの最新を保持する cons の carかcdr を set! する(つまり、setcar! か setcdr!する)
ことになるであろう。(環境リストを単純な変数で保持していたら、その変数にset!するだけだが)
大域脱出などで、環境リストを、いきなりたくさん縮めたいときに、setcdr! したい気持ちが高まる(であろう、たぶん…きっと…)。



・Prologインタープリタを Lispで作るとき…

Prologの変数は、双方向代入であり…
ず〜っとアンバウンド(未代入)の変数の値が、どんどん呼びだされた後の節の中で決まり(バインドされ)、
それが呼び出し側(環境リストでいうと浅い側の環境の中)の変数に反映されなければならない。
これは、もう、環境リスト中の変数の値を、set!(インタープリタの中では、setcdr!ぐらい)を、行うしかないっ!
(凡人の脳では)

そして加えて…
Prologが素晴らしいのは、バックトラックが行われた場合、
上記のような変数のバインディングは、キレイさっぱりと、忘れてしまわなければならないことである。
その実現を、素朴な凡人脳でプログラムすると、
環境リストの途中を setcdr! して、
忘れてしまいたいバインディングを保持した環境を、切り離してしまうことであろう。

うほほ〜い、setcar!/setcdr! 最高〜\(^^)/


・Schemeの setcar!/setcdr! が rplaca/rplacd でないのは…
私は、
「SchemeにMAC Lisp上に書かれていたものがあって、関数名がMAC Lispとぶつからないようにしてたのじゃないかな〜」
と、勝手に想像してます。



・ちなみに、Common Lisp の setfは、私の中では…
- 値を得る直前に、寸止めして、参照場所を見るだけとして堪え、
- そこに値をぶち込む
という行為に、
マゾ感覚(寸止めで我慢) と、
サド感覚(最後に、値をぶち込む)
の両者を感じ、大変に感情を揺さぶられる 魅惑的な機能として位置づけられている。
また、setfは、純粋関数に反した背徳的な行為であることも、その魅力を、指数関数的に増大させている。


もう、私は、setf/rplaca/rplacd 無しでは、退屈すぎて、クリスマスも自宅で寝るしかないのである。
(setf/rplaca/rplacd があっても、クリスマスは自宅で寝ると思われるが…)

これは、関西Lisp アドベント・カレンダの 2017年12月2日です。

 

  • 基本Lisp小咄

    Lisperには紅茶好きが多い(?)

    LisperA: 「foodp ?」(和訳: 飯に行かない? ) 
    LisperB: 「T」(yes) 
    飯屋に行き、一通り飯を食い終わったところにウエイトレスが来て、
    ウエイトレス: 「Coffee?」(コーヒーはいかが?)
    Lispers: 「T」
    少し後、紅茶(ティー)が運ばれてきた…

 

  • どうして CAR は、左の要素を取るのか
         「クルマ(Car)は左」というじゃろ。
                 ただし、日本とイギリス限定 (^^;
                 (このネタは、竹内郁雄さんの文章で読みました)
 
  • 「ラムダ文字山」
 

a>

 
  • 火星のラムダ文字山
 

 
お粗末
 

 
 
 

関西Lisp のネタのために、usim を引っ張り出してきた。

古いオリジナルのものをそのままmakeしても、動作した。(64bit Linux用に、ちょっと直した)

 

g000001さんのusimの記事"http://g000001.cddddr.org/3700105594"にある 

この GitHub: ams/mit-cadr から、 download Zip で得たものも簡単に動いた。

 

OSは、Ubuntu 16.04LTS 64bit。

 

usimは、32bit で make して吉。

 

ubuntu x86_64 の場合、32bit コンパイル環境を入れる
 $ sudo apt-get install libc6-dev-i386
 $ sudo apt-get install libsdl1.2debian:i386

そして、Makefile をちょっと変更。

 

--------

*** Makefile.org    2017-04-02 17:15:10.000000000 +0900
--- Makefile    2017-10-09 22:00:15.842199400 +0900
***************
*** 34,41 ****
  endif
  
  ifeq ($(OS_NAME), Linux)
! DISPLAY = X11
! KEYBOARD = OLD
  endif
  
  #----------- code ------------
--- 34,43 ----
  endif
  
  ifeq ($(OS_NAME), Linux)
! #DISPLAY = X11
! DISPLAY = SDL
! #KEYBOARD = OLD
! KEYBOARD = NEW
  endif
  
  #----------- code ------------
***************
*** 77,83 ****
  ifeq ($(DISPLAY), X11)
  LFLAGS = -m32
  ifeq ($(OS), LINUX)
! USIM_LIBS = -L/usr/lib/x86_64-linux-gnu -lX11 -lpthread
  else
  USIM_LIBS = -L/usr/X11R6/lib -lX11 -lpthread
  endif
--- 79,86 ----
  ifeq ($(DISPLAY), X11)
  LFLAGS = -m32
  ifeq ($(OS), LINUX)
! #USIM_LIBS = -L/usr/lib/x86_64-linux-gnu -lX11 -lpthread
! USIM_LIBS =
  else
  USIM_LIBS = -L/usr/X11R6/lib -lX11 -lpthread
  endif
***************
*** 90,97 ****
  #CFLAGS= -O3 -march=pentium3 -mfpmath=sse -mmmx -msse $(DEFINES) -Walle
  #CFLAGS = -O3 -fomit-frame-pointer -mcpu=i686 -g $(DEFINES)
  #CFLAGS= -O3 -mfpmath=sse -mmmx -msse $(DEFINES) -Walle
! CFLAGS = -mfpmath=sse -mmmx -msse -DMAP_SITE_TREE_DIRECTORY $(DEFINES) -g
! LFLAGS = -ldl -L/usr/lib
  USIM_SRC += Files.c glob.c
  USIM_HDR += Files.h glob.h
  USIM_LIBS += -lrt
--- 93,103 ----
  #CFLAGS= -O3 -march=pentium3 -mfpmath=sse -mmmx -msse $(DEFINES) -Walle
  #CFLAGS = -O3 -fomit-frame-pointer -mcpu=i686 -g $(DEFINES)
  #CFLAGS= -O3 -mfpmath=sse -mmmx -msse $(DEFINES) -Walle
! #CFLAGS = -mfpmath=sse -mmmx -msse -DMAP_SITE_TREE_DIRECTORY $(DEFINES) -g
! #CFLAGS = -mfpmath=sse -mmmx -msse -DMAP_SITE_TREE_DIRECTORY $(DEFINES) $(M32) -g
! CFLAGS = -O4 -mfpmath=sse -mmmx -msse -DMAP_SITE_TREE_DIRECTORY $(DEFINES) $(M32)
! #LFLAGS = -ldl -L/usr/lib
! LFLAGS = $(M32) -ldl -L/usr/lib
  USIM_SRC += Files.c glob.c
  USIM_HDR += Files.h glob.h
  USIM_LIBS += -lrt
***************
*** 110,116 ****
  M32 = -m32
  
  ifeq ($(DISPLAY), SDL)
! USIM_LIBS = /usr/lib/libSDL-1.2.so.0.7.0 -lpthread
  endif
  
  endif
--- 116,123 ----
  M32 = -m32
  
  ifeq ($(DISPLAY), SDL)
! #USIM_LIBS = /usr/lib/libSDL-1.2.so.0.7.0 -lpthread
! USIM_LIBS = /usr/lib/i386-linux-gnu/libSDL-1.2.so.0 -lpthread
  endif
  
  endif

---------------------------------------

そしてmake すれば、OK。

 

$ ./usim で、起動する。

 

 

 

<hr>

 

XBee をだいぶ前に、入手して、少し遊んでいた。

だが、End Device APIだか、End Device AnalogIOだったか、ADC を読み込んで、自動的に送出する ファームウェア を焼いたら、ちっとも通信できなくなった… orz

 

そして、ファームウェアの更新(元に戻す)も、できなくなった…

 

急に思い立って、真面目にググって見つけたのが…

「Bootloader to force XBee reflash」

http://www.digi.com/wiki/developer/index.php/Bootloader_to_force_XBee_reflash

 

これでうまく、ファームウェアを焼き直せた。

 

僕の XBee は、XB24-Z7CIT-007 

 

要するに…

DTR (9ピン), DIN(3ピン) を GND に落として、reset する。

僕の場合、それで、Bootloader が起動した。

シリアル端末を、115200bps, 8bit, non-parity で、つないでおけば、boot loaderの起動メッセージが見えて、判る。

 

その後、X-CTU を起動して、強制的にファームウェア更新を行えば、良し。

 

 

「Bootloader to force XBee reflash」の内容、正確には…

DTR (9ピン), DIN(3ピン) を GND に落として、reset する。

シリアル端末を、115200bps, 8bit, non-parity で、つないで、

"B", 「CR」

を打ち込むと、boot loader が起動すると、書いてある。

 

 

ま、とりあえず、ATコマンドで遊べるように戻ったので、めでたい。

 


Raspi2 の浮動小数点演算性能 OpenMP 使用編

先日、Raspi2 の1 コアの浮動小数点演算性能を Linpack で測った

OpenMP を使用する Linpack がある。
古いのかも知れないが、 http://people.inf.ethz.ch/arbenz/book/Chapter4/ から、

http://people.inf.ethz.ch/arbenz/book/Chapter4/ompsgefa.tar
を得た。
CBLASやBLASのルーチンが必要なので、上記ページからリンクのある、CBLASなどをゲットして、
適当にmake した。

gcc, gfortranは、4.8.2 を使用した。
gcc, gfortran のオプションは下記
CFLAGS = -O4 -fopenmp -march=armv7-a -mfpu=vfpv3-d16
FFLAGS = -O4 -fopenmp -march=armv7-a -mfpu=vfpv3-d16

Raspbian 標準の gcc,gfortran 4.6.3も計測したが、今回は、単精度に関わらず、4.8.2 に負けていた。
(結果の表の、末尾に gcc,gfortran 4.6.3 omp_tread=4 の結果を掲げてある)

Raspi2 は 4 coreである。
OMP thread を1 ~ 4 まで変えて、計測してみた。
システム・クロックは1000MHz

計測結果は、Google表計算で
https://docs.google.com/spreadsheets/d/1HV3aaqAxxXxustCJjhZsqLiypWJ_kZGGwEeE2aybEh0/edit?usp=sharing



結局、
OpenMP で 4 thread だと、1threadの 2.13倍ぐらい。
Raspi2は、1 core Linpack で 166 MFlops 程度だったので…
4thread (4 core) 時は、
166 MFlops × 2.13 = 352.76 MFlops ぐらいの
実効性能であろうか。




Aitendo に行くと、特売品を買ってしまう。
今日は、液晶漏れ(?)だかの、FSTN液晶[COG128X64-18P7565]を100円で買ってしまった。
(今回は、LCDにコネクタ基板がついている シリアルFSTN液晶モジュール(128x64/SPI) [18P7565-2P] 100円を買った)
そもそも、先日に、Aitendoの下記のWebページで、簡単に動きそうなことを読んでいたものだった、だがしかし…
びんぼうでいいの with LCD [U3RLCD18P7565]
シリアルFSTN液晶モジュール(128x64/SPI) [18P7565-2P]
FSTN液晶モジュール(128x64) [COG128X64-18P7565]

下の写真は、苦労の末、動いているもの
動作中



しかし、この びんぼうでいいの(Arduino) と接続する情報が、えらい酷いもので…
安定の、Aitendo クオリティ。100円で、長時間、楽しめる(^^;

当該ページに、ある結線のうち、一つは、VSS(GND)ではなく、オープン(N.C)にしておくべきものであった。(下図)
結線、修正版

今回、N.Cにしたものは、なにか、意味のある線かも知れないが、調べる気もしなく、得体が知れないので、もう、N.Cでいいや。



コントラストと、しきい値抵抗を、適切に設定すると、結構キレイに映る。
その情報は、下記。


------ ST7565.cpp.patch

*** ST7565.cpp.org 2015-02-28 17:42:20.000000000 +0900
--- ST7565.cpp 2015-03-01 01:27:20.000000000 +0900
***************
*** 421,427 ****
_delay_ms(10);

// set lcd operating voltage (regulator resistor, ref voltage resistor)
! st7565_command(CMD_SET_RESISTOR_RATIO | 0x6);

// initial display line
// set page address
--- 425,432 ----
_delay_ms(10);

// set lcd operating voltage (regulator resistor, ref voltage resistor)
! // st7565_command(CMD_SET_RESISTOR_RATIO | 0x6);
! st7565_command(CMD_SET_RESISTOR_RATIO | 0x2); /*take@takeoka.net*/

// initial display line
// set page address
***************



-----------examples/st7565lcd/st7565lcd.pde.patch

*** examples/st7565lcd/st7565lcd.pde.org 2013-03-11 20:49:20.000000000 +0
900
--- examples/st7565lcd/st7565lcd.ino 2015-03-01 01:30:00.000000000 +0900
***************
***************
*** 27,37 ****
Serial.print(freeRam());

// turn on backlight
! pinMode(BACKLIGHT_LED, OUTPUT);
! digitalWrite(BACKLIGHT_LED, HIGH);

// initialize and set the contrast to 0x18
! glcd.begin(0x18);

glcd.display(); // show splashscreen
delay(2000);
--- 29,43 ----
Serial.print(freeRam());

// turn on backlight
! // pinMode(BACKLIGHT_LED, OUTPUT);
! // digitalWrite(BACKLIGHT_LED, HIGH);

// initialize and set the contrast to 0x18
! // glcd.begin(0x18);
! glcd.begin(0x10); /*contrast ,
! and check st7565_command(CMD_SET_RESISTOR_RATIO | 0x2);
! take@takeoka.net*/
! glcd.st7565_command(CMD_SET_RESISTOR_RATIO | 0x2);/*take@takeoka.net*/

glcd.display(); // show splashscreen
delay(2000);




Raspberry Pi 2を動かした
Dhrystone など、整数性能は、クロック比程度の性能向上。
Raspi1は、ARM11@700MHz で、Raspi2 は、ARM Cortex-A7@1000MHz。
ARM11は、なかなかいい機械だったので、Cortex-A7と比べてもあまり見劣りしない。

浮動小数点演算 性能が気になる。
組込みCPUなので、期待をしてはいけないが…
Raspi1 の FPU は、ARMの VFP で、ショート・ベクトルとか言っているが、
どないもこないも、遅いしろものであった…

Raspi2 のFPUは、また別物。

Raspbian 標準の gcc (gcc 4.6.3) に
CFLAGS = -O4 -mfp=3 -march=armv7-a -mfpu=vfpv3-d16
で、linpack を make。

システムクロックは、1000MHz と 標準の700MHz で計測。



--- 1000MHz ---

take@raspi2% ./linpackc_sp
Enter array size (q to quit) [200]:
Memory required: 158K.


LINPACK benchmark, Single precision.
Machine precision: 6 digits.
Array size 200 X 200.
Average rolled and unrolled performance:

Reps Time(s) DGEFA DGESL OVERHEAD KFLOPS
----------------------------------------------------
64 0.58 86.21% 10.34% 3.45% 156952.375
128 1.16 91.38% 0.00% 8.62% 165836.516
256 2.32 88.79% 1.72% 9.48% 167415.844
512 4.62 89.18% 3.46% 7.36% 164286.562
1024 9.27 87.59% 3.02% 9.39% 167415.984
2048 18.54 88.03% 2.10% 9.87% 168317.594

Enter array size (q to quit) [200]:
Memory required: 158K.


LINPACK benchmark, Single precision.
Machine precision: 6 digits.
Array size 200 X 200.
Average rolled and unrolled performance:

Reps Time(s) DGEFA DGESL OVERHEAD KFLOPS
----------------------------------------------------
64 0.58 89.66% 0.00% 10.34% 169025.500
128 1.16 83.62% 0.00% 16.38% 181223.141
256 2.32 87.50% 4.74% 7.76% 164286.656
512 4.63 89.20% 2.16% 8.64% 166228.547
1024 9.27 88.57% 2.48% 8.95% 166622.547
2048 18.54 88.24% 3.13% 8.63% 166032.109

Enter array size (q to quit) [200]:

take@raspi2% ./linpackc_dp
Enter array size (q to quit) [200]:
Memory required: 315K.


LINPACK benchmark, Double precision.
Machine precision: 15 digits.
Array size 200 X 200.
Average rolled and unrolled performance:

Reps Time(s) DGEFA DGESL OVERHEAD KFLOPS
----------------------------------------------------
64 0.78 87.18% 5.13% 7.69% 122074.074
128 1.54 89.61% 4.55% 5.84% 121232.184
256 3.09 91.59% 2.59% 5.83% 120815.578
512 6.19 90.79% 2.75% 6.46% 121441.566
1024 12.36 91.10% 2.91% 5.99% 121023.523

Enter array size (q to quit) [200]:
Memory required: 315K.


LINPACK benchmark, Double precision.
Machine precision: 15 digits.
Array size 200 X 200.
Average rolled and unrolled performance:

Reps Time(s) DGEFA DGESL OVERHEAD KFLOPS
----------------------------------------------------
64 0.77 90.91% 2.60% 6.49% 122074.074
128 1.55 91.61% 2.58% 5.81% 120401.826
256 3.10 90.97% 2.58% 6.45% 121232.184
512 6.20 90.97% 3.06% 5.97% 120608.348
1024 12.40 91.05% 2.66% 6.29% 121023.523

Enter array size (q to quit) [200]:







--- 700MHz ---

take@raspi2% ./linpackc_sp
Enter array size (q to quit) [200]:
Memory required: 158K.


LINPACK benchmark, Single precision.
Machine precision: 6 digits.
Array size 200 X 200.
Average rolled and unrolled performance:

Reps Time(s) DGEFA DGESL OVERHEAD KFLOPS
----------------------------------------------------
64 0.64 90.63% 1.56% 7.81% 148971.734
128 1.29 88.37% 2.33% 9.30% 150245.031
256 2.57 87.94% 2.72% 9.34% 150889.688
512 5.14 88.13% 3.11% 8.75% 149924.641
1024 10.28 88.42% 2.63% 8.95% 150245.156

Enter array size (q to quit) [200]:
Memory required: 158K.


LINPACK benchmark, Single precision.
Machine precision: 6 digits.
Array size 200 X 200.
Average rolled and unrolled performance:

Reps Time(s) DGEFA DGESL OVERHEAD KFLOPS
----------------------------------------------------
64 0.65 89.23% 4.62% 6.15% 144087.297
128 1.30 89.23% 1.54% 9.23% 148971.484
256 2.59 88.03% 2.70% 9.27% 149605.656
512 5.19 91.71% 2.12% 6.17% 144383.328
1024 10.37 90.26% 2.12% 7.62% 146794.453

Enter array size (q to quit) [200]:



take@raspi2% ./linpackc_dp
Enter array size (q to quit) [200]:
Memory required: 315K.


LINPACK benchmark, Double precision.
Machine precision: 15 digits.
Array size 200 X 200.
Average rolled and unrolled performance:

Reps Time(s) DGEFA DGESL OVERHEAD KFLOPS
----------------------------------------------------
64 0.86 93.02% 2.33% 4.65% 107186.992
128 1.72 92.44% 2.33% 5.23% 107844.581
256 3.45 91.01% 2.90% 6.09% 108510.288
512 6.87 90.83% 3.20% 5.97% 108846.233
1024 13.75 92.95% 1.38% 5.67% 108426.626

Enter array size (q to quit) [200]:
Memory required: 315K.


LINPACK benchmark, Double precision.
Machine precision: 15 digits.
Array size 200 X 200.
Average rolled and unrolled performance:

Reps Time(s) DGEFA DGESL OVERHEAD KFLOPS
----------------------------------------------------
64 0.86 93.02% 0.00% 6.98% 109866.667
128 1.74 91.38% 1.72% 6.90% 108510.288
256 3.47 89.63% 4.03% 6.34% 108176.410
512 6.95 90.65% 3.02% 6.33% 108010.241
1024 13.90 90.86% 2.66% 6.47% 108176.410

Enter array size (q to quit) [200]:





コア1つで、この性能なら、組込みCPUとしては、まぁ速い。
4コアなので、OpenMP とかで並列に動けば、まぁまぁいいかも知れない。
だが、キャッシュの食い合いとか、内部のバンド幅のせいで、性能が出ないかも知れない。

OpenMP版Linpack も動かしたが、Flops 値が、今は出せていない。



上記で使用したコンパイラ

take@raspi2% gcc -v
Using built-in specs.
COLLECT_GCC=gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc/arm-linux-gnueabihf/4.6/lto-wrapper
Target: arm-linux-gnueabihf
Configured with: ../src/configure -v --with-pkgversion='Debian 4.6.3-14+rpi1' --with-bugurl=file:///usr/share/doc/gcc-4.6/README.Bugs --enable-languages=c,c++,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.6 --enable-shared --enable-linker-build-id --with-system-zlib --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.6 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --enable-plugin --enable-objc-gc --disable-sjlj-exceptions --with-arch=armv6 --with-fpu=vfp --with-float=hard --enable-checking=release --build=arm-linux-gnueabihf --host=arm-linux-gnueabihf --target=arm-linux-gnueabihf
Thread model: posix
gcc version 4.6.3 (Debian 4.6.3-14+rpi1)






2015/FEB/27 追記

kkojimaさんのコメントにより…
gcc-4.8 に
CFLAGS = -O4 -march=armv7-a -mfpu=vfpv3-d16
で、linpack を makeし計測。

システムクロックは、1000MHzで計測。
単精度はそこはかとなく遅い気がする(700MHzでは、はっきりと遅い)。
が、倍精度は、速いようだ。
これがコンパイラの力か…
でも、単精度が遅くなったら、アカンやん…うーん

--- 1000MHz ---

take@raspi2% ./linpackc_sp
Enter array size (q to quit) [200]:
Memory required: 158K.


LINPACK benchmark, Single precision.
Machine precision: 6 digits.
Array size 200 X 200.
Average rolled and unrolled performance:

Reps Time(s) DGEFA DGESL OVERHEAD KFLOPS
----------------------------------------------------
64 0.57 87.72% 0.00% 12.28% 175786.672
128 1.15 88.70% 2.61% 8.70% 167415.891
256 2.31 88.31% 4.33% 7.36% 164286.578
512 4.60 88.91% 2.39% 8.70% 167415.844
1024 9.20 88.70% 2.83% 8.48% 167018.266
2048 18.41 88.21% 2.82% 8.96% 167815.422

Enter array size (q to quit) [200]:
Memory required: 158K.


LINPACK benchmark, Single precision.
Machine precision: 6 digits.
Array size 200 X 200.
Average rolled and unrolled performance:

Reps Time(s) DGEFA DGESL OVERHEAD KFLOPS
----------------------------------------------------
64 0.58 84.48% 6.90% 8.62% 165835.672
128 1.16 87.07% 3.45% 9.48% 167416.609
256 2.32 88.79% 3.45% 7.76% 164287.234
512 4.65 89.25% 2.80% 7.96% 164287.094
1024 9.28 88.04% 3.02% 8.94% 166425.469
2048 18.57 88.21% 3.02% 8.78% 166031.844

Enter array size (q to quit) [200]:
Memory required: 158K.


LINPACK benchmark, Single precision.
Machine precision: 6 digits.
Array size 200 X 200.
Average rolled and unrolled performance:

Reps Time(s) DGEFA DGESL OVERHEAD KFLOPS
----------------------------------------------------
64 0.58 87.93% 3.45% 8.62% 165839.250
128 1.17 86.33% 2.56% 11.11% 169024.250
256 2.32 87.50% 3.45% 9.05% 166623.000
512 4.64 88.58% 2.80% 8.62% 165836.562
1024 9.29 89.13% 1.94% 8.93% 166228.250
2048 18.57 88.37% 2.85% 8.78% 166032.328

Enter array size (q to quit) [200]: q



take@raspi2% ./linpackc_dp
Enter array size (q to quit) [200]:
Memory required: 315K.


LINPACK benchmark, Double precision.
Machine precision: 15 digits.
Array size 200 X 200.
Average rolled and unrolled performance:

Reps Time(s) DGEFA DGESL OVERHEAD KFLOPS
----------------------------------------------------
64 0.73 91.78% 1.37% 6.85% 129254.902
128 1.46 90.41% 2.05% 7.53% 130212.346
256 2.92 89.04% 2.40% 8.56% 131675.406
512 5.84 90.07% 2.91% 7.02% 129492.940
1024 11.68 89.81% 2.65% 7.53% 130212.346

Enter array size (q to quit) [200]:
Memory required: 315K.


LINPACK benchmark, Double precision.
Machine precision: 15 digits.
Array size 200 X 200.
Average rolled and unrolled performance:

Reps Time(s) DGEFA DGESL OVERHEAD KFLOPS
----------------------------------------------------
64 0.73 89.04% 4.11% 6.85% 129254.902
128 1.46 90.41% 2.74% 6.85% 129254.902
256 2.92 89.73% 3.42% 6.85% 129254.902
512 5.84 89.90% 2.74% 7.36% 129971.657
1024 11.68 89.64% 3.00% 7.36% 129971.657

Enter array size (q to quit) [200]:
Memory required: 315K.


LINPACK benchmark, Double precision.
Machine precision: 15 digits.
Array size 200 X 200.
Average rolled and unrolled performance:

Reps Time(s) DGEFA DGESL OVERHEAD KFLOPS
----------------------------------------------------
64 0.74 89.19% 4.05% 6.76% 127381.643
128 1.47 91.84% 0.68% 7.48% 129254.902
256 2.94 89.12% 3.40% 7.48% 129254.902
512 5.89 90.15% 2.55% 7.30% 128781.441
1024 11.78 89.81% 2.63% 7.56% 129136.211

Enter array size (q to quit) [200]:
Memory required: 315K.


LINPACK benchmark, Double precision.
Machine precision: 15 digits.
Array size 200 X 200.
Average rolled and unrolled performance:

Reps Time(s) DGEFA DGESL OVERHEAD KFLOPS
----------------------------------------------------
64 0.74 90.54% 1.35% 8.11% 129254.902
128 1.47 88.44% 4.08% 7.48% 129254.902
256 2.94 88.44% 3.74% 7.82% 129731.857
512 5.89 89.64% 2.89% 7.47% 129017.737
1024 11.77 89.97% 2.63% 7.39% 129017.737

Enter array size (q to quit) [200]: q


take@raspi2% gcc-4.8 -v
Using built-in specs.
COLLECT_GCC=gcc-4.8
COLLECT_LTO_WRAPPER=/usr/lib/gcc/arm-linux-gnueabihf/4.8/lto-wrapper
Target: arm-linux-gnueabihf
Configured with: ../src/configure -v --with-pkgversion='Raspbian 4.8.2-21~rpi3rpi1' --with-bugurl=file:///usr/share/doc/gcc-4.8/README.Bugs --enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.8 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.8 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --disable-libmudflap --disable-libitm --disable-libquadmath --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.8-armhf/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.8-armhf --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.8-armhf --with-arch-directory=arm --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --disable-sjlj-exceptions --with-arch=armv6 --with-fpu=vfp --with-float=hard --enable-checking=release --build=arm-linux-gnueabihf --host=arm-linux-gnueabihf --target=arm-linux-gnueabihf
Thread model: posix
gcc version 4.8.2 (Raspbian 4.8.2-21~rpi3rpi1)