Browse Source

Merge pull request #150 from grissiom/simulator-linux

Simulator linux
Bernard Xiong 12 years ago
parent
commit
e2a0b1930b

+ 6 - 0
bsp/simulator/applications/application.c

@@ -30,6 +30,12 @@ void rt_init_thread_entry(void *parameter)
     /* initialization RT-Thread Components */
     rt_components_init();
 
+#ifdef RT_USING_RTGUI
+    /* start sdl thread to simulate an LCD. SDL may depend on DFS and should be
+     * called after rt_components_init. */
+    rt_hw_sdl_start();
+#endif /* RT_USING_RTGUI */
+
 #if defined(RT_USING_COMPONENTS_INIT) && defined(__GNUC__) && defined(RT_USING_FINSH)
     finsh_set_device(RT_CONSOLE_DEVICE_NAME);
 #endif

+ 0 - 5
bsp/simulator/applications/platform.c

@@ -17,11 +17,6 @@ void rt_platform_init(void)
 
 #endif /* RT_USING_DFS */
 
-#ifdef RT_USING_RTGUI
-    /* start sdl thread to simulate an LCD */
-    rt_hw_sdl_start();
-#endif /* RT_USING_RTGUI */
-
 #ifdef _WIN32
     rt_thread_idle_sethook(rt_hw_win32_low_cpu);
 #endif

+ 18 - 0
bsp/simulator/drivers/sdl_fb.c

@@ -152,8 +152,12 @@ static void sdlfb_hw_init(void)
 
 #ifdef _WIN32
 static HANDLE  sdl_ok_event = NULL;
+
 static DWORD WINAPI sdl_loop(LPVOID lpParam)
 #else
+static pthread_mutex_t sdl_ok_mutex;
+static pthread_cond_t sdl_ok_event;
+
 static void *sdl_loop(void *lpParam)
 #endif
 {
@@ -167,14 +171,19 @@ static void *sdl_loop(void *lpParam)
     /* set the getchar without buffer */
     sigfillset(&sigmask);
     pthread_sigmask(SIG_BLOCK, &sigmask, &oldmask);
+    pthread_mutex_lock(&sdl_ok_mutex);
 #endif
 
     sdlfb_hw_init();
 
     device = rt_device_find("sdl");
+    RT_ASSERT(device);
     rtgui_graphic_set_device(device);
 #ifdef _WIN32
     SetEvent(sdl_ok_event);
+#else
+    pthread_cond_signal(&sdl_ok_event);
+    pthread_mutex_unlock(&sdl_ok_mutex);
 #endif
     /* handle SDL event */
     while (!quit)
@@ -338,11 +347,20 @@ void rt_hw_sdl_start(void)
     /* Linux */
     pthread_t pid;
     int res;
+
+    pthread_mutex_init(&sdl_ok_mutex, NULL);
+    pthread_cond_init(&sdl_ok_event, NULL);
+
     res = pthread_create(&pid, NULL, &sdl_loop, NULL);
     if (res)
     {
         printf("pthread create sdl thread faild, <%d>\n", res);
         exit(EXIT_FAILURE);
     }
+    pthread_mutex_lock(&sdl_ok_mutex);
+    pthread_cond_wait(&sdl_ok_event, &sdl_ok_mutex);
+
+    pthread_mutex_destroy(&sdl_ok_mutex);
+    pthread_cond_destroy(&sdl_ok_event);
 #endif
 }