deep-learning-from-scratch

git clone https://github.com/oreilly-japan/deep-learning-from-scratch

でソースコードを入手します。

README.mdをみると

* Python 3.x
* NumPy
* Matplotlib

が必要なのでmac portsでinstallします。
py35-matplotlibをinstallして動作を確認します。
~/.matplotlib/matplotlibrcで
backend : MacOSX
を指定します。

[~/src/Python]python3.5 simple_plot.py --verbose-helpful
machdep: class is not implemented
$HOME=/Users/isomura
matplotlib data path /opt/local/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/matplotlib/mpl-data

*****************************************************************
You have the following UNSUPPORTED LaTeX preamble customizations:

Please do not ask for support with these customizations active.
*****************************************************************

loaded rc file /Users/isomura/.matplotlib/matplotlibrc
matplotlib version 2.0.0
verbose.level helpful
interactive is False
platform is darwin
CACHEDIR=/Users/isomura/.matplotlib
font search path ['/opt/local/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/matplotlib/mpl-data/fonts/ttf', '/opt/local/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/matplotlib/mpl-data/fonts/afm', '/opt/local/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/matplotlib/mpl-data/fonts/pdfcorefonts']
terminate called after throwing an instance of 'char*'
Abort

いろいろやりましたが、ダメでした。python3.6でも同じでした。
python2.7だとmatplotlibは動きました。

[~/src/Python]python2.7 simple_plot.py --verbose-helpful
machdep: class is not implemented
$HOME=/Users/isomura
matplotlib data path /opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/mpl-data

*****************************************************************
You have the following UNSUPPORTED LaTeX preamble customizations:

Please do not ask for support with these customizations active.
*****************************************************************

loaded rc file /Users/isomura/.matplotlib/matplotlibrc
matplotlib version 2.0.0
verbose.level helpful
interactive is False
platform is darwin
CACHEDIR=/Users/isomura/.matplotlib
Using fontManager instance from /Users/isomura/.matplotlib/fontList.cache
backend MacOSX version unknown
findfont: Matching :family=sans-serif:style=normal:variant=normal:weight=400:stretch=normal:size=10.0 to DejaVu Sans (u'/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/mpl-data/fonts/ttf/DejaVuSans.ttf') with score of 0.000000

170604

追記
machdep: class is not implemented
が表示されてしまいます。原因を調べてみます。

[lib/python2.7/site-packages]grep -r machdep *
バイナリファイル numpy/core/multiarray.so に一致しました
バイナリファイル objc/_objc.so に一致しました
[lib/python2.7/site-packages]strings numpy/core/multiarray.so|grep mac
sysctl -n machdep.cpu.features | grep -q AVX
[lib/python2.7/site-packages]strings objc/_objc.so|grep mac
macroman
[lib/python2.7/site-packages]sysctl -n machdep.cpu.features
machdep: class is not implemented

multiarray.soで使っているsysctlにmachdepが無いのが原因のようです。
AVX拡張命令セットが有るかを判定しているようです。
sysctl -a hw.machine
hw.machine: Power Macintosh
なので無視しても問題ないと思います。
とりあえず出ないようにしてみます。
sudo mv /usr/sbin/sysctl /usr/sbin/sysctl.orig
にして、シェルスクリプトにします。

cat /usr/sbin/sysctl
#! /bin/sh
if [ "$2" = "machdep.cpu.features" ] 
then
	exit
fi
/usr/sbin/sysctl.orig $*

これで、machdep: class is not implementedはでなくなりました。

準備ができたので動かしてみます。

[Python/deep-learning-from-scratch/ch01]python hungry.py 
I'm hungry!
[Python/deep-learning-from-scratch/ch01]python man.py 
Initilized!
Hello David!
Good-bye David!
[Python/deep-learning-from-scratch/ch01]python simple_graph.py 
[Python/deep-learning-from-scratch/ch01]python sin_graph.py 
[Python/deep-learning-from-scratch/ch01]python sin_cos_graph.py 
[Python/deep-learning-from-scratch/ch01]python img_show.py 
[Python/deep-learning-from-scratch/ch02]python and_gate.py 
(0, 0) -> 0
(1, 0) -> 0
(0, 1) -> 0
(1, 1) -> 1
[Python/deep-learning-from-scratch/ch02]python nand_gate.py 
(0, 0) -> 1
(1, 0) -> 1
(0, 1) -> 1
(1, 1) -> 0
[Python/deep-learning-from-scratch/ch02]python or_gate.py 
(0, 0) -> 0
(1, 0) -> 1
(0, 1) -> 1
(1, 1) -> 1
[Python/deep-learning-from-scratch/ch02]python xor_gate.py 
(0, 0) -> 0
(1, 0) -> 1
(0, 1) -> 1
(1, 1) -> 0
[Python/deep-learning-from-scratch/ch03]python step_function.py 
[Python/deep-learning-from-scratch/ch03]python sigmoid.py 
[Python/deep-learning-from-scratch/ch03]python sig_step_compare.py 
[Python/deep-learning-from-scratch/ch03]python relu.py 
[Python/deep-learning-from-scratch/ch03]python3.6 neuralnet_mnist.py
Accuracy:0.9352
[Python/deep-learning-from-scratch/ch03]python3.6 neuralnet_mnist_batch.py 
Accuracy:0.9352

[Python/deep-learning-from-scratch/ch03]python3.6 mnist_show.py
Traceback (most recent call last):
  File "mnist_show.py", line 6, in 
    from PIL import Image
ModuleNotFoundError: No module named 'PIL'

mac ports で’PIL’を探してinstallします。
py36-Pillow @4.1.1 (python, devel)
Python Imaging Library (fork)
sudo port install py36-Pillow

[Python/deep-learning-from-scratch/ch03]python3.6 mnist_show.py 
5
(784,)
(28, 28)
[Python/deep-learning-from-scratch/ch04]python gradient_1d.py 
0.199999999999

[Python/deep-learning-from-scratch/ch04]python gradient_2d.py
/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/site-packages/matplotlib/axes/_axes.py:545: UserWarning: No labelled objects found. Use label='...' kwarg on individual plots.
  warnings.warn("No labelled objects found. "
D:\cygwin\home\root\src\deep-learning-from-scratch\ch04>python gradient_2d.py
C:\Users\isomura\Anaconda3\lib\site-packages\matplotlib\axes\_axes.py:545: UserWarning: No labelled objects found. Use label='...' kwarg on individual plots.
  warnings.warn("No labelled objects found. "

windowsでも同じ結果になるようです。

[Python/deep-learning-from-scratch/ch04]python gradient_method.py 
[Python/deep-learning-from-scratch/ch04]python gradient_simplenet.py 
[[ 0.44710081  0.02188944 -0.46899026]
 [ 0.67065122  0.03283417 -0.70348539]]
[Python/deep-learning-from-scratch/ch04]python two_layer_net.py 
[Python/deep-learning-from-scratch/ch04]python train_neuralnet.py 
Traceback (most recent call last):
  File "train_neuralnet.py", line 6, in 
    from dataset.mnist import load_mnist
  File "../dataset/mnist.py", line 5, in 
    raise ImportError('You should use Python 3.x')
ImportError: You should use Python 3.x
[Python/deep-learning-from-scratch/ch04]python3.6 train_neuralnet.py
terminate called after throwing an instance of 'char*'

動かないのが出てしまいました。matplotlibを使ってPython3.xを要求するのがダメです。
当然windowsなら動きます。

D:\cygwin\home\root\src\deep-learning-from-scratch\ch04>python train_neuralnet.py
train acc, test acc | 0.112366666667, 0.1135
train acc, test acc | 0.798, 0.8032
train acc, test acc | 0.8754, 0.8783
train acc, test acc | 0.898433333333, 0.9023
train acc, test acc | 0.908833333333, 0.9112
train acc, test acc | 0.915266666667, 0.9173
train acc, test acc | 0.920666666667, 0.9223
train acc, test acc | 0.92485, 0.9247
train acc, test acc | 0.928333333333, 0.9299
train acc, test acc | 0.930466666667, 0.9322
train acc, test acc | 0.935066666667, 0.9361
train acc, test acc | 0.93715, 0.9383
train acc, test acc | 0.9396, 0.9394
train acc, test acc | 0.94245, 0.9419
train acc, test acc | 0.9443, 0.9442
train acc, test acc | 0.946433333333, 0.9452
train acc, test acc | 0.9483, 0.9468

[Python/deep-learning-from-scratch/ch05]python buy_apple.py 
('price:', 220)
('dApple:', 2.2)
('dApple_num:', 110)
('dTax:', 200)
[Python/deep-learning-from-scratch/ch05]python buy_apple_orange.py 
('price:', 715)
('dApple:', 2.2)
('dApple_num:', 110)
('dOrange:', 3.3000000000000003)
('dOrange_num:', 165)
('dTax:', 650)
[Python/deep-learning-from-scratch/ch05]python layer_naive.py
[Python/deep-learning-from-scratch/ch05]python two_layer_net.py 
[Python/deep-learning-from-scratch/ch05]python3.6 train_neuralnet.py
0.081 0.0792
0.903683333333 0.9073
0.923266666667 0.9267
0.935433333333 0.9352
0.944883333333 0.9433
0.951283333333 0.9492
0.956066666667 0.9547
0.959766666667 0.9556
0.964466666667 0.9591
0.9666 0.9618
0.968883333333 0.9644
0.971683333333 0.9663
0.971233333333 0.9644
0.973433333333 0.9665
0.975616666667 0.9682
0.97765 0.9699
0.978683333333 0.9697
[Python/deep-learning-from-scratch/ch05]python3.6 gradient_check.py
W1:2.68363647145e-13
b1:9.32718058604e-13
W2:9.38517990943e-13
b2:1.21014305521e-10

この後は、動かないのが多くなりました。

[Python/deep-learning-from-scratch/ch06]python3.6 batch_norm_gradient_check.py
W1:0.0
b1:0.0
gamma1:0.0
beta1:0.0
W2:0.0
b2:0.0
gamma2:0.0
beta2:0.0507355901743
W3:0.0
b3:1.20126128489e-10
[Python/deep-learning-from-scratch/ch06]python optimizer_compare_naive.py
[Python/deep-learning-from-scratch/ch06]python weight_init_activation_histogram.py
[Python/deep-learning-from-scratch/ch07]python3.6 gradient_check.py 
W1 7.96847710054e-13
b1 8.53629631716e-13
W2 4.16094078313e-13
b2 0.000294700165544
W3 5.09735778418e-13
b3 1.20570220474e-10
[Python/deep-learning-from-scratch/ch07]python3.6 simple_convnet.py
[Python/deep-learning-from-scratch/ch08]python3.6 awesome_net.py
[Python/deep-learning-from-scratch/ch08]python3.6 deep_convnet.py

python3.6がうまく動いていないようです。

[~/src/macports]python3.6
Python 3.6.1 (default, Jun 25 2017, 10:31:32) 
[GCC 5.4.0] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 7/5
Python(94954) malloc: *** error for object 0x866e8: Non-aligned pointer being freed
*** set a breakpoint in malloc_error_break to debug
1.4
>>> Python(94954) malloc: *** error for object 0x866e0: Non-aligned pointer being freed (2)
*** set a breakpoint in malloc_error_break to debug

検索してみると、readlineに関係しているようです。

[~/src/macports]sudo port deactivate py36-readline @6.2.4.1_1
Password:
--->  Deactivating py36-readline @6.2.4.1_1
--->  Cleaning py36-readline
[~/src/macports]python3.6
Python 3.6.1 (default, Jun 25 2017, 10:31:32) 
[GCC 5.4.0] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 7/5
1.4
>>> 

readline extensionは、py36-readlineの他にpy36-gnureadlineが有ったので試してみます。

[Python/deep-learning-from-scratch/ch01]port installed py36-gnureadline py36-readline python36
The following ports are currently installed:
  py36-gnureadline @6.3.3_1 (active)
  py36-readline @6.2.4.1_1
  python36 @3.6.1_1+readline (active)

py36-gnureadlineだと大丈夫なようです。
でもまだmatplotlibを使うとエラーになってしまいます。

カテゴリー: 未分類 | コメントする

「ami:tool障害のお知らせ」について

4/3にwebページに表題のお知らせが出ましたが、その経緯です。
自動返信メール
件名: お問い合わせを受付しました
日時: 2017年4月2日 9:48:40:JST
お問い合わせ項目 ami:tool
お問い合わせの内容
ブログが昨日の夕方位から回覧も修正も出来ません。自分以外のページも回覧できません。
いつ頃回復するのでしょうか?

4/2 17:31 TEL 障害を確認して対応中であることの連絡
4/3 13:24 TEL 復旧したことの報告

4/1 10:xx ブログのコメントのメールが有るのを確認しています。
問い合わせでは夕方としていますが4/1の午後の早い時点で障害が発生していたようです。

ブログの動作は、チェックされてなくてユーザの問い合わせで障害に気づくという状態は問題があると思います。
TELでの連絡でなくmailで報告して欲しいと思います。

カテゴリー: アミクッスコム | コメントする

NASを使い始める

東芝アメリカのcanvio home 2TByteを購入しました。
ユーザ評価を読むと散々でしたが、楽天のポイント10倍が有ったので購入しました。
楽天で購入しても発送はアマゾンからでした。数日前のニュースである事は知っていましたが驚きました。

設定で躓いたので経験をメモしておきます。
1.windowsのアプリはfullをダウンロードして使うと英語表示でinstallerだと日本語表示でした。
2.user名をrootにするとloginできません。(windowsアプリで作成出来る。1度作成すると後はlogin画面になる。)
3.デフォルトユーザとして、adminがありパスワードもadmin
4.ブラウザからadminでログインして設定を工場出荷状態にする。(FAQのpdfに書いてあります)
5.ブラウザからadminでログインして初期設定をする。
6.windowsアプリを起動して新規ユーザを作成する。

4の後5をしないと共有用のフォルダが作成されなくて困りました。
結局windowsアプリはユーザを追加するのにしか使いませんでした。
USB端子にメモリを刺すと共有領域になりパソコンからアクセスできました。

ファームウエアのアップデートは、最初は予期せぬエラーが発生が出ていましたが
今は3/5までは進んでいます。3番目が200M以上の大きなファイルでした。
170402

WebUIにもファームウエアの更新が有りますが更新用のファイルをどこから入手すればいいかわかりません。

メディアサーバとしては、PS3から動画ファイルは再生できました。
静止画、音楽ファイルはPS3から見えていません。

カテゴリー: 未分類 | コメントする

楽天マガジンを使ってみました

楽天マガジンを使い始めました。
XInternalSDで外部SDに保存出来るかと試してみると
マイページのダウンロード可能サイズは外部SDのサイズを表示しますが
実際にダウンロードされるのは内部SDになってしまいます。
こんなアプリは初めてです。

追記 2017.4.18
今日のアップデートで上記問題は解決されています。
XInternalSDで楽天マガジンを有効にしても、
ダウンロード可能サイズは内部SDになっていました。
外部SDになると良かったのですが残念でした。

カテゴリー: Android | コメントする

MacPorts 2.4.0

MacPortsがアップデートされて2.4.0になったのでインストールしてみました。
10.5は問題なくインストールできましたが
10.4ではmakeでエラーになります。2.3.5まではOKでした。
spawn.hをincludeしているのですが、10.4ではありません。
10.5では、/usr/include/spawn.hにあります。

10.4では、libc++が作成出来なくてアップデートできない物が出てきていたのでそろそろ諦める時かもしれません。

カテゴリー: mac | コメントする

macportsがgitに

svn log https://svn.macports.org/repository/macports/trunk/dports/math/octave
とすると
————————————————————————
r153773 | mps@macports.org | 2016-10-11 06:40:54 +0900 (2016/10/11 (火)) | 2 lines
で最近の更新が反映されていません。
調べてみるとsvnからgitに変更されたようです。
ここ
を参考にgitを使うようにしました。

[~/src/macports]cd /opt/local/var/macports/sources/github.com/macports/macports-ports/math/octave
[macports-ports/math/octave]ls
./		../		Portfile	files/
[macports-ports/math/octave]git log Portfile
commit a099fb31427d00275534827896d84c934fe0af10
Author: Marcus Calhoun-Lopez 
Date:   Tue Dec 27 21:48:52 2016 -0700

    octave: make distributable

commit f9ab7cac0c41427968293f1fc1fadbafe3c294b0
Author: Marcus Calhoun-Lopez 
Date:   Tue Dec 20 13:50:46 2016 -0700

    octave: use older libstdc++ ABI on older system
    
    See https://trac.macports.org/ticket/53044

個別のlogや特定のバージョンの取り出しなどgitの使い方を調べないとだめなようです。

追記
特定のバージョンの取り出しは、

[macports/macports-ports/lang]git checkout aa5b79dc64405f39bc8267e398a7200db479363a sbcl/Portfile 

git checkoutに続きcommit IDを指定すればできました。
commit IDは、git logで表示されます。

sudo port -v sync
--->  Updating the ports tree
Synchronizing local ports tree from file:///opt/local/var/macports/sources/github.com/macports/macports-ports/
/opt/local/var/macports/sources/github.com/macports/macports-ports /Users/isomura/src/macports
error: cannot pull with rebase: You have unstaged changes.
error: please commit or stash them.

と変更したままだとエラーになります。

[github.com/macports/macports-ports]git status
On branch master
Your branch is up-to-date with 'origin/master'.
Changes not staged for commit:
  (use "git add ..." to update what will be committed)
  (use "git checkout -- ..." to discard changes in working directory)
	modified:   gnome/gtk3/files/patch-gdk_quartz_gdkcursor-quartz-10_6_compat.diff
	modified:   lang/sbcl/Portfile
It took 10.08 seconds to enumerate untracked files. 'status -uno'
may speed it up, but you have to be careful not to forget to add
new files yourself (see 'git help status').
no changes added to commit (use "git add" and/or "git commit -a")
[github.com/macports/macports-ports]git checkout lang/sbcl/Portfile
[github.com/macports/macports-ports]git checkout gnome/gtk3/files/patch-gdk_quartz_gdkcursor-quartz-10_6_compat.diff

変更ファイルを戻します。

カテゴリー: mac | コメントする

lwIPでping

contrib-1.4.1/apps/pingを動かしてみます。

lwipopts.h
/* socket API */
#define LWIP_TIMEVAL_PRIVATE	0

/* ping */
#define PING_USE_SOCKETS	1	//1=ping_thread
#define sys_msleep	vTaskDelay

SOCKETSを有効にするとタスク(スレッド)が生成されて実行されます。
プライオリティはとりあえず最低にしました。

LPC2388 lwIP:72000000Hz
dns_init: initializing
PHYInit:0
PHYInit:1
PHYInit:2
PHYInit:3
PHYInit:4
PHYInit:5 6
LWIP_PLATFORM_ASSERT:reply wasn't freed
IP:192.168.11.10
GW:192.168.11.1
netmask:255.255.255.0
web server start:7fd02080
l
UART            R       1       205     6
IDLE            R       0       100     7
LEDx            B       2       92      3
LEDx            B       2       92      2
LEDx            B       2       92      4
tcpip_thread    B       6       141     1
NET             B       3       108     5
ETH_INT         B       5       243     8

ping
ping: send 192.168.11.1
ping: recv 192.168.11.1 0 ms
l
UART            R       1       124     6
IDLE            R       0       100     7
ETH_INT         B       5       243     8
LEDx            B       2       92      2
ping_thread     B       1       106     9
LEDx            B       2       92      3
LEDx            B       2       92      4
NET             B       3       108     5
tcpip_thread    B       6       141     1

ping: send 192.168.11.1
ping: recv 192.168.11.1 0 ms

無事動きました。

カテゴリー: ARM | コメントする

lwIPでDNS

lwIPでDNSを試しています。
すでに書いたように手動でIPアドレスを割り当てると問題なく動きます。

dns_enqueue: "ntp.jst.mfeed.ad.jp": use DNS entry 0
dns_send: dns_servers[0] "ntp.jst.mfeed.ad.jp": request
udp_connect: connected to 0.0.0.0,port 49153
udp_send
udp_send: added header in given pbuf 0x40001400
udp_send: sending datagram of length 45
udp_send: UDP packet length 45
udp_send: UDP checksum 0x78cf
udp_send: ip_output_if (,,,,IP_PROTO_UDP,)
ip_output_if: en1
IP header:
+-------------------------------+
| 4 | 5 |  0x00 |        65     | (v, hl, tos, len)
+-------------------------------+
|        0      |000|       0   | (id, flags, offset)
+-------------------------------+
|  255  |   17  |    0xdf8f     | (ttl, proto, chksum)
+-------------------------------+
|  192  |  168  |   11  |  100  | (src)
+-------------------------------+
|    8  |    8  |    8  |    8  | (dest)
+-------------------------------+
netif->output()ip_input: iphdr->dest 0x640ba8c0 netif->ip_addr 0x640ba8c0 (0xba8c0, 0xba8c0, 0x64000000)
ip_input: packet accepted on interface en
ip_input:
IP header:
+-------------------------------+
| 4 | 5 |  0x00 |       113     | (v, hl, tos, len)
+-------------------------------+
|    63433      |000|       0   | (id, flags, offset)
+-------------------------------+
|   60  |   17  |    0xaa96     | (ttl, proto, chksum)
+-------------------------------+
|    8  |    8  |    8  |    8  | (src)
+-------------------------------+
|  192  |  168  |   11  |  100  | (dest)
+-------------------------------+
ip_input: p->len 113 p->tot_len 113
udp_input: received datagram of length 93
UDP header:
+-------------------------------+
|        53     |     49153     | (src port, dest port)
+-------------------------------+
|        93     |     0x2a65    | (len, chksum)
+-------------------------------+
udp (192.168.11.100, 49153) <-- (8.8.8.8, 53)
pcb (0.0.0.0, 49153) --- (8.8.8.8, 53)
udp_input: calculating checksum
dns_recv: "ntp.jst.mfeed.ad.jp": response = 210.173.160.57

DHCPでIPアドレスを割り当てると駄目です。

dns_enqueue: "ntp.jst.mfeed.ad.jp": use DNS entry 0
dns_send: dns_servers[0] "ntp.jst.mfeed.ad.jp": request
udp_bind(ipaddr = 0.0.0.0, port = 0)
udp_bind: bound to 0.0.0.0, port 49154
udp_connect: connected to 0.0.0.0,port 49154
udp_send
udp_send: added header in given pbuf 0x400015cc
udp_send: sending datagram of length 45
udp_send: UDP packet length 45
udp_send: UDP checksum 0xd1cf
udp_send: ip_output_if (,,,,IP_PROTO_UDP,)
ip_output_if: en1
IP header:
+-------------------------------+
| 4 | 5 |  0x00 |        65     | (v, hl, tos, len)
+-------------------------------+
|        2      |000|       0   | (id, flags, offset)
+-------------------------------+
|    0  |   17  |    0xdee8     | (ttl, proto, chksum)
+-------------------------------+
|  192  |  168  |   11  |   10  | (src)
+-------------------------------+
|    8  |    8  |    8  |    8  | (dest)
+-------------------------------+
netif->output()ip_input: iphdr->dest 0xa0ba8c0 netif->ip_addr 0xa0ba8c0 (0xba8c0, 0xba8c0, 0xa000000)
ip_input: packet accepted on interface en
ip_input:
IP header:
+-------------------------------+
| 4 | 5 |  0x00 |        56     | (v, hl, tos, len)
+-------------------------------+
|     5215      |000|       0   | (id, flags, offset)
+-------------------------------+
|   64  |    1  |    0xcf0a     | (ttl, proto, chksum)
+-------------------------------+
|  192  |  168  |   11  |    1  | (src)
+-------------------------------+
|  192  |  168  |   11  |   10  | (dest)
+-------------------------------+
ip_input: p->len 56 p->tot_len 56

送信先IPアドレスは正しいですが、TTL=0になっているのでデフォルトGWが応答しているようです。

カテゴリー: ARM | コメントする

FreeRTOSのスタックサイズ

FreeRTOS+lwIPで動かしていますが安定して動きません。
動かし始めてしばらくするとpingに応答を返さくなったりします。
heapの不足はLEDで表示するようにしたのでタスク毎のスタックの使用量を調べてみます。

FreeRTOSConfig.h
#define configUSE_TRACE_FACILITY	1		//vTaskList
#define configUSE_STATS_FORMATTING_FUNCTIONS	1	//vTaskList

uart初期化
    xUARTQueue = xQueueCreate(RBUFSIZE, sizeof(unsigned char));
uart受信割り込み
	    while (U0LSR & 0x01) {	/* Get all data in the Rx FIFO */
		c = U0RBR;
		xHigherPriorityTaskWoken = pdFALSE;
		xQueueSendToBackFromISR(xUARTQueue, &c, &xHigherPriorityTaskWoken);
	    }
uartタスク
void uartTask(void *pvParameters)
{
    int c;
    unsigned char d;
    while (1) {
	while (xQueueReceive(xUARTQueue, &d, portMAX_DELAY) != pdPASS);
	c = (int)d;
	uart_send(c);	//エコーバック
	if(c == 'l'){
	    vTaskList( pcWriteBuffer );
	    printf("\n%s\n", pcWriteBuffer);
	}
#ifdef USE_RTC
	if(c == 't'){
	    printf("\n");
	    print_time();
	}
#endif	//USE_RTC
    }
}

uartタスクを追加してキー入力でvTaskListを呼びだします。
元々uartの受信割り込みではリングバッファに書き込んでいたのをキューを使うように変更しました。
実行すると

PHYInit:5 6
LWIP_PLATFORM_ASSERT:reply wasn't freed
IP:192.168.11.10
web server start:7fd036d8
sntp_set_system_time:Sat Jan  7 13:26:55 2017
12345l
UART            R       1       463     6
IDLE            R       0       100     7
LEDx            B       2       92      3
LEDx            B       2       92      2
LEDx            B       2       92      4
tcpip_thread    B       6       907     1
NET             B       3       357     5
ETH_INT         B       5       316     8

l
UART            R       1       378     6
IDLE            R       0       100     7
ETH_INT         B       5       316     8
tcpip_thread    B       6       907     1
LEDx            B       2       92      3
LEDx            B       2       92      4
NET             B       3       357     5
LEDx            B       2       92      2

この結果からスタックサイズを修正しましたが動作に変化はありませんでした。
もう一つオーバーフローを検出時にフックする関数を定義してみましたが異常は検出できませんでした。

FreeRTOSConfig.h
#define configCHECK_FOR_STACK_OVERFLOW		1	//vApplicationStackOverflowHook

#if(  configCHECK_FOR_STACK_OVERFLOW > 0 )
void vApplicationStackOverflowHook( TaskHandle_t xTask, char *pcTaskName )
{
    LED7_SetLED(0x70+xTask);
    printf("vApplicationStackOverflowHook:[%d]%s\n",xTask, pcTaskName);
}
#endif

追記
表示されている数字はスタックの使用量でなく空き容量でした。
従って余裕が十分あります。

カテゴリー: ARM | コメントする

FreeRTOSのMemMang

heap_1 – the very simplest, does not permit memory to be freed
heap_2 – permits memory to be freed, but not does coalescence adjacent free blocks.
heap_3 – simply wraps the standard malloc() and free() for thread safety
heap_4 – coalescences adjacent free blocks to avoid fragmentation. Includes absolute address placement option
heap_5 – as per heap_4, with the ability to span the heap across multiple non-adjacent memory areas

になっています。FreeRTOS/Demoのソースを見るとheap_2.cを使っています。
libcのmallocが問題なければheap_3.cでいいように思います。
どれを使ってもheapが不足した事を知るために
FreeRTOSConfig.h
#define configUSE_MALLOC_FAILED_HOOK 1
にしてvApplicationMallocFailedHookを作成します。

#if configUSE_MALLOC_FAILED_HOOK
void vApplicationMallocFailedHook( void )	//malloc error発生時
{
    LED7_SetLED(0x60);
}
#endif

で7segLEDでエラーの発生が分かるようにしています。
heap_2.c, heap_4.cではheapを配列で確保します。
#define configAPPLICATION_ALLOCATED_HEAP 1
にすると自分で確保する場所を指定できます。

#if( configAPPLICATION_ALLOCATED_HEAP == 1 )
__attribute__((section(".usbram")))
uint8_t ucHeap[ configTOTAL_HEAP_SIZE ];
#endif

この場合は、USBメモリ空間を指定しています。
heap_4.c heap_5.cでは、
#define configSUPPORT_DYNAMIC_ALLOCATION 1
にしないとコンパイルできません。
2,3,4ではlwIPが動作しましたが、heap_5.cを使うと起動してすぐLEDに60が表示されます。

heap_5.cを使うには

HeapRegion_t xHeapRegions[] = {
	{ ( uint8_t * ) 0x7FD00000UL, 16*1024 }, 
	{ NULL, 0 }
};
    vPortDefineHeapRegions( xHeapRegions );

を追加すれば、lwIPもうごきました。
メモリはUSBメモリを指定しています。heap_4.cとの違いは複数のエリアを指定できることでしょうか。

カテゴリー: ARM | コメントする