diff options
| author | xqyjlj <[email protected]> | 2023-10-25 20:31:25 +0800 |
|---|---|---|
| committer | GitHub <[email protected]> | 2023-10-25 20:31:25 +0800 |
| commit | 3283f54c7a0444b2e51ec79a4da57e7871528f05 (patch) | |
| tree | e4bcd748ad2362f16d0dea5c5da62922de466999 /components/utilities | |
| parent | 91fc52df3635d5dda8285616420f08efa79cea04 (diff) | |
🎈 perf: perf rt_hw_interrupt_disable/enable (#8042)
Signed-off-by: Shell <[email protected]>
Co-authored-by: Shell <[email protected]>
Diffstat (limited to 'components/utilities')
| -rw-r--r-- | components/utilities/resource/resource_id.c | 15 | ||||
| -rw-r--r-- | components/utilities/resource/resource_id.h | 4 | ||||
| -rw-r--r-- | components/utilities/ulog/ulog.c | 23 |
3 files changed, 23 insertions, 19 deletions
diff --git a/components/utilities/resource/resource_id.c b/components/utilities/resource/resource_id.c index 43f64e7b03..dedd097167 100644 --- a/components/utilities/resource/resource_id.c +++ b/components/utilities/resource/resource_id.c @@ -6,6 +6,7 @@ * Change Logs: * Date Author Notes * 2021-08-25 RT-Thread First version + * 2023-09-15 xqyjlj perf rt_hw_interrupt_disable/enable */ #include <rthw.h> #include <rtthread.h> @@ -19,6 +20,7 @@ void resource_id_init(resource_id_t *mgr, int size, void **res) mgr->_res = res; mgr->noused = 0; mgr->_free = RT_NULL; + rt_spin_lock_init(&(mgr->spinlock)); } } @@ -27,21 +29,21 @@ int resource_id_get(resource_id_t *mgr) rt_base_t level; void **cur; - level = rt_hw_interrupt_disable(); + level = rt_spin_lock_irqsave(&(mgr->spinlock)); if (mgr->_free) { cur = mgr->_free; mgr->_free = (void **)*mgr->_free; - rt_hw_interrupt_enable(level); + rt_spin_unlock_irqrestore(&(mgr->spinlock), level); return cur - mgr->_res; } else if (mgr->noused < mgr->size) { cur = &mgr->_res[mgr->noused++]; - rt_hw_interrupt_enable(level); + rt_spin_unlock_irqrestore(&(mgr->spinlock), level); return cur - mgr->_res; } - rt_hw_interrupt_enable(level); + return -1; } @@ -52,11 +54,10 @@ void resource_id_put(resource_id_t *mgr, int no) if (no >= 0 && no < mgr->size) { - level = rt_hw_interrupt_disable(); + level = rt_spin_lock_irqsave(&(mgr->spinlock)); cur = &mgr->_res[no]; *cur = (void *)mgr->_free; mgr->_free = cur; - rt_hw_interrupt_enable(level); + rt_spin_unlock_irqrestore(&(mgr->spinlock), level); } } - diff --git a/components/utilities/resource/resource_id.h b/components/utilities/resource/resource_id.h index 9706a3cbaf..57de7fae5d 100644 --- a/components/utilities/resource/resource_id.h +++ b/components/utilities/resource/resource_id.h @@ -6,6 +6,7 @@ * Change Logs: * Date Author Notes * 2021-08-25 RT-Thread First version + * 2023-09-15 xqyjlj perf rt_hw_interrupt_disable/enable */ #ifndef RESOURCE_ID_H__ @@ -14,7 +15,7 @@ #include <rthw.h> #include <rtthread.h> -#define RESOURCE_ID_INIT(size, pool) {size, pool, 0, RT_NULL} +#define RESOURCE_ID_INIT(size, pool) {size, pool, 0, RT_NULL, RT_SPINLOCK_INIT} typedef struct { @@ -22,6 +23,7 @@ typedef struct void **_res; int noused; void **_free; + struct rt_spinlock spinlock; } resource_id_t; void resource_id_init(resource_id_t *mgr, int size, void **res); diff --git a/components/utilities/ulog/ulog.c b/components/utilities/ulog/ulog.c index 359677d333..18302a3380 100644 --- a/components/utilities/ulog/ulog.c +++ b/components/utilities/ulog/ulog.c @@ -138,6 +138,7 @@ static const char * const color_output_info[] = /* ulog local object */ static struct rt_ulog ulog = { 0 }; +static RT_DEFINE_SPINLOCK(_spinlock); rt_size_t ulog_strcpy(rt_size_t cur_len, char *dst, const char *src) { @@ -197,7 +198,7 @@ static void output_unlock(void) else { #ifdef ULOG_USING_ISR_LOG - rt_hw_interrupt_enable(ulog.output_locker_isr_lvl); + rt_spin_unlock_irqrestore(&_spinlock, ulog.output_locker_isr_lvl); #endif } } @@ -218,7 +219,7 @@ static void output_lock(void) else { #ifdef ULOG_USING_ISR_LOG - ulog.output_locker_isr_lvl = rt_hw_interrupt_disable(); + ulog.output_locker_isr_lvl = rt_spin_lock_irqsave(&_spinlock); #endif } } @@ -1273,9 +1274,9 @@ rt_err_t ulog_backend_register(ulog_backend_t backend, const char *name, rt_bool backend->out_level = LOG_FILTER_LVL_ALL; rt_strncpy(backend->name, name, RT_NAME_MAX); - level = rt_hw_interrupt_disable(); + level = rt_spin_lock_irqsave(&_spinlock); rt_slist_append(&ulog.backend_list, &backend->list); - rt_hw_interrupt_enable(level); + rt_spin_unlock_irqrestore(&_spinlock, level); return RT_EOK; } @@ -1292,9 +1293,9 @@ rt_err_t ulog_backend_unregister(ulog_backend_t backend) backend->deinit(backend); } - level = rt_hw_interrupt_disable(); + level = rt_spin_lock_irqsave(&_spinlock); rt_slist_remove(&ulog.backend_list, &backend->list); - rt_hw_interrupt_enable(level); + rt_spin_unlock_irqrestore(&_spinlock, level); return RT_EOK; } @@ -1304,9 +1305,9 @@ rt_err_t ulog_backend_set_filter(ulog_backend_t backend, ulog_backend_filter_t f rt_base_t level; RT_ASSERT(backend); - level = rt_hw_interrupt_disable(); + level = rt_spin_lock_irqsave(&_spinlock); backend->filter = filter; - rt_hw_interrupt_enable(level); + rt_spin_unlock_irqrestore(&_spinlock, level); return RT_EOK; } @@ -1319,18 +1320,18 @@ ulog_backend_t ulog_backend_find(const char *name) RT_ASSERT(ulog.init_ok); - level = rt_hw_interrupt_disable(); + level = rt_spin_lock_irqsave(&_spinlock); for (node = rt_slist_first(&ulog.backend_list); node; node = rt_slist_next(node)) { backend = rt_slist_entry(node, struct ulog_backend, list); if (rt_strncmp(backend->name, name, RT_NAME_MAX) == 0) { - rt_hw_interrupt_enable(level); + rt_spin_unlock_irqrestore(&_spinlock, level); return backend; } } - rt_hw_interrupt_enable(level); + rt_spin_unlock_irqrestore(&_spinlock, level); return RT_NULL; } |
