




已閱讀5頁(yè),還剩84頁(yè)未讀, 繼續(xù)免費(fèi)閱讀
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
現(xiàn)場(chǎng)總線控制系統(tǒng),第3講 Neuron C 語言與I/O對(duì)象,信息學(xué)院自動(dòng)化系 凌志浩,內(nèi)容簡(jiǎn)介 1 Neuron C 簡(jiǎn)介 2 Neuron C 編程及技巧 3 節(jié)點(diǎn)間通信 3.1 網(wǎng)絡(luò)變量 3.2 顯示報(bào)文 4 輸入輸出對(duì)象,1 Neuron C 簡(jiǎn)介,Neuron芯片的應(yīng)用程序是用Neuron C編寫的 。 Neuron C是建立在ANSI C的基礎(chǔ)上的,與之相比有如下三方面擴(kuò)展功能: (1)一種新的語句類型when,引入事件并定義任務(wù)事件的執(zhí)行順序。 (2)新增加了37種數(shù)據(jù)類型,34種輸入/輸出對(duì)象,2個(gè)定時(shí)器/計(jì)數(shù)器對(duì)象,大大簡(jiǎn)化了設(shè)備控制器的用法。 (3)網(wǎng)絡(luò)變量的內(nèi)部消息傳送機(jī)制和其他消息處理機(jī)制 。 它是將程序樣例建立在事件上的。也即應(yīng)用程序是被發(fā)生在網(wǎng)絡(luò)當(dāng)中或指定設(shè)備上的事件所觸發(fā)的。因此網(wǎng)絡(luò)自己是被事件驅(qū)動(dòng)的。,1.1 對(duì)ANSI C 的擴(kuò)展包括,(1)一個(gè)內(nèi)部多任務(wù)調(diào)度程序,它允許程序員以自然的方式描述事件驅(qū)動(dòng)的任務(wù),同時(shí)控制這些任務(wù)的優(yōu)先級(jí)的執(zhí)行。 (2)將I/O對(duì)象直接映射到處理器的I/O能力。 (3)網(wǎng)絡(luò)變量對(duì)象定義:提供一種簡(jiǎn)單的實(shí)現(xiàn)節(jié)點(diǎn)之間數(shù)據(jù)共享的方法。 (4)when語句:引入事件并定義這些事件所對(duì)應(yīng)的任務(wù)。 (5)顯式消息傳遞( explicit message ):用于直接對(duì)LonTalk協(xié)議的底層進(jìn)行訪問。 (6)秒及毫秒級(jí)軟件定時(shí)器對(duì)象。 (7)函數(shù)庫(kù):當(dāng)調(diào)用時(shí),可以執(zhí)行事件檢查、管理輸入/輸出、網(wǎng)上發(fā)送或接收消息以及控制Neuron芯片的各種功能。 (8)Neuron C中有三個(gè)ANSI包含文件:、 。,1.2 Neuron C 支持的變量的類型,(1) 整型(整型常數(shù)或整型變量) int 、short int、long int、unsinged int 、signed(可省略) int (2)字符型(字符型常數(shù)或字符型變量) unsigned char(8位)、 signed char (8位) (3) typedef enum FALSE、TRUE boolean (4)其他,1.3 Neuron C 變量定義,(1)Neuron C和ANSI C支持的變量定義如下 簡(jiǎn)單的數(shù)據(jù)類型 int a,b,c ;char a; 數(shù)據(jù)類型 typedef unsigned long ULONG; 枚舉 enum hueRED,GREEN,BLUE 指針 char *p; 函數(shù) int f(int a, int b) 數(shù)組 int a4 結(jié)構(gòu)和共用體 struct char name10; int age; char addr10; ,(2)Neuron C中附加定義的對(duì)象,I/O對(duì)象: IO_0 output bit alarm 定時(shí)器: mtimer led_on_timer 網(wǎng)絡(luò)變量:network input int net_is_car 消息標(biāo)簽:msg_tag command,1.4 編譯指令,NEURON C允許通過#pragma編譯指令進(jìn)行編譯器擴(kuò)充。#pragma可用來設(shè)置一個(gè)Neuron 芯片的系統(tǒng)資源以及節(jié)點(diǎn)參數(shù),諸如緩存器數(shù)及其大小,接收事務(wù)數(shù)等。也可用于對(duì)特定的Neuron芯片參數(shù)進(jìn)行控制,這些指令可在源文件的任何位置出現(xiàn)。 例:#pragma enable_io_pull_ups 可使IO4-IO7的上拉使能,2 Neuron C 編程及技巧,2.1 調(diào)度程序 Neuron 芯片的任務(wù)調(diào)度是由事件驅(qū)動(dòng)的:當(dāng)一個(gè)給定的條件判斷為“真”時(shí),與該事件有關(guān)的代碼被執(zhí)行(稱為任務(wù)被執(zhí)行)。調(diào)度程序允許定義任務(wù),該任務(wù)作為特定事件的結(jié)果而被運(yùn)行,如:輸入管腳的改變、接收一個(gè)網(wǎng)絡(luò)變量的新值、或定時(shí)器溢出等。也可以指定某些任務(wù)是具有優(yōu)先級(jí)的任務(wù),以便能得到優(yōu)先服務(wù)。,(1) when語句,事件由when語句來定義,when語句包含一個(gè)表達(dá)式,當(dāng)表達(dá)式為真時(shí),表達(dá)式后面的代碼段被執(zhí)行。 例:when(timer_expires(led_timer) /當(dāng)定時(shí)器溢出時(shí)執(zhí)行下列任務(wù) io_out(io_led,OFF); 在任務(wù)執(zhí)行后,時(shí)間溢出事件被清除。當(dāng)led_timer再次溢出,when子句判斷為真,任務(wù)又將執(zhí)行;否則,任務(wù)被忽略。,A. 多個(gè)when子句可與一個(gè)任務(wù)發(fā)生關(guān)聯(lián),when(reset) when(io_change(io_switch) when(!timer_expires) when(x= =3) . ,B. when子句不能嵌套,如下為錯(cuò)誤: when(io_changes(io_switch) when(x= =3) ,()when子句語法,priority prompt_safe when(event) task priority(優(yōu)先級(jí)) :可選擇項(xiàng) prompt_safe:可選項(xiàng),如使用即便應(yīng)用程序處于占先模式,仍然允許調(diào)度程序執(zhí)行相關(guān)的when任務(wù) 。 event:可是預(yù)定的事件也可是有效的 Neuron C 表達(dá)式。 task:是Neuron 的復(fù)合語句,任務(wù)同void函數(shù)體等同,也即它不能返回一個(gè)值.,()when語句中的事件類型,分為兩種:預(yù)定義事件和用戶定義事件 預(yù)定義事件:使用編譯器內(nèi)部固有的關(guān)鍵字,包括輸入引腳狀態(tài)變化、網(wǎng)絡(luò)變量修改、定時(shí)器溢出以及消息的接收等。 用戶定義事件:可以是任何有效的Neuron C表達(dá)式。 例: when(msg_arrives) /正確 when(online) /正確 when(msg_arrives & flag = =TURE) /正確,()when語句的調(diào)度,調(diào)度程序?qū)σ唤Mwhen子句的判斷過程是一個(gè)循環(huán)往復(fù)的過程,每一個(gè)when語句都由調(diào)度程序檢測(cè),如果為真,則與其相關(guān)聯(lián)的任務(wù)就被執(zhí)行。如果when語句為假(FALSE),調(diào)度程序?qū)⒗^續(xù)檢查后面的when語句,在檢查完最后一個(gè)when語句后,調(diào)度程序返回頂部重復(fù)執(zhí)行上述過程。 例如: (其中只有為真) when() A when() B when() C when() D ,()優(yōu)先級(jí)when子句,如when子句選用priority關(guān)鍵字,相比無優(yōu)先級(jí)的when子句,調(diào)度程序?qū)哂袃?yōu)先級(jí)的when子句的判斷次數(shù)要頻繁的多。優(yōu)先級(jí)when語句在每次調(diào)度程序運(yùn)行時(shí)以指定的順序被檢查。如果任何優(yōu)先級(jí)when語句被檢測(cè)為真,則與它相對(duì)應(yīng)的任務(wù)就被執(zhí)行,然后調(diào)度程序又重新回到優(yōu)先級(jí) when語句隊(duì)列頭,從頭開始檢測(cè)優(yōu)先級(jí)when語句。 使用優(yōu)先級(jí)when語句必須仔細(xì)考慮。因?yàn)閮?yōu)先級(jí)when語句太多的話,將使無優(yōu)先級(jí)的when語句根本沒機(jī)會(huì)執(zhí)行。如果一個(gè)優(yōu)先級(jí)when語句在大部分時(shí)間里都為真,則它將獨(dú)占處理器時(shí)間。,()預(yù)定義事件關(guān)鍵字,flush_completes 、 offline 、 online 、 wink、io_changes、 io_in_ready、io_out_ready、reset、timer_expires、io_update_occurs、msg_arrives、msg_completes、nv_update_fails、nv_update_succeeds等等。 預(yù)定義事件還可以作為子表達(dá)式放置在if 、while 、for語句的控制表達(dá)式中,這種方法稱為直接事件處理。 例: mtimer t; when(event) if(timer_expires(t) io_out(io_led,OFF); ,2.2 定時(shí)器,Neuron 可以使用兩種類型的軟件定時(shí)器對(duì)象:毫秒定時(shí)器和秒定時(shí)器。 毫秒定時(shí)器提供一個(gè)計(jì)時(shí)范圍為164000毫秒的定時(shí)器。 秒定時(shí)器提供一個(gè)計(jì)時(shí)范圍為 165535秒的定時(shí)器。 它們和Neuron芯片上兩個(gè)硬件定時(shí)器計(jì)時(shí)器無關(guān),由網(wǎng)絡(luò)處理器實(shí)現(xiàn)(15個(gè))。,() 定時(shí)器的定義,mtimer repeating timer-name= initial-value 毫秒定時(shí)器 stimer repeating timer-name=initial-value 秒定時(shí)器 repeating: 為可選項(xiàng),如果定時(shí)器溢出,定時(shí)器將自動(dòng)開始重新計(jì)時(shí)。使用該選項(xiàng),即使應(yīng)用不能立即響應(yīng)該終止事件,精確的時(shí)間間隔也能夠被保留。 timer-name:為定時(shí)器指定的名字 init-value: 為可選項(xiàng),指定當(dāng)加電或者復(fù)位時(shí)賦給定時(shí)器的值。如果不提供該初始值,定時(shí)器的值被置為0。,例,stimer led_timer; /定義秒定時(shí)器led_timer when(reset) led_timer=5; when(t = =50) led_timer=0; /關(guān)閉秒定時(shí)器 ,(2) 時(shí)間溢出事件,語法: timer_expires ( 定時(shí)器名) 定時(shí)器名:是可選項(xiàng),由它來指定所要檢查的具體的定時(shí)器。如沒有該選項(xiàng),該事件是一個(gè)未加限定的timer_expires事件。它與其它預(yù)定義事件不同的是,其它的某個(gè)掛起事件只為真一次,而對(duì)未加限定的timer_expires事件,只要任何一個(gè)定時(shí)器已經(jīng)終止,未加限定的timer_expires將一直保持為真。該事件只有當(dāng)檢測(cè)到特定的定時(shí)器終止事件時(shí)才能被清除 stimer led_timer; when(timer_expires(led_timer) io_out(io_led,OFF);,如果程序中有多個(gè)定時(shí)器,對(duì)每個(gè)具體的定時(shí)器都要作檢查,以便這個(gè)終止事件被清除。例如: mtimer x; mtimer y; mtimer z; when( timer_expires(x) when(timer_expires(y) when(timer_expires(z) ,另外也可采用如下的方法: when(timer_expires) if(timer_expires(x) else if(timer_expires(y) else if(timer_expires(z) ,2.3 輸入輸出,對(duì)未定義的I/O引腳也就是不用的引腳,默認(rèn)為無效狀態(tài),即高阻狀態(tài)。如果引腳不用,應(yīng)設(shè)計(jì)上拉電阻,對(duì)IO4IO7可使用enable_io_pullups編譯指令,加上軟件實(shí)現(xiàn)的上拉電阻。為避免使用上拉電阻,可將不用的管腳定義為輸出管腳。為實(shí)現(xiàn)I/O,可使用內(nèi)嵌的I/O函數(shù):io_out( ) 、 io_in( )、 io_select( ) 、 io_select_dirction( ) 、 io_change_init( ) 、io_set_clock( ) 等。,(1)I/O對(duì)象的定義,說明一個(gè)I/O對(duì)象,完成了兩件事: 1在哪個(gè)或哪幾個(gè)管腳上將實(shí)現(xiàn)什么類型的I/O操作。 2 將I/O對(duì)象的名字和硬件連在一起。 語法: pin type option io-object-name ; pin :IO0IO10中的一個(gè),同一個(gè)引腳可以出現(xiàn)在多個(gè) I /O對(duì)象定義中 type:I/O對(duì)象類型 option:是可選的I/O參數(shù),不同I/O對(duì)象有不同的選項(xiàng),(2)定義I/O對(duì)象的指導(dǎo)原則,(1) 最多定義16個(gè)I/O對(duì)象 (2) Neurowire、I2C、磁卡、磁跡1以及串行I/O對(duì)象是互斥的。在一個(gè)程序中可以說明一個(gè)或多個(gè)該組中的某一種I/O對(duì)象。 (3)定時(shí)器/計(jì)數(shù)器對(duì)象定義了的引腳不能再定義 為移位I/O對(duì)象。 (4)定時(shí)器/計(jì)數(shù)器1可以有多到4個(gè)的輸入對(duì)象供選擇(多路復(fù)用輸入對(duì)象)。 (5)并行和muxbus I/O對(duì)象要求使用所有的I/O管腳,任何一個(gè)這種類型的I/O對(duì)象被說明后,就不能再說明其它I/O對(duì)象類型。,(3)I/O對(duì)象的重疊使用,可能同一引腳要定義為多種I/O對(duì)象 例: IO_4 input nibble io_all_points; IO_4 input bit io_point_1; IO_5 input bit io_point_2; IO_6 input bit io_point_3; IO_7 input bit io_point_4; 允許一個(gè)程序在同一個(gè)操作中讀相鄰的4個(gè)引腳或分別讀每個(gè)引腳(比特I/O)。,(4) I/O函數(shù)及事件,輸入對(duì)象的訪問可以采用兩種方法: 1顯式的調(diào)用io_in( )函數(shù)。 2. 判斷與該對(duì)象有關(guān)的事件 輸出對(duì)象的訪問方法: 調(diào)用io_out( )函數(shù),內(nèi)嵌的I/O函數(shù),io_in ( ) return-value =io_in(io-object-name,args) /從I/O對(duì)象讀取數(shù)據(jù) io_out ( ) 當(dāng)信號(hào)要發(fā)送到某個(gè)設(shè)備時(shí),使用 io_out (io-object-name,output-value,agrs) / 向一個(gè)I/O對(duì)象寫數(shù)據(jù),與I/O有關(guān)的事件,代替顯式調(diào)用io_in( )函數(shù)的方法 使用預(yù)定義事件: io_changes( ) io_update_occurs( ) 僅用于輸入對(duì)象,在檢測(cè)時(shí),io_update_occurs和io_changes事件都隱含的執(zhí)行io_in( )函數(shù),該函數(shù)包括對(duì)象的輸入值。任務(wù)可以通過使用關(guān)鍵字input_value訪問這個(gè)輸入值。,1) io_changes事件,語法:io_changes(io-object-name)by|to expr 當(dāng)從I/O對(duì)象讀到的值改變時(shí),該事件判斷為真。值的改變有三種類型: 改變?yōu)槟持付ǖ闹担?to ) 至少改變一指定的量(by 絕對(duì)值) 任意改變(無限制) 參考值是上次事件判斷為真時(shí)讀取的值,對(duì)于無限制的io_changes事件,如果當(dāng)前值與引用值不同時(shí)就意味著發(fā)生了一個(gè)狀態(tài)的改變.對(duì)于定時(shí)器/計(jì)數(shù)器輸入設(shè)備有一個(gè)新的值并且該值與以前的值不同時(shí),io_changes事件才發(fā)生。,IO_0 input bit push_button; when(io_changes(push_button) to 0) IO_7 input pulsecount total_ticks; when(io_changes(total_ticks) by 100) ,例,對(duì)于定時(shí)器/計(jì)數(shù)器對(duì)象,io_changes事件發(fā)生于: 雙斜率輸入:轉(zhuǎn)換完成時(shí)事件發(fā)生 定期及周期輸入:如果測(cè)量時(shí)間與上次測(cè)量時(shí)間相比已發(fā)生改變時(shí)事件發(fā)生。 脈沖計(jì)數(shù)輸入:如果脈沖計(jì)數(shù)的值與上次計(jì)數(shù)相比已發(fā)生改變,則事件發(fā)生。,2) io_update_occurs事件,語法: io_update_occurs (io-object-name) 當(dāng)輸入對(duì)象(io-object-name)讀取的值發(fā)生改變時(shí),io_update_occurs事件為真。該事件只能用在某些定時(shí)器/計(jì)數(shù)器的輸入對(duì)象中。對(duì)事件的定時(shí)依賴于輸入對(duì)象的類型 。,例如,雙斜率輸入:轉(zhuǎn)換完成且值發(fā)生變化時(shí),該事件發(fā)生 定期及周期輸入:事件發(fā)生在定時(shí)度量結(jié)束時(shí) 脈沖計(jì)數(shù)輸入:每0.839秒事件發(fā)生一次,即當(dāng)一個(gè)新的脈沖計(jì)數(shù)值有效時(shí)。,3)input_value變量,long int類型,內(nèi)嵌變量,可象任何其他的C變量一樣使用. 例: when(io_changes(io_switch_in) nv_switch_state= (input_value= = SWITCH_ON)? ST_ON:ST_OFF ; 例中可以根據(jù) input_value的值設(shè)置網(wǎng)絡(luò)變量 nv_switch_state的值。 input_value 只有在io_changes和io_update_occurs事件發(fā)生后才有效。 有兩種方法可以幫助你確定輸入值是否為新值。,3 節(jié)點(diǎn)間通信,3.1 網(wǎng)絡(luò)變量 概述 (1)可定義為輸入或輸出 (2)基于Neuron節(jié)點(diǎn)定義62個(gè),基于非Neuron節(jié)點(diǎn)可定義4096個(gè) (3)實(shí)現(xiàn)節(jié)點(diǎn)間通信、數(shù)據(jù)共享 (4)由LonTalk協(xié)議實(shí)現(xiàn),被稱為隱式消息 (5)類型相同的網(wǎng)絡(luò)變量才能建立I/O連接 (6)不用考慮消息的打包、發(fā)送及接收,簡(jiǎn)化編程,縮短開發(fā)周期。,3.1.1 網(wǎng)絡(luò)變量的說明,network input | output type identifier = initial-value; network input | output type identifier array-bound = initializer-list,input、output :輸出/輸入網(wǎng)絡(luò)變量 identifier:用戶定義的網(wǎng)絡(luò)變量名 初值:(initial-value)指定一個(gè)初值,說明,Type: 網(wǎng)絡(luò)變量的數(shù)據(jù)類型,(1)signedlong int (2) unsigned long int (3)signedshort int (4) unsigned short int (5)signed char (6) unsinged char (7)枚舉 (9)標(biāo)準(zhǔn)網(wǎng)絡(luò)變量(SNVT) (8)以上類型構(gòu)成的結(jié)構(gòu)體、數(shù)組(最多62個(gè)元素) SNVT: 是一組與數(shù)據(jù)的單位(如攝氏、伏、米等)相關(guān)聯(lián)的預(yù)定義網(wǎng)絡(luò)變量類型,同時(shí)SNVT 還定義了網(wǎng)絡(luò)變量值的范圍以及類型標(biāo)識(shí)號(hào)ID。目前,已定義了的標(biāo)準(zhǔn)網(wǎng)絡(luò)變量有255種。,例,network input SNVT_temp temp_set_point; network output SNVT_lev_disc primary_heater; network output int current_temp; network output boolean bind_info(priority) fire_aalarm; network output boolean bind_info priority(nonconfig) fire_aalarm;,3.1.2 網(wǎng)絡(luò)變量的連接,網(wǎng)絡(luò)變量的連接是獨(dú)立于節(jié)點(diǎn)上的Neuron C 應(yīng) 用的。網(wǎng)絡(luò)變量的連接由網(wǎng)絡(luò)管理工具中稱為連 接器(Binder)的部分來建立。Binder是LonBuilder網(wǎng)絡(luò)管理程序、LonMaker安裝工具或其它網(wǎng)絡(luò)管理工具的一部分。 連接器首先找共享共同網(wǎng)絡(luò)變量的所有節(jié)點(diǎn)。然 后對(duì)每個(gè)網(wǎng)絡(luò)變量,連接器給所有相應(yīng)的節(jié)點(diǎn)分配 地址,以保證信息從正確的地方來,到正確的地方 去。 is_bound( )函數(shù)用來確定網(wǎng)絡(luò)變量是否連接到 其它任何的網(wǎng)絡(luò)變量 。,3.1.3 網(wǎng)絡(luò)變量事件,有4個(gè)和網(wǎng)絡(luò)變量相關(guān)的預(yù)定義的事件: nv_update_completes (network-var) nv_update_fails (network-var) nv_update_occurs (network-var) 只用于輸入網(wǎng)絡(luò)變量 nv_update_succeeds (network-var) 其它三個(gè)事件,當(dāng)輸出網(wǎng)絡(luò)變量被更新時(shí),用于輸出網(wǎng)絡(luò)變量,當(dāng)輸入網(wǎng)絡(luò)變量被輪循時(shí),應(yīng)用于輸入網(wǎng)絡(luò)變量 。 network-var :可用網(wǎng)絡(luò)變量名、網(wǎng)絡(luò)變量數(shù)組名或網(wǎng)絡(luò)變量數(shù)組元素來限定 例如: network_varindex,如事件被一個(gè)數(shù)組名限定,事件將對(duì)每個(gè)數(shù)組元素發(fā)生一次 。, nv_update_occurs (network-var)事件,network-var:如果省略,事件對(duì)任何網(wǎng)絡(luò)變量更新都為 真。當(dāng)輸入網(wǎng)絡(luò)變量收到一個(gè)新值,nv_update_occurs事 件為真。 例 network input SNVT_temp tempSetPoint; when(nv_update_occurs(tempSetPoint) primaryHeader= (curTemptempSetPoint)?ST_ON:ST_OFF; , nv_update_completes (network-var)事件,network-var:可是網(wǎng)絡(luò)變量名、網(wǎng)絡(luò)變量數(shù)組名或網(wǎng)絡(luò)變量數(shù)組元素,也可沒有。 用于: (1)輸出網(wǎng)絡(luò)變量更新完成 (2)被輪循的輸入網(wǎng)絡(luò)變量操作完成 無論成功還是失敗,只要完成該事件都判斷為真。 例:network output int humidity; humidity=32; when(nv_update_completes(humidity) , nv_update_fails和nv_update_succeeds,nv_update_fails(network-var) 當(dāng)一個(gè)網(wǎng)絡(luò)變量更新或輪循失敗后,nv_update_fails事件為真。如果沒有為該事件指定相應(yīng)的網(wǎng)絡(luò)變量,那么該節(jié)點(diǎn)上任何網(wǎng)絡(luò)變量的更新或輪循失敗該事件都檢測(cè)為真。如果多個(gè)網(wǎng)絡(luò)變量被指定,則每一個(gè)網(wǎng)絡(luò)變量更新或輪循失敗都使該事件為真。 nv_update_succeeds(network-var) 同樣當(dāng)輸出網(wǎng)絡(luò)變量更新已被成功地發(fā)送或來自所有寫出節(jié)點(diǎn)的輪循都已被接收到,nv_update_succeeds事件為真。,三個(gè)節(jié)點(diǎn)網(wǎng)絡(luò)示意圖,開關(guān) 節(jié)點(diǎn),nv_switch_state,nv_lamp_state,電燈 節(jié)點(diǎn),電燈 節(jié)點(diǎn),nv_lamp_state,一個(gè)輸出網(wǎng)絡(luò)變量控制兩個(gè)輸入網(wǎng)絡(luò)變量,開關(guān)節(jié)點(diǎn),#pragma enable_io_pullups; #include network output SNVT_lev_disc nv_switch_state=ST_OFF; #define BUTTON_DOWN 1 #define BUTTON_UP 0 IO_4 input bit ioButton=BUTTON_UP; / I/O任務(wù) When(io_changes(ioButton)to BUTTON_DOWN) nv_switch_state=(nv_switch_state!=ST_OFF)? ST_OFF:ST_ON; ,電燈節(jié)點(diǎn),network input SNVT_lev_disc nv_lamp_state=ST_OFF; #define LED_ON 1 #define LED_OFF 0 IO_0 output bit ioLED=LED_OFF; /修改任務(wù)-修改電燈的狀態(tài),用網(wǎng)絡(luò)變量的值作為電燈的新狀態(tài) when(nv_update_occurs(nv_lamp_state) io_out(ioLED,(nv_lamp_state!=ST_OFF)?LED_ON:LED_OFF); ,3.2 顯式報(bào)文 3.2.1 顯式報(bào)文與網(wǎng)絡(luò)變量的比較,(1)顯式報(bào)文有一個(gè)可變大小的數(shù)據(jù)域,一個(gè)給定的網(wǎng)絡(luò)變量 數(shù)據(jù)域的大小是一個(gè)常數(shù)。 (2)顯式報(bào)文提供了請(qǐng)求/響應(yīng)機(jī)制,使得在一個(gè)節(jié)點(diǎn)上的應(yīng)用 可以引起另一個(gè)節(jié)點(diǎn)的應(yīng)用來響應(yīng)它. (3)顯式報(bào)文使用的E2PROM表空間比網(wǎng)絡(luò)變量少,用的代碼空 間比網(wǎng)絡(luò)變量要多 . (4)顯式報(bào)文是從一個(gè)節(jié)點(diǎn)向另一個(gè)節(jié)點(diǎn)傳送信息的更復(fù)雜的 方法。程序員必須顯示地構(gòu)造、發(fā)送和接收顯示報(bào)文。而報(bào)文 的屬性例如服務(wù)類型、認(rèn)證和優(yōu)先級(jí)是在編譯時(shí)定義的,在節(jié) 點(diǎn)安裝后是不能通過網(wǎng)絡(luò)管理工具配置的。,3.2.2 顯式報(bào)文,操作步驟 Neuron C 功能 (1) 構(gòu)造一個(gè)報(bào)文 msg_out對(duì)象 (2) 發(fā)送一個(gè)報(bào)文 msg_send() 函數(shù) msg_cancel() 函數(shù) (3) 接收一個(gè)報(bào)文 msg_arrives 事件 msg_receive函數(shù) msg_in 對(duì)象 (4) 發(fā)送報(bào)文后的確認(rèn)服務(wù) msg_completes 事件 msg_succeeds 事件 msg_fails 事件,3.2.3 構(gòu)造一個(gè)報(bào)文,報(bào)文對(duì)象名字:msg_out 發(fā)送:使用msg_send( )函數(shù) 注意: 在同一時(shí)間,只有一個(gè)輸出報(bào)文(或響應(yīng))和一個(gè)輸入 報(bào)文(或響應(yīng))是可用的。程序不能同時(shí)建造兩個(gè)報(bào)文, 也不能同時(shí)發(fā)送它們。并且兩個(gè)輸入報(bào)文不能同時(shí)被分析。,(1)msg_out 對(duì)象定義,struct boolean priority_on; /優(yōu)先級(jí)消息TRUE,缺省為FALSE msg_tag tag; /報(bào)文標(biāo)簽該域是必須的 int code; /消息代碼,為數(shù)字報(bào)文碼,該域必須的 int dataMAXDATA; /報(bào)文包含的數(shù)據(jù)(缺省沒有), /該域是可選的 建議MAXDATA228 boolean authenticated; /報(bào)文是證實(shí)的為TRUE,缺省為FALSE service_type service; /服務(wù)類型(缺省為確認(rèn)服務(wù)) msg_out_addr dest_addr; msg_out;,typedef enumACKD=0,UNACKD_RPT=1, UNACKD=2,REQUSET=3service_type; service:為下列服務(wù)之一 (1) ACKD(缺省值)-確認(rèn)服務(wù) (2) UNACKD -非確認(rèn)服務(wù) (3) UNACKD_RPT-非確認(rèn)重發(fā)(報(bào)文發(fā)送多次) (4) REQUEST-請(qǐng)求/響應(yīng)服務(wù)。當(dāng)報(bào)文使用該服務(wù)被發(fā)送,則接收節(jié)點(diǎn)返回一個(gè)響應(yīng)給發(fā)送節(jié)點(diǎn),發(fā)送節(jié)點(diǎn)處理這個(gè)響應(yīng)。 dest_addr:在msg_out對(duì)象中是一個(gè)可選域,如果用顯示地址發(fā)送報(bào)文,則應(yīng)用程序給該域賦值 。,(2)發(fā)送報(bào)文,void msg_send(void); /其用msg_out對(duì)象發(fā)送報(bào)文 例如: msg_tag motor; # define MOTOR_ON 0 # define ON_FULL 100 when (io_changes(switch1)to ON) / 給電動(dòng)機(jī)發(fā)送一個(gè)報(bào)文 msg_out.tag = motor; msg_out.code = MOTOR_ON; /消息代碼是0 msg_out.data0 = ON_FULL; msg_send(); ,void msg_cancel(void) 該函數(shù)取消為msg_out對(duì)象構(gòu)造的報(bào)文并釋放分配給它 的緩沖區(qū),允許構(gòu)造另外的報(bào)文,它無參數(shù)、無返回值。 如果構(gòu)造了報(bào)文還沒有發(fā)送出去,在任務(wù)退出前報(bào)文被自 動(dòng)取消。這個(gè)函數(shù)用來取消優(yōu)先級(jí)和非優(yōu)先級(jí)報(bào)文。 (3)接收一個(gè)報(bào)文 程序通常通過預(yù)定義事件when(msg_arrives)接收一個(gè) 報(bào)文。msg_receive( )函數(shù)也可用來接收一個(gè)消息。收到的 消息可在msg_in對(duì)象中得到。,取消發(fā)送,例,If(offline() /被請(qǐng)求脫機(jī) msg_cancel(); else msg_send(); ,struct int code; / 報(bào)文碼 int len; / 報(bào)文數(shù)據(jù)的長(zhǎng)度 int dataMAXDATA; / 報(bào)文數(shù)據(jù) boolean authenticated; / 如認(rèn)證通過為真 service_type service; msg_in_addr addr; boolean duplicate; / 接收消息是一個(gè)重發(fā)的請(qǐng)求消息 unsigned rcvtx; /接收事務(wù) ID,在節(jié)點(diǎn)的事務(wù)數(shù)據(jù)庫(kù)中使用它。 msg_in;,msg_arrives 事件,msg_arrives(message-code)事件 message-code:是一個(gè)可選的整數(shù)報(bào)文代碼。如果省略這 個(gè)參數(shù),收到任何報(bào)文,事件都為真。當(dāng)報(bào)文到達(dá)時(shí), msg_arrives事件為真。這個(gè)事件可以由報(bào)文的發(fā)送者指 定一個(gè)限定的報(bào)文碼。這時(shí)只有當(dāng)包含指定碼的報(bào)文到達(dá) 時(shí),事件才為真。當(dāng)既使用非限定的msg_arrives事件又 使用限定的msg_arrives事件時(shí),則必須指定 #pragma scheduler_reset編譯指令,以便在所有的限定 事件when語句之后處理非限定事件when語句 。,例 :#pragma scheduler_reset when (msg_arrives(1) io_out(sprinkler, ON); when (msg_arrives(2) io_out(sprinkler, OFF); when (msg_arrives) / 處理意料之外的消息 / 什么也不做,只是仍掉它 注意:使用msg_arrives事件接收消息的程序,應(yīng)該考慮到接收意料之外的消息。例如某個(gè)節(jié)點(diǎn)的服務(wù)引腳向所有節(jié)點(diǎn)發(fā)送,但只有網(wǎng)絡(luò)管理工具對(duì)該消息有興趣并處理該消息。否則未處理的消息永遠(yuǎn)停留在隊(duì)列前面,造成阻塞。,boolean msg_receive (void) 函數(shù),msg_receive( )函數(shù)接收一個(gè)消息到msg_in對(duì)象,如果收到一 個(gè)新的報(bào)文,函數(shù)返回真,否則返回假。 (1)如果在報(bào)文隊(duì)列中沒有報(bào)文,該函數(shù)并不等待。 (2)如果在一個(gè)任務(wù)中收到多個(gè)報(bào)文,正如在旁路模式,它可能需要使用這個(gè)函數(shù)。 (3)如果收到的是已接收的消息,先接收的消息將被刪掉以釋放它所占的緩存空間。 (4)該函數(shù)不能用在一個(gè)when子句表達(dá)式中。 例: if(msg_receive() . msg_free(); ,開關(guān)、燈節(jié)點(diǎn),開關(guān)程序,#define LAMP_ON 1 #define LAMP_OFF 2 #define OFF 0 #define ON 1 IO_4 input bit io_switch_in; msg_tag TAG_OUT; /聲明消息標(biāo)簽 when(reset) io_change_init(io_switch_in); when(io_changes(io_switch_in) msg_out.code=(input_value=ON)?LAMP_ON:LAMP_OFF; msg_out.tag=TAG_OUT; msg_send(); ,燈程序,#define LAMP_ON 1 #define LAMP_OFF 2 #define OFF 0 #define ON 1 IO_0 output bit io_lamp_control; when(msg_arrives) switch(msg_in.code) case LAMP_ON: io_out(io_lamp_control,ON ); break; case LAMP_OFF: io_out(io_lamp_control,OFF ); break; ,4.Neuron 芯片應(yīng)用I/O對(duì)象,4.1 Neuron芯片I/O對(duì)象類型 I/O對(duì)象簡(jiǎn)單的講就是一個(gè)定義的輸入或輸出波形,也可看成是存放在ROM 中供用戶程序訪問的已編寫好的固件例程,如同Windows編程中的各種控件,可直接使用。用戶可通過io_out( )和io_in( )系統(tǒng)調(diào)用來訪問這些I/O對(duì)象,并在程序執(zhí)行期間完成輸入/輸出操作。,Neuron芯片通過11只引腳(IO0-IO10)與應(yīng)用指定的外部硬件相連,稱這11只引腳為應(yīng)用I/O。 這些引腳可以以最少的外接電路實(shí)現(xiàn)多種靈活的輸入輸出功能。其中IO4-IO7可通過編程使用芯片內(nèi)部的上拉電阻、IO0-IO3有高電流吸收能力、IO0IO7具有低電平檢測(cè)鎖存器。IO0-IO10有TTL電平輸入。可以定義一個(gè)或多個(gè)引腳作為I/O對(duì)象。Neuron芯片共有34種不同的I/O對(duì)象,分為以下四類:,應(yīng)用I/O,(1)直接I/O對(duì)象: 基于I/O管腳的邏輯電平,(2) 并行雙向I/O對(duì)象,并行I/O對(duì)象用于高速雙向輸入、輸出數(shù)據(jù),當(dāng)定義并行I/O對(duì)象時(shí),必須定義用全部的I/O對(duì)象引腳。,(3) 串行I/O對(duì)象 用來實(shí)現(xiàn)在一個(gè)管腳上串行的數(shù)據(jù)傳輸,(4) 定時(shí)器/計(jì)數(shù)器 I/O 對(duì)象,4.2 I/O對(duì)象介紹 4.2.1 直接I/O對(duì)象,(1)比特I/O對(duì)象 (bit) 這種I/O對(duì)象類型用于讀或控制單個(gè)管腳的邏輯狀態(tài),IO0IO10都可分別配置成單個(gè)的比特輸入或輸出端口,0相當(dāng)于低電平而1相當(dāng)于高電平。輸入信號(hào)電平是TTL電平,比特輸入可從外接的邏輯電路例如觸點(diǎn)式表決器以及類似的電路中讀取與TTL電平兼容的邏輯信號(hào)。比特輸出信號(hào)電平是CMOS 電平,可驅(qū)動(dòng)外接的與CMOS電平兼容的邏輯電路。如開關(guān)晶體管、燈等。也可驅(qū)動(dòng)較高電流的外部設(shè)備如步進(jìn)電機(jī)等。程序可動(dòng)態(tài)的改變端口的輸入、輸出方向。IO0-IO3 具有較高的高電流(20mA)吸收能力,使得它們能直接驅(qū)動(dòng)多個(gè)I/O設(shè)備。IO4IO7具有可編程上拉電阻。,比特對(duì)象定義,pin input bit o_object_name; pin output bit o_object_name(=initial_output_level); initial_output_level:初始狀態(tài),缺省為0 IO_1 input bit io_switch_1; unsigned int switch_on_off; . when(io_changes(io_swtich_1) switch_on_off=input_value; ,IO_2 output bit io_led; unsigned int led_on_off; when() Io_out(io_led,led_on_off); ,(2)電平檢測(cè)輸入對(duì)象(leveldetect),IO0IO7可分別配置為電平檢測(cè)輸入端口,用于檢測(cè)某一輸入端輸入的邏輯為“0”的電平。它能鎖存輸入引腳的負(fù)跳變,即使該負(fù)脈沖很窄,對(duì)于10Mhz的輸入時(shí)鐘每200ns輸入狀態(tài)在硬件上被鎖存一次(時(shí)間間隔與輸入時(shí)鐘速度成比例),可捕獲任何電平輸入。該事件由值代表,當(dāng)讀取時(shí)被清為零。只要輸入管腳電平停留在邏輯,每個(gè)io_in( )調(diào)用將返回值.用于俘獲短持續(xù)時(shí)間的事件。,對(duì)象定義,pininput leveldetect io-name; 例: IO_5 input leveldetect io_edge_trigger; when(io_changes(io_edge_trigger) to 1) /任務(wù)將在每次引腳IO_5變?yōu)殡娖綍r(shí)執(zhí)行 ,4.2.2 串行I/O對(duì)象 (1)同步串行I/O對(duì)象(Neurowire),Neurowire可實(shí)現(xiàn)與外部器件的同步全雙工串行數(shù)據(jù)格式的傳送,它可作為主控收發(fā)器(提供同步時(shí)鐘)或被控收發(fā)器(接收同步時(shí)鐘)。只要遵循SPI或National Semiconductors Microwire TM的接口器件,都可以作為Neurowire的外接器件。例如A/D、D/A以及顯示驅(qū)動(dòng)器等。,1) 引腳配置如下:,主控方式 被控方式,語法:,IO_8 neurowire masterslaveselect(pin)timeout(pin) kbaud(const-expr)clockedge(+/-) io-name; (1)IO_8:必須指定IO_8,片選IO0-IO7。 (2)master:由IO8提供時(shí)鐘; slave:IO8為輸入管腳,最大輸入時(shí)鐘為18kbps,占空比為50/50,此時(shí)Neuron輸入時(shí)鐘為10MHz。速度與輸入時(shí)鐘成正比。 (3)select:為 master指定片選管腳(IO0IO7)。數(shù)據(jù)輸出前,片選為低電平,數(shù)據(jù)輸出后為高電平。 (4)timeout:為 slave 指定一個(gè)超時(shí)管腳(IO0IO7)每當(dāng)Neuron芯片等待時(shí)鐘的上升沿或下降沿時(shí),將檢查該管腳的邏輯電平。如果檢測(cè)到邏輯電平1,則傳輸被終止。這樣就允許使用外部超時(shí)信號(hào)或內(nèi)部生成的超時(shí)信號(hào)來限制傳輸?shù)某掷m(xù)時(shí)間。 (5)kbaud為master指定比特率,const-expr的結(jié)果可以為1,10,或20。對(duì)于10Mhz的Neuron芯片輸入時(shí)鐘缺省為20kbps。不能用于 Slave。 (6)clockedge(+/-):時(shí)鐘信號(hào)的極性,缺省為上升沿 。,(2) RS232半雙工異步串行I/O對(duì)象(Serial),用于異步串行數(shù)據(jù)格式數(shù)據(jù)傳輸,實(shí)現(xiàn)半雙工的EIA-232(RS232)通信,傳輸格式為:1位始位,8位數(shù)據(jù)位,1位停止位。 輸入串行I/O對(duì)象將等待被接收的數(shù)據(jù)幀的真正的開始,直到已經(jīng)等待了接收20個(gè)字符所需要的時(shí)間結(jié)束,如果在這段時(shí)間內(nèi)沒有輸入發(fā)生則返回0。當(dāng)已收到全部的字節(jié)數(shù)或已超過接收20個(gè)字符所需要的時(shí)間但仍未接收到數(shù)據(jù)時(shí),輸入終止。輸入串行I/O對(duì)象將在無效停止位或奇偶校驗(yàn)位時(shí)停止接收數(shù)據(jù)。在波特率為2400bps,輸入超時(shí)為83ms。,串行輸入:必須為IO8 串行輸出:必須為IO10, 串行輸入模式只提供1位緩存和
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 安陽市殷都區(qū)2024年三上數(shù)學(xué)期末調(diào)研試題含解析
- 知識(shí)產(chǎn)權(quán)英語課件
- 2025屆平?jīng)鍪腥昙?jí)數(shù)學(xué)第一學(xué)期期末檢測(cè)試題含解析
- 2025年考試技巧強(qiáng)化試題及答案
- 糧食管理職責(zé)清單
- 2025年工程經(jīng)濟(jì)模塊學(xué)習(xí)試題及答案
- 數(shù)媒藝術(shù)畢業(yè)設(shè)計(jì)
- 公共關(guān)系在文化傳播中的重要性試題及答案
- 電子商務(wù)交易安全練習(xí)題
- 酒店裝修設(shè)計(jì)作業(yè)指導(dǎo)書
- 保健院急診急救工作制度與流程(2025版)
- 珍奇的稀有動(dòng)物針鼴課件
- 臺(tái)達(dá)VFDM變頻器說明書
- 社會(huì)保險(xiǎn)繳費(fèi)征管與企業(yè)數(shù)字化轉(zhuǎn)型
- 課題申報(bào)參考:行業(yè)協(xié)會(huì)商會(huì)服務(wù)經(jīng)濟(jì)高質(zhì)量發(fā)展研究
- 2024年基金從業(yè)資格證考試題庫(kù)含答案(奪分金卷)
- 罐車司機(jī)安全培訓(xùn)課件
- 基于認(rèn)知模型建構(gòu)與應(yīng)用發(fā)展科學(xué)思維
- 企業(yè)戰(zhàn)略性技術(shù)創(chuàng)新與產(chǎn)業(yè)自主可控水平
- 檢驗(yàn)科職業(yè)暴露應(yīng)急預(yù)案
- 湖北省武漢市華科附中2025屆高考數(shù)學(xué)四模試卷含解析
評(píng)論
0/150
提交評(píng)論