Merge pull request #150 from grissiom/simulator-linux

Simulator linux
This commit is contained in:
Bernard Xiong 2013-08-31 17:14:21 -07:00
commit e2a0b1930b
3 changed files with 24 additions and 5 deletions

View File

@ -30,6 +30,12 @@ void rt_init_thread_entry(void *parameter)
/* initialization RT-Thread Components */ /* initialization RT-Thread Components */
rt_components_init(); 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) #if defined(RT_USING_COMPONENTS_INIT) && defined(__GNUC__) && defined(RT_USING_FINSH)
finsh_set_device(RT_CONSOLE_DEVICE_NAME); finsh_set_device(RT_CONSOLE_DEVICE_NAME);
#endif #endif

View File

@ -17,11 +17,6 @@ void rt_platform_init(void)
#endif /* RT_USING_DFS */ #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 #ifdef _WIN32
rt_thread_idle_sethook(rt_hw_win32_low_cpu); rt_thread_idle_sethook(rt_hw_win32_low_cpu);
#endif #endif

View File

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