新聞中心

        EEPW首頁 > 嵌入式系統 > 牛人業話 > 【單片機到嵌入式之路】序列之3:苦逼的CPU

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

        —— 【單片機到嵌入式之路】序列之三:苦逼的CPU
        作者: 時間:2015-05-14 來源:網絡 收藏

          軟件平臺

        本文引用地址:http://www.104case.com/article/274193.htm

          硬件平臺:單片機

          編譯環境:keil

          二、苦逼的CPU

          【事故起因】:單片機是單核的,所以在做多線程問題的時候,我們要考慮的太多。但是大部分人都會讓單片機一直工作,比如while死循環,然后就抱怨單片機太簡單了,只能點燈,其它的事情就不行了。

          【現場分析】:1.單片機是單核的;

          2.做多線程,方法兩種:a.上操作系統,b.仿操作系統;

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

          4.要想馬兒跑,必須給馬兒吃草。要想單片機多工作,必須優化代碼,多下功夫。

          【案例列舉】:單燈閃爍

          void main(void)

          {

          LED_Init(); //LED初始化

          while(1)

          {

          LED = ON; //LED亮

          Delay_Ms(1000); //延時1s

          LED = OFF; //LED滅

          Delay_Ms(1000); //延時1s

          }

          }

          【案例分析】:單燈閃爍分析

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

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

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

          分析:咋一看,程序沒有什么問題,但是暗藏玄機。

          1.程序被死循環卡死;

          2.死循環里面就是一個產生2s周期的頻率,那么燈就是2s閃爍一次;

          3.單片機就這樣被你“征服”了。但是你這是把單片機浪費了。

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

          三、單片機CPU的苦衷——請釋放CPU

          1.硬件電路分析

          

         

          用上面的電路來做分析,當P1口為低電平的時候,LED燈才亮,高電平則滅。

          1.軟件分析

          由硬件可以知道,我們可以通過宏定義來對接口進行簡單的定義

          #define LED_Light P1 //LED燈端口

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

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

          現在端口也定義好了,下面單片機要哭訴了。

          3.你誤解了單片機

          單片機其實可以干很多活,結果你誤解了。

          為了讓單片機不白忙活我們可以通過兩種方式來實現LED燈閃爍:a.定時器中斷,b.計時+標志位。

          A.定時器中斷

          定時器中斷大家都知道,這里就不說了,就是產生xms的中斷就可以了。

          B.計時+標志位

          計時+標志位太有用了,這一下幫單片機洗清沉冤了。我們只要產生一個對200ms的時間,然后對該時間進行計數到了5次,然后就清0該計數值,同時反轉LED燈的狀態即可。

          代碼部分:

          unsigned int LedTimeCount = 0 ; //LED計數器

          unsigned char LedStatus = 0 ; //LED狀態標志, 0表示亮,1表示熄滅

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

          * 函數描述:LED燈線程處理函數

          * 輸入參數:No

          * 返 回 值:No

          * 說 明:通過標志位來實現LED的反轉

          * 修改記錄:

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

          void LEDThread_Process(void)

          {

          if(0 == LedStatus) //如果LED的狀態為0,則點亮LED

          {

          LED_ON() ; //點亮LED燈

          }

          else //否則熄滅LED

          {

          LED_OFF() ;

          }

          }

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

          * 函數描述:計時和標志位函數

          * 輸入參數:No

          * 返 回 值:No

          * 說 明:狀態標志位改變

          * 修改記錄:

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

          void LEDStatus_Change(void)

          {

          if(Sys_200MS) //系統200ms時標到

          {

          Sys_200MS = 0 ;

          LedTimeCount ++ ; //LED計數器加1

          if(LedTimeCount >= 5) //計數達到5,即1s到了,改變LED的狀態。

          {

          LedTimeCount = 0 ;

          LedStatus = ! LedStatus;

          }

          }

          }

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

          * 函數描述:主函數

          * 輸入參數:No

          * 返 回 值:No

          * 說 明:

          * 修改記錄:

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

          void main(void)

          {

          while(1)

          {

          LEDThread_Process() ;

          LEDStatus_Change() ;

          }

          }

          通過上面的程序就可以釋放單片機的CPU。因為LED燈亮滅是有標志位(LedStatus)來決定,而標志位由計數器(LedTimeCount)來決定,兩個函數都沒有綁架單片機的CPU,所以單片機的CPU是自由的。終于洗冤了。O(∩_∩)O哈哈~

          到此結束!!! 謝謝閱讀,歡迎拍磚!!!!

        linux操作系統文章專題:linux操作系統詳解(linux不再難懂)

        單片機相關文章:單片機教程


        單片機相關文章:單片機視頻教程


        單片機相關文章:單片機工作原理


        塵埃粒子計數器相關文章:塵埃粒子計數器原理
        全息投影相關文章:全息投影原理


        關鍵詞: 嵌入式 CPU

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 湟中县| 易门县| 东光县| 高邮市| 汽车| 河源市| 四平市| 柘荣县| 邯郸市| 平定县| 含山县| 娄底市| 西平县| 江门市| 桓仁| 定边县| 紫金县| 原阳县| 建瓯市| 稷山县| 靖州| 昭苏县| 筠连县| 山东省| 仙桃市| 凤城市| 武功县| 泰和县| 古交市| 团风县| 南投市| 庆云县| 华宁县| 宝山区| 东莞市| 静宁县| 健康| 河曲县| 同江市| 峡江县| 乐清市|