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

下載本文檔

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

文檔簡介

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

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

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

4、兒以后、RTX51轉(zhuǎn)回到j(luò)ob0。 這個過程將不確定地重復(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 */ 今天夜已很深了,明早還有考試,對不起了,不寫了。我介紹幾個資料的下載地址,大家自己去看吧!【轉(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ù):0個系統(tǒng)時鐘分頻:1000-65535中斷嵌套:小于20層任務(wù)切換時間:100-700時鐘周期工具要求:以下軟件應(yīng)用需要用 RTX51 TinyC51紡編譯器A51 Marco Assemble

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

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

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

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

11、/* repeat forever */do_something (); /* execute the do_something 'task' */在這個例子中,do_something ()函數(shù)可以認為是一個單任務(wù),既然只有一個任務(wù)在執(zhí)行,就不需要具有多任務(wù)能力或多任務(wù)操作系統(tǒng)。多任務(wù)程序許多成熟的C程序使用一種叫做pseudo多任務(wù)的策略,把多個作協(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 */在這個例子中,每個函數(shù)完成一個獨立的操作或任務(wù)。這些函數(shù)是一個一個順序執(zhí)行的當(dāng)添加更多的任務(wù)時調(diào)度就行了一個問題。比方說,如果函數(shù)pr

13、ocess_kbd_cmds執(zhí)行的時間比較長,主循環(huán)就需要很長時間才能再執(zhí)行到函數(shù)check_serial_io ,這時候串口的數(shù)據(jù)可能會丟失。當(dāng)然check_serial_io 可以在主循環(huán)中多調(diào)用幾次來解決這個問題,但最終這種方法并不是最有效的。RTX51 Tiny的程序當(dāng)使用RTX51 Tiny時,你可以為每一個任務(wù)生成一個獨立的函數(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 */在這個例子中,每個函數(shù)定義了一個RTX51 Tiny的任務(wù)。RTX51 Tiny程序沒有主C函數(shù),RTX51 Tiny首先執(zhí)行任務(wù)0。作為一個典型的應(yīng)用,任務(wù)0只是簡單地用來生成其他的所有任務(wù)。工作原理RTX51 Tiny使用并管理你的目標(biāo)資源,這一部分講述RTX

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

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

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

19、務(wù)處于TIME-OUT狀態(tài)。這個狀態(tài)在round-robin程序中等效于READY狀態(tài)事件(Events)在實時操作系統(tǒng)中事件可以用來控制任務(wù)的執(zhí)行。一個可能會等待一個事件,也可能給其他任務(wù)設(shè)置事件標(biāo)志。函數(shù)os_wait允許任務(wù)等待一個或多個事件。任務(wù)等待的是最普通的事件就是Timeout,一個簡單的Timeout就是一定數(shù)量的clock ticks,當(dāng)一個任務(wù)等待的時間耗盡時,它就可以繼續(xù)執(zhí)行了,當(dāng)它等待時,其他的任務(wù)就可以運行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í)行后的時間,而是某個特定的時間點,從而是一個規(guī)律性的、周期性的運行的任務(wù):比如說每秒一次)信號是任務(wù)間通信的一種簡單的形式,一個任務(wù)可以等待其他作任務(wù)給他發(fā)一個信號(使用 os_send_signal and isr_send_signal 函數(shù))。每個任務(wù)的READY標(biāo)志都可能被其他任務(wù)置位(使用 os_set_ready and isr_set_ready 函數(shù))。一個等timeout, interval, 或信號的任務(wù)都可以通過置位READY標(biāo)志重新啟動。RTX5

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

23、號已經(jīng)發(fā)給他,或直到設(shè)定的interval耗盡注意:上面的兩個事件也可能不組合。任務(wù)調(diào)度器任務(wù)調(diào)度器是RTX51 Tiny的一部分,用來將處理器交給任務(wù)。任務(wù)調(diào)度器根據(jù)以下規(guī)則決定具體執(zhí)行哪一個任務(wù)。當(dāng)出現(xiàn)以下情況將中斷當(dāng)前任務(wù)任務(wù)調(diào)用函數(shù)os_wait,并且等待的任務(wù)還沒有發(fā)生任務(wù)執(zhí)行的時間超過了設(shè)定的round-robin時間片其他的任務(wù)在出現(xiàn)以下條件時開始運行沒有其他任務(wù)正在運行將啟動的任務(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í)行的,而是分時間片執(zhí)行的(可用的CPU時間被分成時間片,RTX51 Tiny把時間片分配給各個任務(wù))。時間片的時間很短(以毫秒為單位),所以任務(wù)看起來像連續(xù)執(zhí)行一樣任務(wù)在分配給他的時間片內(nèi)執(zhí)行(除非放棄)。然后切換到下一個就緒的任務(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)實例應(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)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論