I’m loser, baby.

So why don't you kill me?

Propeller C Tutorials - Simple Circuits ~ Functions

今日も朝にざっと訓練校向けの勉強をして、その後、またPropeller Cの勉強。

昨日は簡単なプログラムで、今日は簡単な回路、センサー、ロボットと続くけれど、とりあえず手持ちのボードで試すことができる回路の前半だけやってみる。LEDチカチカと矩形波の音出し。

実はシンプルとは謳っているけどsimpletools.hは結構なんでも用意してあって、回路関係ならば関数呼び出しでそのまま使えてしまう。音なんかも簡単に出てしまった。ただ例題では1bitサウンドの矩形波なので今の段階では凝ったことはやってない。

センサーは全く手持ちが無いので斜め読みするだけだけど、一般的なセンサーなどはライブラリが用意してあるので、インクルードすれば他の作例と同じくらい簡単に制御できてしまう。へー。

ロボットはそれこそ全く準備がないので飛ばして読む。

で、C言語そのものの話題に戻ってきて、関数の話。いよいよってところですか。

 

ここで目が疲れてきてしまったので、お昼の後に奥さんと熊本駅まで散歩しつつ、駅前のビルにある図書館へ。 

熱血!アセンブラ入門

熱血!アセンブラ入門

 

とかがあったので判んないなりに読んでみる。本の趣旨も判らないなりにざっくりアセンブラを読んでみよう、なんとなく判ってくるから、ってことなので間違っていないと思う。 

 

夕方から熊本駅〜白川沿いをブラブラして、帰宅後みんなで素麺で晩御飯の後に勉強再開。

プログラム経験ゼロではないので、特に判らないこともなく、スルスル進む。

関数の最後にマルチコアCPUならではの話が出てきたので念入りに読む。

とりあえず以下がサンプル。

/*
  Multicore Example.c
 
  Launch a function into another cog (processor) and display what it does
  to the global n variable over time.
*/

#include "simpletools.h"                      // Include simpletools

void adder(void *par);                        // Forward declaration

static volatile int t, n;                     // Global vars for cogs to share
unsigned int stack[40 + 25];                  // Stack vars for other cog

int main()                                    // main function
{
  t = 50;                                     // Set values of t & n
  n = 5000;

  // Launch adder function into another cog (processor).
  cogstart(&adder, NULL, stack, sizeof(stack));

  // Watch what the other cog is doing to the value of n.
  while(1)
  {
    print("n = %d\n", n);                     // Display result
    pause(100);                               // Wait 1/10 of a second    
  }    
}

// Function that can continue on its
// own if launched into another cog.
void adder(void *par)                         // adder keeps going on its own
{
  while(1)                                    // Endless loop
  {
    n = n + 1;                                // n + 1 each time loop repeats
    pause(t);                                 // Wait for t ms between updates
  }                            
}

propellerではマルチコアのコアをcog(歯車の歯)と読んでいて、1チップの中に0から7までのcogがある。mainの関数はcog0で実行されて、cog0は他のcogに関数の実行を指示できる。

cog0以外で実行される関数はそれ用の宣言があるようだけれど、このadder関数の例では引数も戻り値もないので

void adder(void *par);                        

と宣言される。

その際、グローバル変数であればどのcogで実行されている関数からも触ることができて、

static volatile int t, n;

で宣言する。

そして、その他のcog用にスタックを符号なし整数の配列の形で用意する必要があって、1個起動する毎に40、そしてそのcogが利用するためのスタックも用意する。

 

この例ではメインのルーチンをcog0、adder関数をcog1が実行していて、cog1の起動はsimpletools.hに用意されているcogstart関数で行う。引数は順番に担当する関数、その引数、cog用のスタックとその配列のサイズ、となる。

どの基本的に空いているcogに関数が割り当てられていくのだがcogstart関数の戻り値が割り当てられたcogの番号になるので、これで参照することが出来る。

 

とまあ、ここまで書いてきたのですが、他のマルチコア対応のC言語と違うのか同じなのかも判らず書いてます。自分の理解確認用ということでゴメンナサイ。

でも恐らく他の開発環境に比べて凄く簡単なのではないのだろうか。