diff --git a/bsp/simulator/applications/application.c b/bsp/simulator/applications/application.c index 4abecb872e48977a1c955dd8e4b4284d5523d5de..ea07f01c5f1269aed3485555f4e541935d1ac2d6 100755 --- a/bsp/simulator/applications/application.c +++ b/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 diff --git a/bsp/simulator/applications/platform.c b/bsp/simulator/applications/platform.c index 3c7ffdb541a230df6aa6b007c1f4a123e884705d..fbc1003d2ad890927d4fdf5423baad840b0dc36d 100644 --- a/bsp/simulator/applications/platform.c +++ b/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 diff --git a/bsp/simulator/drivers/sdl_fb.c b/bsp/simulator/drivers/sdl_fb.c index d7ebbc82453919e26c99c002f4bc5404f29c2992..78bca6f07f1360b475d480549137f3477807702b 100755 --- a/bsp/simulator/drivers/sdl_fb.c +++ b/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 }