目前更新到5.3节,请在http://dl.dbank.com/c02ackpwp6下载5.3节的全部文档
本节源代码请在http://dl.dbank.com/c0bvhcdi9n下载
第3节 用户代码入口——根任务
经过上节的修改,Wanlix操作系统可以建立任意多个任务,但是在操作系统运行之前必须得先建立一个任务,然后再调用WLX_TaskStart函数从非操作系统状态切换到操作系统状态,如果没有这么做的话系统就会崩溃。这一过程需要用户在用户代码里完成,相当于使用用户代码来初始化操作系统,这无疑给用户增加了一个限制,也不利于用户使用。
为了解决这个问题,我们提出操作系统“根”任务的概念,所谓“根”任务,它是其它所有任务的“根”,其它所有的任务都是从这个根任务开始的,我们将之命名为WLX_RootTask。
我们在main函数里首先建立根任务,然后调用WLX_TaskStart函数切换到操作系统状态,去执行根任务,将根任务作为留给用户的接口,main函数则被封装到操作系统内部,用户不可见,用户只要认为自己的代码是从根任务开始的就可以了,这样,在用户代码执行前,操作系统就已经可以使用了,这个问题也就解决了。
为此,我们需要将main函数从原来的test.c文件中搬移到wlx_core_c.c文件中,将它封装到操作系统内部,作为操作系统的一部分。
00019 S32 main(void)
00020 {
00021
00022 gpstrRootTaskTcb = WLX_TaskCreate((VFUNC)WLX_RootTask, gaucRootTaskStack,
00023 ROOTTASKSTACK);
00024
00025
00026 WLX_TaskStart(gpstrRootTaskTcb);
00027
00028 return 0;
00029 }
在main函数运行完毕后就开始运行根任务WLX_RootTask了,用户可以在WLX_RootTask任务中创建自己的任务,我们将上节的例子移植过来,只需要将原有main函数中创建任务的用户代码移植到根任务WLX_RootTask中就可以了。
00010 void WLX_RootTask(void)
00011 {
00012
00013 DEV_HardwareInit();
00014
00015
00016 gpstrTask1Tcb = WLX_TaskCreate((VFUNC)TEST_TestTask1, gaucTask1Stack,
00017 TASKSTACK);
00018 gpstrTask2Tcb = WLX_TaskCreate((VFUNC)TEST_TestTask2, gaucTask2Stack,
00019 TASKSTACK);
00020 gpstrTask3Tcb = WLX_TaskCreate((VFUNC)TEST_TestTask3, gaucTask3Stack,
00021 TASKSTACK);
00022
00023 WLX_TaskSwitch(gpstrTask1Tcb);
00024 }
根任务WLX_RootTask虽然是操作系统建立的任务,属于操作系统的一部分,但它的内容却完全需要用户编写,因此将它放到wlx_userboot.c文件中,将wlx_userboot.c文件放到用户代码目录srccode中,与用户代码绑定在一起。
编译本节代码,运行,串口打印如下。读者也可通过本节的视频观察这3个任务动态执行过程,虽然实现上与上节不同,但输出结果却是一样的。
图 19 使用根任务作为用户入口的运行结果