Propeller C Tutorials - Simple Protocols ~ Multicore Approaches
引き続きプロペラチップでC言語の勉強。
次の単元がSimple Protocolsで色々外部機器と情報をやりとりするためのノウハウ。とりあえず今は斜め読み。例題にあるのがいわゆるシリアル通信とSPI、I2Cでライブラリがあるので簡単そう。
次が8コアマイコンであるプロペラチップならではの複数のコアをコントロールするための話。
サンプルはこんな感じ。
/* Cog Info Exchange.c Example of two cogs exchanging information with a volatile global variable. The main function in cog 0 changes the value; and it affects the blink function's rate running in cog 1. http://learn.parallax.com/propeller-c-multicore-approaches */ #include "simpletools.h" // Library include void blink(); // Forward declaration int *cog; // For storing process ID volatile int dt; // Declare dt for both cogs int main() // Main function { dt = 100; // Set value of dt to 100 cog = cog_run(blink, 128); // Run blink in other cog pause(2000); // Let run for 2 s dt = 50; // Update value of dt pause(2000); // New rate for 2 s cog_end(cog); // Stop the cog } void blink() // Function for other cog { while(1) // Endless loop { high(26); // LED on pause(dt); // ...for dt ms low(26); // LED off pause(dt); // ...for dt ms } }
以前の例では関数に引数を渡したけれど、引数や戻り値がない場合は、cog_runでコアを起動し、cog_stopで停止ができる。起動時には実行する関数とそれに必要なスタックを渡す必要があって、最低でも10は必要とのこと。またcog_runの戻り値が動いたコアの番号を返すので、cog_stopにそれを渡してやれば停止させる。
cog_runで起動していてもグローバル関数に対しては全てのコアから参照できるので、上の例dでは変数dtを使ってコア間でデータのやりとりをしている。
チュートリアル自体はやさしい英語で凄く判りやすいのだが、C言語自体の知識不足で他のサイトを参照。当初「お気楽〜」を副読本に、と思ったのだけれど、このサイトはC言語でのプログラムの組み方は詳しいけど、自分のようなC言語そのものを知りたい人にはちょっと高度だったかも。なのでいくつかサイトをググって基礎知識を補填して、なんとなく流していた関数宣言時の修飾子、staticとvolatileについて理解。