久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2196|回復: 10
打印 上一主題 下一主題
收起左側

忽略系統的前提下,單片機新手如何提高程序的執行效率

[復制鏈接]
跳轉到指定樓層
樓主
ID:136119 發表于 2022-8-5 09:11 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
在忽略系統的前提下,如何使自己寫到代碼更美觀,運行效率更高。是一個初級開發人員的追求。
追求代碼美觀和代碼可讀性,我們要學會善于用結構體和指針,結構體能有效的幫助我們表達復雜的變量關系和復雜的變量定義,當你習慣用time1、time2、time3……定義變量名的時候,推薦你可以思考一下用結構體,是否滿足你的需求。
本次話題主要講的是提高代碼的執行效率,那么如何才能使代碼執行效率更高了,最簡單粗暴的方式就是減少延時函數的調用。減少函數調用后,相對程序執行效率就會高一些。
那么還有其它更好的方式嗎?當然有了,比如有段代碼需0.1s執行一次,我們就讓0.1秒執行一次,如果代碼需要0.5秒執行一次就讓他0.5秒執行一次,這樣單片機就能更好的執行其它代碼了,如果代碼按照你設想時間運行,并且你們沒有使用延時函數。你的代碼執行效率會提升很多。

話不多說直接上思路和代碼。首先跟著我來了解一個結構體。
         typedef struct
         {
         unsigned short int  time; // 定義一個時間變量,它用來判斷何時進入函數,目的是減少代延時函數調用(8位單片機只能,定義8位數據,16或32數據會因中斷打擾導致數據賦值出錯。)
         unsigned char  label;  // label用來記代碼執行到那個階段了,
unsigned char  value ;  // 用來記錄,你想要的值,或者其它什么概念的東西。當然你可以刪除
         } AP_APP;         

定義一個指示燈結構體變量,
AP_APP  AP_LED ; 我想他看上去很簡單對吧。
在while(1)循環體中定義指示燈函數
         VoidFun_Led(void)
{        
if(AP_LED.time==0 )
{
AP_LED.time  =  250 ; // AP_LED.time標記什么時間進入當函數,類似延時函數,中斷中需要對--AP_LED.time處理。         
IO_LED  =  ~ LO_LED;//這個只是端口取反后再次輸出。
}
}
這就是一個指示燈函數,看上去是不是比較簡單。
我們再來假設一個中斷,是每2ms進入一次,中斷里面我們這樣寫
Void 中斷服務函數(void) //每2ms進入一次
{
if(AP_LED.time != 0xFFFF )  // AP_LED.time 不等0xFFFF。我們進入函數
{                                           //等于0xFFFF 你可以設想先一下出現什么情況。
                   if(AP_LED.time)  --AP_LED.time; // 我們每過2ms,減去一個值,一直到變量
//等于0。等于0后再進入Fun_Led內部函數執相關代碼
}
}
當前的程序沒有使用延時函數,能很好的控制LED的亮滅時間,提高我們代碼執行效率?瓷先ヒ脖容^簡單。
我們很明確的知道程序不使用延時函數,我們的其他代碼執行效率就會提高,

我起初定義了一個結構體,其中有個AP_LED. label,AP_LED. label我在這里表示程序運行到哪里了,或者簡單說狀態機。
還是led控制,例如我想控制LED亮時間和滅的時間不同,我們可以調整程序如下
         VoidFun_Led(void)
{        
if(AP_LED.time==0 )
{
switch (AP_LED. Label)
{
                  Case 1 :
                            AP_LED.Label =2;
IO_LED = 1;
AP_LED.time  =  50 ; // 進入下一次LED狀態的間隔時間
                            break;
                  case 2 :
                            AP_LED.Label =3;
IO_LED = 0;
AP_LED.time  =  100 ; //進入下一次LED狀態的間隔時間
                            break;
                  Case 3:
                            AP_LED.Label =4;
IO_LED = 1;
AP_LED.time  =  150 ; // 進入下一次LED狀態的間隔時間
                            break;
                  case 4:
                            AP_LED.Label =1;
IO_LED = 0;
AP_LED.time  =  200 ; //進入下一次LED狀態的間隔時間
                            break;
                  default:    //剛開機或者其它情況進入當前信息
                            AP_LED.Label =1;
AP_LED.time  =  250 ; // AP_LED.time標記什么時間進入當函數。
                           break;
}
}
}
當我們遇到一個復雜的代碼,并且每個動作執行時間不定長度的時候,當前的結構形式更為簡單一些,更方便我們理解。
關于AP_LED. Value我也很少用,但是不表示我不用,當上一個代碼中在嵌套一個switch (AP_LED. Value),或者在其它函數中獲取,讀取或者標記一些狀態,傳遞一些消息都會用上。這個我就不多說了,你喜歡就看看移植一下,理解了就是最適合你的。

如果有人喜歡 我下次講解我的按鍵代碼

http://www.zg4o1577.cn/bbs/dpj-215832-1.html  5樓,這也是一個不錯的代碼,最起碼我是這樣理解的。

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:883242 發表于 2022-8-5 22:27 | 只看該作者
switch/case那部分寫的太啰嗦了,簡單的查表就行。樓主的水平還達不到傳道受業解惑的程度。
回復

使用道具 舉報

板凳
ID:824490 發表于 2022-8-6 17:41 | 只看該作者
switch (AP_LED. Label)這段這么有規律,可以優化掉!
回復

使用道具 舉報

地板
ID:824490 發表于 2022-8-6 17:43 | 只看該作者
續上貼:
IO_LED = AP_LED.Label % 2;
AP_LED.time =  AP_LED.Label *50;
AP_LED.Label ++;
AP_LED.Label = AP_LED.Label % 5;
回復

使用道具 舉報

5#
ID:401564 發表于 2022-8-7 14:55 | 只看該作者
我一直不明白,為什么很多人都要提高單片機的運行效率?有什么意義呢?
這總得看場合的吧,如果一個程序要做的東西并不多,提高效率的意義何在?
這一堆代碼,讓我感覺原本應該可以很簡單的東西,看起來好恐怖
回復

使用道具 舉報

6#
ID:123289 發表于 2022-8-7 22:35 | 只看該作者
學會匯編語言,就知道如何做效率高了。
回復

使用道具 舉報

7#
ID:420836 發表于 2022-8-7 23:59 | 只看該作者
對于一個單片機程序員的初學者來說,最重要的是讓每一行代碼都正確,因為對于一個沒有經驗的程序員來說,調試代碼是一個挑戰。
回復

使用道具 舉報

8#
ID:136119 發表于 2022-8-8 08:28 | 只看該作者
怎么說了,你們都是對的,只是當前你們沒有遇到,對應代碼需求, 理解就行
回復

使用道具 舉報

9#
ID:1034262 發表于 2022-8-8 17:43 | 只看該作者
程序架構要合理,程序中不要用軟件延時。
回復

使用道具 舉報

10#
ID:811253 發表于 2022-8-13 11:32 | 只看該作者
用定時器代替延時就能提升效率了
回復

使用道具 舉報

11#
ID:139866 發表于 2022-8-17 10:34 | 只看該作者
需要提高執行效率,只有在比較精細的項目中才會考慮,有可能讓新手接手這種項目的公司,我覺得項目經理心可能很大
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲啊v在线 | 日本涩涩网 | 国产成人久久久 | 久久99视频 | 久久亚洲经典 | 人人九九 | 久久久www成人免费无遮挡大片 | 欧美日韩91| 欧美日韩一区在线观看 | 天天综合网91 | 手机在线观看av | 国产在线视频在线观看 | 日本不卡免费新一二三区 | 欧美一区二区免费 | 韩日一区二区 | 免费的av | 国产精品国产三级国产aⅴ无密码 | 日韩免费一区二区 | 久久综合久久综合久久综合 | 中文字幕日韩一区二区 | 久久精品二区亚洲w码 | 中文字字幕在线中文乱码范文 | 久久精品久久久久久 | 亚洲一区二区久久 | 日韩在线视频一区二区三区 | 久久久新视频 | 人人做人人澡人人爽欧美 | 精品在线免费看 | 欧美久久一区二区三区 | 日韩欧美精品在线 | 午夜寂寞福利视频 | 99热精品在线观看 | 亚洲成人综合在线 | 久久久综合色 | 亚洲网站观看 | 国产日韩欧美一区 | 精品99在线 | 国产精品国产a | 国产人免费人成免费视频 | 国产精品美女久久久久久久网站 | 久久久精品网 |