瀏覽代碼

surport finsh

prife 12 年之前
父節點
當前提交
07da6caafd

+ 4 - 35
bsp/simlinux/applications/application.c

@@ -18,6 +18,7 @@
 
 #include <components.h>
 
+
 void rt_init_thread_entry(void *parameter)
 {
 #ifdef RT_USING_LWIP
@@ -74,16 +75,8 @@ void rt_init_thread_entry(void *parameter)
     }
 #endif
 
-#if 0
-    {
-        extern void application_init(void);
-        rt_thread_delay(RT_TICK_PER_SECOND);
-        application_init();
-    }
-#endif
-
 #if defined(RT_USING_RTGUI)
-    rt_thread_delay(3000);
+    rt_thread_delay(RT_TICK_PER_SECOND);
     snake_main();
 #endif
 }
@@ -91,56 +84,32 @@ void rt_init_thread_entry(void *parameter)
 static void rt_test_thread_entry(void *parameter)
 {
     int i;
-    for (i = 0; i < 10; i++)
+    for (i = 0; i < 5; i++)
     {
         rt_kprintf("hello, world\n");
         rt_thread_delay(RT_TICK_PER_SECOND);
     }
 }
 
-static void rt_high_thread_entry(void *parameter)
-{
-    int i;
-    for (i = 0; i < 3; i++)
-    {
-        rt_kprintf("high thread <%d> \n", i);
-        rt_thread_delay(2*RT_TICK_PER_SECOND);
-    }
-}
 
 int rt_application_init()
 {
     rt_thread_t tid;
 
-#if 0
     tid = rt_thread_create("init",
                            rt_init_thread_entry, RT_NULL,
                            2048, RT_THREAD_PRIORITY_MAX / 3, 20);
 
     if (tid != RT_NULL)
         rt_thread_startup(tid);
+
     tid = rt_thread_create("test",
                            rt_test_thread_entry, RT_NULL,
                            2048, RT_THREAD_PRIORITY_MAX * 3 / 4, 20);
     if (tid != RT_NULL)
         rt_thread_startup(tid);
 
-#endif
-
-    tid = rt_thread_create("test1",
-                           rt_high_thread_entry, RT_NULL,
-                           2048, RT_THREAD_PRIORITY_MAX / 2, 20);
-    if (tid != RT_NULL)
-        rt_thread_startup(tid);
-
-    tid = rt_thread_create("test2",
-                           rt_test_thread_entry, RT_NULL,
-                           2048, RT_THREAD_PRIORITY_MAX / 2, 20);
-    if (tid != RT_NULL)
-        rt_thread_startup(tid);
-
     return 0;
 }
 
-
 /*@}*/

+ 1 - 0
bsp/simlinux/drivers/serial.c

@@ -122,6 +122,7 @@ static rt_size_t rt_serial_write(rt_device_t dev, rt_off_t pos, const void *buff
 #endif
 
     printf("%s", (char *)buffer);
+	fflush(stdout);
     return size;
 }
 

+ 23 - 25
bsp/simlinux/drivers/usart_sim.c

@@ -59,28 +59,6 @@ void rt_hw_usart_init(void)
 #include <termios.h> /* for tcxxxattr, ECHO, etc */
 #include <unistd.h> /* for STDIN_FILENO */
 
-/*simulate windows' getch(), it works!!*/
-int getch(void) 
-{
-    int ch;
-    struct termios oldt, newt;
-
-	// get terminal input's attribute
-    tcgetattr(STDIN_FILENO, &oldt);
-    newt = oldt;
-
-	//set termios' local mode
-    newt.c_lflag &= ~(ECHO|ICANON);
-    tcsetattr(STDIN_FILENO, TCSANOW, &newt);
-
-	//read character from terminal input
-    ch = getchar();
-
-	//recover terminal's attribute
-    tcsetattr(STDIN_FILENO, TCSANOW, &oldt);
-
-    return ch;
-}
 
 static void * ThreadforKeyGet(void * lpParam);
 static pthread_t OSKey_Thread;
@@ -149,16 +127,36 @@ static int savekey(unsigned char key)
 #ifdef _WIN32
 static DWORD WINAPI ThreadforKeyGet(LPVOID lpParam)
 #else
+
+/*simulate windows' getch(), it works!!*/
+static void setgetchar(void) 
+{
+    struct termios oldt, newt;
+
+	// get terminal input's attribute
+    tcgetattr(STDIN_FILENO, &oldt);
+    newt = oldt;
+
+	//set termios' local mode
+    newt.c_lflag &= ~(ECHO|ICANON);
+    tcsetattr(STDIN_FILENO, TCSANOW, &newt);
+}
+#define getch  getchar
+
 static void * ThreadforKeyGet(void * lpParam)
-#endif
+#endif /* not _WIN32*/
 {
     unsigned char key;
 
     (void)lpParam;              //prevent compiler warnings
-
+#ifndef _WIN32
+	/* set the getchar without buffer */
+ 	setgetchar();
+#endif
     for (;;)
     {
         key = getch();
+#ifdef _WIN32
         if (key == 0xE0)
         {
             key = getch();
@@ -178,7 +176,7 @@ static void * ThreadforKeyGet(void * lpParam)
 
             continue;
         }
-
+#endif
         savekey(key);
     }
 } /*** ThreadforKeyGet ***/

+ 3 - 1
bsp/simlinux/rtconfig.py

@@ -35,11 +35,13 @@ if PLATFORM == 'gcc':
     OBJCPY = PREFIX + 'objcopy'
 
     DEVICE = ' -ffunction-sections -fdata-sections'
+    DEVICE = '  '
     CFLAGS = DEVICE + ' -I/usr/include -w -D_REENTRANT'
     AFLAGS = ' -c' + DEVICE + ' -x assembler-with-cpp'
     #LFLAGS = DEVICE + ' -Wl,--gc-sections,-Map=rtthread-linux.map,-cref,-u,Reset_Handler -T stm32_rom.ld'
     #LFLAGS = DEVICE + ' -Wl,--gc-sections,-Map=rtthread-linux.map -lpthread'
-    LFLAGS = DEVICE + ' -Wl,--gc-sections,-Map=rtthread-linux.map -pthread'
+    #LFLAGS = DEVICE + ' -Wl,--gc-sections,-Map=rtthread-linux.map -pthread'
+    LFLAGS = DEVICE + ' -Wl,-Map=rtthread-linux.map -pthread -T gcc.ld'
 
     CPATH = ''
     LPATH = ''

+ 6 - 9
libcpu/sim/posix/cpu_port.c

@@ -94,9 +94,9 @@ static void thread_switch_handler(int sig)
     thread_from = (thread_t *) rt_interrupt_from_thread;
     thread_to = (thread_t *) rt_interrupt_to_thread;
 
-    /* FIXME 注意!此时 rt_thread_self的值是to线程的值! */
+    /* 注意!此时 rt_thread_self的值是to线程的值! */
     tid = rt_thread_self();
-    RT_ASSERT(thread_from->pthread == pid);
+    /* FIXME RT_ASSERT(thread_from->pthread == pid); */
     RT_ASSERT((thread_t *)(tid->sp) == thread_to);
 
     TRACE("signal: SIGSUSPEND suspend <%s>\n", thread_from->rtthread->name);
@@ -124,7 +124,6 @@ static void *thread_run(void *parameter)
     thread->task(thread->para);
     TRACE("pid <%08x> tid <%s> exit...\n", (unsigned int)(thread->pthread),
           tid->name);
-    //FIXME
     thread->exit();
     //sem_destroy(&thread->sem); //<--------------
 
@@ -235,7 +234,7 @@ void rt_hw_interrupt_enable(rt_base_t level)
     tid = rt_thread_self();
     pid = pthread_self();
 
-    if (pid != mainthread_pid)
+    if (pid != mainthread_pid && thread_from->pthread == pid)
     {
         /* 注意这段代码是在RTT普通线程函数总函数中执行的,
          * from线程就是当前rtt线程 */
@@ -245,9 +244,6 @@ void rt_hw_interrupt_enable(rt_base_t level)
               thread_from->rtthread->name,
               thread_to->rtthread->name);
 
-        /* 确定一下,这两个值一定是相等的! */
-        RT_ASSERT(thread_from->pthread == pid);
-
         /* 唤醒被挂起的线程 */
         sem_post(& thread_to ->sem);
         cpu_pending_interrupts --;
@@ -259,8 +255,9 @@ void rt_hw_interrupt_enable(rt_base_t level)
     }
     else
     {
-        /* 注意这段代码是在system tick 函数中执行的,
-         * 即此时位于主线程的SIGALRM信号处理函数中
+        /* 注意这段代码可能在多种情况下运行:
+		 * 1. 在system tick中执行, 即主线程的SIGALRM信号处理函数中执行
+		 * 2. 其他线程中调用,比如用于获取按键输入的线程中调用
          */
         TRACE("conswitch: S in pid<%x>  ,suspend <%s>, resume <%s>!\n",
               (unsigned int)pid,