From f2c31eebb5306046c44227b72178e5b9490af7c4 Mon Sep 17 00:00:00 2001 From: armink Date: Wed, 19 Oct 2016 10:49:42 +0800 Subject: [PATCH 1/7] [DeviceDrivers]Fix dataqueue's bug when push data is timeout the lwm flag isn't reset. --- components/drivers/src/dataqueue.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/components/drivers/src/dataqueue.c b/components/drivers/src/dataqueue.c index 1702d20710..f3247f6d30 100644 --- a/components/drivers/src/dataqueue.c +++ b/components/drivers/src/dataqueue.c @@ -119,7 +119,11 @@ rt_err_t rt_data_queue_push(struct rt_data_queue *queue, /* thread is waked up */ result = thread->error; level = rt_hw_interrupt_disable(); - if (result != RT_EOK) goto __exit; + if (result != RT_EOK) + { + queue->waiting_lwm = RT_FALSE; + goto __exit; + } } queue->queue[queue->put_index & mask].data_ptr = data_ptr; From 7860ea4f8348cf42c8690cdb265ed42fa2a2c32c Mon Sep 17 00:00:00 2001 From: armink Date: Wed, 19 Oct 2016 10:54:22 +0800 Subject: [PATCH 2/7] [DeviceDrivers]Fix dataqueue calculate put and get buffer index bug. --- components/drivers/src/dataqueue.c | 19 ++++++------------- 1 file changed, 6 insertions(+), 13 deletions(-) diff --git a/components/drivers/src/dataqueue.c b/components/drivers/src/dataqueue.c index f3247f6d30..c47eeefee9 100644 --- a/components/drivers/src/dataqueue.c +++ b/components/drivers/src/dataqueue.c @@ -67,7 +67,6 @@ rt_err_t rt_data_queue_push(struct rt_data_queue *queue, rt_size_t data_size, rt_int32_t timeout) { - rt_uint16_t mask; rt_ubase_t level; rt_thread_t thread; rt_err_t result; @@ -76,7 +75,6 @@ rt_err_t rt_data_queue_push(struct rt_data_queue *queue, result = RT_EOK; thread = rt_thread_self(); - mask = queue->size - 1; level = rt_hw_interrupt_disable(); while (queue->put_index - queue->get_index == queue->size) @@ -126,8 +124,8 @@ rt_err_t rt_data_queue_push(struct rt_data_queue *queue, } } - queue->queue[queue->put_index & mask].data_ptr = data_ptr; - queue->queue[queue->put_index & mask].data_size = data_size; + queue->queue[queue->put_index % queue->size].data_ptr = data_ptr; + queue->queue[queue->put_index % queue->size].data_size = data_size; queue->put_index += 1; if (!rt_list_isempty(&(queue->suspended_pop_list))) @@ -168,7 +166,6 @@ rt_err_t rt_data_queue_pop(struct rt_data_queue *queue, rt_ubase_t level; rt_thread_t thread; rt_err_t result; - rt_uint16_t mask; RT_ASSERT(queue != RT_NULL); RT_ASSERT(data_ptr != RT_NULL); @@ -176,7 +173,6 @@ rt_err_t rt_data_queue_pop(struct rt_data_queue *queue, result = RT_EOK; thread = rt_thread_self(); - mask = queue->size - 1; level = rt_hw_interrupt_disable(); while (queue->get_index == queue->put_index) @@ -220,8 +216,8 @@ rt_err_t rt_data_queue_pop(struct rt_data_queue *queue, goto __exit; } - *data_ptr = queue->queue[queue->get_index & mask].data_ptr; - *size = queue->queue[queue->get_index & mask].data_size; + *data_ptr = queue->queue[queue->get_index % queue->size].data_ptr; + *size = queue->queue[queue->get_index % queue->size].data_size; queue->get_index += 1; @@ -271,12 +267,9 @@ rt_err_t rt_data_queue_peak(struct rt_data_queue *queue, rt_size_t *size) { rt_ubase_t level; - rt_uint16_t mask; RT_ASSERT(queue != RT_NULL); - mask = queue->size - 1; - level = rt_hw_interrupt_disable(); if (queue->get_index == queue->put_index) @@ -286,8 +279,8 @@ rt_err_t rt_data_queue_peak(struct rt_data_queue *queue, return -RT_EEMPTY; } - *data_ptr = queue->queue[queue->get_index & mask].data_ptr; - *size = queue->queue[queue->get_index & mask].data_size; + *data_ptr = queue->queue[queue->get_index % queue->size].data_ptr; + *size = queue->queue[queue->get_index % queue->size].data_size; rt_hw_interrupt_enable(level); From bda654330567a62695ae365b56d31512ba301ad3 Mon Sep 17 00:00:00 2001 From: armink Date: Sat, 29 Oct 2016 14:35:07 +0800 Subject: [PATCH 3/7] [DeviceDrivers]Fix dataqueue irq not resume bug. --- components/drivers/src/dataqueue.c | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/components/drivers/src/dataqueue.c b/components/drivers/src/dataqueue.c index c47eeefee9..dc265fb66d 100644 --- a/components/drivers/src/dataqueue.c +++ b/components/drivers/src/dataqueue.c @@ -117,11 +117,7 @@ rt_err_t rt_data_queue_push(struct rt_data_queue *queue, /* thread is waked up */ result = thread->error; level = rt_hw_interrupt_disable(); - if (result != RT_EOK) - { - queue->waiting_lwm = RT_FALSE; - goto __exit; - } + if (result != RT_EOK) goto __exit; } queue->queue[queue->put_index % queue->size].data_ptr = data_ptr; @@ -244,6 +240,10 @@ rt_err_t rt_data_queue_pop(struct rt_data_queue *queue, /* perform a schedule */ rt_schedule(); } + else + { + rt_hw_interrupt_enable(level); + } if (queue->evt_notify != RT_NULL) queue->evt_notify(queue, RT_DATAQUEUE_EVENT_LWM); From 0970cf03a4db015d988b4e3fea6bc80f50394ef0 Mon Sep 17 00:00:00 2001 From: armink Date: Mon, 31 Oct 2016 08:39:49 +0800 Subject: [PATCH 4/7] [DeviceDrivers]Reset dataqueue waiting_lwm flag when suspended_push_list is empty --- components/drivers/src/dataqueue.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/components/drivers/src/dataqueue.c b/components/drivers/src/dataqueue.c index dc265fb66d..1d458eec81 100644 --- a/components/drivers/src/dataqueue.c +++ b/components/drivers/src/dataqueue.c @@ -20,6 +20,7 @@ * Change Logs: * Date Author Notes * 2012-09-30 Bernard first version. + * 2016-10-31 armink fix some resume push and pop thread bugs */ #include @@ -220,8 +221,6 @@ rt_err_t rt_data_queue_pop(struct rt_data_queue *queue, if ((queue->waiting_lwm == RT_TRUE) && (queue->put_index - queue->get_index) <= queue->lwm) { - queue->waiting_lwm = RT_FALSE; - /* * there is at least one thread in suspended list * and less than low water mark @@ -242,6 +241,7 @@ rt_err_t rt_data_queue_pop(struct rt_data_queue *queue, } else { + queue->waiting_lwm = RT_FALSE; rt_hw_interrupt_enable(level); } From 6fe47a9537e222d6047592c9f113657687e6ce69 Mon Sep 17 00:00:00 2001 From: armink Date: Mon, 31 Oct 2016 15:08:55 +0800 Subject: [PATCH 5/7] [DeviceDrivers]Improve dataqueue resume suspended thread code. Thanks for @grissiom suggestion. --- components/drivers/src/dataqueue.c | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/components/drivers/src/dataqueue.c b/components/drivers/src/dataqueue.c index 1d458eec81..fc4ce1ef1e 100644 --- a/components/drivers/src/dataqueue.c +++ b/components/drivers/src/dataqueue.c @@ -45,7 +45,6 @@ rt_data_queue_init(struct rt_data_queue *queue, queue->size = size; queue->lwm = lwm; - queue->waiting_lwm = RT_FALSE; queue->get_index = 0; queue->put_index = 0; @@ -80,8 +79,6 @@ rt_err_t rt_data_queue_push(struct rt_data_queue *queue, level = rt_hw_interrupt_disable(); while (queue->put_index - queue->get_index == queue->size) { - queue->waiting_lwm = RT_TRUE; - /* queue is full */ if (timeout == 0) { @@ -218,8 +215,7 @@ rt_err_t rt_data_queue_pop(struct rt_data_queue *queue, queue->get_index += 1; - if ((queue->waiting_lwm == RT_TRUE) && - (queue->put_index - queue->get_index) <= queue->lwm) + if ((queue->put_index - queue->get_index) <= queue->lwm) { /* * there is at least one thread in suspended list @@ -241,7 +237,6 @@ rt_err_t rt_data_queue_pop(struct rt_data_queue *queue, } else { - queue->waiting_lwm = RT_FALSE; rt_hw_interrupt_enable(level); } From c414bdaac82888fe6afbd4987fd7a1d0696b9b72 Mon Sep 17 00:00:00 2001 From: armink Date: Wed, 2 Nov 2016 08:17:24 +0800 Subject: [PATCH 6/7] [DeviceDrivers]Modify the dataqueue comments. --- components/drivers/src/dataqueue.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/components/drivers/src/dataqueue.c b/components/drivers/src/dataqueue.c index fc4ce1ef1e..a10b0805b4 100644 --- a/components/drivers/src/dataqueue.c +++ b/components/drivers/src/dataqueue.c @@ -122,10 +122,9 @@ rt_err_t rt_data_queue_push(struct rt_data_queue *queue, queue->queue[queue->put_index % queue->size].data_size = data_size; queue->put_index += 1; + /* there is at least one thread in suspended list */ if (!rt_list_isempty(&(queue->suspended_pop_list))) { - /* there is at least one thread in suspended list */ - /* get thread entry */ thread = rt_list_entry(queue->suspended_pop_list.next, struct rt_thread, @@ -217,10 +216,7 @@ rt_err_t rt_data_queue_pop(struct rt_data_queue *queue, if ((queue->put_index - queue->get_index) <= queue->lwm) { - /* - * there is at least one thread in suspended list - * and less than low water mark - */ + /* there is at least one thread in suspended list */ if (!rt_list_isempty(&(queue->suspended_push_list))) { /* get thread entry */ From aa662dccef1e284162cbfb91a1def3f02527f1ac Mon Sep 17 00:00:00 2001 From: armink Date: Wed, 2 Nov 2016 08:40:30 +0800 Subject: [PATCH 7/7] [DeviceDrivers]Remove dataqueue waiting_lwm flag --- components/drivers/include/rtdevice.h | 1 - 1 file changed, 1 deletion(-) diff --git a/components/drivers/include/rtdevice.h b/components/drivers/include/rtdevice.h index 4564491003..3b22248c97 100644 --- a/components/drivers/include/rtdevice.h +++ b/components/drivers/include/rtdevice.h @@ -134,7 +134,6 @@ struct rt_data_queue { rt_uint16_t size; rt_uint16_t lwm; - rt_bool_t waiting_lwm; rt_uint16_t get_index; rt_uint16_t put_index;