diff --git a/components/dfs/src/dfs_file.c b/components/dfs/src/dfs_file.c index 1063a278aba5459e8e72853d98c072088bcab688..91d39597f06d520096dc863754c21cbce1cd5233 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 diff --git a/components/drivers/src/pipe.c b/components/drivers/src/pipe.c index b682c351ad5d6cddf07ff36cbb18f9a9588de253..ae87b6f5f22e54e91d2b15cae957f713073a498f 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 --; diff --git a/include/rtthread.h b/include/rtthread.h index 13a1a4424bf47e5caf5a54543f3b7bfe315d3136..92cdf012b24b2875fd7874d4449bb8eb44f8c842 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_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 7596906fae68de4996ce3729d63c2f221d8aa5cc..3a3c97d0b67d8aaecd5473ab1825dcd2461f2845 100644 --- a/src/thread.c +++ b/src/thread.c @@ -530,6 +530,63 @@ rt_err_t rt_thread_delay(rt_tick_t tick) } RTM_EXPORT(rt_thread_delay); +/** + * 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_until(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); + 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(); + + /* clear error number of this thread to RT_EOK */ + if (thread->error == -RT_ETIMEOUT) + { + thread->error = RT_EOK; + } + } + else + { + rt_hw_interrupt_enable(level); + } + + /* get the wakeup tick */ + *tick = rt_tick_get(); + + return RT_EOK; +} +RTM_EXPORT(rt_thread_delay_util); + /** * This function will let current thread delay for some milliseconds. *