我們知道,要想在VxWorks里啟動(dòng)應(yīng)用程序(APP/Application/Task+RTP),常見(jiàn)的方法是使用taskSpawn()/rtpSpawn()來(lái)創(chuàng)建并激活相應(yīng)的Task/RTP。那我們的第一條taskSpawn()/rtpSpawn()應(yīng)該放在哪呢?也就是如何讓VxWorks系統(tǒng)自動(dòng)啟動(dòng)APP呢? 只要找到VxWorks系統(tǒng)啟動(dòng)時(shí)執(zhí)行的最后一個(gè)函數(shù),讓這個(gè)函數(shù)來(lái)調(diào)用我們自己的APP就可以了。 打開(kāi)工程目錄里的prjConfig.c文件,可以看到VxWorks的第一個(gè)Task tRootTask的入口函數(shù)usrRoot()。而usrRoot()調(diào)用的最后一個(gè)函數(shù)是usrAppInit() 然后在工程里可以找到文件usrAppInit.c 從注釋里可以看出來(lái)了,我們的APP可以從這里開(kāi)始。 寫個(gè)小程序試試,例如printf() 啟動(dòng)VxWorks,看看效果 可以看到APP的printf()執(zhí)行了,不過(guò)它是運(yùn)行在tRootTask的上下文里的。這樣不好,一來(lái)它的優(yōu)先級(jí)太高;二來(lái)出了問(wèn)題后,影響太大。所以我們的APP應(yīng)該由usrAppInit()中的taskSpawn()來(lái)啟動(dòng),例如 這樣就可以了 usrRoot()之所以會(huì)調(diào)用usrAppInit(),是因?yàn)榘私M件INCLUDE_USER_APPL 可以看到還有幾個(gè)組件與startup相關(guān),有興趣的話,我們?cè)囋嚻渌M件 INCLUDE_RTP_APPL_USER 可以看到,包含了這個(gè)組件后,工程里多出來(lái)一個(gè)與usrAppInit()類似的usrRtpAppInit()。從注釋來(lái)看,它是用來(lái)啟動(dòng)RTP的。不過(guò)它倆默認(rèn)都是空函數(shù),沒(méi)什么本質(zhì)區(qū)別的。也就是說(shuō),在usrRtpAppInit()里來(lái)啟動(dòng)Kernel Task也是沒(méi)問(wèn)題的。 INCLUDE_STARTUP_SCRIPT 這個(gè)組件在另一個(gè)目錄里,包含之后,usrRoot()會(huì)在調(diào)用usrShell()之前解析并執(zhí)行bootrom的startup script參數(shù) 我們寫一個(gè)script文件來(lái)試試這個(gè)功能: 新建一個(gè)文件,為了方便編輯,可以把文件后綴寫作txt,在文件中添加幾行可以在VxWorks的Kernel Shell里執(zhí)行的語(yǔ)句。我們之前定義了一個(gè)函數(shù)test(),這次也調(diào)用它 把這個(gè)文件存放到VxWorks文件的目錄里 修改bootrom的startup script參數(shù) 啟動(dòng)VxWorks 可以看到,在Kernel Shell的提示符“->”出現(xiàn)之前,VxWorks解析并執(zhí)行了test.txt中的語(yǔ)句。而且這些語(yǔ)句是在Kernel Shell的上下文里執(zhí)行的。因此,最好也使用taskSpawn()來(lái)創(chuàng)建自己的Task環(huán)境。 INCLUDE_RTP_APPL_INIT_BOOTLINE 包含這個(gè)組件后,usrRoot()會(huì)在usrAppInit()之后再調(diào)用一個(gè)函數(shù)usrRtpAppInitBootline()。 這個(gè)函數(shù)的作用也是解析startup script,不過(guò)它解析的不是script里的文件,而是直接用使用startup script指定的RTP文件。格式是: #RTP文件1^參數(shù)1^參數(shù)2…#RTP文件2… 即符號(hào)#之后是RTP的文件名,符號(hào)^之后是RTP的入?yún)?。有幾個(gè)RTP就用幾個(gè)#,有幾個(gè)參數(shù)就用幾個(gè)^ 我們來(lái)試一下,首先創(chuàng)建一個(gè)RTP工程,簡(jiǎn)單寫幾句代碼 新建一個(gè)ROMFS工程,用于存放RTP工程編譯后的rtp_test.vxe,然后把ROMFS工程放到VxWorks的Image工程里 修改bootrom的startup script參數(shù),可以保留之前的script文件,不過(guò)要放到第一個(gè)#之前。并給RTP傳遞兩個(gè)參數(shù):x和y 這次script文件test.txt的內(nèi)容如下 啟動(dòng)VxWorks,看看得到了什么 VxWorks在打印Kernel Shell提示符“->”之前執(zhí)行了test.txt里的語(yǔ)句;在打印“->”之后,又啟動(dòng)了startup script里指定的RTP。 這就是INCLUDE_RTP_APPL_INIT_BOOTLINE的作用:執(zhí)行bootrom參數(shù)startup script中符號(hào)#之后的RTP INCLUDE_RTP_APPL_INIT_CMD_SHELL_SCRIPT 這個(gè)組件也是在VxWorks啟動(dòng)Kernel Shell之后來(lái)啟動(dòng)RTP的。不過(guò)它的輸入是由參數(shù)RTP_APPL_CMD_SCRIPT_FILE來(lái)指定的文件,而且它解析文件時(shí),用的是VxWorks6特有的Command Interpreter。 例如我們?cè)赩xWorks鏡像文件的目錄里新建一個(gè)rtp.txt文件,并把這個(gè)文件名賦值給參數(shù)RTP_APPL_CMD_SCRIPT_FILE 文件里放一條Command Interpreter能識(shí)別的語(yǔ)句 為了看的更清晰,我們先把bootrom的參數(shù)startup script清空 然后啟動(dòng)VxWorks 可以看到,組件INCLUDE_RTP_APPL_INIT_CMD_SHELL_SCRIPT的作用就是使用Command Interpreter來(lái)解析RTP_APPL_CMD_SCRIPT_FILE指定的文件 INCLUDE_RTP_APPL_INIT_STRING 這個(gè)組件的作用類似于前文中的INCLUDE_RTP_APPL_INIT_BOOTLINE,解析的格式也是一樣的。不過(guò)它的輸入不是bootrom的startup script參數(shù),而是自己的參數(shù)RTP_APPL_INIT_STRING。 我們修改一下這個(gè)參數(shù)試試,同樣為了看的清晰,我們把上個(gè)例子中的RTP_APPL_CMD_SCRIPT_FILE置為空,并把RTP的參數(shù)改為a和b 啟動(dòng)VxWorks 總結(jié)一下 1、3用于啟動(dòng)Task,2、4-6用于啟動(dòng)RTP。 1、2在代碼中;3、4在引導(dǎo)參數(shù)中;5、6在組件參數(shù)中。 1、2使用C語(yǔ)法;3使用Shell命令,類似于C語(yǔ)法;4、6使用符號(hào)#和^;5使用專用于RTP的Command命令。 這正是: 應(yīng)用程序自啟動(dòng),多個(gè)位置靈活可用。 編碼或組件參數(shù),引導(dǎo)階段也可指定。 我是泰山,專注VX14年! |
|