トップ 差分 一覧 ソース 検索 ヘルプ PDF RSS ログイン

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

[電子工作]

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 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>>

 カテゴリ : もくしいゲームレシピコンピュータ雑文生活電子工作おいしい店マップ

                  Topページへ | もてないSNS「もくしい」