首先是問題的描述:硬件單片機型號,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使用freertos時在中斷中調用系統函數的注意點
下一篇:ARM中斷體系結構
推薦閱讀
史海拾趣
DMEL Inc公司成立于XX世紀初,最初由幾位熱衷于電子技術的工程師創立。他們憑借對半導體技術的深入研究,開發出了幾款具有創新性的產品,這些產品在市場上獲得了初步的成功。公司注重技術創新,不斷投入研發資金,建立起了一支高效的研發團隊。隨著技術的不斷積累,DMEL Inc逐漸在電子行業中嶄露頭角。
Burr-Brown在音頻領域取得了顯著的成就。1957年,公司推出的Model 130成為世界上第一個固態運算放大器(op amp),這一技術在現代高級音頻系統中仍占據核心地位。1982年,公司發布的16位單片數模轉換器(DAC)更是徹底改變了音樂的播放和發行方式,使得音樂可以以高保真度進行復制,并方便地隨身攜帶。Burr-Brown的技術成為優質音頻的代名詞,贏得了廣泛的行業認可。
銀河微電自成立之初,便專注于半導體分立器件的研發與生產。面對國內外市場的激烈競爭,公司堅持自主創新,不斷投入研發力量,終于在某關鍵技術上取得了重大突破。這一技術突破不僅提高了產品的性能,還降低了生產成本,使得銀河微電的產品在市場上更具競爭力。憑借這一技術優勢,銀河微電逐漸在行業中樹立起了自己的地位。
背景:為了進一步擴大市場份額和提高品牌影響力,振華新云積極開展市場拓展和國際合作。
內容:公司積極參加國內外電子展會和論壇等活動,加強與國內外客戶的溝通和交流。同時,積極尋求與國際先進企業的合作機會,共同開展技術研發和市場推廣等活動。
成果:通過市場拓展和國際合作,振華新云的產品逐漸走向世界舞臺,贏得了廣大客戶的信賴和好評。同時,公司也積累了寶貴的國際化經驗和資源,為未來的國際化發展奠定了堅實基礎。
BREL International Components公司深知合作共贏的重要性。公司積極與上下游企業建立緊密的合作關系,共同開發新產品、拓展新市場。通過與供應商的深度合作,BREL確保了原材料的穩定供應和成本控制;通過與客戶的緊密溝通,BREL及時了解市場需求,調整產品策略。此外,BREL還積極參與行業交流和合作,與同行共同推動電子行業的發展。
為了滿足市場需求和擴大生產規模,千志電子不斷加大投資力度。2014年,千志電子在湖北投資建設了千志電子科技(湖北)有限公司項目,總投資額達到5000萬元人民幣。該項目占地面積50畝,主要生產電阻等電子產品。預計項目建成后可實現年產值4000萬元,年創利稅350萬元,安置勞動力120人左右。這一項目的投資建設不僅使千志電子的生產規模得到了進一步擴大,還為其未來的發展奠定了堅實基礎。
西門子與AB最主要的差別在于AB所使用的網絡類型都是開放的網絡,可以與其他公司的產品做到很好的兼容,AB控制層網絡采用ControlNet網絡,該網絡是一種高性能的工業局域網,具有開放性、高效率、多功能、確定性和可重復性、靈活性等特點,擴展性極強 ...… 查看全部問答∨ |
|
在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網絡攝像頭,距離能 ...… 查看全部問答∨ |
因為最近在編寫一個網絡文件傳輸方面的應用程序,該應用程序需要實現windows XP和vxWorks之間的文件傳輸。因為在這方面我是一個初學者,所以遇到不少的問題,問題如下 ,希望大家可以詳細的幫我解答一下。 ...… 查看全部問答∨ |
|
默認是//// Define a region for the on-chip flash.//define region FLASH = mem:[from 0x00000000 to 0x0003ffff];當我把上述區域修改成 mem:[from 0x00001000 to 0x0003ffff]后,程序下載后即飛掉。這里面是什么原因造成的呢,需要修改os的 ...… 查看全部問答∨ |
設計資源 培訓 開發板 精華推薦
- Mouser 新用戶大禮包再次來襲:曬單5折返E金幣!
- 【EEWORLD第二十九屆】2011年08月社區明星人物揭曉!
- 收藏英飛凌天貓店 或 下單都有禮、打折滿減同享!
- 【已結束】 Qorvo、村田、NI直播【UWB最新技術、方案、市場、應用解析】(13:30開始入場)
- 羅徹斯特有獎調查:元器件日期代碼限制是否仍然適用?70+份獎品先到先得!
- TI 有獎直播 | 毫米波雷達在樓宇自動化的應用
- MPS 新年福利|注冊即有機會贏取京東卡
- 電源技術專輯第2期:從零開始 DIY 雙向高效 DC-DC!
- 下載有禮:2017年泰克亞太專家大講堂第一期:大數據與云存儲環境下的高速總線技術演進
- 有獎直播|ADI在可穿戴產品中的生命體征監測解決方案