diff --git a/bsp/ls1bdev/ls1b_ram.lds b/bsp/ls1bdev/ls1b_ram.lds index e55c645865436fd138d6b44d7736a5a3079f0d75..95fb2496f814210761e169d8e0c368bba04967b3 100644 --- a/bsp/ls1bdev/ls1b_ram.lds +++ b/bsp/ls1bdev/ls1b_ram.lds @@ -46,6 +46,12 @@ SECTIONS KEEP(*(VSymTab)) __vsymtab_end = .; . = ALIGN(4); + + . = ALIGN(4); + __rt_init_start = .; + KEEP(*(SORT(.rti_fn*))) + __rt_init_end = .; + . = ALIGN(4); } . = ALIGN(4); diff --git a/bsp/stm32f40x/stm32_rom.ld b/bsp/stm32f40x/stm32_rom.ld index 20c27f6f1a75392f043f97fcc25443d80d63c8d3..bd2ef9fe4487debae8a58a84b2b40a5c22c53af2 100644 --- a/bsp/stm32f40x/stm32_rom.ld +++ b/bsp/stm32f40x/stm32_rom.ld @@ -6,8 +6,8 @@ /* Program Entry, set to mark it as "used" and avoid gc */ MEMORY { - CODE (rx) : ORIGIN = 0x08000000, LENGTH = 512k /* 512KB flash */ - DATA (rw) : ORIGIN = 0x20000000, LENGTH = 64k /* 64K sram */ + CODE (rx) : ORIGIN = 0x08000000, LENGTH = 1024k /* 1024KB flash */ + DATA (rw) : ORIGIN = 0x20000000, LENGTH = 128k /* 128K sram */ } ENTRY(Reset_Handler) _system_stack_size = 0x100; diff --git a/components/external/libpng/pngconf.h b/components/external/libpng/pngconf.h index 047376302dd80ec340c04454bf34de7aefe856a4..bb0a189f9d971b678a7b5c867d4d34d453f3e783 100644 --- a/components/external/libpng/pngconf.h +++ b/components/external/libpng/pngconf.h @@ -23,6 +23,8 @@ #include #define PNG_MAX_MALLOC_64K #define PNG_NO_STDIO +#define PNG_NO_ERROR_NUMBERS +#define PNG_ABORT() do { rt_kprintf("libpng abort.\n"); } while (0) #ifndef RT_USING_NEWLIB #define PNG_NO_WRITE_SUPPORTED diff --git a/components/external/tjpgd1a/SConscript b/components/external/tjpgd1a/SConscript index d5db35385f0e9f8f44d79d956bf7165609e27a1f..37448fcc3b0411d96009f44319874cfd3970c514 100644 --- a/components/external/tjpgd1a/SConscript +++ b/components/external/tjpgd1a/SConscript @@ -8,7 +8,7 @@ tjpgd.c CPPPATH = [RTT_ROOT + '/components/external/tjpgd1a'] -group = DefineGroup('tjpgd', src, depend = ['RTGUI_IMAGE_TJPGD'], CPPPATH = CPPPATH) +group = DefineGroup('RTGUI', src, depend = ['RT_USING_RTGUI', 'RTGUI_IMAGE_TJPGD'], CPPPATH = CPPPATH) Return('group') diff --git a/components/external/tjpgd1a/tjpgd.c b/components/external/tjpgd1a/tjpgd.c index 9c69989ced182ad8e71510502445998dbb208f4a..4203336c51edafc90e5996540f198aac252347de 100644 --- a/components/external/tjpgd1a/tjpgd.c +++ b/components/external/tjpgd1a/tjpgd.c @@ -525,7 +525,7 @@ JRESULT mcu_load ( } while (++i < 64); /* Next AC element */ if (JD_USE_SCALE && jd->scale == 3) - *bp = (*tmp / 256) + 128; /* If scale ratio is 1/8, IDCT can be ommited and only DC element is used */ + *bp = (BYTE)((*tmp / 256) + 128); /* If scale ratio is 1/8, IDCT can be ommited and only DC element is used */ else block_idct(tmp, bp); /* Apply IDCT and store the block to the MCU buffer */ diff --git a/components/finsh/shell.c b/components/finsh/shell.c index 393d68713ccd72c99e7357602f6fcc846337dfa2..ae099e7e7c3e9ce5915fd33d8577499e242627c3 100644 --- a/components/finsh/shell.c +++ b/components/finsh/shell.c @@ -530,6 +530,12 @@ void finsh_thread_entry(void* parameter) ch = 0; shell->line_position ++; shell->line_curpos++; + if (shell->line_position >= 80) + { + /* clear command line */ + shell->line_position = 0; + shell->line_curpos = 0; + } } /* end of device read */ } } diff --git a/components/libc/armlibc/stubs.c b/components/libc/armlibc/stubs.c index 301f65418285b85eed24b51a1c7ac4cc46349f0c..d219b3430a79a58f82d5ec7bfbba9b89b8eaf697 100644 --- a/components/libc/armlibc/stubs.c +++ b/components/libc/armlibc/stubs.c @@ -46,8 +46,10 @@ const char __stderr_name[] = "STDERR"; */ FILEHANDLE _sys_open(const char *name, int openmode) { +#ifdef RT_USING_DFS int fd; - +#endif + /* Register standard Input Output devices. */ if (strcmp(name, __stdin_name) == 0) return (STDIN); @@ -91,12 +93,13 @@ int _sys_close(FILEHANDLE fh) */ int _sys_read(FILEHANDLE fh, unsigned char *buf, unsigned len, int mode) { +#ifdef RT_USING_DFS int size; - +#endif + if (fh == STDIN) { /* TODO */ - return 0; } @@ -125,8 +128,10 @@ int _sys_read(FILEHANDLE fh, unsigned char *buf, unsigned len, int mode) */ int _sys_write(FILEHANDLE fh, const unsigned char *buf, unsigned len, int mode) { +#ifdef RT_USING_DFS int size; - +#endif + if ((fh == STDOUT) || (fh == STDERR)) { #ifndef RT_USING_CONSOLE diff --git a/components/net/lwip-1.4.1/src/arch/sys_arch.c b/components/net/lwip-1.4.1/src/arch/sys_arch.c index ee1d9524100dad9392ac32db5ff32cb003ab7437..356dc101cf1641ded9d33b21603fbe1b4ac79c83 100644 --- a/components/net/lwip-1.4.1/src/arch/sys_arch.c +++ b/components/net/lwip-1.4.1/src/arch/sys_arch.c @@ -108,7 +108,7 @@ static void tcpip_init_done_callback(void *arg) netif_set_up(ethif->netif); } -#ifdef LWIP_NETIF_LINK_CALLBACK +#if LWIP_NETIF_LINK_CALLBACK netif_set_link_up(ethif->netif); #endif diff --git a/components/net/lwip-1.4.1/src/include/netif/ethernetif.h b/components/net/lwip-1.4.1/src/include/netif/ethernetif.h index 53dacf2270b33721ea36a8b06343b5ed9bb3da68..2019df701721522f77cfb845b06d9e909ee2b63d 100644 --- a/components/net/lwip-1.4.1/src/include/netif/ethernetif.h +++ b/components/net/lwip-1.4.1/src/include/netif/ethernetif.h @@ -5,7 +5,11 @@ #include #define NIOCTL_GADDR 0x01 +#ifndef RT_LWIP_ETH_MTU #define ETHERNET_MTU 1500 +#else +#define ETHERNET_MTU RT_LWIP_ETH_MTU +#endif struct eth_device { diff --git a/components/net/lwip-1.4.1/src/lwipopts.h b/components/net/lwip-1.4.1/src/lwipopts.h index 10cb7893a7ad3e3c23979e1e282c2c22ec7601db..bff172e280493cafdb27119c18c4418e82a7fd43 100644 --- a/components/net/lwip-1.4.1/src/lwipopts.h +++ b/components/net/lwip-1.4.1/src/lwipopts.h @@ -38,8 +38,9 @@ #define LWIP_PLATFORM_BYTESWAP 0 #define BYTE_ORDER LITTLE_ENDIAN -/* Enable SO_RCVTIMEO processing. */ +/* Enable SO_RCVTIMEO/LWIP_SO_SNDTIMEO processing. */ #define LWIP_SO_RCVTIMEO 1 +#define LWIP_SO_SNDTIMEO 1 /* #define RT_LWIP_DEBUG */ @@ -117,6 +118,8 @@ /* the number of simultaneously queued TCP */ #ifdef RT_LWIP_TCP_SEG_NUM +#define MEMP_NUM_TCP_SEG RT_LWIP_TCP_SEG_NUM +#else #define MEMP_NUM_TCP_SEG TCP_SND_QUEUELEN #endif @@ -135,12 +138,12 @@ /* ---------- Pbuf options ---------- */ /* PBUF_POOL_SIZE: the number of buffers in the pbuf pool. */ #ifdef RT_LWIP_PBUF_NUM -#define PBUF_POOL_SIZE RT_LWIP_PBUF_NUM +#define PBUF_POOL_SIZE RT_LWIP_PBUF_NUM #endif /* PBUF_POOL_BUFSIZE: the size of each pbuf in the pbuf pool. */ #ifdef RT_LWIP_PBUF_POOL_BUFSIZE -#define PBUF_POOL_BUFSIZE RT_LWIP_PBUF_POOL_BUFSIZE +#define PBUF_POOL_BUFSIZE RT_LWIP_PBUF_POOL_BUFSIZE #endif /* PBUF_LINK_HLEN: the number of bytes that should be allocated for a @@ -176,7 +179,7 @@ /* TCP sender buffer space (bytes). */ #ifdef RT_LWIP_TCP_SND_BUF -#define TCP_SND_BUF RT_LWIP_TCP_SND_BUF +#define TCP_SND_BUF RT_LWIP_TCP_SND_BUF #else #define TCP_SND_BUF (TCP_MSS * 2) #endif @@ -230,10 +233,15 @@ /* IP reassembly and segmentation.These are orthogonal even * if they both deal with IP fragments */ -#define IP_REASSEMBLY 0 +#ifdef RT_LWIP_REASSEMBLY_FRAG +#define IP_REASSEMBLY 1 +#define IP_FRAG 1 #define IP_REASS_MAX_PBUFS 10 #define MEMP_NUM_REASSDATA 10 +#else +#define IP_REASSEMBLY 0 #define IP_FRAG 0 +#endif /* ---------- ICMP options ---------- */ #define ICMP_TTL 255 @@ -307,7 +315,7 @@ * in this file. */ #ifdef RT_LWIP_PPPOE -#define PPPOE_SUPPORT 1 +#define PPPOE_SUPPORT 1 #else #define PPPOE_SUPPORT 0 #endif @@ -315,7 +323,7 @@ #ifdef RT_LWIP_PPPOS #define PPPOS_SUPPORT 1 #else -#define PPPOS_SUPPORT 0 +#define PPPOS_SUPPORT 0 #endif #define PAP_SUPPORT 1 /* Set > 0 for PAP. */ diff --git a/components/utilities/logtrace/log_trace.c b/components/utilities/logtrace/log_trace.c index 1d0a42725e47695061a3565d9b8d71db19f43e55..d0604659073a32037048c8b5fb8770046737206c 100644 --- a/components/utilities/logtrace/log_trace.c +++ b/components/utilities/logtrace/log_trace.c @@ -42,7 +42,7 @@ static rt_device_t _traceout_device = RT_NULL; /* define a default lg session. The name is empty. */ static struct log_trace_session _def_session = {{"\0"}, LOG_TRACE_LEVEL_INFO}; -static struct log_trace_session *_the_sessions[LOG_TRACE_MAX_SESSION] = {&_def_session}; +static const struct log_trace_session *_the_sessions[LOG_TRACE_MAX_SESSION] = {&_def_session}; /* there is a default session at least */ static rt_uint16_t _the_sess_nr = 1; @@ -83,11 +83,11 @@ rt_inline int _idname_len(log_trace_idnum_t id) */ static struct log_trace_session* _lg_lookup_session(log_trace_idnum_t num) { - static struct log_trace_session *_cache = &_def_session; + static const struct log_trace_session *_cache = &_def_session; rt_uint16_t first, last; if (_cache->id.num == num) - return _cache; + return (struct log_trace_session *)_cache; first = 0; last = _the_sess_nr; @@ -104,7 +104,7 @@ static struct log_trace_session* _lg_lookup_session(log_trace_idnum_t num) * process and we wrote the old one to _cache. But it doesn't harm * a lot because it will be flushed in the next time. */ _cache = _the_sessions[i]; - return _the_sessions[i]; + return (struct log_trace_session *)_the_sessions[i]; } else if (_the_sessions[i]->id.num > num) { @@ -119,7 +119,7 @@ static struct log_trace_session* _lg_lookup_session(log_trace_idnum_t num) return RT_NULL; } -rt_err_t log_trace_register_session(struct log_trace_session *session) +rt_err_t log_trace_register_session(const struct log_trace_session *session) { unsigned int lvl, i; @@ -255,8 +255,9 @@ static rt_size_t _lg_parse_session( return 0; } -static void _lg_fmtout( - struct log_trace_session *session, const char *fmt, va_list argptr) +void __logtrace_vfmtout(const struct log_trace_session *session, + const char *fmt, + va_list argptr) { /* 1 for ']' */ static char _trace_buf[1+LOG_TRACE_BUFSZ]; @@ -303,12 +304,12 @@ void log_trace(const char *fmt, ...) return; va_start(args, fmt); - _lg_fmtout(session, fmt, args); + __logtrace_vfmtout(session, fmt, args); va_end(args); } FINSH_FUNCTION_EXPORT(log_trace, log trace); -void log_session(struct log_trace_session *session, const char *fmt, ...) +void log_session(const struct log_trace_session *session, const char *fmt, ...) { va_list args; int level; @@ -321,7 +322,7 @@ void log_session(struct log_trace_session *session, const char *fmt, ...) return; va_start(args, fmt); - _lg_fmtout(session, fmt, args); + __logtrace_vfmtout(session, fmt, args); va_end(args); } diff --git a/components/utilities/logtrace/log_trace.h b/components/utilities/logtrace/log_trace.h index 77e1f08b6c087860673bc34dc182c209a52435c2..1e8cc4abae599f9eacacb99b45e2d5d53171d319 100644 --- a/components/utilities/logtrace/log_trace.h +++ b/components/utilities/logtrace/log_trace.h @@ -1,7 +1,7 @@ /* * File : log_trace.h * This file is part of RT-Thread RTOS - * COPYRIGHT (C) 2013, RT-Thread Development Team + * COPYRIGHT (C) 2013-2014, RT-Thread Development Team * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -95,7 +95,7 @@ void log_trace_init(void); * * @return RT_EOK on success. -RT_EFULL if there is no space for registration. */ -rt_err_t log_trace_register_session(struct log_trace_session *session); +rt_err_t log_trace_register_session(const struct log_trace_session *session); /** find a session with name * @@ -130,7 +130,43 @@ void log_trace(const char *fmt, ...); * "[systick][name]log messages". The name is the name of the session. It is * faster than bare log_trace. */ -void log_session(struct log_trace_session *session, const char *fmt, ...); +void log_session(const struct log_trace_session *session, const char *fmt, ...); + +extern void __logtrace_vfmtout(const struct log_trace_session *session, + const char *fmt, + va_list argptr); + +rt_inline void __logtrace_fmtout(const struct log_trace_session *session, + const char *fmt, ...) +{ + va_list args; + + va_start(args, fmt); + __logtrace_vfmtout(session, fmt, args); + va_end(args); +} + +/** + * log with numeric level + * + * The prototype of this function is: + * + * void log_session_lvl(struct log_trace_session *session, + * int lvl, + * const char *fmt, ...); + * + * If the @session is const and @level is greater than @session->lvl, the whole + * function will be optimized out. This is suitable for performance critical + * places where in most cases, the log is turned off by level. + */ +#define log_session_lvl(session, level, fmt, ...) \ + do { \ + if ((level) > (session)->lvl) \ + { \ + break; \ + } \ + __logtrace_fmtout(session, fmt, ##__VA_ARGS__); \ + } while (0) /* here comes the global part. All sessions share the some output backend. */ diff --git a/components/utilities/ymodem/ymodem.c b/components/utilities/ymodem/ymodem.c index fdd1950cc06b516e2ed05717c151d618ea0ed2ca..f5ebeab832f7e2f389f9506f2fff8b5cf8064e9f 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/include/rtdef.h b/include/rtdef.h index 2d1ea4dfd26cf0a38e9fa5917aa90d8a53ed5f38..332f2eff5929047c25793d4d87de5edba2037d5e 100644 --- a/include/rtdef.h +++ b/include/rtdef.h @@ -50,7 +50,7 @@ extern "C" { /* RT-Thread version information */ #define RT_VERSION 1L /**< major version number */ #define RT_SUBVERSION 2L /**< minor version number */ -#define RT_REVISION 1L /**< revise version number */ +#define RT_REVISION 2L /**< revise version number */ /* RT-Thread version */ #define RTTHREAD_VERSION ((RT_VERSION * 10000) + \ diff --git a/src/device.c b/src/device.c index 75b88bf6eba414555a5cd72eb0071958dc97b169..7ee130041c6b59e8a1ecca57a7a543ab1d575561 100644 --- a/src/device.c +++ b/src/device.c @@ -239,11 +239,6 @@ rt_err_t rt_device_open(rt_device_t dev, rt_uint16_t oflag) return -RT_EBUSY; } - dev->ref_count++; - /* don't let bad things happen silently. If you are bitten by this assert, - * please set the ref_count to a bigger type. */ - RT_ASSERT(dev->ref_count != 0); - /* call device open interface */ if (dev->open != RT_NULL) { @@ -252,8 +247,15 @@ rt_err_t rt_device_open(rt_device_t dev, rt_uint16_t oflag) /* set open flag */ if (result == RT_EOK || result == -RT_ENOSYS) + { dev->open_flag = oflag | RT_DEVICE_OFLAG_OPEN; + dev->ref_count++; + /* don't let bad things happen silently. If you are bitten by this assert, + * please set the ref_count to a bigger type. */ + RT_ASSERT(dev->ref_count != 0); + } + return result; } RTM_EXPORT(rt_device_open); diff --git a/src/timer.c b/src/timer.c index ac8a148d8d1f32cd4027406932c415442a1130a7..53cb186243b90ada67e294887d1e9e76f840622f 100644 --- a/src/timer.c +++ b/src/timer.c @@ -128,6 +128,7 @@ rt_inline void _rt_timer_remove(rt_timer_t timer) } } +#if RT_DEBUG_TIMER static int rt_timer_count_height(struct rt_timer *timer) { int i, cnt = 0; @@ -155,6 +156,7 @@ void rt_timer_dump(rt_list_t timer_heads[]) } rt_kprintf("\n"); } +#endif /** * @addtogroup Clock @@ -298,8 +300,14 @@ rt_err_t rt_timer_start(rt_timer_t timer) /* timer check */ RT_ASSERT(timer != RT_NULL); - if (timer->parent.flag & RT_TIMER_FLAG_ACTIVATED) - return -RT_ERROR; + + /* stop timer firstly */ + level = rt_hw_interrupt_disable(); + /* remove timer from list */ + _rt_timer_remove(timer); + /* change status of timer */ + timer->parent.flag &= ~RT_TIMER_FLAG_ACTIVATED; + rt_hw_interrupt_enable(level); RT_OBJECT_HOOK_CALL(rt_object_take_hook, (&(timer->parent)));