summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBernard Xiong <[email protected]>2014-07-15 18:12:15 +0800
committerBernard Xiong <[email protected]>2014-07-15 18:12:15 +0800
commit19ef55375a39a2ae1ed662ec07baad528c419940 (patch)
treeff41a6f165cbff4eaa0fb55cce9e457fd5df1dac
parent0bc57e9b8223181d4827eb4c422776bf72dc5a3a (diff)
parent2aa51d42f910781cc25747347eea4e0ae6bd1b77 (diff)
Merge pull request #299 from grissiom/next-ymodem
Next ymodem
-rw-r--r--components/utilities/ymodem/ymodem.c25
-rw-r--r--components/utilities/ymodem/ymodem.h2
2 files changed, 16 insertions, 11 deletions
diff --git a/components/utilities/ymodem/ymodem.c b/components/utilities/ymodem/ymodem.c
index fdd1950cc0..f5ebeab832 100644
--- a/components/utilities/ymodem/ymodem.c
+++ b/components/utilities/ymodem/ymodem.c
@@ -70,18 +70,23 @@ static enum rym_code _rym_read_code(
struct rym_ctx *ctx,
rt_tick_t timeout)
{
- /* consume the available sem and read the data in buffer if possible */
- while (rt_sem_trytake(&ctx->sem) == RT_EOK)
- ;
+ /* Fast path */
if (rt_device_read(ctx->dev, 0, ctx->buf, 1) == 1)
return *ctx->buf;
- /* no data yet, wait for one */
- if (rt_sem_take(&ctx->sem, timeout) != RT_EOK)
- return RYM_CODE_NONE;
- /* read one */
- if (rt_device_read(ctx->dev, 0, ctx->buf, 1) == 1)
- return *ctx->buf;
- return RYM_CODE_NONE;
+
+ /* Slow path */
+ do {
+ rt_size_t rsz;
+
+ /* No data yet, wait for one */
+ if (rt_sem_take(&ctx->sem, timeout) != RT_EOK)
+ return RYM_CODE_NONE;
+
+ /* Try to read one */
+ rsz = rt_device_read(ctx->dev, 0, ctx->buf, 1);
+ if (rsz == 1)
+ return *ctx->buf;
+ } while (1);
}
/* the caller should at least alloc _RYM_STX_PKG_SZ buffer */
diff --git a/components/utilities/ymodem/ymodem.h b/components/utilities/ymodem/ymodem.h
index daed61d15f..43ee6f5c10 100644
--- a/components/utilities/ymodem/ymodem.h
+++ b/components/utilities/ymodem/ymodem.h
@@ -52,7 +52,7 @@ enum rym_code {
#endif
/* how many ticks between two handshake code. */
#ifndef RYM_CHD_INTV_TICK
-#define RYM_CHD_INTV_TICK (RT_TICK_PER_SECOND / 4)
+#define RYM_CHD_INTV_TICK (RT_TICK_PER_SECOND * 3)
#endif
enum rym_stage {