新建工程
創(chuàng)新互聯(lián)擁有網(wǎng)站維護(hù)技術(shù)和項目管理團(tuán)隊,建立的售前、實施和售后服務(wù)體系,為客戶提供定制化的成都網(wǎng)站建設(shè)、做網(wǎng)站、網(wǎng)站維護(hù)、成都服務(wù)器托管解決方案。為客戶網(wǎng)站安全和日常運維提供整體管家式外包優(yōu)質(zhì)服務(wù)。我們的網(wǎng)站維護(hù)服務(wù)覆蓋集團(tuán)企業(yè)、上市公司、外企網(wǎng)站、商城網(wǎng)站建設(shè)、政府網(wǎng)站等各類型客戶群體,為全球超過千家企業(yè)提供全方位網(wǎng)站維護(hù)、服務(wù)器維護(hù)解決方案。
首先新建工程,并加以簡單配置,可以參考我的分享:《IAR如何建立工程》,如下為硬件電路圖:
cc2530 外部中斷
查看cc2530 datasheet可以知道,2530的所有外部引腳均可以配置為中斷模式,如下圖所示:P0\P1\P2 中,P0.0-0.7共享一個中斷地址,P1.0-1.7共享一個中斷地址,P2.0-P2.3共享一個中斷地址。
PxIEN
在引腳中斷功能配置時,常需要設(shè)置P0IEN,主要是開啟/關(guān)閉引腳的中斷功能。如下圖所示,為1時開啟,為0時關(guān)閉中斷。
開啟S1按鈕中斷:
P0IEN |= BIT4;
PICTL
PICTL可以控制Px口中斷觸發(fā)信號:上升沿觸發(fā)、下降沿觸發(fā)。由于按鍵在未按下時處于高電平,按下后為低電平,松開后又為高電平,所以會產(chǎn)生下降沿觸發(fā)信號,配置為下降沿觸發(fā)即可:
PICTL |= BIT0; ?//falling edge
IEN1
除了配置引腳,還需要開啟端口引腳中斷使能,如下所示開啟PO口中斷使能:
IEN1 |= BIT5; //P0 interrupt
PxIFG
在開啟中斷前需要先清除中斷標(biāo)志,以免誤入中斷造成系統(tǒng)混亂。
P0IFG = ~BIT4;
系統(tǒng)中斷使能
學(xué)習(xí)51都知道,在任何中斷操作時,都需要開啟系統(tǒng)中斷:
EA = 1; //system interrupt open
中斷函數(shù)書寫
#pragma vector = P0INT_VECTOR
__interrupt void P0_isr(void)
{
wg_waitUs(10);
P0IFG = ~BIT4;
P0IF = ~BIT4;
P1_0 = ~P1_0; //led1 trigger
}
其中wg_waitUs()是延時函數(shù),起到按鍵消抖作用。
代碼框架
void wg_ledInit(void)
{
P1DIR |= BIT0;
P1 |= BIT0;
}
void wg_btnInit(void)
{
P0IEN |= BIT4; // P0.4 button input
PICTL |= BIT0; ?//falling edge
IEN1 |= BIT5; //P0 interrupt
P0IFG = ~BIT4;
EA = 1; //system interrupt open
}
void wg_waitUs(uint16 duration)
{
while (duration--)
{
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
asm("NOP");
}
}
void main(void)
{
wg_ledInit();
wg_btnInit();
//loop
for(;;)
{
;//
}
}
#pragma vector = P0INT_VECTOR
__interrupt void P0_isr(void)
{
wg_waitUs(10);
P0IFG = ~BIT4;
P0IF = ~BIT4;
P1_0 = ~P1_0; //led1 trigger
}
c語言怎么使用sql觸發(fā)器:
定義: 何為觸發(fā)器?在SQL Server里面也就是對某一個表的一定的操作,觸發(fā)某種條件,從而執(zhí)行的一段程序。觸發(fā)器是一個特殊的存儲過程。
常見的觸發(fā)器有三種:分別應(yīng)用于Insert , Update , Delete 事件。
我為什么要使用觸發(fā)器?比如,這么兩個表:
Create Table Student( --學(xué)生表
StudentID int primary key, --學(xué)號
....
)
Create Table BorrowRecord( --學(xué)生借書記錄表
BorrowRecord int identity(1,1), --流水號
StudentID int , --學(xué)號
BorrowDate datetime, --借出時間
ReturnDAte Datetime, --歸還時間
...
)
用到的功能有:
1.如果我更改了學(xué)生的學(xué)號,我希望他的借書記錄仍然與這個學(xué)生相關(guān)(也就是同時更改借書記錄表的學(xué)號);
2.如果該學(xué)生已經(jīng)畢業(yè),我希望刪除他的學(xué)號的同時,也刪除它的借書記錄。
等等。
這時候可以用到觸發(fā)器。對于1,創(chuàng)建一個Update觸發(fā)器:
Create Trigger truStudent
On Student --在Student表中創(chuàng)建觸發(fā)器
for Update --為什么事件觸發(fā)
As --事件觸發(fā)后所要做的事情
if Update(StudentID)
begin
Update BorrowRecord
Set StudentID=i.StudentID
From BorrowRecord br , Deleted d ,Inserted i --Deleted和Inserted臨時表
Where br.StudentID=d.StudentID
end
理解觸發(fā)器里面的兩個臨時的表:Deleted , Inserted 。注意Deleted 與Inserted分別表示觸發(fā)事件的表“舊的一條記錄”和“新的一條記錄”。
一個數(shù)據(jù)庫系統(tǒng)中有兩個虛擬表用于存儲在表中記錄改動的信息,分別是:
虛擬表Inserted 虛擬表Deleted
在表記錄新增時 存放新增的記錄 不存儲記錄
修改時 存放用來更新的新記錄 存放更新前的記錄
刪除時 不存儲記錄 存放被刪除的記錄
一個Update 的過程可以看作為:生成新的記錄到Inserted表,復(fù)制舊的記錄到Deleted表,然后刪除Student記錄并寫入新紀(jì)錄。
對于2,創(chuàng)建一個Delete觸發(fā)器
Create trigger trdStudent
On Student
for Delete
As
Delete BorrowRecord
From BorrowRecord br , Delted d
Where br.StudentID=d.StudentID
從這兩個例子我們可以看到了觸發(fā)器的關(guān)鍵:A.2個臨時的表;B.觸發(fā)機(jī)制。
在語言中一般 Invoke是立即調(diào)用一段委托代碼,相當(dāng)于調(diào)用了一個函數(shù)。
而trigger是觸發(fā)一個事件,而事件機(jī)制允許注冊多個事件。也即trigger所有綁定到該事件的監(jiān)聽器都會被觸發(fā)。
invoke,trigger兩種思路了,如果只想簡單的執(zhí)行一個函數(shù)可以用invoke,如果是類似事件那種可能有多個函數(shù)被調(diào)用就用trigger。
一個觸發(fā)器是一種聲明,告訴數(shù)據(jù)庫應(yīng)該在執(zhí)行特定的操作的時候執(zhí)行特定的函數(shù)。 觸發(fā)器可以定義在一個INSERT,UPDATE, 或者 DELETE 命令之前或者之后執(zhí)行,要么是對每個被修改的行一次, 要么是每條 SQL 一次。 如果發(fā)生觸發(fā)器事件,那么將在合適的時刻調(diào)用觸發(fā)器的函數(shù)以處理該事件。
觸發(fā)器函數(shù)必須在創(chuàng)建觸發(fā)器之前,作為一個沒有參數(shù)并且返回trigger類型的函數(shù)定義。 (觸發(fā)器函數(shù)通過特殊的 TriggerData 結(jié)構(gòu)接收其輸入,而不是用普通函數(shù)參數(shù)那種形式。)
一旦創(chuàng)建了一個合適的觸發(fā)器函數(shù),觸發(fā)器就用 CREATE TRIGGER 創(chuàng)建。同一個觸發(fā)器函數(shù)可以用于多個觸發(fā)器。
PostgreSQL 提供按行觸發(fā)的觸發(fā)器和按語句觸發(fā)的觸發(fā)器。在按行觸發(fā)的觸發(fā)器里, 觸發(fā)器函數(shù)是為觸發(fā)觸發(fā)器的語句影響的每一行執(zhí)行一次。相比之下,一個按語句觸發(fā)的觸發(fā)器是在每執(zhí)行一次合適的語句執(zhí)行一次的, 而不管影響的行數(shù)。特別是,一個影響零行的語句將仍然導(dǎo)致任何適用的按語句觸發(fā)的觸發(fā)器的執(zhí)行。 這兩種類型的觸發(fā)器有時候分別叫做行級別的觸發(fā)器和語句級別的觸發(fā)器。
觸發(fā)器還通常分成 before 觸發(fā)器和 after 觸發(fā)器。 語句級別的 "before" 觸發(fā)器通常在語句開始做任何事情之前觸發(fā), 而語句級別的 "after" 觸發(fā)器在語句的最后觸發(fā)。 行級別的 "before" 觸發(fā)器在對特定行進(jìn)行操作的時候馬上觸發(fā), 而行級別的 "after" 觸發(fā)器在語句結(jié)束的時候觸發(fā)(但是在任何語句級別的 "after" 觸發(fā)器之前)。
按語句觸發(fā)的觸發(fā)器應(yīng)該總是返回 NULL。 如果必要,按行觸發(fā)的觸發(fā)器函數(shù)可以給調(diào)用它的執(zhí)行者返回一表數(shù)據(jù)行(一個類型為 HeapTuple 的數(shù)值), 那些在操作之前觸發(fā)的觸發(fā)器有以下選擇:
它可以返回 NULL 以忽略對當(dāng)前行的操作。 這就指示執(zhí)行器不要執(zhí)行調(diào)用該觸發(fā)器的行級別操作(對特定行的插入或者更改))。
只用于INSERT和UPDATE觸發(fā)器: 返回的行將成為被插入的行或者是成為將要更新的行。 這樣就允許觸發(fā)器函數(shù)修改被插入或者更新的行。
一個無意導(dǎo)致任何這類行為的在操作之前觸發(fā)的行級觸發(fā)器必須仔細(xì)返回那個被當(dāng)作新行傳進(jìn)來的同一行 (也就是說,對于 INSERT 和 UPDATE 觸發(fā)器而言,是 NEW 行, 對于 DELETE 觸發(fā)器而言,是 OLD 行)。
對于在操作之后觸發(fā)的行級別的觸發(fā)器,其返回值會被忽略,因此他們可以返回NULL。
如果多于一個觸發(fā)器為同樣的事件定義在同樣的關(guān)系上, 觸發(fā)器將按照由名字的字母順序排序的順序觸發(fā)。 如果是事件之前觸發(fā)的觸發(fā)器,每個觸發(fā)器返回的可能已經(jīng)被修改過的行成為下一個觸發(fā)器的輸入。 如果任何事件之前觸發(fā)的觸發(fā)器返回 NULL 指針, 那么對該行的操作將被丟棄并且隨后的觸發(fā)器不會被觸發(fā)。
通常,行的 before 觸發(fā)器用于檢查或修改將要插入或者更新的數(shù)據(jù)。 比如,一個 before 觸發(fā)器可以用于把當(dāng)前時間插入一個 timestamp 字段, 或者跟蹤該行的兩個元素是一致的。行的 after 觸發(fā)器多數(shù)用于填充或者更新其它表, 或者對其它表進(jìn)行一致性檢查。這么區(qū)分工作的原因是, after 觸發(fā)器肯定可以看到該行的最后數(shù)值, 而 before 觸發(fā)器不能;還可能有其它的 before 觸發(fā)器在其后觸發(fā)。 如果你沒有具體的原因定義觸發(fā)器是 before 還是 after,那么 before 觸發(fā)器的效率高些, 因為操作相關(guān)的信息不必保存到語句的結(jié)尾。
如果一個觸發(fā)器函數(shù)執(zhí)行 SQL 命令,然后這些命令可能再次觸發(fā)觸發(fā)器。 這就是所謂的級聯(lián)觸發(fā)器。對級聯(lián)觸發(fā)器的級聯(lián)深度沒有明確的限制。 有可能出現(xiàn)級聯(lián)觸發(fā)器導(dǎo)致同一個觸發(fā)器的遞歸調(diào)用的情況; 比如,一個 INSERT 觸發(fā)器可能執(zhí)行一個命令, 把一個額外的行插入同一個表中,導(dǎo)致 INSERT 觸發(fā)器再次激發(fā)。 避免這樣的無窮遞歸的問題是觸發(fā)器程序員的責(zé)任。
在定義一個觸發(fā)器的時候,我們可以聲明一些參數(shù)。 在觸發(fā)器定義里面包含參數(shù)的目的是允許類似需求的不同觸發(fā)器調(diào)用同一個函數(shù)。 比如,我們可能有一個通用的觸發(fā)器函數(shù), 接受兩個字段名字,把當(dāng)前用戶放在第一個,而當(dāng)前時間戳在第二個。 只要我們寫得恰當(dāng),那么這個觸發(fā)器函數(shù)就可以和觸發(fā)它的特定表無關(guān)。 這樣同一個函數(shù)就可以用于有著合適字段的任何表的 INSERT 事件,實現(xiàn)自動跟蹤交易表中的記錄創(chuàng)建之類的問題。如果定義成一個 UPDATE 觸發(fā)器,我們還可以用它跟蹤最后更新的事件。
每種支持觸發(fā)器的編程語言都有自己的方法讓觸發(fā)器函數(shù)得到輸入數(shù)據(jù)。 這些輸入數(shù)據(jù)包括觸發(fā)器事件的類型(比如,INSERT 或者 UPDATE)以及所有在 CREATE TRIGGER 里面列出的參數(shù)。 對于低層次的觸發(fā)器,輸入數(shù)據(jù)也包括 INSERT 和 UPDATE 觸發(fā)器的 NEW 行,和/或 UPDATE 和 DELETE 觸發(fā)器的 OLD 行。 語句級別的觸發(fā)器目前沒有任何方法檢查改語句修改的獨立行。