From 1ec6f5b10103ccee7b20c14dce829da6f91f36fe Mon Sep 17 00:00:00 2001 From: guozhanxin Date: Thu, 13 Jun 2019 15:10:02 +0800 Subject: [PATCH 1/4] =?UTF-8?q?[sensor]=20Fix=20the=20problem=20that=20mem?= =?UTF-8?q?ory=20is=20not=20free=20after=20the=20sensor=20is=20closed.=20|?= =?UTF-8?q?=20=E4=BF=AE=E5=A4=8Dsensor=E8=AE=BE=E5=A4=87=E5=85=B3=E9=97=AD?= =?UTF-8?q?=E5=90=8E=E5=86=85=E5=AD=98=E4=B8=8D=E9=87=8A=E6=94=BE=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/drivers/sensors/sensor.c | 65 +++++++++++++++++------------ 1 file changed, 39 insertions(+), 26 deletions(-) diff --git a/components/drivers/sensors/sensor.c b/components/drivers/sensors/sensor.c index dba20f6555..67539d9410 100644 --- a/components/drivers/sensors/sensor.c +++ b/components/drivers/sensors/sensor.c @@ -44,7 +44,7 @@ void rt_sensor_cb(rt_sensor_t sen) { return; } - + if (sen->irq_handle != RT_NULL) { sen->irq_handle(sen); @@ -135,25 +135,6 @@ static void rt_sensor_irq_disable(rt_sensor_t sensor) } /* RT-Thread Device Interface */ - -static rt_err_t rt_sensor_init(rt_device_t dev) -{ - rt_sensor_t sensor = (rt_sensor_t)dev; - RT_ASSERT(dev != RT_NULL); - - if (sensor->module != RT_NULL && sensor->info.fifo_max > 0 && sensor->data_buf == RT_NULL) - { - /* Allocate memory for the sensor buffer */ - sensor->data_buf = rt_malloc(sizeof(struct rt_sensor_data) * sensor->info.fifo_max); - if (sensor->data_buf == RT_NULL) - { - return -RT_ENOMEM; - } - } - - return RT_EOK; -} - static rt_err_t rt_sensor_open(rt_device_t dev, rt_uint16_t oflag) { rt_sensor_t sensor = (rt_sensor_t)dev; @@ -165,6 +146,16 @@ static rt_err_t rt_sensor_open(rt_device_t dev, rt_uint16_t oflag) rt_mutex_take(sensor->module->lock, RT_WAITING_FOREVER); } + if (sensor->module != RT_NULL && sensor->info.fifo_max > 0 && sensor->data_buf == RT_NULL) + { + /* Allocate memory for the sensor buffer */ + sensor->data_buf = rt_malloc(sizeof(struct rt_sensor_data) * sensor->info.fifo_max); + if (sensor->data_buf == RT_NULL) + { + return -RT_ENOMEM; + } + } + if (oflag & RT_DEVICE_FLAG_RDONLY && dev->flag & RT_DEVICE_FLAG_RDONLY) { /* If polling mode is supported, configure it to polling mode */ @@ -221,6 +212,8 @@ static rt_err_t rt_sensor_open(rt_device_t dev, rt_uint16_t oflag) static rt_err_t rt_sensor_close(rt_device_t dev) { rt_sensor_t sensor = (rt_sensor_t)dev; + int i; + RT_ASSERT(dev != RT_NULL); if (sensor->module) @@ -237,6 +230,26 @@ static rt_err_t rt_sensor_close(rt_device_t dev) /* Sensor disable interrupt */ rt_sensor_irq_disable(sensor); + if (sensor->module != RT_NULL && sensor->info.fifo_max > 0 && sensor->data_buf != RT_NULL) + { + for (i = 0; i < sensor->module->sen_num; i ++) + { + if (sensor->module->sen[i]->parent.ref_count > 0) + goto __exit; + } + + /* Free memory for the sensor buffer */ + for (i = 0; i < sensor->module->sen_num; i ++) + { + if (sensor->module->sen[i]->data_buf != RT_NULL) + { + rt_free(sensor->module->sen[i]->data_buf); + sensor->module->sen[i]->data_buf = RT_NULL; + } + } + } + +__exit: if (sensor->module) { rt_mutex_release(sensor->module->lock); @@ -325,7 +338,7 @@ static rt_err_t rt_sensor_control(rt_device_t dev, int cmd, void *args) } break; case RT_SENSOR_CTRL_SET_ODR: - + /* Configuration data output rate */ result = sensor->ops->control(sensor, RT_SENSOR_CTRL_SET_ODR, args); if (result == RT_EOK) @@ -335,7 +348,7 @@ static rt_err_t rt_sensor_control(rt_device_t dev, int cmd, void *args) } break; case RT_SENSOR_CTRL_SET_MODE: - + /* Configuration sensor work mode */ result = sensor->ops->control(sensor, RT_SENSOR_CTRL_SET_MODE, args); if (result == RT_EOK) @@ -354,7 +367,7 @@ static rt_err_t rt_sensor_control(rt_device_t dev, int cmd, void *args) } break; case RT_SENSOR_CTRL_SET_POWER: - + /* Configuration sensor power mode */ result = sensor->ops->control(sensor, RT_SENSOR_CTRL_SET_POWER, args); if (result == RT_EOK) @@ -364,7 +377,7 @@ static rt_err_t rt_sensor_control(rt_device_t dev, int cmd, void *args) } break; case RT_SENSOR_CTRL_SELF_TEST: - + /* Device self-test */ result = sensor->ops->control(sensor, RT_SENSOR_CTRL_SELF_TEST, args); break; @@ -383,7 +396,7 @@ static rt_err_t rt_sensor_control(rt_device_t dev, int cmd, void *args) #ifdef RT_USING_DEVICE_OPS const static struct rt_device_ops rt_sensor_ops = { - rt_sensor_init, + RT_NULL, rt_sensor_open, rt_sensor_close, rt_sensor_read, @@ -434,7 +447,7 @@ int rt_hw_sensor_register(rt_sensor_t sensor, #ifdef RT_USING_DEVICE_OPS device->ops = &rt_sensor_ops; #else - device->init = rt_sensor_init; + device->init = RT_NULL; device->open = rt_sensor_open; device->close = rt_sensor_close; device->read = rt_sensor_read; From 44abc9099028c86c1bb9f53c3fb67b7b81dd837a Mon Sep 17 00:00:00 2001 From: guozhanxin Date: Thu, 13 Jun 2019 15:15:31 +0800 Subject: [PATCH 2/4] =?UTF-8?q?[sensor]=20Add=20static=20keywords=20for=20?= =?UTF-8?q?internal=20functions.|=20=E4=B8=BA=E5=86=85=E9=83=A8=E5=87=BD?= =?UTF-8?q?=E6=95=B0=E6=B7=BB=E5=8A=A0=20static=20=E5=85=B3=E9=94=AE?= =?UTF-8?q?=E8=AF=8D=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/drivers/sensors/sensor_cmd.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/drivers/sensors/sensor_cmd.c b/components/drivers/sensors/sensor_cmd.c index 6babf12db3..245279020e 100755 --- a/components/drivers/sensors/sensor_cmd.c +++ b/components/drivers/sensors/sensor_cmd.c @@ -55,7 +55,7 @@ static void sensor_show_data(rt_size_t num, rt_sensor_t sensor, struct rt_sensor } } -rt_err_t rx_callback(rt_device_t dev, rt_size_t size) +static rt_err_t rx_callback(rt_device_t dev, rt_size_t size) { rt_sem_release(sensor_rx_sem); return 0; From 2600f82e397b1fba2b127511ef775f813875f0f6 Mon Sep 17 00:00:00 2001 From: guozhanxin Date: Thu, 13 Jun 2019 16:01:20 +0800 Subject: [PATCH 3/4] =?UTF-8?q?[sensor]=20Fixed=20error=20with=20mutex=5Fl?= =?UTF-8?q?ock=20take=20and=20release=20not=20matching.|=20=E4=BF=AE?= =?UTF-8?q?=E5=A4=8D=E9=94=81=E7=9A=84=E8=8E=B7=E5=8F=96=E5=92=8C=E9=87=8A?= =?UTF-8?q?=E6=94=BE=E4=B8=8D=E5=AF=B9=E5=BA=94=E7=9A=84=E9=94=99=E8=AF=AF?= =?UTF-8?q?.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/drivers/sensors/sensor.c | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/components/drivers/sensors/sensor.c b/components/drivers/sensors/sensor.c index 67539d9410..818bf23164 100644 --- a/components/drivers/sensors/sensor.c +++ b/components/drivers/sensors/sensor.c @@ -139,6 +139,7 @@ static rt_err_t rt_sensor_open(rt_device_t dev, rt_uint16_t oflag) { rt_sensor_t sensor = (rt_sensor_t)dev; RT_ASSERT(dev != RT_NULL); + rt_err_t res = RT_EOK; if (sensor->module) { @@ -152,7 +153,8 @@ static rt_err_t rt_sensor_open(rt_device_t dev, rt_uint16_t oflag) sensor->data_buf = rt_malloc(sizeof(struct rt_sensor_data) * sensor->info.fifo_max); if (sensor->data_buf == RT_NULL) { - return -RT_ENOMEM; + res = -RT_ENOMEM; + goto __exit; } } @@ -186,12 +188,8 @@ static rt_err_t rt_sensor_open(rt_device_t dev, rt_uint16_t oflag) } else { - if (sensor->module) - { - /* release the module mutex */ - rt_mutex_release(sensor->module->lock); - } - return -RT_EINVAL; + res = -RT_EINVAL; + goto __exit; } /* Configure power mode to normal mode */ @@ -200,13 +198,14 @@ static rt_err_t rt_sensor_open(rt_device_t dev, rt_uint16_t oflag) sensor->config.power = RT_SENSOR_POWER_NORMAL; } +__exit: if (sensor->module) { /* release the module mutex */ rt_mutex_release(sensor->module->lock); } - return RT_EOK; + return res; } static rt_err_t rt_sensor_close(rt_device_t dev) From 7d6fa2388d9d2063d5a06f325ed9a7b2a328c730 Mon Sep 17 00:00:00 2001 From: guozhanxin Date: Thu, 13 Jun 2019 17:51:32 +0800 Subject: [PATCH 4/4] =?UTF-8?q?[sensor]=20To=20streamline=20the=20code.|?= =?UTF-8?q?=20=E7=B2=BE=E7=AE=80=E4=BB=A3=E7=A0=81=EF=BC=8C=E5=8E=BB?= =?UTF-8?q?=E9=99=A4=E5=86=97=E4=BD=99=E7=9A=84=E4=BB=A3=E7=A0=81=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- components/drivers/sensors/sensor.c | 73 +++++++++-------------------- 1 file changed, 21 insertions(+), 52 deletions(-) diff --git a/components/drivers/sensors/sensor.c b/components/drivers/sensors/sensor.c index 818bf23164..d689988fdd 100644 --- a/components/drivers/sensors/sensor.c +++ b/components/drivers/sensors/sensor.c @@ -116,24 +116,6 @@ static rt_err_t rt_sensor_irq_init(rt_sensor_t sensor) return 0; } -/* Sensor interrupt enable */ -static void rt_sensor_irq_enable(rt_sensor_t sensor) -{ - if (sensor->config.irq_pin.pin != RT_PIN_NONE) - { - rt_pin_irq_enable(sensor->config.irq_pin.pin, RT_TRUE); - } -} - -/* Sensor interrupt disable */ -static void rt_sensor_irq_disable(rt_sensor_t sensor) -{ - if (sensor->config.irq_pin.pin != RT_PIN_NONE) - { - rt_pin_irq_enable(sensor->config.irq_pin.pin, RT_FALSE); - } -} - /* RT-Thread Device Interface */ static rt_err_t rt_sensor_open(rt_device_t dev, rt_uint16_t oflag) { @@ -160,31 +142,34 @@ static rt_err_t rt_sensor_open(rt_device_t dev, rt_uint16_t oflag) if (oflag & RT_DEVICE_FLAG_RDONLY && dev->flag & RT_DEVICE_FLAG_RDONLY) { - /* If polling mode is supported, configure it to polling mode */ - if (sensor->ops->control(sensor, RT_SENSOR_CTRL_SET_MODE, (void *)RT_SENSOR_MODE_POLLING) == RT_EOK) + if (sensor->ops->control != RT_NULL) { - sensor->config.mode = RT_SENSOR_MODE_POLLING; + /* If polling mode is supported, configure it to polling mode */ + sensor->ops->control(sensor, RT_SENSOR_CTRL_SET_MODE, (void *)RT_SENSOR_MODE_POLLING); } + sensor->config.mode = RT_SENSOR_MODE_POLLING; } else if (oflag & RT_DEVICE_FLAG_INT_RX && dev->flag & RT_DEVICE_FLAG_INT_RX) { - /* If interrupt mode is supported, configure it to interrupt mode */ - if (sensor->ops->control(sensor, RT_SENSOR_CTRL_SET_MODE, (void *)RT_SENSOR_MODE_INT) == RT_EOK) + if (sensor->ops->control != RT_NULL) { - sensor->config.mode = RT_SENSOR_MODE_INT; - /* Initialization sensor interrupt */ - rt_sensor_irq_init(sensor); + /* If interrupt mode is supported, configure it to interrupt mode */ + sensor->ops->control(sensor, RT_SENSOR_CTRL_SET_MODE, (void *)RT_SENSOR_MODE_INT); } + /* Initialization sensor interrupt */ + rt_sensor_irq_init(sensor); + sensor->config.mode = RT_SENSOR_MODE_INT; } else if (oflag & RT_DEVICE_FLAG_FIFO_RX && dev->flag & RT_DEVICE_FLAG_FIFO_RX) { - /* If fifo mode is supported, configure it to fifo mode */ - if (sensor->ops->control(sensor, RT_SENSOR_CTRL_SET_MODE, (void *)RT_SENSOR_MODE_FIFO) == RT_EOK) + if (sensor->ops->control != RT_NULL) { - sensor->config.mode = RT_SENSOR_MODE_FIFO; - /* Initialization sensor interrupt */ - rt_sensor_irq_init(sensor); + /* If fifo mode is supported, configure it to fifo mode */ + sensor->ops->control(sensor, RT_SENSOR_CTRL_SET_MODE, (void *)RT_SENSOR_MODE_FIFO); } + /* Initialization sensor interrupt */ + rt_sensor_irq_init(sensor); + sensor->config.mode = RT_SENSOR_MODE_FIFO; } else { @@ -208,7 +193,7 @@ __exit: return res; } -static rt_err_t rt_sensor_close(rt_device_t dev) +static rt_err_t rt_sensor_close(rt_device_t dev) { rt_sensor_t sensor = (rt_sensor_t)dev; int i; @@ -227,7 +212,10 @@ static rt_err_t rt_sensor_close(rt_device_t dev) } /* Sensor disable interrupt */ - rt_sensor_irq_disable(sensor); + if (sensor->config.irq_pin.pin != RT_PIN_NONE) + { + rt_pin_irq_enable(sensor->config.irq_pin.pin, RT_FALSE); + } if (sensor->module != RT_NULL && sensor->info.fifo_max > 0 && sensor->data_buf != RT_NULL) { @@ -346,25 +334,6 @@ static rt_err_t rt_sensor_control(rt_device_t dev, int cmd, void *args) LOG_D("set odr %d", sensor->config.odr); } break; - case RT_SENSOR_CTRL_SET_MODE: - - /* Configuration sensor work mode */ - result = sensor->ops->control(sensor, RT_SENSOR_CTRL_SET_MODE, args); - if (result == RT_EOK) - { - sensor->config.mode = (rt_uint32_t)args & 0xFF; - LOG_D("set work mode code:", sensor->config.mode); - - if (sensor->config.mode == RT_SENSOR_MODE_POLLING) - { - rt_sensor_irq_disable(sensor); - } - else if (sensor->config.mode == RT_SENSOR_MODE_INT || sensor->config.mode == RT_SENSOR_MODE_FIFO) - { - rt_sensor_irq_enable(sensor); - } - } - break; case RT_SENSOR_CTRL_SET_POWER: /* Configuration sensor power mode */