C語言是面向過程的,而C++是面向?qū)ο蟮?/b>
C和C++的區(qū)別:
C是一個結(jié)構(gòu)化語言,它的重點在于算法和數(shù)據(jù)結(jié)構(gòu)绽榛。C程序的設(shè)計首要考慮的是如何通過一個過程,對輸入(或環(huán)境條件)進行運算處理得到輸出(或?qū)崿F(xiàn)過程(事務)控制)辜御。
C++,首要考慮的是如何構(gòu)造一個對象模型屈张,讓這個模型能夠契合與之對應的問題域擒权,這樣就可以通過獲取對象的狀態(tài)信息得到輸出或?qū)崿F(xiàn)過程(事務)控制。 所以C與C++的最大區(qū)別在于它們的用于解決問題的思想方法不一樣袜茧。之所以說C++比C更先進菜拓,是因為“ 設(shè)計這個概念已經(jīng)被融入到C++之中 ”。
C與C++的最大區(qū)別:在于它們的用于解決問題的思想方法不一樣笛厦。之所以說C++比C更先進纳鼎,是因為“ 設(shè)計這個概念已經(jīng)被融入到C++之中 ”,而就語言本身而言裳凸,在C中更多的是算法的概念贱鄙。那么是不是C就不重要了,錯姨谷!算法是程序設(shè)計的基礎(chǔ)逗宁,好的設(shè)計如果沒有好的算法,一樣不行梦湘。而且瞎颗,“C加上好的設(shè)計”也能寫出非常好的東西。
“別人休息捌议,我學習哼拔!”感謝大家今天又和小編一起學習來學習C語言嵌入式,希望大家一天天進步瓣颅,“吃得苦中苦倦逐,方為人上人”。
小編推薦一個學C語言/C++的學習裙【 六九九宫补,四七零檬姥,五九六 】曾我,無論你是大牛還是小白,是想轉(zhuǎn)行還是想入行都可以來了解一起進步一起學習健民!裙內(nèi)有開發(fā)工具抒巢,很多干貨和技術(shù)資料分享!
懸梁刺股
今天小編和大家一起來探討C語言嵌入式中最最最重要的一項內(nèi)容“中斷”秉犹!“中斷”這個概念要使用起來也挺簡單虐秦,可要是真的深入了解其實也比較復雜,為了不是大家困惑凤优,我們還是從簡單出發(fā),直接給大家介紹它的機制和使用方法蜈彼,最后在和大家稍微介紹一下原理筑辨!
大家知道MCU在執(zhí)行任務時,都是順序執(zhí)行的幸逆,執(zhí)行完任務1棍辕,再執(zhí)行任務2,之后一直到任務n还绘,再重頭開始執(zhí)行楚昭。但是有時我們需要執(zhí)行的事件是不確定性的。例如:你平常在干活時拍顷,你的電話突然響了抚太,這時候你肯定會放下手中的事情去接電話,電話鈴聲就是一個中斷信號昔案,它打斷了你當前正在做的事情尿贫,讓你去執(zhí)行接電話這個任務,待電話結(jié)束之后再回到原來的任務踏揣,從剛才停下來的地方繼續(xù)執(zhí)行庆亡。“電話”什么時候會響捞稿,這件事情什么時候發(fā)生我們無法確定又谋,但是只要電話響了我們就要去接電話,這就是中斷娱局!當然了假設(shè)MCU帶操作系統(tǒng)彰亥,我們可以使用多線程,采用輪詢的方式去實時查看“電話”是不是響了铃辖,但是這無疑加重了CPU的負擔剩愧,使用中斷就可以大大減少CPU的負擔,讓他能夠高效地去執(zhí)行其他任務娇斩。
所以嵌入式產(chǎn)品在設(shè)計功能時仁卷,針對不確定性的因素最好使用中斷來實現(xiàn)控制穴翩。但是中斷也有一定的限制,那就是中斷執(zhí)行函數(shù)時間不可過長锦积,我在使用ARM編程時芒帕,中斷函數(shù)中不可以添加延時函數(shù),否則系統(tǒng)就會崩潰丰介,中斷函數(shù)就是“要少要執(zhí)行快”背蟆,主要是因為中斷函數(shù)占用了CPU的資源,只能允許短時間的使用哮幢,否則他就找不到“原來的路”了带膀!所以大家“接電話的時間不可過長”,那么多長的時間才可以呢橙垢?老實說這個小編也沒有嘗試過垛叨,不過小編在日常編程中都是盡量使用較為簡潔的語言來實現(xiàn),常常也就是改變一個標志量柜某,例如函數(shù)中有“接電話”的函數(shù)功能嗽元,但是只有在“電話響了”這個標志位使能了才執(zhí)行,那么中斷函數(shù)就是去使能這個標志位喂击。使能一個標志位是很快的剂癌,將接電話的功能放到主函數(shù)中去執(zhí)行。
接下來就和大家一起學習STM32的外部中斷的使用方法翰绊。我使用的是STM32F4系列的芯片佩谷,它的外部IO口中斷線只有16根,但是幾乎每個管腳都可以配置為外部中斷辞做,那就說明一根中斷線對應多個引腳.具體對應情況如下圖:
中斷線對應IO口
我們在使用之前要確認引腳所對應的的中斷線琳要,這一步做錯了,那么中斷肯定不會響應了秤茅。所以我們需要將中斷線和IO口匹配起來稚补。
接下來讓我們來捋一捋邏輯關(guān)系。和之前一樣框喳,從外到內(nèi)從大到小依次分析:
1课幕、我們使用IO口外部中斷功能,當外部產(chǎn)生中斷信號那么就要執(zhí)行相應的中斷函數(shù)
2五垮、要使用中斷乍惊,那么使用的是哪個IO引腳?
3放仗、配置IO引腳润绎,并且將IO引腳與對應的中斷線連接起來
4、配置中斷參數(shù)
5、設(shè)置中斷管理器
6莉撇、完成中斷響應函數(shù)
按照這樣的流程呢蛤,我們就能明確自己的任務,和大家講過棍郎,條理理清了就很容易去寫其障,不要看到功能就埋頭去寫代碼,會寫代碼的不代表是優(yōu)秀的程序猿涂佃,會思考的才是一流的人才励翼。
那么我們按照上述流程來完成中斷的實現(xiàn):
第一步:配置引腳并且將引腳和中斷線匹配起來
GPIO_InitTypeDef GPIO_InitStructure;
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE);//使能GPIOA,GPIOE時鐘
RCC_APB2PeriphClockCmd(RCC_APB2Periph_SYSCFG, ENABLE);//使能SYSCFG中斷線時鐘
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; //KEY0對應引腳
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN;//普通輸入模式
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;//100M
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;//上拉
GPIO_Init(GPIOE, &GPIO_InitStructure);//初始化GPIOE2
··SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOE, EXTI_PinSource2);//PE2 連接到中斷線2
第二步:配置中斷參數(shù)
EXTI_InitTypeDef EXTI_InitStructure;//定義外部中斷
EXTI_InitStructure.EXTI_Line = EXTI_Line2;
EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;//中斷事件
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling; //下降沿觸發(fā)
EXTI_InitStructure.EXTI_LineCmd = ENABLE;//中斷線使能
EXTI_Init(&EXTI_InitStructure);//配置中斷
第三步:配置中斷管理器
NVIC_InitTypeDef NVIC_InitStructure;//定義中斷管理器
NVIC_InitStructure.NVIC_IRQChannel = EXTI2_IRQn;//外部中斷2
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x03;//搶占優(yōu)先級3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x02;//子優(yōu)先級2
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;//使能外部中斷通道
NVIC_Init(&NVIC_InitStructure);//配置
第四步:完成中斷響應函數(shù)
void EXTI2_IRQHandler(void)
{
delay_ms(10);//消抖 10ms時間延時
if(KEY2==0)
{
LED0=!LED0; //這里實現(xiàn)的是LED燈的反轉(zhuǎn),LED燈的實現(xiàn)函數(shù)這里就不寫了
}
EXTI_ClearITPendingBit(EXTI_Line2);//清除LINE2上的中斷標志位
}
看看是不是很簡單辜荠,只要完成上述幾個步驟一個外部中斷就完成了汽抚,之后想怎么使用這個功能就看大家自己的發(fā)揮了!
和大家一直強調(diào)的是伯病,配置函數(shù)(初始化函數(shù))基本就是配置幾個模塊殊橙,而且這些都是有例可循的,關(guān)鍵是大家如何去活學活用狱从,將這些功能科學合理地使用起來!人和人的差別就在于思維叠纹,你能想到季研,而別人想不到,你就比他強誉察,所以我們平時要多思考与涡,不要擔心異想天開,其實正是異想才使世界變得豐富多彩持偏!
最后在和大家看一下中斷的原理驼卖,如下圖:
小編推薦一個學C語言/C++的學習裙【 六九九,四七零鸿秆,五九六 】酌畜,無論你是大牛還是小白,是想轉(zhuǎn)行還是想入行都可以來了解一起進步一起學習卿叽!裙內(nèi)有開發(fā)工具桥胞,很多干貨和技術(shù)資料分享!
中斷執(zhí)行流程
1考婴、原程序正在執(zhí)行
2贩虾、產(chǎn)生了1號中斷
3、保護原程序現(xiàn)場
4沥阱、執(zhí)行中斷1
5缎罢、執(zhí)行中斷1時產(chǎn)生了中斷優(yōu)先級更高的中斷2
6、保護中斷1的現(xiàn)場
7、執(zhí)行中斷2
8策精、中斷2執(zhí)行結(jié)束之后舰始,回到中斷1的現(xiàn)場
9、繼續(xù)執(zhí)行中斷1
10蛮寂、中斷1執(zhí)行結(jié)束之后蔽午,回到原程序執(zhí)行現(xiàn)場
11、執(zhí)行原程序
所以中斷函數(shù)的流程還是較為復雜的酬蹋,幸好我們只要會使用中斷就可以了及老,更底層的函數(shù),如果大家想更深入了解可以自己去查查資料范抓!
小編推薦一個學C語言/C++的學習裙【 六九九骄恶,四七零,五九六 】匕垫,無論你是大牛還是小白僧鲁,是想轉(zhuǎn)行還是想入行都可以來了解一起進步一起學習!裙內(nèi)有開發(fā)工具象泵,很多干貨和技術(shù)資料分享寞秃!
好了謝謝大家今天的陪伴,如果大家喜歡話點個贊或評論兩句吧偶惠,小編需要大家的支持春寿。當然如果小編哪里寫錯了還希望大家批評指正,再次謝謝大家了忽孽。
這些是C/C++能做的
服務器開發(fā)工程師绑改、人工智能、云計算工程師兄一、信息安全(黑客反黑客)厘线、大數(shù)據(jù) 、數(shù)據(jù)平臺出革、嵌入式工程師造壮、流媒體服務器、數(shù)據(jù)控解骂束、圖像處理费薄、音頻視頻開發(fā)工程師、游戲服務器栖雾、分布式系統(tǒng)楞抡、游戲輔助等