久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1233|回復: 11
打印 上一主題 下一主題
收起左側

中斷函數內增加static關鍵字的問題

[復制鏈接]
跳轉到指定樓層
樓主
ID:705846 發表于 2024-6-23 11:11 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
代碼要求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;}
                }               
}


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:59202 發表于 2024-6-23 13:21 | 只看該作者
如果你這樣寫成局部變量就要加上static,因為局部變量退出函數后會被銷毀,再次進入函數后會先初始化為零。或者你干脆設置成全局變量
回復

使用道具 舉報

板凳
ID:866313 發表于 2024-6-23 13:22 | 只看該作者
在你的代碼中,必須使用static關鍵字來聲明局部變量 i 因為局部變量如果沒有使用 static 限定,默認就是 auto 類型的,那么每次 5ms 定時時間到,中斷服務函數就會被調用一次,每次調用,變量 i 的值又會重新歸為垃圾值,主要是需要理解函數調用時會給該函數分配一個棧空間,并不能保證每次分配的都是同一個,所以變量 i 的值在沒有使用 static 修飾它的存儲類型時就不會按照我們預想的從 i 一直自加到 100

當然,如果不想使用 static 關鍵字,也可以將記錄 T0 中斷次數的變量 i 定義成全局變量
回復

使用道具 舉報

地板
ID:1080935 發表于 2024-6-23 13:37 | 只看該作者
函數中變量為局部變量,離開該函數后該變量被釋放(不保存數據),static 靜態變量,離開該函數后數據保存,除了用static,用全局變量也可以,但要注意操作沖突問題,還是靜態好些,只在該函數中使用,其他地方用不了。
回復

使用道具 舉報

5#
ID:123289 發表于 2024-6-23 13:43 | 只看該作者
中斷函數中的i,每次函數執行只將 i+1,下次中斷i在上次的基礎上再將 i+1。所以要求函數退出時,i 不能改動。函數退出后,其使用的變量(i),不允許改變,你看如何定義它(i)好呢?
回復

使用道具 舉報

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

使用道具 舉報

7#
ID:705846 發表于 2024-6-23 14:51 來自手機 | 只看該作者
xiaobendan001 發表于 2024-6-23 13:47
好像不能每次調用時初始化,因此應該需要STATIC標識吧。否則可能出現無法預料的值。
那個if(falg)行,直接 ...

謝謝大家回復,解釋的很清楚。加static是最佳實踐。實際我沒有加static,i也不是全局,led燈也會閃爍。這又是什么原因呢。
回復

使用道具 舉報

8#
ID:1109793 發表于 2024-6-23 16:51 | 只看該作者
samxon 發表于 2024-6-23 14:51
謝謝大家回復,解釋的很清楚。加static是最佳實踐。實際我沒有加static,i也不是全局,led燈也會閃爍。這 ...

變量比較少,I的地址沒有被分配別的變量吧。
回復

使用道具 舉報

9#
ID:824490 發表于 2024-6-24 09:15 | 只看該作者
你這個定時器初始化代碼呢?沒有初始化也能工作,奇了怪了~
回復

使用道具 舉報

10#
ID:705846 發表于 2024-6-24 12:25 來自手機 | 只看該作者
xiaobendan001 發表于 2024-6-23 16:51
變量比較少,I的地址沒有被分配別的變量吧。

加了static后,確實更健壯些。沒有莫名其妙的問題了。
回復

使用道具 舉報

11#
ID:517951 發表于 2024-6-30 08:49 | 只看該作者
51單片機定時器的時長可以設置為500ms的, 500ms中斷一次就翻轉一次LED電壓. 就不需要i變量計數了.

中斷函數體內代碼越少越好, i變量和計數代碼完全可以放到main()函數內.
static 修飾變量, 就是函數體執行完畢, i的值依舊保存(i=99),下次函數被調用時就是99+1. 且其他函數是不能改變i的值.
回復

使用道具 舉報

12#
ID:1127816 發表于 2024-7-2 00:09 來自手機 | 只看該作者
是否使用 static 關鍵字取決于你的具體需求和代碼設計。如果你需要在中斷服務函數之間保持 i 的值,那么使用 static 是合適的。但如果你擔心重入性問題或者不希望在函數調用之間保持狀態,那么你可能需要考慮其他方法來實現LED的閃爍,例如使用全局變量或者在中斷服務之外維護狀態。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 男女羞羞视频大全 | 久久久久久久一级 | 九色porny自拍视频 | 欧美日韩亚洲系列 | 精品久久网 | 精品国产一区二区国模嫣然 | 日本午夜一区二区三区 | 久久国产精品99久久久久久丝袜 | 成人精品视频99在线观看免费 | av中文字幕网站 | а√中文在线8 | 一区二区三区四区在线 | 亚洲精品福利视频 | 亚洲最大的成人网 | 成人欧美一区二区三区1314 | 国产亚洲区 | 欧美成人激情 | 91久久看片| 91 在线| 99精品国产一区二区三区 | 国产九九九九 | 亚洲精品乱码久久久久久蜜桃91 | 一区影院| 免费在线观看一级毛片 | a免费视频 | 成年网站在线观看 | 日韩欧美视频在线 | 日韩欧美在线精品 | 久久久精品天堂 | 亚洲网站在线观看 | 日韩成人一区 | 免费av观看 | 午夜激情网 | 男女免费观看在线爽爽爽视频 | 成人免费在线观看 | 午夜天堂精品久久久久 | 久久99这里只有精品 | 久婷婷| 久久久精品网站 | 狠狠操网站 | www.久久久久久久久久久久 |