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.h@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 | #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 |