月別アーカイブ: 2017年1月

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++が作成出来なくてアップデートできない物が出てきていたのでそろそろ諦める時かもしれません。

追記 2018. 4.26
MacPorts-2.4.3は無事インストールできました。
sudo port -v syncでエラーが出ていましたが
Ports failed: 0
で終了しました。

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

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

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

無事動きました。

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が応答しているようです。

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

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

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との違いは複数のエリアを指定できることでしょうか。