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: TYBLE16_simple_data_logger TYBLE16_MP3_Air
ns_timeout.c
00001 /* 00002 * Copyright (c) 2014-2015 ARM Limited. All rights reserved. 00003 * SPDX-License-Identifier: Apache-2.0 00004 * Licensed under the Apache License, Version 2.0 (the License); you may 00005 * not use this file except in compliance with the License. 00006 * You may obtain a copy of the License at 00007 * 00008 * http://www.apache.org/licenses/LICENSE-2.0 00009 * 00010 * Unless required by applicable law or agreed to in writing, software 00011 * distributed under the License is distributed on an AS IS BASIS, WITHOUT 00012 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 00013 * See the License for the specific language governing permissions and 00014 * limitations under the License. 00015 */ 00016 #include "eventOS_event.h" 00017 #include "eventOS_event_timer.h" 00018 #include "nsdynmemLIB.h" 00019 #include "ns_list.h" 00020 #include "timer_sys.h" 00021 00022 #define STARTUP_EVENT 0 00023 #define TIMER_EVENT 1 00024 00025 // Timeout structure, already typedefed to timeout_t 00026 struct timeout_entry_t { 00027 void (*callback)(void *); 00028 void *arg; 00029 arm_event_storage_t *event; 00030 }; 00031 00032 static int8_t timeout_tasklet_id = -1; 00033 00034 static void timeout_tasklet(arm_event_s *event) 00035 { 00036 if (TIMER_EVENT != event->event_type) { 00037 return; 00038 } 00039 00040 timeout_t *t = event->data_ptr; 00041 arm_event_storage_t *storage = t->event; 00042 sys_timer_struct_s *timer = NS_CONTAINER_OF(storage, sys_timer_struct_s, event); 00043 00044 t->callback(t->arg); 00045 00046 00047 // Check if this was periodic timer 00048 if (timer->period == 0) { 00049 ns_dyn_mem_free(event->data_ptr); 00050 } 00051 } 00052 00053 static timeout_t *eventOS_timeout_at_(void (*callback)(void *), void *arg, uint32_t at, uint32_t period) 00054 { 00055 arm_event_storage_t *storage; 00056 00057 timeout_t *timeout = ns_dyn_mem_alloc(sizeof(timeout_t)); 00058 if (!timeout) { 00059 return NULL; 00060 } 00061 timeout->callback = callback; 00062 timeout->arg = arg; 00063 00064 // Start timeout taskled if it is not running 00065 if (-1 == timeout_tasklet_id) { 00066 timeout_tasklet_id = eventOS_event_handler_create(timeout_tasklet, STARTUP_EVENT); 00067 if (timeout_tasklet_id < 0) { 00068 timeout_tasklet_id = -1; 00069 goto FAIL; 00070 } 00071 } 00072 00073 arm_event_t event = { 00074 .receiver = timeout_tasklet_id, 00075 .sender = timeout_tasklet_id, 00076 .event_type = TIMER_EVENT, 00077 .event_id = TIMER_EVENT, 00078 .data_ptr = timeout 00079 }; 00080 00081 if (period) { 00082 storage = eventOS_event_timer_request_every(&event, period); 00083 } else { 00084 storage = eventOS_event_timer_request_at(&event, at); 00085 } 00086 00087 timeout->event = storage; 00088 if (storage) { 00089 return timeout; 00090 } 00091 FAIL: 00092 ns_dyn_mem_free(timeout); 00093 return NULL; 00094 } 00095 00096 timeout_t *eventOS_timeout_ms(void (*callback)(void *), uint32_t ms, void *arg) 00097 { 00098 return eventOS_timeout_at_(callback, arg, eventOS_event_timer_ms_to_ticks(ms) + eventOS_event_timer_ticks(), 0); 00099 } 00100 00101 timeout_t *eventOS_timeout_every_ms(void (*callback)(void *), uint32_t every, void *arg) 00102 { 00103 return eventOS_timeout_at_(callback, arg, 0, eventOS_event_timer_ms_to_ticks(every)); 00104 } 00105 00106 void eventOS_timeout_cancel(timeout_t *t) 00107 { 00108 if (!t) { 00109 return; 00110 } 00111 00112 eventOS_cancel(t->event); 00113 00114 // Defer the freeing until returning from the callback 00115 if (t->event->state != ARM_LIB_EVENT_RUNNING) { 00116 ns_dyn_mem_free(t); 00117 } 00118 }
Generated on Tue Jul 12 2022 13:54:39 by
