亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码

標題: 中斷函數內增加static關鍵字的問題 [打印本頁]

作者: samxon    時間: 2024-6-23 11:11
標題: 中斷函數內增加static關鍵字的問題
代碼要求led間隔0.5秒閃爍,在定時中斷函數內的unsigned char i變量是否有必要增加static關鍵字。原因是什么,謝謝大家。
或者有更優化的代碼。

bit flag;
sbit led=P1^2;
void main(){
        while(1){
                   if(flag){led=1;}else{led=0;}
       }
}
void Timer0Init(void)                //5ms@11.0592MHz
{
//定時器代碼
}

void Timer0() interrupt 1
{
        unsigned char i;
        i++;
        if(i<100){
                flag=1;
        }else{
                flag=0;
                if(i>200){i=0;}
                }               
}



作者: xxxevery    時間: 2024-6-23 13:21
如果你這樣寫成局部變量就要加上static,因為局部變量退出函數后會被銷毀,再次進入函數后會先初始化為零;蛘吣愀纱嘣O置成全局變量
作者: cedtek    時間: 2024-6-23 13:22
在你的代碼中,必須使用static關鍵字來聲明局部變量 i 因為局部變量如果沒有使用 static 限定,默認就是 auto 類型的,那么每次 5ms 定時時間到,中斷服務函數就會被調用一次,每次調用,變量 i 的值又會重新歸為垃圾值,主要是需要理解函數調用時會給該函數分配一個棧空間,并不能保證每次分配的都是同一個,所以變量 i 的值在沒有使用 static 修飾它的存儲類型時就不會按照我們預想的從 i 一直自加到 100

當然,如果不想使用 static 關鍵字,也可以將記錄 T0 中斷次數的變量 i 定義成全局變量
作者: LaoYuTou    時間: 2024-6-23 13:37
函數中變量為局部變量,離開該函數后該變量被釋放(不保存數據),static 靜態變量,離開該函數后數據保存,除了用static,用全局變量也可以,但要注意操作沖突問題,還是靜態好些,只在該函數中使用,其他地方用不了。
作者: yzwzfyz    時間: 2024-6-23 13:43
中斷函數中的i,每次函數執行只將 i+1,下次中斷i在上次的基礎上再將 i+1。所以要求函數退出時,i 不能改動。函數退出后,其使用的變量(i),不允許改變,你看如何定義它(i)好呢?

作者: xiaobendan001    時間: 2024-6-23 13:47
好像不能每次調用時初始化,因此應該需要STATIC標識吧。否則可能出現無法預料的值。
那個if(falg)行,直接led = flag;可以不。甚至不用flag了,直接在定時器中斷里面使用led可以不。
定時器中斷里面也不用else吧。改成if(i==100){led=!led;i=0;}是不是也可以。當然static還是要的,或者干脆把i定義成全局吧。
作者: samxon    時間: 2024-6-23 14:51
xiaobendan001 發表于 2024-6-23 13:47
好像不能每次調用時初始化,因此應該需要STATIC標識吧。否則可能出現無法預料的值。
那個if(falg)行,直接 ...

謝謝大家回復,解釋的很清楚。加static是最佳實踐。實際我沒有加static,i也不是全局,led燈也會閃爍。這又是什么原因呢。
作者: xiaobendan001    時間: 2024-6-23 16:51
samxon 發表于 2024-6-23 14:51
謝謝大家回復,解釋的很清楚。加static是最佳實踐。實際我沒有加static,i也不是全局,led燈也會閃爍。這 ...

變量比較少,I的地址沒有被分配別的變量吧。
作者: 名字不是重點    時間: 2024-6-24 09:15
你這個定時器初始化代碼呢?沒有初始化也能工作,奇了怪了~
作者: samxon    時間: 2024-6-24 12:25
xiaobendan001 發表于 2024-6-23 16:51
變量比較少,I的地址沒有被分配別的變量吧。

加了static后,確實更健壯些。沒有莫名其妙的問題了。
作者: rayin    時間: 2024-6-30 08:49
51單片機定時器的時長可以設置為500ms的, 500ms中斷一次就翻轉一次LED電壓. 就不需要i變量計數了.

中斷函數體內代碼越少越好, i變量和計數代碼完全可以放到main()函數內.
static 修飾變量, 就是函數體執行完畢, i的值依舊保存(i=99),下次函數被調用時就是99+1. 且其他函數是不能改變i的值.
作者: 3205563085    時間: 2024-7-2 00:09
是否使用 static 關鍵字取決于你的具體需求和代碼設計。如果你需要在中斷服務函數之間保持 i 的值,那么使用 static 是合適的。但如果你擔心重入性問題或者不希望在函數調用之間保持狀態,那么你可能需要考慮其他方法來實現LED的閃爍,例如使用全局變量或者在中斷服務之外維護狀態。




歡迎光臨 (http://www.denmoz.com/bbs/) Powered by Discuz! X3.1