<meter id="pryje"><nav id="pryje"><delect id="pryje"></delect></nav></meter>
          <label id="pryje"></label>

          新聞中心

          EEPW首頁(yè) > 嵌入式系統(tǒng) > 牛人業(yè)話(huà) > 【單片機(jī)到嵌入式之路】序列之3:苦逼的CPU

          【單片機(jī)到嵌入式之路】序列之3:苦逼的CPU

          —— 【單片機(jī)到嵌入式之路】序列之三:苦逼的CPU
          作者: 時(shí)間:2015-05-14 來(lái)源:網(wǎng)絡(luò) 收藏

            軟件平臺(tái)

          本文引用地址:http://www.ex-cimer.com/article/274193.htm

            硬件平臺(tái):?jiǎn)纹瑱C(jī)

            編譯環(huán)境:keil

            二、苦逼的CPU

            【事故起因】:?jiǎn)纹瑱C(jī)是單核的,所以在做多線(xiàn)程問(wèn)題的時(shí)候,我們要考慮的太多。但是大部分人都會(huì)讓單片機(jī)一直工作,比如while死循環(huán),然后就抱怨單片機(jī)太簡(jiǎn)單了,只能點(diǎn)燈,其它的事情就不行了。

            【現(xiàn)場(chǎng)分析】:1.單片機(jī)是單核的;

            2.做多線(xiàn)程,方法兩種:a.上操作系統(tǒng),b.仿操作系統(tǒng);

            3.自己想釋放單片機(jī)的CPU,但是格局有限,就怪單片機(jī);

            4.要想馬兒跑,必須給馬兒吃草。要想單片機(jī)多工作,必須優(yōu)化代碼,多下功夫。

            【案例列舉】:?jiǎn)螣糸W爍

            void main(void)

            {

            LED_Init(); //LED初始化

            while(1)

            {

            LED = ON; //LED亮

            Delay_Ms(1000); //延時(shí)1s

            LED = OFF; //LED滅

            Delay_Ms(1000); //延時(shí)1s

            }

            }

            【案例分析】:?jiǎn)螣糸W爍分析

            聲明幾點(diǎn):1.如果你只用單片機(jī)作為單燈閃爍,那么單片機(jī)就完全可以;

            2.如果你不想玩那么高級(jí),那么單機(jī)這樣也是OK的;

            3.如果你想玩高級(jí)的,那么肯定不行。

            分析:咋一看,程序沒(méi)有什么問(wèn)題,但是暗藏玄機(jī)。

            1.程序被死循環(huán)卡死;

            2.死循環(huán)里面就是一個(gè)產(chǎn)生2s周期的頻率,那么燈就是2s閃爍一次;

            3.單片機(jī)就這樣被你“征服”了。但是你這是把單片機(jī)浪費(fèi)了。

            這是單片機(jī)CPU的苦啊,他是沒(méi)有口啊,有口要罵人的哦!O(∩_∩)O哈哈~

            三、單片機(jī)CPU的苦衷——請(qǐng)釋放CPU

            1.硬件電路分析

            

           

            用上面的電路來(lái)做分析,當(dāng)P1口為低電平的時(shí)候,LED燈才亮,高電平則滅。

            1.軟件分析

            由硬件可以知道,我們可以通過(guò)宏定義來(lái)對(duì)接口進(jìn)行簡(jiǎn)單的定義

            #define LED_Light P1 //LED燈端口

            #define LED_ON() LED_Light = 0x00 //LED燈亮

            #define LED_OFF() LED_Light = 0xFF //LED燈滅

            現(xiàn)在端口也定義好了,下面單片機(jī)要哭訴了。

            3.你誤解了單片機(jī)

            單片機(jī)其實(shí)可以干很多活,結(jié)果你誤解了。

            為了讓單片機(jī)不白忙活我們可以通過(guò)兩種方式來(lái)實(shí)現(xiàn)LED燈閃爍:a.定時(shí)器中斷,b.計(jì)時(shí)+標(biāo)志位。

            A.定時(shí)器中斷

            定時(shí)器中斷大家都知道,這里就不說(shuō)了,就是產(chǎn)生xms的中斷就可以了。

            B.計(jì)時(shí)+標(biāo)志位

            計(jì)時(shí)+標(biāo)志位太有用了,這一下幫單片機(jī)洗清沉冤了。我們只要產(chǎn)生一個(gè)對(duì)200ms的時(shí)間,然后對(duì)該時(shí)間進(jìn)行計(jì)數(shù)到了5次,然后就清0該計(jì)數(shù)值,同時(shí)反轉(zhuǎn)LED燈的狀態(tài)即可。

            代碼部分:

            unsigned int LedTimeCount = 0 ; //LED計(jì)數(shù)器

            unsigned char LedStatus = 0 ; //LED狀態(tài)標(biāo)志, 0表示亮,1表示熄滅

            /***************************************

            * 函數(shù)描述:LED燈線(xiàn)程處理函數(shù)

            * 輸入?yún)?shù):No

            * 返 回 值:No

            * 說(shuō) 明:通過(guò)標(biāo)志位來(lái)實(shí)現(xiàn)LED的反轉(zhuǎn)

            * 修改記錄:

            ****************************************/

            void LEDThread_Process(void)

            {

            if(0 == LedStatus) //如果LED的狀態(tài)為0,則點(diǎn)亮LED

            {

            LED_ON() ; //點(diǎn)亮LED燈

            }

            else //否則熄滅LED

            {

            LED_OFF() ;

            }

            }

            /***************************************

            * 函數(shù)描述:計(jì)時(shí)和標(biāo)志位函數(shù)

            * 輸入?yún)?shù):No

            * 返 回 值:No

            * 說(shuō) 明:狀態(tài)標(biāo)志位改變

            * 修改記錄:

            ****************************************/

            void LEDStatus_Change(void)

            {

            if(Sys_200MS) //系統(tǒng)200ms時(shí)標(biāo)到

            {

            Sys_200MS = 0 ;

            LedTimeCount ++ ; //LED計(jì)數(shù)器加1

            if(LedTimeCount >= 5) //計(jì)數(shù)達(dá)到5,即1s到了,改變LED的狀態(tài)。

            {

            LedTimeCount = 0 ;

            LedStatus = ! LedStatus;

            }

            }

            }

            /***************************************

            * 函數(shù)描述:主函數(shù)

            * 輸入?yún)?shù):No

            * 返 回 值:No

            * 說(shuō) 明:

            * 修改記錄:

            ****************************************/

            void main(void)

            {

            while(1)

            {

            LEDThread_Process() ;

            LEDStatus_Change() ;

            }

            }

            通過(guò)上面的程序就可以釋放單片機(jī)的CPU。因?yàn)長(zhǎng)ED燈亮滅是有標(biāo)志位(LedStatus)來(lái)決定,而標(biāo)志位由計(jì)數(shù)器(LedTimeCount)來(lái)決定,兩個(gè)函數(shù)都沒(méi)有綁架單片機(jī)的CPU,所以單片機(jī)的CPU是自由的。終于洗冤了。O(∩_∩)O哈哈~

            到此結(jié)束!!! 謝謝閱讀,歡迎拍磚!!!!

          linux操作系統(tǒng)文章專(zhuān)題:linux操作系統(tǒng)詳解(linux不再難懂)

          單片機(jī)相關(guān)文章:單片機(jī)教程


          單片機(jī)相關(guān)文章:單片機(jī)視頻教程


          單片機(jī)相關(guān)文章:單片機(jī)工作原理


          塵埃粒子計(jì)數(shù)器相關(guān)文章:塵埃粒子計(jì)數(shù)器原理
          全息投影相關(guān)文章:全息投影原理


          關(guān)鍵詞: 嵌入式 CPU

          評(píng)論


          相關(guān)推薦

          技術(shù)專(zhuān)區(qū)

          關(guān)閉
          看屁屁www成人影院,亚洲人妻成人图片,亚洲精品成人午夜在线,日韩在线 欧美成人 (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })();