娇小w搡bbbb搡bbb,《第一次の人妻》,中国成熟妇女毛茸茸,边啃奶头边躁狠狠躁视频免费观看

歷史上的今天

今天是:2024年12月18日(星期三)

正在發生

2018年12月18日 | STM32中,關于中斷函數調用全局變量的問題

發布者:梅花居士 來源: eefocus關鍵字:STM32  中斷函數  全局變量 手機看文章 掃描二維碼
隨時隨地手機看文章

首先是問題的描述:硬件單片機型號,STM32F103VET6,IDE:keil 5。想通過它實現的一個功能是,通過兩個按鍵控制一個RGB燈的閃爍開始和停止。兩個按鍵通過外部中斷上升沿檢測,貼一下最開始的代碼。


  void KEY1_IRQHandler(void)

{

  //確保是否產生了EXTI Line中斷

    if(EXTI_GetITStatus(KEY1_INT_EXTI_LINE) != RESET) 

    {        

        run_flag=0x01;

        EXTI_ClearITPendingBit(KEY1_INT_EXTI_LINE);     

    }  

}


void KEY2_IRQHandler(void)

{

  //確保是否產生了EXTI Line中斷

    if(EXTI_GetITStatus(KEY2_INT_EXTI_LINE) != RESET) 

    {

        run_flag=0;

        EXTI_ClearITPendingBit(KEY2_INT_EXTI_LINE);     

    }  

}


定義了一個全局變量run_flag,當有按鍵按下的時候對run_flag分別賦予不同的值,當然有人會說這是何必多此一舉直接調用中斷標志不就行了,這也是一個解決的辦法。但是解決問題的方式有很多種,嘗試用不同的方法解決問題這本身就是一件很有意思的事情。本身從邏輯上來講沒有問題,但是實際燒錄程序到單片機之后,出現的情況是按鍵不起作用,準確來講是有一個按鍵不起作用。我一開始懷疑是中斷沒有起作用,仔細檢查了一下,發現并沒錯誤,在中斷函數中調用LED()開led函數又是沒有問題的,最后我將問題定位到了run_flag上。這個變量在多個函數中都會用到,所以定義了一個全局變量,經過查找資料,找到這樣一條表述:“中斷中使用的全局變量,在其他函數內要使用時一定要進入臨界區(也就是關閉中斷)。如果是使用操作系統的話,則在所有使用到與其他任務共享的全局變量的地方都要進臨界區”。


為此增加了如下一段代碼


EXTI_InitTypeDef EXTI_InitStructure;

  EXTI_InitStructure.EXTI_LineCmd = DISABLE;

  EXTI_Init(&EXTI_InitStructure);

    run_flag1=run_flag;

    EXTI_InitStructure.EXTI_LineCmd = ENABLE;

  EXTI_Init(&EXTI_InitStructure);


在讀取run_flag的時候,先關畢中斷,之后再開中斷。下載之后成功解決了這個問題。


總結如下(轉載)很有用:


1、盡量用局部變量替代全局變量。如果用局部變量能實現功能,最好用局部變量。


2、在函數僅僅只是要用到某個全局變量,而無需改動時,就將全局變量通過形參傳遞進來,變成局部變量使用。并在定義時使用const。這是避免全局變量在函數中被意外的改動。如在判斷語句中將'=='誤寫成'='。這時首先因為在函數內的是局部變量所以即使出錯也不會影響全局變量和其他函數或模塊。其次因為定義的是const類型,當發生意外改動時,編譯器會發出錯誤信息或警報,這也就是讓你的程序自動糾錯。這種情況應發生在對模塊內的全局變量的調用,而對于其他模塊的全局變量應通過模塊接口調用。


3、中斷中使用的全局變量,在其他函數內要使用時一定要進入臨界區(也就是關閉中斷)。如果是使用操作系統的話,則在所有使用到與其他任務共享的全局變量的地方都要進臨界區。


4、對于僅在某個函數內使用的全局變量就用靜態局部變量替代。


5、應盡量避免直接操作或調用其他模塊的變量。需要調用或修改其他模塊的變量時,可以通過那個模塊提供的操作接口函數進行操作。比如某個模塊有一個全局的計數值Count,則可以提供函數接口:GetCount()、SetCount()或ReloadCount()。這樣一來,其他模塊要調用Count時就通過這些指定的函數接口。這樣可以降低模塊間的耦合程度。另外如果嫌接口用函數實現過于復雜或是影響速度,則可以用帶參數的宏定義實現。如:

#define GetCount()  (Count)

#define SetCount(num) (Count=(num)) 

#define ReloadCount() (Count=0)


這樣,使用時與函數調用一樣,但沒有函數調用時的開銷。另外,功能變化是可以將宏定義改成函數,而無需改動調用語句。


6、每個模塊內的全局變量應該用靜態全局變量,一來其他模塊無法直接調用這些變量;二來命名空間不會重疊,在實現一個模塊時無需考慮某個全局變量的名稱是否已被其他模塊使用。如在模塊A中定義靜態變量 static unsigned char Count;在B模塊中,仍可以定義靜態變量 static unsigned char Count;這兩個Count不會相互影響,但是如果定義的是全局變量則不然。


7、模塊間的耦合性就是指當修改其中某個模塊時會影起其他模塊運行結果發生不可預料的變化。如果模塊間是通過直接調用對方內部的全局變量來實現交互,則兩個模塊間的耦合性將會變得復雜而且難以控制。而模塊間的交互通過一個統一的接口函數來實現,使得模塊都無需知道對方模塊內部的具體實現(這也就是面向對象里面的封裝)。當某個模塊內的實現發生改寫或升級時,只要確保模塊接口不變即可。這就大大降低兩模塊間的耦合。在規劃設計模塊時就應認真考慮好模塊的接口,以及與其他模塊的調用關系。所以要記住編程原則:針對接口編程,而不是針對實現。


8、函數的功能要單一,也就是高內聚性。如果某個函數需要調用很多個全局變量,則說明函數的內聚性不夠高,可以考慮將函數拆分成幾個功能更單一的函數。


9、要記住編程是一種平衡的藝術。沒有程序可以做到十全十美,省空間、速度快、易擴展、易維護、低耦合、功能強大這些是不可能同時兼得的。如要提高程序的可維護性,就必須在性能方面(空間和速度)做出一點犧牲。至于如何平衡,就要看項目的具體要求了。

這是很有用的,有很多東西也許理解不是很深刻,待更。


關鍵字:STM32  中斷函數  全局變量 引用地址:STM32中,關于中斷函數調用全局變量的問題

上一篇:STM32使用freertos時在中斷中調用系統函數的注意點
下一篇:ARM中斷體系結構

推薦閱讀

除了鋰離子電池,還有許多可望改寫電池產業格局的其他新技術陸續出現,最終將有助于延長電動車的續航里程…為了在主導電動車(EV)市場的競賽中脫穎而出,電池技術以及先進的充電基礎設施就和考慮價格、軟件升級以及汽車外型一樣重要。這就是為什么中國企業紛紛砸大錢投資電池技術,期望迎頭趕上甚至超越特斯拉(Tesla)目前領先業界的電池技術與制造能力。幾...
機器人身上開始出現越來越多的仿人關節,這在讓它們更靈活的同時,也意味著要鉚更多的螺絲釘。 這給維護人員增加了不少工作量,必須要花費大量時間去檢查和維修,給機器人擰螺絲。 東京大學的研究人員 Takayuki Murooka、Kei Oka 和 Masayuki Inaba 意識到了這個問題,經過一系列研究之后,他們教會了機器人自己擰緊螺絲,而且,機器人還順便學...
OPPO官網上架了一新機A53,4+128GB版本售價為1299元,現已開啟預約,該機將于12月21日正式開售,6+128GB版本將在12月25日線上線下同步發售。據悉,OPPO A53采用6.5英寸LCD挖孔屏,分辨率為2400x1080,支持90Hz高刷,機身重量175g,厚度為7.9mm,支持側邊指紋解鎖,提供湖水綠、秘夜黑、流光紫三種配色可選。OPPO A53后置為三攝矩陣模組,分別為1600萬像...

史海拾趣

問答坊 | AI 解惑

AB與西門子PLC的區別

西門子與AB最主要的差別在于AB所使用的網絡類型都是開放的網絡,可以與其他公司的產品做到很好的兼容,AB控制層網絡采用ControlNet網絡,該網絡是一種高性能的工業局域網,具有開放性、高效率、多功能、確定性和可重復性、靈活性等特點,擴展性極強 ...…

查看全部問答∨

ADF4107

好用,的PLL…

查看全部問答∨

工業用超聲波流量計/熱量表線路圖

這是最新的大連海峰超聲波線路圖,供同行參考…

查看全部問答∨

淺析SIP商業交易收費模式(1)

在SOC 的設計趨勢下,可重復使用的SIP 更是快速發展一顆復雜芯片的關鍵。運用SIP,可以加快IC 產品上市的速度,縮短IC 制程技術進步與設計技術進步之間的差距,使IC 設計公司將資源投入核心專長領域,進一步的進行設計上的專業分工。現在IP交易越來 ...…

查看全部問答∨

有人用過Hercules 做DRC和LVS么,急需援助啊。。。

用Hercules工具,版圖抽取后,topcell.LAYOUT_ERRORS文件中。 ERRORS: ERR_TEXT_SHORT, ERR_TEXT_UNUSED, ERR_TEXT_OPEN_RENAME, ERR_TEXT_SHORT ERC reportwell pick-up layer ptd texted with power nets. SELECT ptap TEXTED WITH " ...…

查看全部問答∨

使用s3c2440a芯片的開發板,需要帶一個遠程攝像頭(距離15m->40m).如何實現

1. 板子本身有一個cmos攝像頭的接口,帶驅動,目前可以使用,但是距離短。 2. 板子具有usb接口,本想用usb攝像頭,但發現usb攝像頭的距離也不是很遠,加了延長線在pc上測試發現距離最多10來米。3. 板子有網絡通訊口,后來發現ip網絡攝像頭,距離能 ...…

查看全部問答∨

vxWorks 創建硬盤,使用dosFs文件的方法—求教

因為最近在編寫一個網絡文件傳輸方面的應用程序,該應用程序需要實現windows   XP和vxWorks之間的文件傳輸。因為在這方面我是一個初學者,所以遇到不少的問題,問題如下   ,希望大家可以詳細的幫我解答一下。     ...…

查看全部問答∨

STM32一上電能就能進入低功耗模式嗎?

                                 我想問一下,STM32一上電能就能進入低功耗模式嗎?假設我只有1mA,3.3V的電源,是否STM32根本就沒辦法啟動…

查看全部問答∨

help

bool TXcmplt = false; 這條語句為什么不能用呢?下面是提示信息。 e:\\luhero\\msp430\\hart.h (32) : Warning[14]: Type specifier missing; assumed "int" e:\\luhero\\msp430\\hart.h (32) : Error[32]: Invalid declaration syntax, un ...…

查看全部問答∨

為什么修改icf文件后,UCOSII就跑飛了?

默認是//// Define a region for the on-chip flash.//define region FLASH = mem:[from 0x00000000 to 0x0003ffff];當我把上述區域修改成 mem:[from 0x00001000 to 0x0003ffff]后,程序下載后即飛掉。這里面是什么原因造成的呢,需要修改os的 ...…

查看全部問答∨
小廣播
設計資源 培訓 開發板 精華推薦

最新單片機文章
何立民專欄 單片機及嵌入式寶典

北京航空航天大學教授,20余年來致力于單片機與嵌入式系統推廣工作。

 
EEWorld訂閱號

 
EEWorld服務號

 
汽車開發圈

 
機器人開發圈

電子工程世界版權所有 京ICP證060456號 京ICP備10001474號-1 電信業務審批[2006]字第258號函 京公網安備 11010802033920號 Copyright ? 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
主站蜘蛛池模板: 拜城县| 阿克陶县| 渝北区| 溧水县| 开江县| 富宁县| 漯河市| 嘉兴市| 高淳县| 景德镇市| 思南县| 深州市| 海淀区| 仁怀市| 多伦县| 南昌市| 丹棱县| 秦安县| 兴安盟| 怀柔区| 托克逊县| 左云县| 鄂托克前旗| 桃源县| 喀什市| 砚山县| 开平市| 阳东县| 红原县| 开阳县| 新密市| 东阿县| 樟树市| 新建县| 高尔夫| 疏勒县| 东源县| 武穴市| 宜城市| 义乌市| 吉木乃县|