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 02:41:24 2014 +0000
Revision:
3:0c93bdf73d87
Parent:
2:b12e4c1338db
delete Logger#setLogStream() method.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
mzta 0:0c5255720d77 1 #ifndef TASK_H
mzta 0:0c5255720d77 2 #define TASK_H
mzta 0:0c5255720d77 3
mzta 0:0c5255720d77 4 #include <cstdio>
mzta 0:0c5255720d77 5 #include <cstdarg>
mzta 0:0c5255720d77 6 #include "mbed.h"
mzta 0:0c5255720d77 7 #include "rtos.h"
mzta 0:0c5255720d77 8
mzta 0:0c5255720d77 9 using namespace std;
mzta 0:0c5255720d77 10
mzta 2:b12e4c1338db 11 /** Log level symbol definition */
mzta 0:0c5255720d77 12 typedef enum {
mzta 0:0c5255720d77 13 LOG_DEBUG = 0,
mzta 0:0c5255720d77 14 LOG_INFO,
mzta 0:0c5255720d77 15 LOG_WARN,
mzta 0:0c5255720d77 16 LOG_ERR
mzta 0:0c5255720d77 17 } LogLevel;
mzta 0:0c5255720d77 18
mzta 2:b12e4c1338db 19 /** max length of mail queue block per task */
mzta 0:0c5255720d77 20 #define MAX_MAIL_NUM 16
mzta 2:b12e4c1338db 21
mzta 2:b12e4c1338db 22 /** max length of log string */
mzta 0:0c5255720d77 23 #define LOG_BUF_SIZE 64
mzta 0:0c5255720d77 24
mzta 0:0c5255720d77 25 typedef void (*Routine)(void const *argument);
mzta 0:0c5255720d77 26 typedef uint32_t MessageID;
mzta 0:0c5255720d77 27 typedef uint32_t TaskID;
mzta 0:0c5255720d77 28
mzta 2:b12e4c1338db 29 /** struct for static task configuration */
mzta 0:0c5255720d77 30 struct TaskConfig {
mzta 0:0c5255720d77 31 TaskConfig(
mzta 0:0c5255720d77 32 const char *task_name,
mzta 0:0c5255720d77 33 Routine func,
mzta 0:0c5255720d77 34 osPriority task_priority = osPriorityNormal,
mzta 0:0c5255720d77 35 uint32_t stack_size = DEFAULT_STACK_SIZE,
mzta 0:0c5255720d77 36 unsigned char *stack_pointer = NULL
mzta 0:0c5255720d77 37 ) {
mzta 0:0c5255720d77 38 name = task_name;
mzta 0:0c5255720d77 39 routine = func;
mzta 0:0c5255720d77 40 priority = task_priority;
mzta 0:0c5255720d77 41 stackSize = stack_size;
mzta 0:0c5255720d77 42 stackPointer = stack_pointer;
mzta 0:0c5255720d77 43 }
mzta 0:0c5255720d77 44 const char *name;
mzta 0:0c5255720d77 45 Routine routine;
mzta 0:0c5255720d77 46 osPriority priority;
mzta 0:0c5255720d77 47 uint32_t stackSize;
mzta 0:0c5255720d77 48 unsigned char *stackPointer;
mzta 0:0c5255720d77 49 };
mzta 0:0c5255720d77 50
mzta 2:b12e4c1338db 51 /** struct for mail event passing */
mzta 0:0c5255720d77 52 struct MailPacket {
mzta 0:0c5255720d77 53 uint32_t messageId;
mzta 0:0c5255720d77 54 void *packet;
mzta 0:0c5255720d77 55 };
mzta 0:0c5255720d77 56
mzta 0:0c5255720d77 57 typedef Mail<MailPacket, MAX_MAIL_NUM> MailBox;
mzta 0:0c5255720d77 58
mzta 2:b12e4c1338db 59 /** Task class : A Thread which driven by mail event, and it have own logger. */
mzta 2:b12e4c1338db 60 class Task
mzta 2:b12e4c1338db 61 {
mzta 0:0c5255720d77 62 public:
mzta 1:381a6f6263c7 63 /** Initialize task config table.
mzta 2:b12e4c1338db 64 * @param cfg array of TaskConfig
mzta 2:b12e4c1338db 65 * @param num_of_task length of cfg
mzta 2:b12e4c1338db 66 * @return void
mzta 2:b12e4c1338db 67 */
mzta 0:0c5255720d77 68 static void init(TaskConfig *config, uint32_t num_of_task);
mzta 1:381a6f6263c7 69
mzta 1:381a6f6263c7 70 /** Send mail to task specified by task_id with Any data.
mzta 2:b12e4c1338db 71 * @param task_id destination task's id
mzta 2:b12e4c1338db 72 * @param message_id mail id
mzta 2:b12e4c1338db 73 * @param packet any data pointer
mzta 2:b12e4c1338db 74 * @return void
mzta 2:b12e4c1338db 75 */
mzta 0:0c5255720d77 76 static void sendMail(TaskID task_id, MessageID message_id, void *packet);
mzta 1:381a6f6263c7 77
mzta 1:381a6f6263c7 78
mzta 0:0c5255720d77 79 static int readClock();
mzta 0:0c5255720d77 80
mzta 0:0c5255720d77 81 Thread *thread;
mzta 1:381a6f6263c7 82
mzta 1:381a6f6263c7 83 /** Wait for mail addressed to itself.
mzta 2:b12e4c1338db 84 * @return received MailPacket
mzta 2:b12e4c1338db 85 */
mzta 0:0c5255720d77 86 MailPacket *waitMail();
mzta 1:381a6f6263c7 87
mzta 1:381a6f6263c7 88 /** Delete a mail queue block. it's responsible for received task.
mzta 2:b12e4c1338db 89 * @param mail received MailPacket
mzta 2:b12e4c1338db 90 * @return void
mzta 2:b12e4c1338db 91 */
mzta 0:0c5255720d77 92 void deleteMail(MailPacket *mail);
mzta 1:381a6f6263c7 93
mzta 1:381a6f6263c7 94 /** Output log to task's own stream pointer.
mzta 2:b12e4c1338db 95 * @param lv loglevel
mzta 2:b12e4c1338db 96 * @param format log format
mzta 2:b12e4c1338db 97 * @param ... log arguments
mzta 2:b12e4c1338db 98 * @return void
mzta 2:b12e4c1338db 99 */
mzta 0:0c5255720d77 100 void log(LogLevel lv, const char *format, ...);
mzta 0:0c5255720d77 101
mzta 2:b12e4c1338db 102 /** Logger class */
mzta 2:b12e4c1338db 103 class Logger
mzta 2:b12e4c1338db 104 {
mzta 0:0c5255720d77 105 public:
mzta 1:381a6f6263c7 106 /** Logger constructor
mzta 2:b12e4c1338db 107 * @param task_name For log prefix
mzta 2:b12e4c1338db 108 * @param sp Stream pointer for output destination(the default is USB serial).
mzta 2:b12e4c1338db 109 */
mzta 0:0c5255720d77 110 Logger(const char *task_name, Stream *sp = Logger::sci);
mzta 2:b12e4c1338db 111
mzta 1:381a6f6263c7 112 /** Log level setter
mzta 2:b12e4c1338db 113 * @param lv log level
mzta 2:b12e4c1338db 114 * @return void
mzta 2:b12e4c1338db 115 */
mzta 0:0c5255720d77 116 static void setLogLevel(LogLevel lv);
mzta 0:0c5255720d77 117 static const char *lvSym[];
mzta 0:0c5255720d77 118 static Stream *sci;
mzta 0:0c5255720d77 119 static LogLevel lv;
mzta 2:b12e4c1338db 120 Stream *sp;
mzta 0:0c5255720d77 121 const char *tag;
mzta 0:0c5255720d77 122 char buf[LOG_BUF_SIZE];
mzta 0:0c5255720d77 123 };
mzta 0:0c5255720d77 124
mzta 0:0c5255720d77 125 private:
mzta 1:381a6f6263c7 126 /** Create a new thread with its own logger.
mzta 2:b12e4c1338db 127 * @param cfg TaskConfig struct pointer
mzta 2:b12e4c1338db 128 * @return void
mzta 2:b12e4c1338db 129 */
mzta 0:0c5255720d77 130 Task(TaskConfig *config);
mzta 0:0c5255720d77 131 ~Task();
mzta 0:0c5255720d77 132
mzta 0:0c5255720d77 133 static Timer clock;
mzta 0:0c5255720d77 134 static Task **taskTable;
mzta 0:0c5255720d77 135 static TaskConfig *taskConfig;
mzta 0:0c5255720d77 136
mzta 0:0c5255720d77 137 MailBox mbox;
mzta 0:0c5255720d77 138 Logger *logger;
mzta 0:0c5255720d77 139 };
mzta 0:0c5255720d77 140
mzta 0:0c5255720d77 141 #endif