DKM,就是Workbench里的Downloadable Kernel Module project,这种工程用于管理/构建系统内核空间里的应用模块
通过DKM,可以单独构建基于内核的应用模块,在运行VxWorks的Target上运行和调试应用,并动态地加载、卸载和重新加载应用。当开发工作完成后,还可以静态地将应用模块链接到内核中。
内核模式生成的所有任务都在未受保护的环境中运行,可以完全访问系统中的硬件。链接到内核的可下载内核模块是在Target启动时就可以启动的应用程序。这种内核模式开发是传统的VxWorks开发方法,而VxWorks 5.x只支持这种模式,也就是Tornado里的downloadable application module project
来建一个DKM看看
先给工程起个名字,位置放在当前workspace就可以了
选择合适的Active build spec。什么叫合适?就是与要运行这个DKM的VIP的CPU+Tool一致
没有提到的页面里,直接使用默认值就可以了。
在建好的DKM里,可以添加自己的代码了
记着文件名是有后缀的,而且后缀名是小写字母
也可以分目录添加,即使用文件夹
也可以直接添加已有的文件
完善代码
然后Build就可以了
第一次Build时,直接选择Continue
然后Workbench就基于每个源文件,生成一个.o文件,最后再链接成一个.out文件
然后启动Target,连接Target Connection。右击Binaries/xxx.out,选择Download VxWorks Kernel Task,将这个Module加载到Target的VxWorks里
然后在Shell里就可以调用DKM的Public Function了
不过Workbench相比Tornado做了很多改进,例如可以直接在DKM上右击,选择Run As VxWorks Kernel Task。这个动作会自动Save Files、Build Project、Download Module、Run Task,相当于一键式运行应用程序了
Entry Point是要启动的任务入口,也就是要执行的第一个函数。可以手动写入,可以通过Browse在Module文件里查找
接下来看看DKM的其它特性,打开工程的属性页面
在Build Properties->Paths页面里,可以添加头文件路径
在Tools、Defines、Variables页面里,都可以添加工程的宏定义
应该有人已经发现:在“Add”按钮后面都有一个“Add to all”。因为Workbench的一个DKM可以支持多种build spec
也就是说,一个DKM可以生成多种Target的Module。是不是很强大,其实还有一个快捷方式:
即使同一个Target,DKM也可以生成多个Module。
试试看:先把默认的Module删掉
然后创建新的Module
名字和包含的文件,都可以指定
例如,建两个Module,包含不同的源文件。Build之后,就得到两个.out文件了
通常在项目开发阶段的最后,还可以把DKM由动态加载的.out改为静态链接的.a
在Build Targets中的Module的属性里,把Linker改为Librarian即可
然后把这个.a文件,加到VIP的LIBS里(在《Tool之VIP》里提到过),使用绝对路径或相对路径都可以
在VIP的usrAppInit()里启动最终的应用程序(在《Utility之APP自启动》里提到过)
百闻不如一见,百看不如一练。学习VxWorks,最好的方法就是做个项目;没有项目的话,先写个自己的Hello World吧
这正是:
DKM里写应用,内核模式来运行。
动态加载省流程,静态链接自启动。