Browse Source

Merge 2.0.0 modification to prepare v1.2.2 release.

bernard 11 years ago
parent
commit
50e7ae7e87

+ 6 - 0
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);

+ 2 - 2
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;

+ 2 - 0
components/external/libpng/pngconf.h

@@ -23,6 +23,8 @@
 #include <rtthread.h>
 #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

+ 1 - 1
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')
 

+ 1 - 1
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 */
 

+ 6 - 0
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 */
     }
 }

+ 9 - 4
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

+ 1 - 1
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
 

+ 4 - 0
components/net/lwip-1.4.1/src/include/netif/ethernetif.h

@@ -5,7 +5,11 @@
 #include <rtthread.h>
 
 #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
 {

+ 15 - 7
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. */

+ 11 - 10
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);
 }
 

+ 39 - 3
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. */
 

+ 15 - 10
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 */

+ 1 - 1
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) + \

+ 7 - 5
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);

+ 10 - 2
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)));