Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: mail_driven_task_example
Task.h@2:b12e4c1338db, 2014-12-25 (annotated)
- Committer:
- mzta
- Date:
- Thu Dec 25 02:32:12 2014 +0000
- Revision:
- 2:b12e4c1338db
- Parent:
- 1:381a6f6263c7
- Child:
- 3:0c93bdf73d87
update api ducument comment.
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 | void setLogStream(Stream *sp); |
| mzta | 0:0c5255720d77 | 118 | static const char *lvSym[]; |
| mzta | 0:0c5255720d77 | 119 | static Stream *sci; |
| mzta | 0:0c5255720d77 | 120 | static LogLevel lv; |
| mzta | 2:b12e4c1338db | 121 | Stream *sp; |
| mzta | 0:0c5255720d77 | 122 | const char *tag; |
| mzta | 0:0c5255720d77 | 123 | char buf[LOG_BUF_SIZE]; |
| mzta | 0:0c5255720d77 | 124 | }; |
| mzta | 0:0c5255720d77 | 125 | |
| mzta | 0:0c5255720d77 | 126 | private: |
| mzta | 1:381a6f6263c7 | 127 | /** Create a new thread with its own logger. |
| mzta | 2:b12e4c1338db | 128 | * @param cfg TaskConfig struct pointer |
| mzta | 2:b12e4c1338db | 129 | * @return void |
| mzta | 2:b12e4c1338db | 130 | */ |
| mzta | 0:0c5255720d77 | 131 | Task(TaskConfig *config); |
| mzta | 0:0c5255720d77 | 132 | ~Task(); |
| mzta | 0:0c5255720d77 | 133 | |
| mzta | 0:0c5255720d77 | 134 | static Timer clock; |
| mzta | 0:0c5255720d77 | 135 | static Task **taskTable; |
| mzta | 0:0c5255720d77 | 136 | static TaskConfig *taskConfig; |
| mzta | 0:0c5255720d77 | 137 | |
| mzta | 0:0c5255720d77 | 138 | MailBox mbox; |
| mzta | 0:0c5255720d77 | 139 | Logger *logger; |
| mzta | 0:0c5255720d77 | 140 | }; |
| mzta | 0:0c5255720d77 | 141 | |
| mzta | 0:0c5255720d77 | 142 | #endif |