This example describes how to use mailbox in CORTEX-M4.We have used Cortex m4 development board
Procedure for mailbox using Cortex m4
- Initialize UART0 @9600 baud rate
- Create a Send Task and a receive Task
- Compose and send the mailbox data using send task
- Discard send task and free-up memories
- Retrieve the messages using receive task
Mailbox using Cortex M4-C Source code
#include <RTL.h> /* RTX kernel functions & defines */#include <LPC407x_8x_177x_8x.h>
#include "uart0.h"
OS_TID tsk1; /* assigned identification for task 1 */OS_TID tsk2; /* assigned identification for task 2 */
typedef struct { /* Message object structure */ int voltage; /* AD result of measured voltage */ int current; /* AD result of measured current */ U32 counter; /* A counter value */} T_MEAS;
os_mbx_declare (MsgBox,16); /* Declare an RTX mailbox */_declare_box (mpool,sizeof(T_MEAS),16); /* Dynamic memory pool */
__task void send_task (void);
__task void rec_task (void);
unsigned char str[6];
/*----------------------------------------------------------------------------
* Task 1: RTX Kernel starts this task with os_sys_init (send_task)
*---------------------------------------------------------------------------*/__task void send_task (void) {
T_MEAS *mptr;
tsk1 = os_tsk_self (); /* get own task identification number */ //2. Create receive Task
tsk2 = os_tsk_create (rec_task, 0); /* start task 2 */ os_mbx_init (MsgBox, sizeof(MsgBox)); /* initialize the mailbox */ os_dly_wait (5); /* Startup delay for MCB21xx */
//3.Compose a mail of data
mptr = _alloc_box (mpool); /* Allocate a memory for the message */ mptr->voltage = 223; /* Set the message content */ mptr->current = 17;
mptr->counter = 1207;
os_mbx_send (MsgBox, mptr, 0xffff); /* Send the message to the mailbox */ os_dly_wait (100);
mptr = _alloc_box (mpool);
mptr->voltage = 227; /* Prepare a 2nd message */ mptr->current = 12;
mptr->counter = 1708;
os_mbx_send (MsgBox, mptr, 0xffff); /* And send it. */ os_tsk_pass (); /* Cooperative multitasking */ os_dly_wait (100);
mptr = _alloc_box (mpool);
mptr->voltage = 229; /* Prepare a 3rd message */ mptr->current = 11;
mptr->counter = 2371;
//3. Send the Mail of data
os_mbx_send (MsgBox, mptr, 0xffff); /* And send it. */ os_dly_wait (100);
//4. Discard the send task
os_tsk_delete_self (); /* We are done here, delete this task */}
/*----------------------------------------------------------------------------
* Task 2: RTX Kernel starts this task with os_tsk_create (rec_task, 0)
*---------------------------------------------------------------------------*/__task void rec_task (void) {
T_MEAS *rptr;
//5. Retrieve the mail of data and display it in UART
for (;;)
{
os_mbx_wait (MsgBox, (void **)&rptr, 0xffff); /* wait for the message */ UART0_puts((unsigned char *)"\r\nVoltage:");
itoa(rptr->voltage,str);
UART0_puts(str);
UART0_puts((unsigned char *)"\r\nCurrent:");
itoa(rptr->current,str);
UART0_puts(str);
UART0_puts((unsigned char *)"\r\nNumber of cycles:");
itoa(rptr->counter,str);
UART0_puts(str);
_free_box (mpool, rptr); /* free memory allocated for message */ }
}
/*----------------------------------------------------------------------------
* Main: Initialize and start RTX Kernel
*---------------------------------------------------------------------------*/int main (void)
{
//1. Initialize Serial Port
init_serial(); /* initialize the serial interface */ _init_box (mpool, sizeof(mpool), /* initialize the 'mpool' memory for */ sizeof(T_MEAS)); /* the membox dynamic allocation */ //2. Create and Initialize the Send Task
os_sys_init (send_task); /* initialize and start task 1 */}
/*----------------------------------------------------------------------------
* end of file
*---------------------------------------------------------------------------*/
Leave a Comment