Task class is an implementation of mail driven thread, for it makes to use Thread and Mail classes in mbed-rtos library easier.

Dependents:   mail_driven_task_example

It makes simple to implement asynchronous processing between threads. Task class is an implementation of mail driven thread, for it makes to use Thread and Mail classes in mbed-rtos library easier.

The example of the use of this library, please refer to the following program.

Import programmail_driven_task_example

Simple example of the use of mail_driven_task library

Committer:
mzta
Date:
Mon Dec 22 01:06:33 2014 +0000
Revision:
0:0c5255720d77
Child:
1:381a6f6263c7
Initial commit.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mzta 0:0c5255720d77 1 #include "Task.h"
mzta 0:0c5255720d77 2
mzta 0:0c5255720d77 3 Timer Task::clock;
mzta 0:0c5255720d77 4 Task **Task::taskTable;
mzta 0:0c5255720d77 5 TaskConfig *Task::taskConfig;
mzta 0:0c5255720d77 6
mzta 0:0c5255720d77 7 Stream *Task::Logger::sci = new Serial(USBTX, USBRX);
mzta 0:0c5255720d77 8 LogLevel Task::Logger::lv = LOG_WARN;
mzta 0:0c5255720d77 9 const char *Task::Logger::lvSym[] = {"D", "I", "W", "E"};
mzta 0:0c5255720d77 10
mzta 0:0c5255720d77 11 Task::Task(TaskConfig *cfg)
mzta 0:0c5255720d77 12 {
mzta 0:0c5255720d77 13 thread = new Thread(
mzta 0:0c5255720d77 14 cfg->routine, this, cfg->priority, cfg->stackSize, cfg->stackPointer);
mzta 0:0c5255720d77 15 logger = new Logger(cfg->name);
mzta 0:0c5255720d77 16 }
mzta 0:0c5255720d77 17
mzta 0:0c5255720d77 18 void Task::init(TaskConfig *config, uint32_t num_of_task)
mzta 0:0c5255720d77 19 {
mzta 0:0c5255720d77 20 osThreadSetPriority(osThreadGetId(), osPriorityIdle);
mzta 0:0c5255720d77 21
mzta 0:0c5255720d77 22 taskConfig = config;
mzta 0:0c5255720d77 23 taskTable = new Task*[num_of_task];
mzta 0:0c5255720d77 24
mzta 0:0c5255720d77 25 for (int id = 0; id < num_of_task; id++) {
mzta 0:0c5255720d77 26 taskTable[id] = new Task(&taskConfig[id]);
mzta 0:0c5255720d77 27 }
mzta 0:0c5255720d77 28 clock.start();
mzta 0:0c5255720d77 29 }
mzta 0:0c5255720d77 30
mzta 0:0c5255720d77 31 void Task::sendMail(TaskID task_id, MessageID message_id, void *packet)
mzta 0:0c5255720d77 32 {
mzta 0:0c5255720d77 33 MailPacket *mail = taskTable[task_id]->mbox.alloc();
mzta 0:0c5255720d77 34 mail->messageId = message_id;
mzta 0:0c5255720d77 35 mail->packet = packet;
mzta 0:0c5255720d77 36 taskTable[task_id]->mbox.put(mail);
mzta 0:0c5255720d77 37 }
mzta 0:0c5255720d77 38
mzta 0:0c5255720d77 39 void Task::deleteMail(MailPacket *mail)
mzta 0:0c5255720d77 40 {
mzta 0:0c5255720d77 41 mbox.free(mail);
mzta 0:0c5255720d77 42 }
mzta 0:0c5255720d77 43
mzta 0:0c5255720d77 44 MailPacket *Task::waitMail()
mzta 0:0c5255720d77 45 {
mzta 0:0c5255720d77 46 osEvent event;
mzta 0:0c5255720d77 47 while(true) {
mzta 0:0c5255720d77 48 event = mbox.get();
mzta 0:0c5255720d77 49 if (event.status == osEventMail) {
mzta 0:0c5255720d77 50 break;
mzta 0:0c5255720d77 51 } else {
mzta 0:0c5255720d77 52 log(LOG_INFO, "event(%d)recieved", event.status);
mzta 0:0c5255720d77 53 }
mzta 0:0c5255720d77 54 }
mzta 0:0c5255720d77 55 return (MailPacket*)event.value.p;
mzta 0:0c5255720d77 56 }
mzta 0:0c5255720d77 57
mzta 0:0c5255720d77 58 void Task::log(LogLevel lv, const char *format, ...)
mzta 0:0c5255720d77 59 {
mzta 0:0c5255720d77 60 if (Logger::lv > lv) return;
mzta 0:0c5255720d77 61
mzta 0:0c5255720d77 62 float t = (float)clock.read_ms() / 1000;
mzta 0:0c5255720d77 63 logger->sp->printf("%.3f:[%s][%s] ",
mzta 0:0c5255720d77 64 t, Logger::lvSym[lv], logger->tag);
mzta 0:0c5255720d77 65
mzta 0:0c5255720d77 66 va_list arg;
mzta 0:0c5255720d77 67 va_start(arg, format);
mzta 0:0c5255720d77 68 vsprintf(logger->buf, format, arg);
mzta 0:0c5255720d77 69 va_end(arg);
mzta 0:0c5255720d77 70
mzta 0:0c5255720d77 71 logger->sp->printf(logger->buf);
mzta 0:0c5255720d77 72 logger->sp->printf("\n");
mzta 0:0c5255720d77 73 }
mzta 0:0c5255720d77 74
mzta 0:0c5255720d77 75 Task::Logger::Logger(const char *task_name, Stream *sp)
mzta 0:0c5255720d77 76 {
mzta 0:0c5255720d77 77 this->tag = task_name;
mzta 0:0c5255720d77 78 this->sp = sp;
mzta 0:0c5255720d77 79 }
mzta 0:0c5255720d77 80
mzta 0:0c5255720d77 81 void Task::Logger::setLogLevel(LogLevel lv)
mzta 0:0c5255720d77 82 {
mzta 0:0c5255720d77 83 Logger::lv = lv;
mzta 0:0c5255720d77 84 }
mzta 0:0c5255720d77 85
mzta 0:0c5255720d77 86 void Task::Logger::setLogStream(Stream *sp)
mzta 0:0c5255720d77 87 {
mzta 0:0c5255720d77 88 this->sp = sp;
mzta 0:0c5255720d77 89 }