rtx51小型實(shí)時(shí)操作系統(tǒng)的應(yīng)用體會(huì)_第1頁
rtx51小型實(shí)時(shí)操作系統(tǒng)的應(yīng)用體會(huì)_第2頁
rtx51小型實(shí)時(shí)操作系統(tǒng)的應(yīng)用體會(huì)_第3頁
rtx51小型實(shí)時(shí)操作系統(tǒng)的應(yīng)用體會(huì)_第4頁
rtx51小型實(shí)時(shí)操作系統(tǒng)的應(yīng)用體會(huì)_第5頁
已閱讀5頁,還剩14頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、rtx51小型實(shí)時(shí)操作系統(tǒng)的應(yīng)用體會(huì)2007年06月27日 星期三 23:53最近在做設(shè)計(jì)的時(shí)候老遇到一些幾個(gè)任務(wù)需要同時(shí)進(jìn)行的情況,剛開始想自己去做一個(gè)多任務(wù)的程序(因?yàn)榉Q不上系統(tǒng)),想用一個(gè)脈沖計(jì)數(shù)的方法來實(shí)現(xiàn)多任務(wù)切換,但是感覺實(shí)現(xiàn)起來比較麻煩。無意中發(fā)現(xiàn)了51單片機(jī)下個(gè)rtx51實(shí)時(shí)操作系統(tǒng)(本人以前不知道的),后來就去找相關(guān)資料。發(fā)現(xiàn)這方面的資料在網(wǎng)上很少,也很雜亂。經(jīng)過一段時(shí)間的學(xué)習(xí),我有了個(gè)大概的了解。下面給大家講述一下:RTX51是一個(gè)用于8051系列處理器多任務(wù)實(shí)時(shí)操作系統(tǒng)。RTX51可以簡化那些復(fù)雜而且時(shí)間要求嚴(yán)格的工程的軟件設(shè)計(jì)工作。有二個(gè)不同的RTX51版本可以利用:R

2、TX51 Full 使用四個(gè)任務(wù)優(yōu)先權(quán)完成同時(shí)存在時(shí)間片輪轉(zhuǎn)調(diào)度和搶先的任務(wù)切換 RTX51工作在與中斷功能相似的狀態(tài)下 信號和信息可以通過郵箱系統(tǒng)在任務(wù)之間互相傳遞 你可以從一存池中分配和釋放內(nèi)存 你可以強(qiáng)迫一個(gè)任務(wù)等待中斷 超時(shí)或者是從另一個(gè)任務(wù)或中斷發(fā)出的信號或信息RTX51 Tiny 是一個(gè) RTX51的子集 它可以很容易地在沒有任何外部存儲(chǔ)器的單片8051系統(tǒng)上運(yùn)轉(zhuǎn)。 除了下列例外 RTX51 Tiny支持許多在RTX51中的特征。RTX51 Tiny僅支持時(shí)間片輪轉(zhuǎn)任務(wù)切換和使用信號進(jìn)行任務(wù)切換 不支持搶先式的任務(wù)切換。不包括消息歷程。沒有存儲(chǔ)器池分配程序 。RTX51使用一個(gè)80

3、51硬件計(jì)時(shí)器中斷作為定時(shí)程序。 產(chǎn)生的周期性中斷用于驅(qū)動(dòng) RTX51時(shí)鐘。 RTX51不需要在你的程序中擁有一個(gè)主函數(shù) 它將自動(dòng)開始執(zhí)行任務(wù) 0 如果你確實(shí)有一個(gè)主函數(shù) 你必須利用 RTX51 Tiny中的 os_create_task函數(shù)或 RTX51中的 os_start_system函數(shù)手工啟動(dòng) RTX51。 下列例子顯示一個(gè)只使用時(shí)間片輪轉(zhuǎn)任務(wù)調(diào)度的簡單的 RTX51應(yīng)用程序 在本程序里的二個(gè)任務(wù)是簡單計(jì)數(shù)器回路 rtx51開始執(zhí)行函數(shù)名為 job0的任務(wù) 0 。 這些功能添加了另一個(gè)叫做 job1任務(wù)。 在 job0運(yùn)行一會(huì)兒以后 RTX51切換到 job1。 在 job0運(yùn)行一會(huì)

4、兒以后、RTX51轉(zhuǎn)回到j(luò)ob0。 這個(gè)過程將不確定地重復(fù)下去 #include <rtx51tny.h> int counter0; int counter1; void job0 (void) _task_ 0 os_create (1); /* mark task 1 as ready */ while (1) /* loop forever */ counter0+; /* update the counter */ void job1 (void) _task_ 1 while (1) /* loop forever */ counter1+; /* update the

5、 counter */ 今天夜已很深了,明早還有考試,對不起了,不寫了。我介紹幾個(gè)資料的下載地址,大家自己去看吧!【轉(zhuǎn)】 KEIL RTX51 TINY內(nèi)核的分析與應(yīng)用2011年04月18日 星期一 19:28轉(zhuǎn)載自 lan042最終編輯 lan042特性:最大任務(wù)數(shù):16最大激活的任務(wù)數(shù):16所需的CODE空間:最大900ByteDATA空間:7字節(jié)STACK空間:3字節(jié)XDATA空間:0字節(jié)時(shí)鐘數(shù):0個(gè)系統(tǒng)時(shí)鐘分頻:1000-65535中斷嵌套:小于20層任務(wù)切換時(shí)間:100-700時(shí)鐘周期工具要求:以下軟件應(yīng)用需要用 RTX51 TinyC51紡編譯器A51 Marco Assemble

6、rBL51 Linker or Lx51 LinkerRTX51TNY.LIB 和 RTX51BT.LIB必需存儲(chǔ)在庫路徑上,一般是文件夾KEILC51LIBRTX51TNY.H包含文件必須存儲(chǔ)在包含文件路徑上,一般是文件夾KEILC51INC目標(biāo)要求:應(yīng)用程序可能需要外部分的數(shù)據(jù)存儲(chǔ)空間,但內(nèi)核并不需要外部存儲(chǔ)空間KEIL C51支持各種存儲(chǔ)模式:選擇存儲(chǔ)模式只影響應(yīng)用程序的存的數(shù)據(jù)存儲(chǔ),操作系統(tǒng)的變量和堆棧只存在于51的內(nèi)存中,即DATA和IDATA,一般情況下,RTX51 Tiny的應(yīng)用只需要小存儲(chǔ)模式在RTX51 Tiny中每個(gè)應(yīng)用程序運(yùn)行的時(shí)間是固定的,支持cooperative任務(wù)

7、切換和round-robin任務(wù)切換,不支持preemptive任務(wù)切換和任務(wù)優(yōu)先級。如果應(yīng)用程序需要preemptive任務(wù)切換則必須使用RTX51 FULL-Time Executive版本。中斷:RTX51 Tiny的工作與中斷函數(shù)是并行工作的。中斷服務(wù)程序可以向RTX51 Tiny的任務(wù)發(fā)信號(使用函數(shù)isr_send_signal),也可以置位作任務(wù)的Ready標(biāo)志(使用函數(shù)isr_set _ready)在RTX51 Tiny中必須使能中斷,但是在RTX51 Tiny沒有中斷服務(wù)管理RTX51 Tiny使用Timer0和Timer0中斷。全局中斷禁能和Timer0中斷禁能會(huì)使RTX5

8、1 Tiny停止工作,所以只能在短時(shí)間內(nèi)禁能中斷??芍厝牒瘮?shù)非可重入的C函數(shù)不能被多個(gè)任務(wù)或中斷過程調(diào)用。非可重入的函數(shù)的參數(shù)和變量保存在靜態(tài)存儲(chǔ)空間中,當(dāng)它們同時(shí)被多個(gè)任務(wù)調(diào)用時(shí),這些參數(shù)和變量就可能被覆蓋了。你可以在多任務(wù)系統(tǒng)中調(diào)用非可重入函數(shù)如果你能保證他們不會(huì)同進(jìn)行。不過,這就意味著必須能 round-robin任務(wù)調(diào)度,并且非可重入函數(shù)不可以調(diào)用RTX51 Tiny的功能函數(shù)。只使用寄存器就量和自動(dòng)變量的函數(shù)自然地就是可重入函數(shù),可以毫無限制地在RTX51 Tiny中調(diào)用。C51編譯器支可重入函數(shù)??芍厝牒褏?shù)和局部變量保存在堆棧中。這樣就可以保證他們被多個(gè)任務(wù)同時(shí)使用。RTX51

9、 Tiny并不管理可重入函數(shù)的堆棧,因些,如果你在應(yīng)用程序中使用了可重入函數(shù),你必須確保這些功能函數(shù)不調(diào)用任務(wù)RTX51 Tiny的系統(tǒng)函數(shù),并且可重入函數(shù)不會(huì)被round-robin任務(wù)切換所中斷。注意:如果你打自在多個(gè)任務(wù)或中斷中調(diào)用可重入或非可重入函數(shù)必須禁止round-robin任務(wù)切換。運(yùn)行時(shí)庫:所有的C51可重入運(yùn)行時(shí)庫可能毫無限制地在所用任務(wù)中使用。非可重入時(shí)庫的要與可重入函數(shù)的要求相同。多個(gè)數(shù)據(jù)指針C51編譯器允許使用多個(gè)數(shù)據(jù)指針。RTX51 Tiny對他們不進(jìn)行管理,所以在應(yīng)用中你必須小心Essentially,你必須確保在改變數(shù)據(jù)指針時(shí)不會(huì)發(fā)生round-robin切換。注

10、意:當(dāng)你打算使用多數(shù)據(jù)指針時(shí)你最好禁止round-robin切換。算術(shù)單元(說法與多個(gè)數(shù)據(jù)指針相同)工作寄存器組RTX51 Tiny的所有任務(wù)都使用工作組0。 因些,所有的任務(wù)都必須使用C51默認(rèn)的編譯選項(xiàng):REGISTERBANK (0)中斷函數(shù)可能會(huì)使用其他的工作寄存器組。然而RTX51 Tiny在工作寄存器組中永遠(yuǎn)需要6個(gè)字節(jié)。RTX51 Tiny在工作寄存器組中使用的這些字節(jié)可以參考配置文件單個(gè)任務(wù)程序嵌入式和標(biāo)準(zhǔn)C程序都mian()函數(shù)開始。在入式應(yīng)用中, main函數(shù)一般都是一個(gè)死循環(huán),我們也可以把它看作是一個(gè)連續(xù)執(zhí)行的任務(wù)。如:void main (void)while (1)

11、/* repeat forever */do_something (); /* execute the do_something 'task' */在這個(gè)例子中,do_something ()函數(shù)可以認(rèn)為是一個(gè)單任務(wù),既然只有一個(gè)任務(wù)在執(zhí)行,就不需要具有多任務(wù)能力或多任務(wù)操作系統(tǒng)。多任務(wù)程序許多成熟的C程序使用一種叫做pseudo多任務(wù)的策略,把多個(gè)作協(xié)做為一循環(huán),如:void main (void)int counter = 0;while (1) /* repeat forever */check_serial_io (); /* check for serial inpu

12、t */process_serial_cmds (); /* process serial input */check_kbd_io (); /* check for keyboard input */process_kbd_cmds (); /* process keyboard input */adjust_ctrlr_parms (); /* adjust the controller */counter+; /* increment counter */在這個(gè)例子中,每個(gè)函數(shù)完成一個(gè)獨(dú)立的操作或任務(wù)。這些函數(shù)是一個(gè)一個(gè)順序執(zhí)行的當(dāng)添加更多的任務(wù)時(shí)調(diào)度就行了一個(gè)問題。比方說,如果函數(shù)pr

13、ocess_kbd_cmds執(zhí)行的時(shí)間比較長,主循環(huán)就需要很長時(shí)間才能再執(zhí)行到函數(shù)check_serial_io ,這時(shí)候串口的數(shù)據(jù)可能會(huì)丟失。當(dāng)然check_serial_io 可以在主循環(huán)中多調(diào)用幾次來解決這個(gè)問題,但最終這種方法并不是最有效的。RTX51 Tiny的程序當(dāng)使用RTX51 Tiny時(shí),你可以為每一個(gè)任務(wù)生成一個(gè)獨(dú)立的函數(shù),如:void check_serial_io_task (void) _task_ 1/* This task checks for serial I/O */void process_serial_cmds_task (void) _task_ 2/*

14、This task processes serial commands */void check_kbd_io_task (void) _task_ 3/* This task checks for keyboard I/O */void process_kbd_cmds_task (void) _task_ 4/* This task processes keyboard commands */void startup_task (void) _task_ 0os_create_task (1); /* Create serial_io Task */os_create_task (2);

15、/* Create serial_cmds Task */os_create_task (3); /* Create kbd_io Task */os_create_task (4); /* Create kbd_cmds Task */os_delete_task (0); /* Delete the Startup Task */在這個(gè)例子中,每個(gè)函數(shù)定義了一個(gè)RTX51 Tiny的任務(wù)。RTX51 Tiny程序沒有主C函數(shù),RTX51 Tiny首先執(zhí)行任務(wù)0。作為一個(gè)典型的應(yīng)用,任務(wù)0只是簡單地用來生成其他的所有任務(wù)。工作原理RTX51 Tiny使用并管理你的目標(biāo)資源,這一部分講述RTX

16、51 Tiny如何使用這些資源。RTX51 Tiny的許多方面都可以根據(jù)工程需要進(jìn)行配置。時(shí)間片中斷RTX51 Tiny使用標(biāo)準(zhǔn)的8051的定時(shí)器0來產(chǎn)生定時(shí)中斷。這個(gè)中斷就是RTX51 Tiny的時(shí)鐘片。RTX51 Tiny運(yùn)行時(shí)庫中用的時(shí)等待時(shí)間都是以這個(gè)時(shí)間片為單位的RTX51 Tiny的默認(rèn)的時(shí)間片是10000個(gè)機(jī)器周期。因此,標(biāo)準(zhǔn)的8051運(yùn)行在12MHz的時(shí)鐘下的時(shí)候,時(shí)間片有0.01S或著說是100Hz。這個(gè)值可以在CONF_TNY.A51 配置文件中更改。注意:你在以RTX51 Tiny時(shí)間片中斷中編輯你自己的代碼,參考:CONF_TNY.A51任務(wù):RTX51 Tiny可以看

17、作是一個(gè)任務(wù)切換器。要生成RTX51 Tiny程序,你必須生成一個(gè)具有一個(gè)或多個(gè)任務(wù)的應(yīng)用。以下細(xì)節(jié)可以幫你更快地理解RTX51任務(wù)必須用C語言編寫,并且用Keil C51支持的關(guān)鍵詞聲明RTX51 Tiny使用準(zhǔn)確的狀態(tài)維護(hù)任務(wù)。同時(shí)只有一個(gè)任務(wù)可以處于運(yùn)行狀態(tài)可能會(huì)有多個(gè)任務(wù)處于就緒,等待,刪除或超時(shí)狀態(tài)空閑任務(wù)總是處于就緒狀態(tài),即使使用你的所有任務(wù)都處于block狀態(tài)任務(wù)管理RTX51 Tiny的任務(wù)總是處于以下狀態(tài)中一確定的狀態(tài)RUNNING:任務(wù)處于運(yùn)行狀態(tài),os_running_task_id返回正在運(yùn)行的任務(wù)的編號READY:任務(wù)處于就緒狀態(tài)。當(dāng)一個(gè)正在運(yùn)行的任務(wù)運(yùn)行完畢,RTX

18、51 Tiny就會(huì)啟動(dòng)下一個(gè)就緒狀態(tài)的任務(wù)。一個(gè)任務(wù)可以通設(shè)置他的READY標(biāo)志位os_set_ready or isr_set_ready使它立即進(jìn)入就緒狀態(tài)(即使它可能正在等待時(shí)間到或等一個(gè)信號)WAITTING:處于等待一個(gè)事件的任務(wù)就處于等待狀態(tài)。當(dāng)所等待的事件發(fā)生后,任務(wù)就轉(zhuǎn)換到就緒狀態(tài),函數(shù)os_wait用來使一個(gè)作任務(wù)進(jìn)行等待狀態(tài)DELETED:沒有開始運(yùn)行的任務(wù)或被刪除的任務(wù)處于DELETED狀態(tài)。函數(shù)os_delete_task使一個(gè)已經(jīng)啟動(dòng)(使用函數(shù)os_create_task)的任務(wù)進(jìn)入DELETED狀態(tài)TIME-OUT:被round-robin Time-Out中斷的任

19、務(wù)處于TIME-OUT狀態(tài)。這個(gè)狀態(tài)在round-robin程序中等效于READY狀態(tài)事件(Events)在實(shí)時(shí)操作系統(tǒng)中事件可以用來控制任務(wù)的執(zhí)行。一個(gè)可能會(huì)等待一個(gè)事件,也可能給其他任務(wù)設(shè)置事件標(biāo)志。函數(shù)os_wait允許任務(wù)等待一個(gè)或多個(gè)事件。任務(wù)等待的是最普通的事件就是Timeout,一個(gè)簡單的Timeout就是一定數(shù)量的clock ticks,當(dāng)一個(gè)任務(wù)等待的時(shí)間耗盡時(shí),它就可以繼續(xù)執(zhí)行了,當(dāng)它等待時(shí),其他的任務(wù)就可以運(yùn)行variant of the Timeout is the Interval. An interval is like a timeout except that

20、the specified number of clock ticks is relative to the last time the os_wait function was invoked by the task. The Interval may be used to generate a task which is run on a regular, synchronous schedule (like once every second) regardless of how long the task takes between calls to the os_wait funct

21、ion.(以上內(nèi)容是說,interval類似于timeout,但與timeout不同的是interval參考的不是上一次任務(wù)執(zhí)行后的時(shí)間,而是某個(gè)特定的時(shí)間點(diǎn),從而是一個(gè)規(guī)律性的、周期性的運(yùn)行的任務(wù):比如說每秒一次)信號是任務(wù)間通信的一種簡單的形式,一個(gè)任務(wù)可以等待其他作任務(wù)給他發(fā)一個(gè)信號(使用 os_send_signal and isr_send_signal 函數(shù))。每個(gè)任務(wù)的READY標(biāo)志都可能被其他任務(wù)置位(使用 os_set_ready and isr_set_ready 函數(shù))。一個(gè)等timeout, interval, 或信號的任務(wù)都可以通過置位READY標(biāo)志重新啟動(dòng)。RTX5

22、1 Tiny會(huì)為每個(gè)事件維護(hù)一個(gè)標(biāo)志。以下事件選擇項(xiàng)可以被用來表明等待什么:事件選項(xiàng) 描述K_IVL 等待特定數(shù)目的IntervalK_SIG 等待一個(gè)信號K_TMO 等待Timeout當(dāng)函數(shù)os_wait返回,發(fā)生的事件被返回值標(biāo)志返回值 描述RDY_EVENT 任務(wù)的就緒標(biāo)志被置位SIG_EVENT 信號已收到TMO_EVENT 一個(gè)Timeout已經(jīng)結(jié)束或一個(gè)interval已經(jīng)完畢函數(shù)os_wait可能會(huì)等待以下事件組合K_SIG | K_TMO:os_wait延遲任務(wù)直到一個(gè)信號已經(jīng)發(fā)給他,或直到設(shè)定的clocktick耗盡K_SIG | K_IVL:os_wait延遲任務(wù)直到一個(gè)信

23、號已經(jīng)發(fā)給他,或直到設(shè)定的interval耗盡注意:上面的兩個(gè)事件也可能不組合。任務(wù)調(diào)度器任務(wù)調(diào)度器是RTX51 Tiny的一部分,用來將處理器交給任務(wù)。任務(wù)調(diào)度器根據(jù)以下規(guī)則決定具體執(zhí)行哪一個(gè)任務(wù)。當(dāng)出現(xiàn)以下情況將中斷當(dāng)前任務(wù)任務(wù)調(diào)用函數(shù)os_wait,并且等待的任務(wù)還沒有發(fā)生任務(wù)執(zhí)行的時(shí)間超過了設(shè)定的round-robin時(shí)間片其他的任務(wù)在出現(xiàn)以下條件時(shí)開始運(yùn)行沒有其他任務(wù)正在運(yùn)行將啟動(dòng)的任務(wù)正處于就緒狀態(tài)或TIME-OUT狀態(tài)RTX51 tiny(2)Round-robin 任務(wù)切換RTX51 Tiny可以配置成使用round-robin多任務(wù)。Round-robinp容許quasi-p

24、arallel執(zhí)行多任務(wù)。任務(wù)并不是連續(xù)執(zhí)行的,而是分時(shí)間片執(zhí)行的(可用的CPU時(shí)間被分成時(shí)間片,RTX51 Tiny把時(shí)間片分配給各個(gè)任務(wù))。時(shí)間片的時(shí)間很短(以毫秒為單位),所以任務(wù)看起來像連續(xù)執(zhí)行一樣任務(wù)在分配給他的時(shí)間片內(nèi)執(zhí)行(除非放棄)。然后切換到下一個(gè)就緒的任務(wù)。RTX51tiny(3)編譯連接有兩種方法編譯和連接RTX51 Tiny應(yīng)用程序RTX51 Tiny(4)os_set_readySummary:i nclude <rtx51tny.h>char os_set_ready (unsigned char task_id); /* Task to make rea

25、dy */Description:使編號為task_id的任務(wù)就入就緒狀態(tài),可以任務(wù)中調(diào)用該函數(shù)Return Value: None.原創(chuàng):RTX51 Tiny操作系統(tǒng)實(shí)例應(yīng)用0推薦/*/*                                 &#

26、160;                                          */*   RCPU.C:  C-51 COMPILER 

27、                                                  */*&#

28、160;                                                 &#

29、160;                         */*/ char code title =   "RCPUn"  "GLOBAL TECH 2005n"  "VERSION 2.0n"i nclude <reg52.h>

30、60;                   /* special function registers 8052      */i nclude <rtx51tny.h>               

31、0; /* RTX-51 tiny functions & defines      */i nclude <stdio.h>                    /* standard I/O .h-file          

32、0;      */i nclude <mydef.h>i nclude "keyname.h"i nclude "vfd.h"i nclude "tmr2.h"/* constants for os_task function */#define INIT   0                /* task nu

33、mber of task:  init           */#define PROCKEY   1                   /* task number of task:  prockey      &#

34、160; */#define PROCPIR   2       /* task number of task:  procpir        */#define VFDCODE   3                   /* task

35、 number of task:  vfdcode        */#define NECCODE   4                   /* task number of task:  neccode        */#defi

36、ne USARTSEND 5                   /* task number of task:  usartsend      */#define CLOCK     7           

37、        /* task number of task:  clock          */#define TICK   6       /* task number of task:  procrst        */#define VIEWCON 

38、;  8/* constants for UsartSend function */#define UsartSendMotor 1              /* Command for control to MOTO board    */#define UsartSendQCB   2          

39、;    /* Command for control to QCB board     */#define UsartSendTime  3              /* System time                

40、          */#define UsartSendVFD   4              /* IDE state                   

41、0;        */#define UsartSendPIR   5              /* pir                      &#

42、160;           */#define UsartSendNEC   6              /* NEC code                  &

43、#160;          */#define UsartSendKey   7              /* key code                   

44、          */#define UsartSendPIREN 8              /* PIR_EN                      

45、;         */#define IDEFREE        1#define IDEPLAY        2#define IDESETUP       3#define IDERECORD      4#define IDENOSIG  

46、;     5#define VIEWIDE        1#define VIEWQUAD1      2#define VIEWQUAD2      3unsigned char QUAD_NOW_BAK;unsigned char CAM_NOW_QUAD1;unsigned char CAM_NOW_QUAD2;unsigned char TickCounter;unsigne

47、d char MotorCmd;unsigned char NECCmd;unsigned char UsartSendData;unsigned char UsartSendCmd;unsigned char IDEStatus;unsigned char rst6s,stopcount;unsigned int rst4h;bit PWFlag;bit viewportbak;bit StopFlagBit;/*/*        Task 0 'init': Initialize  

48、                                         */*/void init (void) _task_ INIT    

49、60;     /* program execution starts here        */    serial_init ();                   /* initialize the serial interface   

50、   */    VIEW_SA = 0;    VIEW_SB = 0;    os_create_task (PROCKEY);         /* key sample task                  

51、0;   */    os_create_task (PROCPIR);         /* PIR sample task                      */    os_create_task (VFDCODE)

52、;         /* VFDCODE incepted from IDE board      */    os_create_task (NECCODE);         /* send NECCODE to IDE board          &#

53、160; */    os_create_task (USARTSEND);       /* send data to USART port              */    os_create_task (CLOCK);          

54、/* start clock task                     */    os_create_task (TICK);            /* process tick      

55、;                   */    os_create_task (VIEWCON);    os_delete_task (INIT);            /* stop init task (no longer needed)

56、    */char code motordata =0x01,0x09,0x0,0x08,0x03,0x0B,0x02,0x0A,0x0D,0x05,0x0C,0x04,0x0F,0x07,0x0E,0x06;/*/*        Task 1 'prockey': monitor key incepted              &#

57、160;               */*/void prockey (void) _task_ PROCKEY    while (1)                        

58、/* prockey is an endless loop           */                    KEY_NOW = _getkey ();          /* key is incepted

59、0;                     */        TickCounter = 0;        if (KEY_NOW = '')continue;     

60、0;  if (KEY_NOW = SLEEP)continue;        switch (KEY_NOW)              /*                    &#

61、160;                 */                    case PANUP:            

62、0;   if (CAM_NOW != 0)&(IDEStatus != IDESETUP)                                        

63、   /* motor control                        */                      

64、60;             MotorCmd = motordata(CAM_NOW-1)*4;                    UsartSendCmd = UsartSendMotor;       

65、60;            os_send_signal (USARTSEND);                                break;  

66、60;         case PANDOWN:                if (CAM_NOW != 0)&(IDEStatus != IDESETUP)                

67、60;                     /* motor control                        */   &

68、#160;                                MotorCmd = motordata(CAM_NOW-1)*4+1;             

69、;       UsartSendCmd = UsartSendMotor;                    os_send_signal (USARTSEND);               

70、                 break;            case PANLEFT:                if (IDEStatus = IDESETUP) break

71、;                if (CAM_NOW = 0)                                 

72、;    /* QCB control                          */                   

73、; CAM_NOW_QUAD1 = 0;                    QUAD_NOW = 1;                    UsartSendCmd = UsartSendQCB; 

74、60;                  os_send_signal (USARTSEND);                    NECCmd = TOQUAD1;      

75、;              os_send_signal (NECCODE);                                else 

76、60;                /* motor control                        */        &

77、#160;                           MotorCmd = motordata(CAM_NOW-1)*4+2;                  

78、;  UsartSendCmd = UsartSendMotor;                    os_send_signal (USARTSEND);                     

79、;           break;            case PANRIGHT:                if (IDEStatus = IDESETUP) break;    

80、0;           if (CAM_NOW = 0)                                     /* QCB co

81、ntrol                          */                    CAM_NOW_QUAD2 = 0; 

82、60;                  QUAD_NOW = 2;                    UsartSendCmd = UsartSendQCB;      &#

83、160;             os_send_signal (USARTSEND);                    NECCmd = TOQUAD2;          

84、0;         os_send_signal (NECCODE);                                else      &#

85、160;           /* motor control                        */             

86、                       MotorCmd = motordata(CAM_NOW-1)*4+3;                    UsartSendCmd = UsartS

87、endMotor;                    os_send_signal (USARTSEND);                         

88、0;      break;            case QUAD:                /* QCB control             &

89、#160;            */                if (IDEStatus = IDESETUP) break;                if (CAM_NOW

90、!= 0)                                    CAM_NOW = 0;             

91、;       UsartSendCmd = UsartSendQCB;                    os_send_signal (USARTSEND);               &#

92、160;    if (QUAD_NOW=1)CAM_NOW_QUAD1 = CAM_NOW;                    if (QUAD_NOW=2)CAM_NOW_QUAD2 = CAM_NOW;              

93、                  break;            case CAMERA1:             /* QCB control     

94、;                     */                if (IDEStatus = IDESETUP) break;         

95、;       if (CAM_NOW = 0)                                    CAM_NOW = 1;    

96、0;               UsartSendCmd = UsartSendQCB;                    os_send_signal (USARTSEND);       &

97、#160;            if (QUAD_NOW=1)CAM_NOW_QUAD1 = CAM_NOW;                    if (QUAD_NOW=2)CAM_NOW_QUAD2 = CAM_NOW;      

98、;                          break;            case CAMERA2:           &

99、#160; /* QCB control                          */                if (IDEStatus = IDESETUP) break;

100、0;               if (CAM_NOW = 0)                                 

101、0;  CAM_NOW = 2;                    UsartSendCmd = UsartSendQCB;                    os_send_signal (USART

102、SEND);                    if (QUAD_NOW=1)CAM_NOW_QUAD1 = CAM_NOW;                    if (QUAD_NOW=2)CAM_NOW_QU

103、AD2 = CAM_NOW;                                break;            case CAMERA3:   

104、          /* QCB control                          */             

105、   if (IDEStatus = IDESETUP) break;                if (CAM_NOW = 0)                         

106、60;          CAM_NOW = 3;                    UsartSendCmd = UsartSendQCB;              

107、60;     os_send_signal (USARTSEND);                    if (QUAD_NOW=1)CAM_NOW_QUAD1 = CAM_NOW;               &

108、#160;    if (QUAD_NOW=2)CAM_NOW_QUAD2 = CAM_NOW;                                break;        &

109、#160;   case CAMERA4:             /* QCB control                          */     

110、;           if (IDEStatus = IDESETUP) break;                if (CAM_NOW = 0)                 &#

111、160;                  CAM_NOW = 4;                    UsartSendCmd = UsartSendQCB;      &#

112、160;             os_send_signal (USARTSEND);                    if (QUAD_NOW=1)CAM_NOW_QUAD1 = CAM_NOW;       

113、             if (QUAD_NOW=2)CAM_NOW_QUAD2 = CAM_NOW;                                break;

114、            case STOP:                if (StopFlagBit = 0)                   

115、60;                NECCmd = KEY_NOW;                    os_send_signal (NECCODE); /* send NECCom to IDE    

116、60;          */                                break;        

117、0;   default :                NECCmd = KEY_NOW;                os_send_signal (NECCODE); /* send NECCom to IDE     

118、          */                break;                if (KEY_NOW = STOP)       

119、;   /* stop check                           */            StopFlagBit = 1;     &

120、#160;    /* stop counter start                   */        else            StopFlagBit = 0;  &#

121、160;       /* stop counter stop                    */    /*/*        Task 2 'procpir': PIR signal manage  &

122、#160;                              */*/void procpir (void) _task_ PROCPIR     unsigned char pirport,pirportn;    while(1

123、)            if (IDEStatus = IDEFREE)                    pirport = P2;               /* PI

124、R Signal Sample                      */            if (pirport!=0xFF)            

125、0;               pirportn = pirport;                UsartSendData = pirport;             &

126、#160;  UsartSendCmd = UsartSendPIR;                os_send_signal (USARTSEND);                       

127、0;        if (pirportn&0x01)!=0)                                    if (PIR_EN&0x80)!=0

128、)                                            CAM_NOW = CAM_NOW_QUAD1;   

129、60;                    QUAD_NOW = 1;                        NECCmd = TRIG_Q1;     &

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論