トップ 一覧 検索 ヘルプ RSS ログイン

XMOS の XS1-G4,L1 であそぶ - その3の変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
{{category 電子工作}}

!!!XMOS の XS1-G4,L1 であそぶ - その3

!!テスト基板 XC-1,XC-2,XK-1 などで遊んで気がついたことのメモを書いていきます。

!!!Stack available: FAILED って? (9.9.0)

ちょっと不親切なメッセージですが、「メモリが足らない時」に出ます。
コードもデータもコアあたり 64KB 共有なので、
メモリがスタック領域まで行くと、

 Constraint check for node 0, core 0:
   Stack available:  <00000000,   used: 00000008 .  FAILED
   Threads available:        8,   used:        3 .  OKAY
   Timers available:        10,   used:        2 .  OKAY
   Chanends available:      32,   used:        0 .  OKAY

のようにおこられます。
メモリを使いすぎていないか、見直しましょう。

!!!chan と streaming chan (9.9.0 & XS1-L1)

chan は完全同期で、受け取り側が入力待ちでないとブロックします。一方、streaming chan はバッファを持っており、非同期でデータを受け渡せます。

引き取り側がいないときのバッファに先行して押し込めるデータ数は、下記の実験によると、2ワード(8 バイト)までです。

実験プログラム

 #include <xs1.h>
 #include <platform.h>
 #include <print.h>
 
 void produce(streaming chanend c)
 {
 	int i=0 ;
 	while(1) {
 		c <: i ;
 		printintln(i) ;
 		i++ ;
 	}
 }
  
 void consume(streaming chanend c)
 {
 	int i=0 ;
 	while(1){
 		i++ ;
 	}
 }
 
 int main(void)
 {
 	streaming chan c ;
 	
 	par {
 		produce(c) ;
 		consume(c) ;
 	}
 	return 0;
 }

 このプログラムの出力

 0
 1

 で停止します。
 produce の c にデータを喰わせる箇所を

 c <: (unsigned) i ;
 c <: (unsigned char) i ;
 ※2013/1 (unsigned) から (unsigned char) に訂正

 とすると、0...7 で停止します。


 余談ですが、streaming channel で 32bit を下回るデータを取り扱う表現を select 内で使うと、Exception で落ちることがあります。

 現バージョン(9.9.0)の開発環境が吐くコードのせいかと思いがちですが、どうも仕様のようで、資料にそれらしき記述があります。ただし、こちらには "in the guard of a select statement." と限定的に書いてありますので、私が経験した Exception とは違う可能性もあります。

Programming XC on XMOS Devices (2009/09/24 版) から引用
 
 C.4 Channel Communication
 
  On some revisions of the XS1 architecture, it is not possible to input
 data of size less than 32 bits from a streaming channel in the guard
 of a select statement.

 32bit 以下のデータをやりとりしていて、どうもうまくいかなかったら、デバッガでその箇所でとまっていないか、32bit 型にするとうまく動いたりしないか、試してみるといいと思います。

!!!streaming chan への出力がブロックするかどうかを知る(9.9.0)

チャンネルからの入力待ちは select で行えますが、出力してもブロックしないかどうかは出力方向には select が使えないので、わかりません。
逆方向の通信が空いているときは、下記の例のように、受ける側であらかじめ入力できることを通知することで、出力可能検査を入力待ちの select に変換することができます。

[参考]http://www.xmoslinkers.org/forum/viewtopic.php?f=6&t=617

 void consume( streaming chanend c )
 {
    unsigned v;
    const unsigned ready = 0xff;
       
    while (1)
    {
       c <: ready; //ready to receive more
       c :> v; // get data now
       delay(100); // sample processing delay
    }
 }
 
 void produce( streaming chanend c )
 {
    unsigned v = 100;
        
    while(1)
    select
    {
    case c :> int:
       c <: v;
       printstrln("Send");
       break;
    default:
       /* put into buffer */
       printstrln("buffer");
       break;
    }
 }

!!!xflash がエラーになることがある(9.9.1)

「その2」で解説した、2つの XS1-L1(XK1) を接続する .XN ファイルを含むコードが、9.9.1 に含まれる xflash のエラーで SPI メモリに焼けないことがあるようです。

具体的には以下のようなエラーで止まってしまいます。

 portDeclsXC_a04656:32: error: use of `deviceSpecs' violates parallel usage rules
 portDeclsXC_a04656:28: error: previously used here (bytes 0..420)
 portDeclsXC_a04656:28: error: previously used here (bytes 0..420)
 Error: F03010 Failed to compile flasher app.

XMOS のサポートの方にエラー報告済みです(09/12/7)。
確認していただいたようですので、次のバージョンでは改善されているかと思います(・∀・)

!!! XS1-G と L の違い:I/Oの内蔵抵抗について

いままで気にしなかったのですが、ふとスイッチを外付けしたときに、横着して G と同様に内蔵プルアップ(ライブラリにポートに対する操作が存在する)を使おうとして、初めて気づきました。

ライブラリリファレンスの set_port_pull_up() の項より引用

 On XS1-L devices no pull-up resistors are available 
 and an exception will be raised if 
 set_port_pull_up() is called. 

逆に、L には G には存在しない内蔵プルダウンがあるようです。ライブラリリファレンスの set_port_pull_down() の項より引用

 On XS1-G devices no pull-down resistors are 
 available and an exception will be raised if 
 set_port_pull_down() is called.

注意すべき点は、L で pull_up をしようとしたり、G で pull_down をしようとすると Exception が発生=プログラムが停止します。これはデバッガで動かしていないとなかなか気づかないので、要注意です。

----

<<XMOS の XS1-G4 であそぶ - その2 | XMOS の XS1-G4,L1 であそぶ - その4>>