From 4ea0d391623691b59eff71c57dce4b4ee2b36f56 Mon Sep 17 00:00:00 2001 From: CloudSir <2301029643@qq.com> Date: Wed, 16 Feb 2022 18:05:35 +0800 Subject: [PATCH 1/2] add param: is_repeated --- MultiTimer.c | 7 ++++++- MultiTimer.h | 5 ++++- README.md | 13 ++++++------- examples/test_linux.c | 9 ++++----- 4 files changed, 20 insertions(+), 14 deletions(-) diff --git a/MultiTimer.c b/MultiTimer.c index 947e35e..bb003ff 100644 --- a/MultiTimer.c +++ b/MultiTimer.c @@ -13,7 +13,7 @@ int MultiTimerInstall(PlatformTicksFunction_t ticksFunc) return 0; } -int MultiTimerStart(MultiTimer* timer, uint64_t timing, MultiTimerCallback_t callback, void* userData) +int MultiTimerStart(MultiTimer* timer, uint64_t timing, MultiTimerCallback_t callback, void* userData, uint8_t is_repeated) { if (!timer || !callback ) { return -1; @@ -29,8 +29,10 @@ int MultiTimerStart(MultiTimer* timer, uint64_t timing, MultiTimerCallback_t cal /* Init timer. */ timer->deadline = platformTicksFunction() + timing; + timer->timeout = timing; timer->callback = callback; timer->userData = userData; + timer->is_repeated = is_repeated; /* Insert timer. */ for (nextTimer = &timerList;; nextTimer = &(*nextTimer)->next) { @@ -76,6 +78,9 @@ int MultiTimerYield(void) /* call callback */ if (entry->callback) { entry->callback(entry, entry->userData); + if(entry->is_repeated == 1) { + MultiTimerStart(entry, entry->timeout, entry->callback, entry->userData, 1); + } } } return 0; diff --git a/MultiTimer.h b/MultiTimer.h index a36fd0f..16c7d49 100644 --- a/MultiTimer.h +++ b/MultiTimer.h @@ -37,7 +37,9 @@ typedef void (*MultiTimerCallback_t)(MultiTimer* timer, void* userData); struct MultiTimerHandle { MultiTimer* next; + uint64_t timeout; uint64_t deadline; + uint8_t is_repeated; MultiTimerCallback_t callback; void* userData; }; @@ -57,9 +59,10 @@ int MultiTimerInstall(PlatformTicksFunction_t ticksFunc); * @param timing Set the start time. * @param callback deadline callback. * @param userData user data. + * @param is_repeated repeat(1) or not(0). * @return int 0: success, -1: fail. */ -int MultiTimerStart(MultiTimer* timer, uint64_t timing, MultiTimerCallback_t callback, void* userData); +int MultiTimerStart(MultiTimer* timer, uint64_t timing, MultiTimerCallback_t callback, void* userData, uint8_t is_repeated); /** * @brief Stop the timer work, remove the handle off work list. diff --git a/README.md b/README.md index 2e61bdf..f41f767 100644 --- a/README.md +++ b/README.md @@ -24,7 +24,7 @@ MultiTimer timer1; 3. 设置定时时间,超时回调处理函数, 用户上下指针,启动定时器; ```c -int MultiTimerStart(&timer1, uint64_t timing, MultiTimerCallback_t callback, void* userData); +int MultiTimerStart(&timer1, uint64_t timing, MultiTimerCallback_t callback, void* userData, uint8_t is_repeated); ``` 4. 在主循环调用定时器后台处理函数 @@ -71,27 +71,26 @@ uint64_t PlatformTicksGetFunc(void) void exampleTimer1Callback(MultiTimer* timer, void *userData) { printf("exampleTimer1Callback-> %s.\r\n", (char*)userData); - MultiTimerStart(timer, 1000, exampleTimer1Callback, userData); } void exampleTimer2Callback(MultiTimer* timer, void *userData) { - printf("exampleTimer2Callback-> %s.\r\n", (char*)userData); + printf("exampleTimer2Callback-> %s.\r\n", (char*)userData, 0); } void exampleTimer3Callback(MultiTimer* timer, void *userData) { printf("exampleTimer3Callback-> %s.\r\n", (char*)userData); - MultiTimerStart(timer, 4567, exampleTimer3Callback, userData); + MultiTimerStart(timer, 4567, exampleTimer3Callback, userData, 0); } int main(int argc, char *argv[]) { MultiTimerInstall(PlatformTicksGetFunc); - MultiTimerStart(&timer1, 1000, exampleTimer1Callback, "1000ms CYCLE timer"); - MultiTimerStart(&timer2, 5000, exampleTimer2Callback, "5000ms ONCE timer"); - MultiTimerStart(&timer3, 3456, exampleTimer3Callback, "3456ms delay start, 4567ms CYCLE timer"); + MultiTimerStart(&timer1, 1000, exampleTimer1Callback, "1000ms CYCLE timer", 1); + MultiTimerStart(&timer2, 5000, exampleTimer2Callback, "5000ms ONCE timer", 0); + MultiTimerStart(&timer3, 3456, exampleTimer3Callback, "3456ms delay start, 4567ms CYCLE timer", 0); while (1) { MultiTimerYield(); diff --git a/examples/test_linux.c b/examples/test_linux.c index 9b91182..f3412cc 100644 --- a/examples/test_linux.c +++ b/examples/test_linux.c @@ -17,7 +17,6 @@ uint64_t PlatformTicksGetFunc(void) void exampleTimer1Callback(MultiTimer* timer, void *userData) { printf("[%012ld] Timer:%p callback-> %s.\r\n", PlatformTicksGetFunc(), timer, (char*)userData); - MultiTimerStart(timer, 1000, exampleTimer1Callback, userData); } void exampleTimer2Callback(MultiTimer* timer, void *userData) @@ -28,16 +27,16 @@ void exampleTimer2Callback(MultiTimer* timer, void *userData) void exampleTimer3Callback(MultiTimer* timer, void *userData) { printf("[%012ld] Timer:%p callback-> %s.\r\n", PlatformTicksGetFunc(), timer, (char*)userData); - MultiTimerStart(timer, 4567, exampleTimer3Callback, userData); + MultiTimerStart(timer, 4567, exampleTimer3Callback, userData, 0); } int main(int argc, char *argv[]) { MultiTimerInstall(PlatformTicksGetFunc); - MultiTimerStart(&timer1, 1000, exampleTimer1Callback, "1000ms CYCLE timer"); - MultiTimerStart(&timer2, 5000, exampleTimer2Callback, "5000ms ONCE timer"); - MultiTimerStart(&timer3, 3456, exampleTimer3Callback, "3456ms delay start, 4567ms CYCLE timer"); + MultiTimerStart(&timer1, 1000, exampleTimer1Callback, "1000ms CYCLE timer", 1); + MultiTimerStart(&timer2, 5000, exampleTimer2Callback, "5000ms ONCE timer", 0); + MultiTimerStart(&timer3, 3456, exampleTimer3Callback, "3456ms delay start, 4567ms CYCLE timer", 0); while (1) { MultiTimerYield(); From 3a26279f236426f3b2bc828c006070f4020fd516 Mon Sep 17 00:00:00 2001 From: CloudSir <2301029643@qq.com> Date: Wed, 16 Feb 2022 18:38:08 +0800 Subject: [PATCH 2/2] fix timer stop --- MultiTimer.c | 1 + examples/test_linux.c | 13 +++++++++++++ 2 files changed, 14 insertions(+) diff --git a/MultiTimer.c b/MultiTimer.c index bb003ff..c6e649a 100644 --- a/MultiTimer.c +++ b/MultiTimer.c @@ -53,6 +53,7 @@ int MultiTimerStart(MultiTimer* timer, uint64_t timing, MultiTimerCallback_t cal int MultiTimerStop(MultiTimer* timer) { MultiTimer** nextTimer = &timerList; + timer->is_repeated = 0; /* Find and remove timer. */ for (; *nextTimer; nextTimer = &(*nextTimer)->next) { MultiTimer* entry = *nextTimer; diff --git a/examples/test_linux.c b/examples/test_linux.c index f3412cc..81760e1 100644 --- a/examples/test_linux.c +++ b/examples/test_linux.c @@ -6,6 +6,7 @@ MultiTimer timer1; MultiTimer timer2; MultiTimer timer3; +MultiTimer timer4; uint64_t PlatformTicksGetFunc(void) { @@ -30,6 +31,17 @@ void exampleTimer3Callback(MultiTimer* timer, void *userData) MultiTimerStart(timer, 4567, exampleTimer3Callback, userData, 0); } +int count = 0; +void exampleTimer4Callback(MultiTimer* timer, void *userData) +{ + count++; + printf("[%012ld] Timer:%p callback-> %s.\r\n", PlatformTicksGetFunc(), timer, (char*)userData); + if (count >= 3) { + printf("Timer 4 stop.\n"); + MultiTimerStop(timer); + } +} + int main(int argc, char *argv[]) { MultiTimerInstall(PlatformTicksGetFunc); @@ -37,6 +49,7 @@ int main(int argc, char *argv[]) MultiTimerStart(&timer1, 1000, exampleTimer1Callback, "1000ms CYCLE timer", 1); MultiTimerStart(&timer2, 5000, exampleTimer2Callback, "5000ms ONCE timer", 0); MultiTimerStart(&timer3, 3456, exampleTimer3Callback, "3456ms delay start, 4567ms CYCLE timer", 0); + MultiTimerStart(&timer4, 2000, exampleTimer4Callback, "2000ms timer - Timer4, loop 3 times", 1); while (1) { MultiTimerYield();