62 typedef struct __stMAILBOX {
64 struct stTask* pst_Task;
80 #define __MAIL_MSG_MAX_DATA_LEN 16 // can be no BIGGER than 16 bytes 82 typedef struct __stMAILMESSAGE {
84 uint16_t u16_FromTaskID;
86 uint32_t u32_Postmark;
97 #define ESOS_MAILMESSAGE_STRING 0x0 98 #define ESOS_MAILMESSAGE_UINT8 0x1 99 #define ESOS_MAILMESSAGE_UINT16 0x2 100 #define ESOS_MAILMESSAGE_UINT32 0x4 101 #define ESOS_MAILMESSAGE_REQUEST_ACK 0x8 104 #define __MAIL_MSG_HEADER_LEN (1+2+1+4) 105 #define __MAIL_MSG_MAX_LEN (__MAIL_MSG_HEADER_LEN+__MAIL_MSG_MAX_DATA_LEN) 108 #define MAX_SIZE_TASK_MAILBOX 5*__MAIL_MSG_MAX_LEN 119 #define ESOS_TASK_HAS_MAIL(pstTask) (__ESOS_CB_IS_NOT_EMPTY((pstTask)->pst_Mailbox->pst_CBuffer)) 129 #define ESOS_TASK_IS_WAITING_MAIL_DELIVERY(TaskHandle) IS_BIT_SET_MASK((TaskHandle)->flags, __TASK_MAILNACK_MASK) 141 #define ESOS_TASK_IVE_GOT_MAIL() ESOS_TASK_HAS_MAIL(__pstSelf) 150 #define ESOS_TASK_WAIT_FOR_MAIL() ESOS_TASK_WAIT_UNTIL(ESOS_TASK_IVE_GOT_MAIL()) 164 #define ESOS_TASK_WAIT_ON_TASKS_MAILBOX_HAS_AT_LEAST(pstTask, x) ESOS_TASK_WAIT_UNTIL(ESOS_TASK_MAILBOX_GOT_AT_LEAST_DATA_BYTES((pstTask), ((x)+__MAIL_MSG_HEADER_LEN))) 180 #define ESOS_TASK_WAIT_ON_TASKS_MAILBOX_HAS_ROOM_MESSAGE(pstTask, pstMsg) \ 181 ESOS_TASK_WAIT_ON_TASKS_MAILBOX_HAS_AT_LEAST(pstTask, __MAIL_MSG_MAX_DATA_LEN ) 191 #define ESOS_TASK_MAILBOX_GET_AVAILABLE_LEN(pstTask) ((__ESOS_CB_GET_AVAILABLE((pstTask)->pst_Mailbox->pst_CBuffer))-__MAIL_MSG_HEADER_LEN) 203 #define ESOS_TASK_MAILBOX_GOT_EXACTLY_DATA_BYTES(pstTask,x) (ESOS_TASK_MAILBOX_GET_AVAILABLE_LEN((pstTask)) == ((x)+__MAIL_MSG_HEADER_LEN)) 216 #define ESOS_TASK_MAILBOX_GOT_AT_LEAST_DATA_BYTES(pstTask, x) (ESOS_TASK_MAILBOX_GET_AVAILABLE_LEN((pstTask)) >= ((x)+__MAIL_MSG_HEADER_LEN)) 230 #define ESOS_TASK_FLUSH_TASK_MAILBOX(pstTask) __ESOS_CB_FLUSH((pstTask)->pst_Mailbox->pst_CBuffer) 232 #define ESOS_TASK_SEND_MESSAGE(pst_ToTask, pst_Msg) __esos_SendMailMessage((pst_ToTask),(pst_Msg)) 234 #define ESOS_TASK_WAIT_ON_DELIVERY(pst_ToTask, pstMsg) \ 236 (pstMsg)->u8_flags |= ESOS_MAILMESSAGE_REQUEST_ACK; \ 237 ESOS_TASK_SEND_MESSAGE((pst_ToTask),(pstMsg)); \ 238 __ESOS_SET_TASK_MAILNACK_FLAG((__pstSelf)); \ 239 ESOS_TASK_WAIT_WHILE( ESOS_TASK_IS_WAITING_MAIL_DELIVERY( __pstSelf ) ); \ 242 #define ESOS_TASK_GET_NEXT_MESSAGE(pst_Msg) __esos_ReadMailMessage(__pstSelf, (pst_Msg)) 244 #define ESOS_TASK_GET_LAST_MESSAGE(pst_Msg) \ 246 while ( ESOS_TASK_IVE_GOT_MAIL() ) { \ 247 __esos_ReadMailMessage(__pstSelf, (pst_Msg) ); \ 254 #define ESOS_IS_TASK_SENDER(hTask, stMsg) (hTask->u16_taskID==stMsg.u16_FromTaskID) 256 #define ESOS_SET_MSG_FLAGS(stMsg, flags) stMsg.u8_flags=(flags) 257 #define ESOS_SET_MSG_FROMTASK(stMsg, pstFromTask) stMsg.u16_FromTaskID=pstFromTask->u16_taskID 258 #define ESOS_SET_MSG_DATA_LENGTH(stMsg, len) stMsg.u8_DataLength=(len) 259 #define ESOS_GET_MSG_FLAGS(stMsg) (stMsg.u8_flags) 260 #define ESOS_GET_MSG_FROMTASK(stMsg) (stMsg.u16_FromTaskID) 261 #define ESOS_GET_MSG_DATA_LENGTH(stMsg) (stMsg.u8_DataLength) 262 #define ESOS_GET_MSG_POSTMARK(stMsg) (stMsg.u32_Postmark) 264 #define ESOS_SET_PMSG_FLAGS(pstMsg, flags) pstMsg->u8_flags=(flags) 265 #define ESOS_SET_PMSG_FROMTASK(pstMsg, pstFromTask) pstMsg->u16_FromTaskID=pstFromTask->u16_taskID 266 #define ESOS_SET_PMSG_DATA_LENGTH(pstMsg, len) pstMsg->u8_DataLength=(len) 267 #define ESOS_GET_PMSG_FLAGS(pstMsg) (pstMsg->u8_flags) 268 #define ESOS_GET_PMSG_FROMTASK(pstMsg) (pstMsg->u16_FromTaskID) 269 #define ESOS_GET_PMSG_DATA_LENGTH(pstMsg) (pstMsg->u8_DataLength) 270 #define ESOS_GET_PMSG_POSTMARK(pstMsg) (pstMsg->u32_Postmark) 272 #define ESOS_TASK_MAKE_MSG_EMPTY(stMsg) \ 274 ESOS_SET_MSG_FLAGS(stMsg, ESOS_MAILMESSAGE_UINT8); \ 275 ESOS_SET_MSG_FROMTASK(stMsg, __pstSelf); \ 276 ESOS_SET_MSG_DATA_LENGTH(stMsg, 0); \ 279 #define ESOS_TASK_MAKE_MSG_UINT8(stMsg, u8x) \ 281 ESOS_SET_MSG_FLAGS(stMsg, ESOS_MAILMESSAGE_UINT8); \ 282 ESOS_SET_MSG_FROMTASK(stMsg, __pstSelf); \ 283 ESOS_SET_MSG_DATA_LENGTH(stMsg, 1); \ 284 stMsg.au8_Contents[0] = (u8x); \ 287 #define ESOS_TASK_MAKE_MSG_UINT8_X2(stMsg, u8x0, u8x1) \ 289 ESOS_SET_MSG_FLAGS(stMsg, ESOS_MAILMESSAGE_UINT8); \ 290 ESOS_SET_MSG_FROMTASK(stMsg, __pstSelf); \ 291 ESOS_SET_MSG_DATA_LENGTH(stMsg, 2); \ 292 stMsg.au8_Contents[0] = (u8x0); \ 293 stMsg.au8_Contents[1] = (u8x1); \ 296 #define ESOS_TASK_MAKE_MSG_UINT8_X3(stMsg, u8x0, u8x1, u8x2) \ 298 ESOS_SET_MSG_FLAGS(stMsg, ESOS_MAILMESSAGE_UINT8); \ 299 ESOS_SET_MSG_FROMTASK(stMsg, __pstSelf); \ 300 ESOS_SET_MSG_DATA_LENGTH(stMsg, 3); \ 301 stMsg.au8_Contents[0] = (u8x0); \ 302 stMsg.au8_Contents[1] = (u8x1); \ 303 stMsg.au8_Contents[2] = (u8x2); \ 306 #define ESOS_TASK_MAKE_MSG_UINT8_X4(stMsg, u8x0, u8x1, u8x2, u8x3) \ 308 ESOS_SET_MSG_FLAGS(stMsg, ESOS_MAILMESSAGE_UINT8); \ 309 ESOS_SET_MSG_FROMTASK(stMsg, __pstSelf); \ 310 ESOS_SET_MSG_DATA_LENGTH(stMsg, 4); \ 311 stMsg.au8_Contents[0] = (u8x0); \ 312 stMsg.au8_Contents[1] = (u8x1); \ 313 stMsg.au8_Contents[2] = (u8x2); \ 314 stMsg.au8_Contents[3] = (u8x3); \ 317 #define ESOS_TASK_MAKE_MSG_AUINT8(stMsg, pau8x, len) \ 319 ESOS_SET_MSG_FLAGS(stMsg, ESOS_MAILMESSAGE_UINT8); \ 320 ESOS_SET_MSG_FROMTASK(stMsg, __pstSelf); \ 321 ESOS_SET_MSG_DATA_LENGTH(stMsg, len); \ 322 for (__u8_esos_mail_routines_dummy_uint8=0; __u8_esos_mail_routines_dummy_uint8<len; __u8_esos_mail_routines_dummy_uint8++) { \ 323 stMsg.au8_Contents[__u8_esos_mail_routines_dummy_uint8] = pau8x[__u8_esos_mail_routines_dummy_uint8]; \ 327 #define ESOS_TASK_MAKE_MSG_UINT16(stMsg, u16x) \ 329 ESOS_SET_MSG_FLAGS(stMsg, ESOS_MAILMESSAGE_UINT16); \ 330 ESOS_SET_MSG_FROMTASK(stMsg, __pstSelf); \ 331 ESOS_SET_MSG_DATA_LENGTH(stMsg, 1); \ 332 stMsg.au16_Contents[0] = (u16x); \ 335 #define ESOS_TASK_MAKE_MSG_UINT16_X2(stMsg, u16x0, u16x1) \ 337 ESOS_SET_MSG_FLAGS(stMsg, ESOS_MAILMESSAGE_UINT16); \ 338 ESOS_SET_MSG_FROMTASK(stMsg, __pstSelf); \ 339 ESOS_SET_MSG_DATA_LENGTH(stMsg, 2); \ 340 stMsg.au16_Contents[0] = (u16x0); \ 341 stMsg.au16_Contents[1] = (u16x1); \ 344 #define ESOS_TASK_MAKE_MSG_UINT16_X3(stMsg, u16x0, u16x1, u16x2) \ 346 ESOS_SET_MSG_FLAGS(stMsg, ESOS_MAILMESSAGE_UINT16); \ 347 ESOS_SET_MSG_FROMTASK(stMsg, __pstSelf); \ 348 ESOS_SET_MSG_DATA_LENGTH(stMsg, 3); \ 349 stMsg.au16_Contents[0] = (u16x0); \ 350 stMsg.au16_Contents[1] = (u16x1); \ 351 stMsg.au16_Contents[2] = (u16x2); \ 354 #define ESOS_TASK_MAKE_MSG_UINT16_X4(stMsg, u16x0, u16x1, u16x2, u16x3) \ 356 ESOS_SET_MSG_FLAGS(stMsg, ESOS_MAILMESSAGE_UINT16); \ 357 ESOS_SET_MSG_FROMTASK(stMsg, __pstSelf); \ 358 ESOS_SET_MSG_DATA_LENGTH(stMsg, 4); \ 359 stMsg.au16_Contents[0] = (u16x0); \ 360 stMsg.au16_Contents[1] = (u16x1); \ 361 stMsg.au16_Contents[2] = (u16x2); \ 362 stMsg.au16_Contents[3] = (u16x3); \ 365 #define ESOS_TASK_MAKE_MSG_UINT32(stMsg, u32x) \ 367 ESOS_SET_MSG_FLAGS(stMsg, ESOS_MAILMESSAGE_UINT32); \ 368 ESOS_SET_MSG_FROMTASK(stMsg, __pstSelf); \ 369 ESOS_SET_MSG_DATA_LENGTH(stMsg, 1); \ 370 stMsg.au32_Contents[0] = (u32x); \ 373 #define ESOS_TASK_MAKE_MSG_UINT32_X2(stMsg, u32x0, u32x1) \ 375 ESOS_SET_MSG_FLAGS(stMsg, ESOS_MAILMESSAGE_UINT32); \ 376 ESOS_SET_MSG_FROMTASK(stMsg, __pstSelf); \ 377 ESOS_SET_MSG_DATA_LENGTH(stMsg, 2); \ 378 stMsg.au32_Contents[0] = (u32x0); \ 379 stMsg.au32_Contents[1] = (u32x1); \ 383 #define PRINTF_MESSAGE(stMsg) \ 385 printf("MESSAGE u8_flags = %02X\n",ESOS_GET_MSG_FLAGS(stMsg) ); \ 386 printf(" u16_FromTaskID = %d\n",ESOS_GET_MSG_FROMTASK(stMsg) ); \ 387 printf(" u8_DataLength = %d\n",ESOS_GET_MSG_DATA_LENGTH(stMsg) ); \ 388 printf(" u32_PostMark = %d\n",ESOS_GET_MSG_POSTMARK(stMsg) ); \ 389 printf(" first byte = %d\n",stMsg.au8_Contents[0]); \ 393 extern MAILBOX __astMailbox[MAX_NUM_USER_TASKS];
394 extern uint8_t __au8_MBData[MAX_NUM_USER_TASKS][MAX_SIZE_TASK_MAILBOX];
395 extern uint8_t __u8_esos_mail_routines_dummy_uint8;
407 #define __esos_WriteMailboxUINT8(pstMB, u8x) __esos_CB_WriteUINT8((pstMB)->pst_CBuffer, (u8x) ) 410 #define __esos_ReadMailboxUINT8(pstMB, u8x) __esos_CB_ReadUINT8((pstMB)->pst_CBuffer ) 421 void __esos_ReadMailMessage(
struct stTask* pst_Task, MAILMESSAGE* pst_Message );
422 void __esos_SendMailMessage(
struct stTask* pst_RcvrTask, MAILMESSAGE* pst_Msg );
426 #endif // ESOS_MAIL_H #define __MAIL_MSG_MAX_DATA_LEN
void __esos_SendMailUint8(struct stTask *pst_Task, MAILBOX *pst_Mailbox, uint8_t *pau8_data, uint8_t u8_len)
unsigned char uint8_t
An abbreviation for an 8-bit unsigned integer.