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
Task.cpp@3:0c93bdf73d87, 2014-12-25 (annotated)
- Committer:
- mzta
- Date:
- Thu Dec 25 02:41:24 2014 +0000
- Revision:
- 3:0c93bdf73d87
- Parent:
- 2:b12e4c1338db
delete Logger#setLogStream() method.
Who changed what in which revision?
User | Revision | Line number | New 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 | 2:b12e4c1338db | 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 | } |