嵌入式操作系统
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

第3章 Hello China的Shell

3.1 Shell的启动和初始化

在Hello China初始化过程中,完成全局对象的初始化后,会创建一个Shell线程,用于完成用户交互功能,代码如下。

lpShellThread=KernelThreadManager.CreateKernelThread(    //Create shell thread.
    (__COMMON_OBJECT*)&KernelThreadManager,
    0L,
    KERNEL_THREAD_STATUS_READY,
    PRIORITY_LEVEL_NORMAL,
    SystemShell,
    NULL,
    NULL);

其中,CreateKernelThread函数是由KernelThreadManager提供的一个接口,用于完成核心线程的创建功能,在第4章中,会进行详细描述。该函数创建一个用户界面(Shell)线程,线程的入口点,即线程的功能函数是SystemShell。该函数是一个封装函数,直接调用EntryPoint例程。在EntryPoint例程中,事先定义了线程的消息处理功能,代码如下。

DWORD  EntryPoint()
{
  //__KTHREAD_MSG Msg;
  __KERNEL_THREAD_MESSAGE KernelThreadMessage;
  PrintPrompt();
  while(TRUE)
  {
    if(GetMessage(&KernelThreadMessage))
    {
        if(KTMSG_THREAD_TERMINAL==KernelThreadMessage.wCommand)
          goto __TERMINAL;
        DispatchMessage(&KernelThreadMessage,EventHandler);
    }
  }
__TERMINAL:                        //Terminal code here.
    return 0L;
  }

其中,KernelThreadMessage是一个核心线程消息数据结构,线程之间的消息交互都是通过该数据结构进行的。该结构的定义如下。

  struct __KERNEL_THREAD_MESSAGE{
    WORD       wCommand;  //Message type,such as Keyboard,Mouse,etc.
    WORD       wParam;
    DWORD      dwParam;
  };