Purpose: Simple application example with 2 threads communicating 5-byte buffers through a Mail event-object.

Dependencies:   IHM_V2

Fork of mbed-os-example-mbed5-blinky by mbed-os-examples

/media/uploads/jacquesolivierklein/mbed-os-mail-5-bytes-tx-rx.png

Purpose: Simple application example with 2 threads communicating 5-byte buffers through a Mail event-object. Target: L432KC / Nboard (from IUT-Cachan) Tested: YES (2019-01-09) Author: Jacques-Olivier Klein - IUT de CACHAN Date: 2018-02-10 rev. 2019-01-09 OS_STACK_SIZE=4096 Libraries: mbed-os rev5345:c966348(03jan2019) + IHMV2 (from IUT-Cachan) rev6:ad91067

main.cpp

Committer:
jacquesolivierklein
Date:
2018-02-11
Revision:
28:9a6aff2af525
Parent:
27:da71f99ce831
Child:
29:e8a6f4ab0fd5

File content as of revision 28:9a6aff2af525:

// Title: mbed-os-mail-5-Bytes-tx-rx
// Author: Jacques-Olivier Klein - IUT de CACHAN
// Date: 2018-02-10

#include "mbed.h"
#include "IHM.h"

#define MY_MAIL_BUFFER_SIZE 5
#define MY_MAIL_NBER_OF_BUFFER 4

typedef  struct{
    char message [MY_MAIL_BUFFER_SIZE] ;
} Mail_Buffer_T; 

IHM ihm; 

DigitalOut L0 (PB_3) ;  // led L0
DigitalOut L1 (PA_7) ;  // led L1
DigitalOut L2 (PA_6) ;  // led L2

void TxMail  ();
void RxMail  ();

Mail<Mail_Buffer_T, MY_MAIL_NBER_OF_BUFFER> my_mail_box;

Thread Thread_TxMail;
Thread Thread_RxMail(osPriorityNormal,500);

Semaphore mysemaphore(0); 

int main(void) 
{   ihm.LCD_clear();
    ihm.LCD_printf("Mail-5B-tx-rx-%s %s",__DATE__,__TIME__);
    printf("\n\rmbed-os-mail-5-Bytes-tx-rx-%s %s\n\r",__DATE__,__TIME__);
    printf("DEFAULT_STACK_SIZE:%d\n\r", DEFAULT_STACK_SIZE); 

    Thread_TxMail.start(TxMail); 
    Thread_RxMail.start(RxMail); 
      
    while(1){
        Thread::wait(3000);  
        L0=!L0;
        printf("M     [pid-%d]Main \n\r",Thread::gettid());
    }
}

void TxMail  (){
    Mail_Buffer_T * p_buffer;
    char c = '!';
    int i;
    while(1){
        p_buffer = (Mail_Buffer_T *) my_mail_box.alloc();
        for(i=0;i<MY_MAIL_BUFFER_SIZE-1;i++){
            p_buffer->message[i]=c++; 
            if (c=='}')c='!'; 
        }
        p_buffer->message[MY_MAIL_BUFFER_SIZE-1]=0;
        printf("   T  [pid-%d]TxMail:<%s>\n\r",Thread::gettid(),p_buffer->message);
        my_mail_box.put(p_buffer);
        L1 = ! L1;
        Thread::wait(1000);
    }    
}

void RxMail (){
    Mail_Buffer_T * p_mail_buffer;
    Mail_Buffer_T local_buffer;
    while(1){
        osEvent evt = my_mail_box.get();
        L2 = ! L2;
        p_mail_buffer = (Mail_Buffer_T *)evt.value.p;      
        memcpy ( &local_buffer,p_mail_buffer, MY_MAIL_BUFFER_SIZE); 
        my_mail_box.free(p_mail_buffer);
        printf("     R[pid-%d]RxMail:<%s>\n\r",Thread::gettid(),local_buffer.message);
    }    
}