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:
Thu Dec 25 01:58:14 2014 +0000
Revision:
1:381a6f6263c7
Parent:
0:0c5255720d77
Child:
2:b12e4c1338db
add api document comment.

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 1:381a6f6263c7 18 void Task::init(TaskConfig *cfg, uint32_t num_of_task)
mzta 0:0c5255720d77 19 {
mzta 1:381a6f6263c7 20 /** set the lowest priority to main thread. */
mzta 0:0c5255720d77 21 osThreadSetPriority(osThreadGetId(), osPriorityIdle);
mzta 0:0c5255720d77 22
mzta 1:381a6f6263c7 23 taskConfig = cfg;
mzta 0:0c5255720d77 24 taskTable = new Task*[num_of_task];
mzta 0:0c5255720d77 25
mzta 0:0c5255720d77 26 for (int id = 0; id < num_of_task; id++) {
mzta 0:0c5255720d77 27 taskTable[id] = new Task(&taskConfig[id]);
mzta 0:0c5255720d77 28 }
mzta 1:381a6f6263c7 29
mzta 1:381a6f6263c7 30 /** start logger tick */
mzta 0:0c5255720d77 31 clock.start();
mzta 0:0c5255720d77 32 }
mzta 0:0c5255720d77 33
mzta 0:0c5255720d77 34 void Task::sendMail(TaskID task_id, MessageID message_id, void *packet)
mzta 0:0c5255720d77 35 {
mzta 0:0c5255720d77 36 MailPacket *mail = taskTable[task_id]->mbox.alloc();
mzta 0:0c5255720d77 37 mail->messageId = message_id;
mzta 0:0c5255720d77 38 mail->packet = packet;
mzta 0:0c5255720d77 39 taskTable[task_id]->mbox.put(mail);
mzta 0:0c5255720d77 40 }
mzta 0:0c5255720d77 41
mzta 0:0c5255720d77 42 void Task::deleteMail(MailPacket *mail)
mzta 0:0c5255720d77 43 {
mzta 0:0c5255720d77 44 mbox.free(mail);
mzta 0:0c5255720d77 45 }
mzta 0:0c5255720d77 46
mzta 0:0c5255720d77 47 MailPacket *Task::waitMail()
mzta 0:0c5255720d77 48 {
mzta 0:0c5255720d77 49 osEvent event;
mzta 0:0c5255720d77 50 while(true) {
mzta 0:0c5255720d77 51 event = mbox.get();
mzta 0:0c5255720d77 52 if (event.status == osEventMail) {
mzta 0:0c5255720d77 53 break;
mzta 0:0c5255720d77 54 } else {
mzta 0:0c5255720d77 55 log(LOG_INFO, "event(%d)recieved", event.status);
mzta 0:0c5255720d77 56 }
mzta 0:0c5255720d77 57 }
mzta 0:0c5255720d77 58 return (MailPacket*)event.value.p;
mzta 0:0c5255720d77 59 }
mzta 0:0c5255720d77 60
mzta 0:0c5255720d77 61 void Task::log(LogLevel lv, const char *format, ...)
mzta 0:0c5255720d77 62 {
mzta 0:0c5255720d77 63 if (Logger::lv > lv) return;
mzta 0:0c5255720d77 64
mzta 0:0c5255720d77 65 float t = (float)clock.read_ms() / 1000;
mzta 0:0c5255720d77 66 logger->sp->printf("%.3f:[%s][%s] ",
mzta 0:0c5255720d77 67 t, Logger::lvSym[lv], logger->tag);
mzta 0:0c5255720d77 68
mzta 0:0c5255720d77 69 va_list arg;
mzta 0:0c5255720d77 70 va_start(arg, format);
mzta 0:0c5255720d77 71 vsprintf(logger->buf, format, arg);
mzta 0:0c5255720d77 72 va_end(arg);
mzta 0:0c5255720d77 73
mzta 0:0c5255720d77 74 logger->sp->printf(logger->buf);
mzta 0:0c5255720d77 75 logger->sp->printf("\n");
mzta 0:0c5255720d77 76 }
mzta 0:0c5255720d77 77
mzta 0:0c5255720d77 78 Task::Logger::Logger(const char *task_name, Stream *sp)
mzta 0:0c5255720d77 79 {
mzta 0:0c5255720d77 80 this->tag = task_name;
mzta 0:0c5255720d77 81 this->sp = sp;
mzta 0:0c5255720d77 82 }
mzta 0:0c5255720d77 83
mzta 0:0c5255720d77 84 void Task::Logger::setLogLevel(LogLevel lv)
mzta 0:0c5255720d77 85 {
mzta 0:0c5255720d77 86 Logger::lv = lv;
mzta 0:0c5255720d77 87 }
mzta 0:0c5255720d77 88
mzta 1:381a6f6263c7 89
mzta 0:0c5255720d77 90 void Task::Logger::setLogStream(Stream *sp)
mzta 0:0c5255720d77 91 {
mzta 0:0c5255720d77 92 this->sp = sp;
mzta 0:0c5255720d77 93 }