From 78d42efd223275b93776d7653a5405ecd29feb8f Mon Sep 17 00:00:00 2001 From: Bernard Xiong Date: Wed, 18 Dec 2019 21:37:42 +0800 Subject: [PATCH 1/6] [DFS] cleanup the log in dfs. --- components/dfs/src/dfs_file.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/components/dfs/src/dfs_file.c b/components/dfs/src/dfs_file.c index 1063a278ab..91d39597f0 100644 --- a/components/dfs/src/dfs_file.c +++ b/components/dfs/src/dfs_file.c @@ -369,8 +369,7 @@ int dfs_file_stat(const char *path, struct stat *buf) if ((fs = dfs_filesystem_lookup(fullpath)) == NULL) { - LOG_E( - "can't find mounted filesystem on this path:%s", fullpath); + LOG_E("can't find mounted filesystem on this path:%s", fullpath); rt_free(fullpath); return -ENOENT; @@ -399,8 +398,7 @@ int dfs_file_stat(const char *path, struct stat *buf) if (fs->ops->stat == NULL) { rt_free(fullpath); - LOG_E( - "the filesystem didn't implement this function"); + LOG_E("the filesystem didn't implement this function"); return -ENOSYS; } @@ -565,7 +563,7 @@ void ls(const char *pathname) } else { - rt_kprintf("%-25lu\n", stat.st_size); + rt_kprintf("%-25lu\n", (unsigned long)stat.st_size); } } else From 055061a6397bcaafab36723ca1598a8b9402059d Mon Sep 17 00:00:00 2001 From: Bernard Xiong Date: Wed, 18 Dec 2019 21:38:05 +0800 Subject: [PATCH 2/6] [DeviceDrivers] Fix pipe memory issue. --- components/drivers/src/pipe.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/components/drivers/src/pipe.c b/components/drivers/src/pipe.c index b682c351ad..74784240dc 100644 --- a/components/drivers/src/pipe.c +++ b/components/drivers/src/pipe.c @@ -19,6 +19,7 @@ static int pipe_fops_open(struct dfs_fd *fd) { + int rc = 0; rt_device_t device; rt_pipe_t *pipe; @@ -31,6 +32,11 @@ static int pipe_fops_open(struct dfs_fd *fd) if (device->ref_count == 0) { pipe->fifo = rt_ringbuffer_create(pipe->bufsz); + if (pipe->fifo == RT_NULL) + { + rc = -RT_ENOMEM; + goto __exit; + } } switch (fd->flags & O_ACCMODE) @@ -48,9 +54,10 @@ static int pipe_fops_open(struct dfs_fd *fd) } device->ref_count ++; +__exit: rt_mutex_release(&(pipe->lock)); - return 0; + return rc; } static int pipe_fops_close(struct dfs_fd *fd) @@ -90,7 +97,8 @@ static int pipe_fops_close(struct dfs_fd *fd) if (device->ref_count == 1) { - rt_ringbuffer_destroy(pipe->fifo); + if (pipe->fifo != RT_NULL) + rt_ringbuffer_destroy(pipe->fifo); pipe->fifo = RT_NULL; } device->ref_count --; From 4a14b8f59a5e03a9d1e9a3185abcd4daf68f5505 Mon Sep 17 00:00:00 2001 From: Bernard Xiong Date: Wed, 18 Dec 2019 21:38:26 +0800 Subject: [PATCH 3/6] [Kernel] Add delay_util implementation. --- include/rtthread.h | 1 + src/thread.c | 55 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 56 insertions(+) diff --git a/include/rtthread.h b/include/rtthread.h index 13a1a4424b..d7be380764 100644 --- a/include/rtthread.h +++ b/include/rtthread.h @@ -138,6 +138,7 @@ rt_err_t rt_thread_delete(rt_thread_t thread); rt_err_t rt_thread_yield(void); rt_err_t rt_thread_delay(rt_tick_t tick); +rt_err_t rt_thread_delay_util(rt_tick_t *tick, rt_tick_t inc_tick); rt_err_t rt_thread_mdelay(rt_int32_t ms); rt_err_t rt_thread_control(rt_thread_t thread, int cmd, void *arg); rt_err_t rt_thread_suspend(rt_thread_t thread); diff --git a/src/thread.c b/src/thread.c index 7596906fae..95f9f76f84 100644 --- a/src/thread.c +++ b/src/thread.c @@ -530,6 +530,61 @@ rt_err_t rt_thread_delay(rt_tick_t tick) } RTM_EXPORT(rt_thread_delay); +/** + * This function will let current thread delay util (*tick + inc_tick). + * + * @param tick the tick of last wakeup. + * @param inc_tick the increment tick + * + * @return RT_EOK + */ +rt_err_t rt_thread_delay_util(rt_tick_t *tick, rt_tick_t inc_tick) +{ + register rt_base_t level; + struct rt_thread *thread; + + /* set to current thread */ + thread = rt_thread_self(); + RT_ASSERT(thread != RT_NULL); + RT_ASSERT(rt_object_get_type((rt_object_t)thread) == RT_Object_Class_Thread); + + /* disable interrupt */ + level = rt_hw_interrupt_disable(); + + if (rt_tick_get() - *tick < inc_tick) + { + *tick = rt_tick_get() - *tick + inc_tick; + + /* suspend thread */ + rt_thread_suspend(thread); + + /* reset the timeout of thread timer and start it */ + rt_timer_control(&(thread->thread_timer), RT_TIMER_CTRL_SET_TIME, tick); + rt_timer_start(&(thread->thread_timer)); + + /* enable interrupt */ + rt_hw_interrupt_enable(level); + + rt_schedule(); + + /* get the wakeup tick */ + *tick = rt_tick_get(); + + /* clear error number of this thread to RT_EOK */ + if (thread->error == -RT_ETIMEOUT) + { + thread->error = RT_EOK; + } + } + else + { + rt_hw_interrupt_enable(level); + } + + return RT_EOK; +} +RTM_EXPORT(rt_thread_delay_util); + /** * This function will let current thread delay for some milliseconds. * From 7a00b42e9764a3a51095f7a810344405ce190f75 Mon Sep 17 00:00:00 2001 From: Bernard Xiong Date: Wed, 18 Dec 2019 23:19:54 +0800 Subject: [PATCH 4/6] Update pipe.c --- components/drivers/src/pipe.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/drivers/src/pipe.c b/components/drivers/src/pipe.c index 74784240dc..ae87b6f5f2 100644 --- a/components/drivers/src/pipe.c +++ b/components/drivers/src/pipe.c @@ -19,7 +19,7 @@ static int pipe_fops_open(struct dfs_fd *fd) { - int rc = 0; + int rc = 0; rt_device_t device; rt_pipe_t *pipe; From df57b9014c07fbb3afdc33c1dc94c55c2dba0359 Mon Sep 17 00:00:00 2001 From: Bernard Xiong Date: Thu, 19 Dec 2019 08:06:53 +0800 Subject: [PATCH 5/6] Update thread.c --- src/thread.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/thread.c b/src/thread.c index 95f9f76f84..041dfab879 100644 --- a/src/thread.c +++ b/src/thread.c @@ -543,6 +543,8 @@ rt_err_t rt_thread_delay_util(rt_tick_t *tick, rt_tick_t inc_tick) register rt_base_t level; struct rt_thread *thread; + RT_ASSERT(tick != RT_NULL); + /* set to current thread */ thread = rt_thread_self(); RT_ASSERT(thread != RT_NULL); @@ -567,9 +569,6 @@ rt_err_t rt_thread_delay_util(rt_tick_t *tick, rt_tick_t inc_tick) rt_schedule(); - /* get the wakeup tick */ - *tick = rt_tick_get(); - /* clear error number of this thread to RT_EOK */ if (thread->error == -RT_ETIMEOUT) { @@ -581,6 +580,9 @@ rt_err_t rt_thread_delay_util(rt_tick_t *tick, rt_tick_t inc_tick) rt_hw_interrupt_enable(level); } + /* get the wakeup tick */ + *tick = rt_tick_get(); + return RT_EOK; } RTM_EXPORT(rt_thread_delay_util); From 2c1f7b73a73f6e5aae7c9bbb1c38a609e39a1a08 Mon Sep 17 00:00:00 2001 From: Bernard Xiong Date: Thu, 19 Dec 2019 09:45:58 +0800 Subject: [PATCH 6/6] [Kernel] fix typo in rthread_delay --- include/rtthread.h | 2 +- src/thread.c | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/include/rtthread.h b/include/rtthread.h index d7be380764..92cdf012b2 100644 --- a/include/rtthread.h +++ b/include/rtthread.h @@ -138,7 +138,7 @@ rt_err_t rt_thread_delete(rt_thread_t thread); rt_err_t rt_thread_yield(void); rt_err_t rt_thread_delay(rt_tick_t tick); -rt_err_t rt_thread_delay_util(rt_tick_t *tick, rt_tick_t inc_tick); +rt_err_t rt_thread_delay_until(rt_tick_t *tick, rt_tick_t inc_tick); rt_err_t rt_thread_mdelay(rt_int32_t ms); rt_err_t rt_thread_control(rt_thread_t thread, int cmd, void *arg); rt_err_t rt_thread_suspend(rt_thread_t thread); diff --git a/src/thread.c b/src/thread.c index 041dfab879..3a3c97d0b6 100644 --- a/src/thread.c +++ b/src/thread.c @@ -531,14 +531,14 @@ rt_err_t rt_thread_delay(rt_tick_t tick) RTM_EXPORT(rt_thread_delay); /** - * This function will let current thread delay util (*tick + inc_tick). + * This function will let current thread delay until (*tick + inc_tick). * * @param tick the tick of last wakeup. * @param inc_tick the increment tick * * @return RT_EOK */ -rt_err_t rt_thread_delay_util(rt_tick_t *tick, rt_tick_t inc_tick) +rt_err_t rt_thread_delay_until(rt_tick_t *tick, rt_tick_t inc_tick) { register rt_base_t level; struct rt_thread *thread;