找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4938|回復(fù): 36
收起左側(cè)

非阻塞程序設(shè)計代表了一個工程師的水平

  [復(fù)制鏈接]
ID:1101997 發(fā)表于 2023-12-12 09:21 | 顯示全部樓層 |閱讀模式
最近比較崩潰的項目移植,一個是RC522驅(qū)動,網(wǎng)絡(luò)上的代碼都是需要死等,很多實例都是一樣,還有項目中需要使用CH376S,官方的DEMO也是一樣,死等待,仿佛整個系統(tǒng)只做一件事一樣。

大家有沒有什么非阻塞設(shè)計的經(jīng)驗分享一下,我自己常用的就是狀態(tài)機和OS系統(tǒng)兩種方法,但搶占式OS用在8位單片機系統(tǒng)總是捉襟見肘,非搶占式有時任務(wù)調(diào)度不夠靈活。
回復(fù)

使用道具 舉報

ID:1101997 發(fā)表于 2023-12-12 12:45 | 顯示全部樓層
目前51主要使用的還是keil-tniy,應(yīng)用簡單缺點是缺少了搶占機制。
回復(fù)

使用道具 舉報

ID:401564 發(fā)表于 2023-12-12 22:19 | 顯示全部樓層
死等不代表水平,有時候效率并沒有多大意義,你知道怎么提高代碼運行效率的原理就可以,但并不代表每個程序都要單片機代碼達到最高的效率
RC522尋卡,讀寫的死等并不會用太多的時間,而且,在實際應(yīng)用中,無非就是把卡片放上去感應(yīng)一下,然后拿開,這中間有太多的時間來死等了,除非你動作比閃電俠還快
其它需要大數(shù)據(jù)處理的函數(shù),應(yīng)該才是你要處理的東西,比如大文件的讀寫,大量浮點數(shù)據(jù)的處理,那應(yīng)該是在尋卡之后的處理
假設(shè)是一個打卡程序,我一打卡之后,應(yīng)該是先把我的工號,上班時間之類的先緩存,我走了之后,到下一個打卡人到來之前處理的
回復(fù)

使用道具 舉報

ID:883242 發(fā)表于 2023-12-13 02:54 | 顯示全部樓層
8位機上RTOS顯然不是什么好的選擇,那就用個定時中斷,所有的任務(wù)調(diào)度放在這個中斷里面就行了唄。
回復(fù)

使用道具 舉報

ID:384109 發(fā)表于 2023-12-13 08:28 | 顯示全部樓層
不懂得死等的意義,只代表你沒做過多少項目,同時也代表你只追求所謂的效率這種表面的東西來體現(xiàn)自己
回復(fù)

使用道具 舉報

ID:1101997 發(fā)表于 2023-12-13 09:37 | 顯示全部樓層
Y_G_G 發(fā)表于 2023-12-12 22:19
死等不代表水平,有時候效率并沒有多大意義,你知道怎么提高代碼運行效率的原理就可以,但并不代表每個程序都 ...

我后臺需要處理并響應(yīng)四路通訊任務(wù)有主有從,大量的主業(yè)務(wù)流程,死等肯定完蛋了
回復(fù)

使用道具 舉報

ID:1101997 發(fā)表于 2023-12-13 09:39 | 顯示全部樓層
人中狼 發(fā)表于 2023-12-13 08:28
不懂得死等的意義,只代表你沒做過多少項目,同時也代表你只追求所謂的效率這種表面的東西來體現(xiàn)自己

確實不多,做個萬行以上代碼的項目估計也就20-30個吧
回復(fù)

使用道具 舉報

ID:1101997 發(fā)表于 2023-12-13 09:43 | 顯示全部樓層
Hephaestus 發(fā)表于 2023-12-13 02:54
8位機上RTOS顯然不是什么好的選擇,那就用個定時中斷,所有的任務(wù)調(diào)度放在這個中斷里面就行了唄。

是的,這是一個簡單的辦法,缺點是需要警惕函數(shù)再入帶來的問題,當(dāng)然程序結(jié)構(gòu)簡單就容易多了,大不了相同的函數(shù)重新復(fù)制一份
回復(fù)

使用道具 舉報

ID:1101997 發(fā)表于 2023-12-13 10:10 | 顯示全部樓層
通常非阻塞函數(shù)原型我自己一般都是這么寫:

U8 StatFun(,,,,);
把完成狀態(tài)放在程序返回上,程序調(diào)用的時候直接看返回碼就可以了,返回可以有(完成,進行中,錯誤)等狀態(tài),而真正需要處理包括需要返回的變量通過形參指針形式來輸入輸出。
回復(fù)

使用道具 舉報

ID:108361 發(fā)表于 2023-12-13 10:43 | 顯示全部樓層
可以考慮在8位機用協(xié)程的實現(xiàn)機制來完成非阻塞式程序設(shè)計
回復(fù)

使用道具 舉報

ID:458247 發(fā)表于 2023-12-13 10:44 | 顯示全部樓層
nearsea 發(fā)表于 2023-12-13 09:39
確實不多,做個萬行以上代碼的項目估計也就20-30個吧

死等確實不是個好辦法。特別是做汽車行業(yè)的,死等就等著被投訴吧。我們連幾微秒的延時都不能用,我們調(diào)度周期不高,5ms,所有工作必須在5ms內(nèi)完成,不能完成的就拆分,每5ms運行一部分。實際上占用了6/70%的cpu時間。
回復(fù)

使用道具 舉報

ID:958310 發(fā)表于 2023-12-13 10:48 | 顯示全部樓層
《UML狀態(tài)圖的實用C/C++設(shè)計(QP狀態(tài)機)》
回復(fù)

使用道具 舉報

ID:332444 發(fā)表于 2023-12-13 10:55 | 顯示全部樓層
家里有一臺旭日黃熱水器控制器每天都走時差十幾分鐘,客服給個電話咨詢,回答還沾沾自喜的說只要每月調(diào)整即可,無語以對!
回復(fù)

使用道具 舉報

ID:397054 發(fā)表于 2023-12-13 11:12 | 顯示全部樓層
這種立論屬于不著邊際類,毫無意義。。。。。
回復(fù)

使用道具 舉報

ID:879348 發(fā)表于 2023-12-13 11:24 | 顯示全部樓層
沒必要花這心思,產(chǎn)品關(guān)鍵是穩(wěn)定
回復(fù)

使用道具 舉報

ID:336378 發(fā)表于 2023-12-13 11:35 | 顯示全部樓層
大俠級人物啊,都上萬行代碼,一般單片機估計上個幾千行就可以了吧。
回復(fù)

使用道具 舉報

ID:401564 發(fā)表于 2023-12-13 12:36 | 顯示全部樓層
nearsea 發(fā)表于 2023-12-13 09:37
我后臺需要處理并響應(yīng)四路通訊任務(wù)有主有從,大量的主業(yè)務(wù)流程,死等肯定完蛋了

不過就是個處理的順序而已
RC522從尋卡到讀寫完成,不需要多少時間的,你把卡上的數(shù)據(jù)存放到緩沖里,隨便怎么通訊
這并不是什么太高深的東西
回復(fù)

使用道具 舉報

ID:1101997 發(fā)表于 2023-12-13 14:39 | 顯示全部樓層
Y_G_G 發(fā)表于 2023-12-13 12:36
不過就是個處理的順序而已
RC522從尋卡到讀寫完成,不需要多少時間的,你把卡上的數(shù)據(jù)存放到緩沖里,隨便怎 ...

好吧,以后跟你好好學(xué)習(xí)
回復(fù)

使用道具 舉報

ID:1101997 發(fā)表于 2023-12-13 14:52 | 顯示全部樓層
bigbigcong 發(fā)表于 2023-12-13 10:48
《UML狀態(tài)圖的實用C/C++設(shè)計(QP狀態(tài)機)》

挺復(fù)雜的,想看看但明顯是系統(tǒng)性的,沒有那么多時間去深入學(xué)習(xí)。

謝謝你的推薦
回復(fù)

使用道具 舉報

ID:883242 發(fā)表于 2023-12-13 15:09 | 顯示全部樓層
又開始吹牛了,8位單片機怎么可能裝得下1萬行c代碼?
回復(fù)

使用道具 舉報

ID:1101997 發(fā)表于 2023-12-13 15:27 | 顯示全部樓層
Hephaestus 發(fā)表于 2023-12-13 15:09
又開始吹牛了,8位單片機怎么可能裝得下1萬行c代碼?

萬行很多嗎?

記得很久很久以前,幫南京一家做消防的公司做中控盤,那個時候也只有51可以選擇,代碼長度是5萬行+,樓主可能不知道有個Bank擴展的事,編譯器還不是今天的KEIL,好像是什么阿基米德命令行的,在DOS環(huán)境下運行,不知道和今天的IAR是不是有淵源,估計存檔文件里面還能找到這玩意兒。
回復(fù)

使用道具 舉報

ID:883242 發(fā)表于 2023-12-13 15:55 | 顯示全部樓層
nearsea 發(fā)表于 2023-12-13 15:27
萬行很多嗎?

記得很久很久以前,幫南京一家做消防的公司做中控盤,那個時候也只有51可以選擇,代碼長 ...

AD2500唄,我電腦里面還有。

就算是5萬+行匯編,一行對應(yīng)2字節(jié)算,就有100kbyte,8051根本就放不下。

c語言比匯編大10倍,一行平均能翻譯出20個字節(jié),1Mbyte是個概念你有嗎???

8位機尋址能力只有64k,你知道是什么意思嗎?
回復(fù)

使用道具 舉報

ID:1101997 發(fā)表于 2023-12-13 16:32 | 顯示全部樓層
你贏了,這是前幾天給用戶做的一個商業(yè)項目的一個文件,100多行代碼編譯生成了300個字節(jié)的二進制文件,不爭論,對不起你,誤導(dǎo)了你。

C51 COMPILER V9.60.7.0   UART1                                                             11/22/2023 13:28:21 PAGE 1   


C51 COMPILER V9.60.7.0, COMPILATION OF MODULE UART1
OBJECT MODULE PLACED IN .\OBJ\UART1.obj
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE SRC\UART1.C LARGE OMF2 OPTIMIZE(7,SPEED) BROWSE DEBUG CODE PRINT(.\LST\UART
                    -1.lst) TABS(2) OBJECT(.\OBJ\UART1.obj)

line level    source

   1          #define __UART1_C_
   2          /*
   3          串口1 的波特率是可變的,其波特率可由定時器1 或者定時器2 產(chǎn)生。
   4          當(dāng)定時器采用1T 模式時(12倍速),相應(yīng)的波特率的速度也會相應(yīng)提高12 倍。
   5          */
   6         
   7          #include "CONFIG.H"
   8         
   9          #define DEBUG_PRT
  10         
  11          //串口1用于程序調(diào)試信息輸出
  12          void SetUart1(void) {
  13   1      
  14   1      #ifdef DEBUG_PRT
  15   1        //串口1工作在8位數(shù)據(jù)模式1,允許接收數(shù)據(jù)
  16   1        SCON |= B0101_0000;  
  17   1        //使用定時器2作為波特率發(fā)生器
  18   1        AUXR |= B0000_0001;
  19   1        //中斷為次低優(yōu)先級
  20   1        IP   |= B0001_0000;
  21   1        IPH  &= B1110_1111;
  22   1        //允許中斷
  23   1        IE   |= B0001_0000;
  24   1      #else
              #endif  
  26   1      }
  27         
  28          #ifdef DEBUG_PRT
  29          //串口1用于輸出調(diào)試信息
  30          #define cbhUart1_BufSize  250
  31          char vrgbhUart1_Buf[cbhUart1_BufSize];
  32          U8 data vbhEmptyUart1 =0;
  33          U8 data vbhGetUart1  = 0;
  34          BOOL vfUart1_BufSize_Empty = TRUE;
  35         
  36          char vrgbhUart1R_Buf[cbhUart1_BufSize];
  37          U8 data vbhEmptyUart1R =0;
  38          U8 data vbhGetUart1R  = 0;
  39          BOOL vfUart1R_BufSize_Full = FAIL;
  40         
  41          //將串口接收數(shù)據(jù)保存到緩存區(qū)
  42          void ReceUart1R_Buf(U8 bhRece) {
  43   1      U8 data bhTemp;
  44   1      
  45   1        bhTemp=vbhEmptyUart1R+1;
  46   1        if(bhTemp>=cbhUart1_BufSize)
  47   1          bhTemp=0;
  48   1        if(bhTemp!=vbhGetUart1R) {
  49   2          vrgbhUart1R_Buf[vbhEmptyUart1R]=bhRece;
  50   2          vbhEmptyUart1R=bhTemp;
  51   2        }
  52   1        else
  53   1          vfUart1R_BufSize_Full = TRUE;  
  54   1      }  
C51 COMPILER V9.60.7.0   UART1                                                             11/22/2023 13:28:21 PAGE 2   

  55         
  56          //從接收緩沖區(qū)取一個字節(jié)數(shù)據(jù)
  57          BOOL GetUart1R_Buf(U8 *pbh) {
  58   1      U8 data bhTemp;
  59   1      BOOL fGetOk = FAIL;
  60   1      
  61   1        if(vbhEmptyUart1R!=vbhGetUart1R) {
  62   2          (*pbh)=vrgbhUart1R_Buf[vbhGetUart1R];
  63   2          bhTemp=vbhGetUart1R+1U;
  64   2          if(bhTemp>=cbhUart1_BufSize)
  65   2            bhTemp=0;
  66   2          vbhGetUart1R=bhTemp;
  67   2          vfUart1R_BufSize_Full = FAIL;
  68   2          fGetOk = TRUE;
  69   2        }
  70   1        return(fGetOk);
  71   1      }  
  72         
  73          //從緩沖區(qū)取數(shù)據(jù)發(fā)送到串口
  74          void SendUart1Buf(void) {
  75   1      U8 data bhTemp;
  76   1      
  77   1        if(vbhEmptyUart1!=vbhGetUart1) {
  78   2          SBUF=vrgbhUart1_Buf[vbhGetUart1];
  79   2          bhTemp=vbhGetUart1+1U;
  80   2          if(bhTemp>=cbhUart1_BufSize)
  81   2            bhTemp=0;
  82   2          vbhGetUart1=bhTemp;
  83   2        }
  84   1        else
  85   1          vfUart1_BufSize_Empty = TRUE;
  86   1      }
  87         
  88          //保存數(shù)據(jù)到發(fā)送緩沖區(qū)
  89          char putchar(char bhchar) {
  90   1      U8 data bhTemp;
  91   1      char data bhRet = '\0';  
  92   1      
  93   1        bhTemp=vbhEmptyUart1+1;
  94   1        if(bhTemp>=cbhUart1_BufSize)
  95   1          bhTemp=0;
  96   1        if(bhTemp!=vbhGetUart1) {
  97   2          vrgbhUart1_Buf[vbhEmptyUart1]=bhchar;
  98   2          bhRet=bhchar;
  99   2          vbhEmptyUart1=bhTemp;
100   2          if(vfUart1_BufSize_Empty) {
101   3            vfUart1_BufSize_Empty = FAIL;
102   3            TI = 1;
103   3          }
104   2        }
105   1        return(bhRet);
106   1      }  
107          #endif  
108         
109         
110          void DebugPrt(char *fmt, ...) {
111   1        
112   1        va_list arg_ptr;
113   1        va_start (arg_ptr, fmt);
114   1      #ifdef DEBUG_PRT
115   1        vprintf (fmt, arg_ptr);
116   1      #endif  
C51 COMPILER V9.60.7.0   UART1                                                             11/22/2023 13:28:21 PAGE 3   

117   1        va_end (arg_ptr);
118   1      }
119         
120          #ifdef DEBUG_PRT
121          //串口1用于調(diào)試信息輸出
122          void Uart1(void) interrupt 4 {
123   1        
124   1        if(RI) {
125   2          RI=0;
126   2          ReceUart1R_Buf(SBUF);
127   2        }
128   1        if(TI) {
129   2          TI=0;
130   2          SendUart1Buf();
131   2        }   
132   1      }
133          #endif  
C51 COMPILER V9.60.7.0   UART1                                                             11/22/2023 13:28:21 PAGE 4   

ASSEMBLY LISTING OF GENERATED OBJECT CODE


             ; FUNCTION SetUart1 (BEGIN)
                                           ; SOURCE LINE # 12
                                           ; SOURCE LINE # 16
0000 439850            ORL     SCON,#050H
                                           ; SOURCE LINE # 18
0003 438E01            ORL     AUXR,#01H
                                           ; SOURCE LINE # 20
0006 43B810            ORL     IP,#010H
                                           ; SOURCE LINE # 21
0009 53B7EF            ANL     IPH,#0EFH
                                           ; SOURCE LINE # 23
000C 43A810            ORL     IE,#010H
                                           ; SOURCE LINE # 26
000F 22                RET     
             ; FUNCTION SetUart1 (END)

             ; FUNCTION _ReceUart1R_Buf (BEGIN)
                                           ; SOURCE LINE # 42
;---- Variable 'bhRece' assigned to Register 'R7' ----
                                           ; SOURCE LINE # 45
0000 E500        R     MOV     A,vbhEmptyUart1R
0002 04                INC     A
0003 F500        R     MOV     bhTemp,A
                                           ; SOURCE LINE # 46
0005 C3                CLR     C
0006 94FA              SUBB    A,#0FAH
0008 4003              JC      ?C0002
                                           ; SOURCE LINE # 47
000A E4                CLR     A
000B F500        R     MOV     bhTemp,A
000D         ?C0002:
                                           ; SOURCE LINE # 48
000D E500        R     MOV     A,bhTemp
000F 6500        R     XRL     A,vbhGetUart1R
0011 6011              JZ      ?C0003
                                           ; SOURCE LINE # 49
0013 7400        R     MOV     A,#LOW vrgbhUart1R_Buf
0015 2500        R     ADD     A,vbhEmptyUart1R
0017 F582              MOV     DPL,A
0019 E4                CLR     A
001A 3400        R     ADDC    A,#HIGH vrgbhUart1R_Buf
001C F583              MOV     DPH,A
001E EF                MOV     A,R7
001F F0                MOVX    @DPTR,A
                                           ; SOURCE LINE # 50
0020 850000      R     MOV     vbhEmptyUart1R,bhTemp
                                           ; SOURCE LINE # 51
0023 22                RET     
0024         ?C0003:
                                           ; SOURCE LINE # 53
0024 D200        R     SETB    vfUart1R_BufSize_Full
                                           ; SOURCE LINE # 54
0026         ?C0005:
0026 22                RET     
             ; FUNCTION _ReceUart1R_Buf (END)

             ; FUNCTION _GetUart1R_Buf (BEGIN)
                                           ; SOURCE LINE # 57
;---- Variable 'pbh' assigned to Register 'R1/R2/R3' ----
C51 COMPILER V9.60.7.0   UART1                                                             11/22/2023 13:28:21 PAGE 5   

                                           ; SOURCE LINE # 59
0000 C200        R     CLR     fGetOk
                                           ; SOURCE LINE # 61
0002 E500        R     MOV     A,vbhEmptyUart1R
0004 6500        R     XRL     A,vbhGetUart1R
0006 6023              JZ      ?C0006
                                           ; SOURCE LINE # 62
0008 7400        R     MOV     A,#LOW vrgbhUart1R_Buf
000A 2500        R     ADD     A,vbhGetUart1R
000C F582              MOV     DPL,A
000E E4                CLR     A
000F 3400        R     ADDC    A,#HIGH vrgbhUart1R_Buf
0011 F583              MOV     DPH,A
0013 E0                MOVX    A,@DPTR
0014 120000      E     LCALL   ?C?CSTPTR
                                           ; SOURCE LINE # 63
0017 E500        R     MOV     A,vbhGetUart1R
0019 04                INC     A
001A F500        R     MOV     bhTemp,A
                                           ; SOURCE LINE # 64
001C C3                CLR     C
001D 94FA              SUBB    A,#0FAH
001F 4003              JC      ?C0007
                                           ; SOURCE LINE # 65
0021 E4                CLR     A
0022 F500        R     MOV     bhTemp,A
0024         ?C0007:
                                           ; SOURCE LINE # 66
0024 850000      R     MOV     vbhGetUart1R,bhTemp
                                           ; SOURCE LINE # 67
0027 C200        R     CLR     vfUart1R_BufSize_Full
                                           ; SOURCE LINE # 68
0029 D200        R     SETB    fGetOk
                                           ; SOURCE LINE # 69
002B         ?C0006:
                                           ; SOURCE LINE # 70
002B A200        R     MOV     C,fGetOk
                                           ; SOURCE LINE # 71
002D 22                RET     
             ; FUNCTION _GetUart1R_Buf (END)

             ; FUNCTION SendUart1Buf (BEGIN)
                                           ; SOURCE LINE # 74
                                           ; SOURCE LINE # 77
0000 E500        R     MOV     A,vbhEmptyUart1
0002 6500        R     XRL     A,vbhGetUart1
0004 601F              JZ      ?C0009
                                           ; SOURCE LINE # 78
0006 7400        R     MOV     A,#LOW vrgbhUart1_Buf
0008 2500        R     ADD     A,vbhGetUart1
000A F582              MOV     DPL,A
000C E4                CLR     A
000D 3400        R     ADDC    A,#HIGH vrgbhUart1_Buf
000F F583              MOV     DPH,A
0011 E0                MOVX    A,@DPTR
0012 F599              MOV     SBUF,A
                                           ; SOURCE LINE # 79
0014 E500        R     MOV     A,vbhGetUart1
0016 04                INC     A
0017 F500        R     MOV     bhTemp,A
                                           ; SOURCE LINE # 80
0019 C3                CLR     C
C51 COMPILER V9.60.7.0   UART1                                                             11/22/2023 13:28:21 PAGE 6   

001A 94FA              SUBB    A,#0FAH
001C 4003              JC      ?C0010
                                           ; SOURCE LINE # 81
001E E4                CLR     A
001F F500        R     MOV     bhTemp,A
0021         ?C0010:
                                           ; SOURCE LINE # 82
0021 850000      R     MOV     vbhGetUart1,bhTemp
                                           ; SOURCE LINE # 83
0024 22                RET     
0025         ?C0009:
                                           ; SOURCE LINE # 85
0025 D200        R     SETB    vfUart1_BufSize_Empty
                                           ; SOURCE LINE # 86
0027         ?C0012:
0027 22                RET     
             ; FUNCTION SendUart1Buf (END)

             ; FUNCTION _putchar (BEGIN)
                                           ; SOURCE LINE # 89
;---- Variable 'bhchar' assigned to Register 'R7' ----
                                           ; SOURCE LINE # 91
0000 E4                CLR     A
0001 F500        R     MOV     bhRet,A
                                           ; SOURCE LINE # 93
0003 E500        R     MOV     A,vbhEmptyUart1
0005 04                INC     A
0006 F500        R     MOV     bhTemp,A
                                           ; SOURCE LINE # 94
0008 C3                CLR     C
0009 94FA              SUBB    A,#0FAH
000B 4003              JC      ?C0013
                                           ; SOURCE LINE # 95
000D E4                CLR     A
000E F500        R     MOV     bhTemp,A
0010         ?C0013:
                                           ; SOURCE LINE # 96
0010 E500        R     MOV     A,bhTemp
0012 6500        R     XRL     A,vbhGetUart1
0014 6019              JZ      ?C0014
                                           ; SOURCE LINE # 97
0016 7400        R     MOV     A,#LOW vrgbhUart1_Buf
0018 2500        R     ADD     A,vbhEmptyUart1
001A F582              MOV     DPL,A
001C E4                CLR     A
001D 3400        R     ADDC    A,#HIGH vrgbhUart1_Buf
001F F583              MOV     DPH,A
0021 EF                MOV     A,R7
0022 F0                MOVX    @DPTR,A
                                           ; SOURCE LINE # 98
0023 F500        R     MOV     bhRet,A
                                           ; SOURCE LINE # 99
0025 850000      R     MOV     vbhEmptyUart1,bhTemp
                                           ; SOURCE LINE # 100
0028 300004            JNB     vfUart1_BufSize_Empty,?C0014
                                           ; SOURCE LINE # 101
002B C200        R     CLR     vfUart1_BufSize_Empty
                                           ; SOURCE LINE # 102
002D D299              SETB    TI
                                           ; SOURCE LINE # 103
                                           ; SOURCE LINE # 104
002F         ?C0014:
C51 COMPILER V9.60.7.0   UART1                                                             11/22/2023 13:28:21 PAGE 7   

                                           ; SOURCE LINE # 105
002F AF00        R     MOV     R7,bhRet
                                           ; SOURCE LINE # 106
0031 22                RET     
             ; FUNCTION _putchar (END)

             ; FUNCTION _DebugPrt (BEGIN)
                                           ; SOURCE LINE # 110
0000 900000      R     MOV     DPTR,#fmt
0003 EB                MOV     A,R3
0004 F0                MOVX    @DPTR,A
0005 A3                INC     DPTR
0006 EA                MOV     A,R2
0007 F0                MOVX    @DPTR,A
0008 A3                INC     DPTR
0009 E9                MOV     A,R1
000A F0                MOVX    @DPTR,A
                                           ; SOURCE LINE # 113
000B 900000      R     MOV     DPTR,#arg_ptr
000E 7401              MOV     A,#01H
0010 F0                MOVX    @DPTR,A
0011 A3                INC     DPTR
0012 7400        R     MOV     A,#HIGH fmt+03H
0014 F0                MOVX    @DPTR,A
0015 A3                INC     DPTR
0016 7400        R     MOV     A,#LOW fmt+03H
0018 F0                MOVX    @DPTR,A
                                           ; SOURCE LINE # 115
0019 900000      R     MOV     DPTR,#arg_ptr
001C E0                MOVX    A,@DPTR
001D F9                MOV     R1,A
001E A3                INC     DPTR
001F E0                MOVX    A,@DPTR
0020 FA                MOV     R2,A
0021 A3                INC     DPTR
0022 E0                MOVX    A,@DPTR
0023 900000      E     MOV     DPTR,#?_vprintf?BYTE+03H
0026 C9                XCH     A,R1
0027 F0                MOVX    @DPTR,A
0028 A3                INC     DPTR
0029 EA                MOV     A,R2
002A F0                MOVX    @DPTR,A
002B A3                INC     DPTR
002C E9                MOV     A,R1
002D F0                MOVX    @DPTR,A
002E 900000      R     MOV     DPTR,#fmt
0031 E0                MOVX    A,@DPTR
0032 FB                MOV     R3,A
0033 A3                INC     DPTR
0034 E0                MOVX    A,@DPTR
0035 FA                MOV     R2,A
0036 A3                INC     DPTR
0037 E0                MOVX    A,@DPTR
0038 F9                MOV     R1,A
0039 120000      E     LCALL   _vprintf
                                           ; SOURCE LINE # 117
003C 900000      R     MOV     DPTR,#arg_ptr
003F E4                CLR     A
0040 F0                MOVX    @DPTR,A
0041 A3                INC     DPTR
0042 F0                MOVX    @DPTR,A
0043 A3                INC     DPTR
C51 COMPILER V9.60.7.0   UART1                                                             11/22/2023 13:28:21 PAGE 8   

0044 F0                MOVX    @DPTR,A
                                           ; SOURCE LINE # 118
0045 22                RET     
             ; FUNCTION _DebugPrt (END)

             ; FUNCTION Uart1 (BEGIN)
0000 C0E0              PUSH    ACC
0002 C083              PUSH    DPH
0004 C082              PUSH    DPL
0006 C0D0              PUSH    PSW
0008 75D000            MOV     PSW,#00H
000B C007              PUSH    AR7
                                           ; SOURCE LINE # 122
                                           ; SOURCE LINE # 124
000D 309807            JNB     RI,?C0018
                                           ; SOURCE LINE # 125
0010 C298              CLR     RI
                                           ; SOURCE LINE # 126
0012 AF99              MOV     R7,SBUF
0014 120000      R     LCALL   _ReceUart1R_Buf
                                           ; SOURCE LINE # 127
0017         ?C0018:
                                           ; SOURCE LINE # 128
0017 309905            JNB     TI,?C0020
                                           ; SOURCE LINE # 129
001A C299              CLR     TI
                                           ; SOURCE LINE # 130
001C 120000      R     LCALL   SendUart1Buf
                                           ; SOURCE LINE # 131
                                           ; SOURCE LINE # 132
001F         ?C0020:
001F D007              POP     AR7
0021 D0D0              POP     PSW
0023 D082              POP     DPL
0025 D083              POP     DPH
0027 D0E0              POP     ACC
0029 32                RETI   
             ; FUNCTION Uart1 (END)



MODULE INFORMATION:   STATIC OVERLAYABLE
   CODE SIZE        =    306    ----
   CONSTANT SIZE    =   ----    ----
   XDATA SIZE       =    500      46
   PDATA SIZE       =   ----    ----
   DATA SIZE        =      4       5
   IDATA SIZE       =   ----    ----
   BIT SIZE         =      2       1
   EDATA SIZE       =   ----    ----
   HDATA SIZE       =   ----    ----
   XDATA CONST SIZE =   ----    ----
   FAR CONST SIZE   =   ----    ----
END OF MODULE INFORMATION.


C51 COMPILATION COMPLETE.  0 WARNING(S),  0 ERROR(S)
回復(fù)

使用道具 舉報

ID:1101997 發(fā)表于 2023-12-13 16:44 | 顯示全部樓層
上個回帖審核的慢,后面的比前面的出來的早。
優(yōu)化等級還是沒針對代碼長度,并且只有7級優(yōu)化,代碼和內(nèi)存都使用的是大模式,小內(nèi)存模式應(yīng)該會更小一些的代碼。
回復(fù)

使用道具 舉報

ID:1101997 發(fā)表于 2023-12-13 17:38 | 顯示全部樓層
xianfajushi 發(fā)表于 2023-12-13 10:55
家里有一臺旭日黃熱水器控制器每天都走時差十幾分鐘,客服給個電話咨詢,回答還沾沾自喜的說只要每月調(diào)整即 ...

這才是高手,前十幾年一直做消防產(chǎn)品,最近改行做醫(yī)療器械設(shè)計,所有的產(chǎn)品都需要過強制認證。

要是都像那樣,估計就該吃免費飯了
回復(fù)

使用道具 舉報

ID:332444 發(fā)表于 2023-12-13 18:48 | 顯示全部樓層
我想起了以前有采集市電頻率做時鐘的了每天誤差也不會是十幾分鐘
回復(fù)

使用道具 舉報

ID:485350 發(fā)表于 2023-12-14 09:12 | 顯示全部樓層
xianfajushi 發(fā)表于 2023-12-13 18:48
我想起了以前有采集市電頻率做時鐘的了每天誤差也不會是十幾分鐘

電網(wǎng)頻率來做時鐘很準的,一天都差不了2秒
回復(fù)

使用道具 舉報

ID:1094811 發(fā)表于 2023-12-14 11:07 來自手機 | 顯示全部樓層
可以用輪詢,調(diào)用一個定時器,每隔一段時間去查詢狀態(tài)
回復(fù)

使用道具 舉報

ID:883242 發(fā)表于 2023-12-14 12:16 | 顯示全部樓層
xianfajushi 發(fā)表于 2023-12-13 18:48
我想起了以前有采集市電頻率做時鐘的了每天誤差也不會是十幾分鐘

看情況,我家在82年有了個用50Hz做時基的鐘控收音機,一開始非常準,原子鐘級別的,跟收音機報時一秒都不帶差的,到八十年代后期越來越慢,可以一天慢20分鐘,搬家時扔掉了。
回復(fù)

使用道具 舉報

ID:1101997 發(fā)表于 2023-12-17 07:42 | 顯示全部樓層
昨天和客戶一起在無錫做完和產(chǎn)品的電磁兼容認證,因為忙碌只是匆匆手機上看了一眼回帖,記憶中好像有人提出大程序應(yīng)該怎么寫的問題。

我自己大學(xué)的時候?qū)W的是無線電,其實和軟件沒啥關(guān)系,后來因為興趣愛好系統(tǒng)的學(xué)習(xí)了軟件工程和數(shù)據(jù)結(jié)構(gòu),按照我自己的理解大的軟件首先需要從程序結(jié)構(gòu)上入手分層驅(qū)動,自己的程序一般是分為設(shè)備層、消息驅(qū)動層和業(yè)務(wù)層,層層之間使用消息或者是FIFO驅(qū)動,這樣DEBUGi起來定位會清晰明了,并且各個業(yè)務(wù)不會相互牽扯。

技術(shù)層面我一般是用經(jīng)過自己改良的匈牙利命名法,因為程序大了需要一眼就能判斷出來函數(shù)變量等等各自的屬性,不能靠猜開解決,并且項目做的越多最后遺忘的也就越多,一個好的命名也方便以后程序的維護。

有批評建議請系統(tǒng)完整的有上下文承接,網(wǎng)絡(luò)上有個段子,我和你說法制,你和我談人性,當(dāng)我和你說人性的時候,你又和我談公平,這樣的反復(fù)不利于我這樣的菜鳥學(xué)習(xí)和進步,拜托了。
回復(fù)

使用道具 舉報

ID:1101997 發(fā)表于 2023-12-17 10:17 | 顯示全部樓層
chenmingwu 發(fā)表于 2023-12-14 11:07
可以用輪詢,調(diào)用一個定時器,每隔一段時間去查詢狀態(tài)

是的,可以這樣處理,這就是我說的,每個功能每個函數(shù)就應(yīng)該保證是沒有阻塞的設(shè)計,否則因為函數(shù)耗時長卡滯在一個功能上就沒有什么意義了
回復(fù)

使用道具 舉報

ID:247571 發(fā)表于 2024-2-7 08:01 | 顯示全部樓層
所有順序結(jié)構(gòu)都可以改為輪詢。還在用順序結(jié)構(gòu)寫程序只能說明作者是業(yè)余編程愛好者,無os軟件編程必須用時間片經(jīng)典架構(gòu)。delay只能用us級,總延時不能超過10us。
回復(fù)

使用道具 舉報

ID:161164 發(fā)表于 2024-2-7 09:04 | 顯示全部樓層
ljchip 發(fā)表于 2024-2-7 08:01
所有順序結(jié)構(gòu)都可以改為輪詢。還在用順序結(jié)構(gòu)寫程序只能說明作者是業(yè)余編程愛好者,無os軟件編程必須用時間 ...

如果遇到DS18B20這類咋辦?
回復(fù)

使用道具 舉報

ID:491577 發(fā)表于 2024-2-7 11:49 | 顯示全部樓層
lkc8210 發(fā)表于 2024-2-7 09:04
如果遇到DS18B20這類咋辦?

不用DS18B20,必須對硬件有一定的要求,什么方法都會有缺點不可能適用所以情況。DS18B20除了89C52在用之外,其他有AD的都不用。
回復(fù)

使用道具 舉報

ID:302293 發(fā)表于 2024-2-27 08:38 | 顯示全部樓層
Hephaestus 發(fā)表于 2023-12-13 15:09
又開始吹牛了,8位單片機怎么可能裝得下1萬行c代碼?

60K的可以
回復(fù)

使用道具 舉報

ID:237471 發(fā)表于 2024-3-12 09:12 | 顯示全部樓層
可不可以把這部分做一個單獨的分板,讓這塊分板自己去死等,有數(shù)據(jù)了就串口向主板輸出,主板的串口中斷檢測到就開始處理分板的數(shù)據(jù),不知道這樣會不會可行
回復(fù)

使用道具 舉報

ID:137736 發(fā)表于 2024-3-15 15:07 | 顯示全部樓層
網(wǎng)上有個多定時器庫?看看能否分時。
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表