GR-PeachのRtosで 2つのスレッドとメールを試す

 
 GR-PeachのRtosで 2つのスレッドとメールを試しました。
 私にとってRtosは、高い存在でしたが、mbedのRtosにチャレンジします。

 チャレンジしたのはよいのですが、ドキュメントが少なく困ってしまいした。

●プログラム構成とボード

 試したプログラムは、mbedのホームページに有るサンプルプログラム「rtos_mail」をベースに、2つ目のスレッドを追加したもので、構成を次に図示します。
 プログラム構成は、1秒毎にメッセージを発行するスレッドと、5秒毎にメッセージを発行するスレッドと、メイン関数です。メッセージは、スレッド毎に別々のメールを使って送信します。メイン関数は、2つのメールの状況を調べ、受信してればその内容をパソコンに送信します。

 下の方の写真は、mbedのホームページに有るメールの説明や、コンパイラーでのプログラム構成の表示や、ハードウエアです。



 



 


 


 



 

●実行結果

 プログラムを実行した結果を次に示します。

 メッセージAは1秒毎に、メッセージBは5秒毎に発行されています。


 

●プログラムの内容

 「main.cpp」のプログラムを次に示します。


// rtos_mail_2thread.cpp

#include "mbed.h"
#include "rtos.h"

/* Mail */
typedef struct {
uint32_t cntr_2; /* A counterX2 valu */
uint32_t counter; /* A counter value */
} mail_t2;

typedef struct {
float voltage; /* AD result of measured voltage */
float current; /* AD result of measured current */
uint32_t counter; /* A counter value */
} mail_t;

Mail<mail_t2, 16> mail_box2;
Mail<mail_t, 16> mail_box;

/* sed2_thread */
void sed2_thread (void const *args) {
uint32_t i = 0;
while (true) {
i++; // fake data update
mail_t2 *mail2 = mail_box2.alloc();
mail2->cntr_2 = i * 2;
mail2->counter = i;
mail_box2.put(mail2);
osDelay(5000);
}
}

void send_thread (void const *args) {
uint32_t i = 0;
while (true) {
i++; // fake data update
mail_t *mail = mail_box.alloc();
mail->voltage = (i * 0.1) * 33;
mail->current = (i * 0.1) * 11;
mail->counter = i;
mail_box.put(mail);
Thread::wait(1000);
}
}

int main (void) {
Thread thread(send_thread);
Thread thread2(sed2_thread);

while (true) {
osEvent evt = mail_box.get(1);
if (evt.status == osEventMail) {
mail_t *mail = (mail_t*)evt.value.p;
printf("\nVoltage: %.2f V\n\r" , mail->voltage);
printf("Current: %.2f A\n\r" , mail->current);
printf("Number of cycles: %u\n\r", mail->counter);

mail_box.free(mail);
}

osEvent evt2 = mail_box2.get(1);
if (evt2.status == osEventMail) {
mail_t2 *mail2 = (mail_t2*)evt2.value.p;
printf("Current: %.4d " , mail2->cntr_2);
printf("Number of cycles: %u\n\r", mail2->counter);

mail_box2.free(mail2);
}
}
}




ホームへ戻る