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