欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 非阻塞程序設計代表了一個工程師的水平 [打印本頁]

作者: nearsea    時間: 2023-12-12 09:21
標題: 非阻塞程序設計代表了一個工程師的水平
最近比較崩潰的項目移植,一個是RC522驅動,網絡上的代碼都是需要死等,很多實例都是一樣,還有項目中需要使用CH376S,官方的DEMO也是一樣,死等待,仿佛整個系統只做一件事一樣

大家有沒有什么非阻塞設計的經驗分享一下,我自己常用的就是狀態機和OS系統兩種方法,但搶占式OS用在8位單片機系統總是捉襟見肘,非搶占式有時任務調度不夠靈活。

作者: nearsea    時間: 2023-12-12 12:45
目前51主要使用的還是keil-tniy,應用簡單缺點是缺少了搶占機制。
作者: Y_G_G    時間: 2023-12-12 22:19
死等不代表水平,有時候效率并沒有多大意義,你知道怎么提高代碼運行效率的原理就可以,但并不代表每個程序都要單片機代碼達到最高的效率
RC522尋卡,讀寫的死等并不會用太多的時間,而且,在實際應用中,無非就是把卡片放上去感應一下,然后拿開,這中間有太多的時間來死等了,除非你動作比閃電俠還快
其它需要大數據處理的函數,應該才是你要處理的東西,比如大文件的讀寫,大量浮點數據的處理,那應該是在尋卡之后的處理
假設是一個打卡程序,我一打卡之后,應該是先把我的工號,上班時間之類的先緩存,我走了之后,到下一個打卡人到來之前處理的
作者: Hephaestus    時間: 2023-12-13 02:54
8位機上RTOS顯然不是什么好的選擇,那就用個定時中斷,所有的任務調度放在這個中斷里面就行了唄。
作者: 人中狼    時間: 2023-12-13 08:28
不懂得死等的意義,只代表你沒做過多少項目,同時也代表你只追求所謂的效率這種表面的東西來體現自己
作者: nearsea    時間: 2023-12-13 09:37
Y_G_G 發表于 2023-12-12 22:19
死等不代表水平,有時候效率并沒有多大意義,你知道怎么提高代碼運行效率的原理就可以,但并不代表每個程序都 ...

我后臺需要處理并響應四路通訊任務有主有從,大量的主業務流程,死等肯定完蛋了
作者: nearsea    時間: 2023-12-13 09:39
人中狼 發表于 2023-12-13 08:28
不懂得死等的意義,只代表你沒做過多少項目,同時也代表你只追求所謂的效率這種表面的東西來體現自己

確實不多,做個萬行以上代碼的項目估計也就20-30個吧
作者: nearsea    時間: 2023-12-13 09:43
Hephaestus 發表于 2023-12-13 02:54
8位機上RTOS顯然不是什么好的選擇,那就用個定時中斷,所有的任務調度放在這個中斷里面就行了唄。

是的,這是一個簡單的辦法,缺點是需要警惕函數再入帶來的問題,當然程序結構簡單就容易多了,大不了相同的函數重新復制一份
作者: nearsea    時間: 2023-12-13 10:10
通常非阻塞函數原型我自己一般都是這么寫:

U8 StatFun(,,,,);
把完成狀態放在程序返回上,程序調用的時候直接看返回碼就可以了,返回可以有(完成,進行中,錯誤)等狀態,而真正需要處理包括需要返回的變量通過形參指針形式來輸入輸出。
作者: powerdruy    時間: 2023-12-13 10:43
可以考慮在8位機用協程的實現機制來完成非阻塞式程序設計
作者: yzw846562238    時間: 2023-12-13 10:44
nearsea 發表于 2023-12-13 09:39
確實不多,做個萬行以上代碼的項目估計也就20-30個吧

死等確實不是個好辦法。特別是做汽車行業的,死等就等著被投訴吧。我們連幾微秒的延時都不能用,我們調度周期不高,5ms,所有工作必須在5ms內完成,不能完成的就拆分,每5ms運行一部分。實際上占用了6/70%的cpu時間。
作者: bigbigcong    時間: 2023-12-13 10:48
《UML狀態圖的實用C/C++設計(QP狀態機)》
作者: xianfajushi    時間: 2023-12-13 10:55
家里有一臺旭日黃熱水器控制器每天都走時差十幾分鐘,客服給個電話咨詢,回答還沾沾自喜的說只要每月調整即可,無語以對!
作者: 鵜鶘    時間: 2023-12-13 11:12
這種立論屬于不著邊際類,毫無意義。。。。。
作者: wufa1986    時間: 2023-12-13 11:24
沒必要花這心思,產品關鍵是穩定
作者: cba_cba    時間: 2023-12-13 11:35
大俠級人物啊,都上萬行代碼,一般單片機估計上個幾千行就可以了吧。
作者: Y_G_G    時間: 2023-12-13 12:36
nearsea 發表于 2023-12-13 09:37
我后臺需要處理并響應四路通訊任務有主有從,大量的主業務流程,死等肯定完蛋了

不過就是個處理的順序而已
RC522從尋卡到讀寫完成,不需要多少時間的,你把卡上的數據存放到緩沖里,隨便怎么通訊
這并不是什么太高深的東西
作者: nearsea    時間: 2023-12-13 14:39
Y_G_G 發表于 2023-12-13 12:36
不過就是個處理的順序而已
RC522從尋卡到讀寫完成,不需要多少時間的,你把卡上的數據存放到緩沖里,隨便怎 ...

好吧,以后跟你好好學習
作者: nearsea    時間: 2023-12-13 14:52
bigbigcong 發表于 2023-12-13 10:48
《UML狀態圖的實用C/C++設計(QP狀態機)》

挺復雜的,想看看但明顯是系統性的,沒有那么多時間去深入學習。

謝謝你的推薦
作者: Hephaestus    時間: 2023-12-13 15:09
又開始吹牛了,8位單片機怎么可能裝得下1萬行c代碼?
作者: nearsea    時間: 2023-12-13 15:27
Hephaestus 發表于 2023-12-13 15:09
又開始吹牛了,8位單片機怎么可能裝得下1萬行c代碼?

萬行很多嗎?

記得很久很久以前,幫南京一家做消防的公司做中控盤,那個時候也只有51可以選擇,代碼長度是5萬行+,樓主可能不知道有個Bank擴展的事,編譯器還不是今天的KEIL,好像是什么阿基米德命令行的,在DOS環境下運行,不知道和今天的IAR是不是有淵源,估計存檔文件里面還能找到這玩意兒。
作者: Hephaestus    時間: 2023-12-13 15:55
nearsea 發表于 2023-12-13 15:27
萬行很多嗎?

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

AD2500唄,我電腦里面還有。

就算是5萬+行匯編,一行對應2字節算,就有100kbyte,8051根本就放不下。

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

8位機尋址能力只有64k,你知道是什么意思嗎?
作者: nearsea    時間: 2023-12-13 16:32
你贏了,這是前幾天給用戶做的一個商業項目的一個文件,100多行代碼編譯生成了300個字節的二進制文件,不爭論,對不起你,誤導了你。

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 產生。
   4          當定時器采用1T 模式時(12倍速),相應的波特率的速度也會相應提高12 倍。
   5          */
   6         
   7          #include "CONFIG.H"
   8         
   9          #define DEBUG_PRT
  10         
  11          //串口1用于程序調試信息輸出
  12          void SetUart1(void) {
  13   1      
  14   1      #ifdef DEBUG_PRT
  15   1        //串口1工作在8位數據模式1,允許接收數據
  16   1        SCON |= B0101_0000;  
  17   1        //使用定時器2作為波特率發生器
  18   1        AUXR |= B0000_0001;
  19   1        //中斷為次低優先級
  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用于輸出調試信息
  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          //將串口接收數據保存到緩存區
  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          //從接收緩沖區取一個字節數據
  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          //從緩沖區取數據發送到串口
  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          //保存數據到發送緩沖區
  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用于調試信息輸出
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)

作者: nearsea    時間: 2023-12-13 16:44
上個回帖審核的慢,后面的比前面的出來的早。
優化等級還是沒針對代碼長度,并且只有7級優化,代碼和內存都使用的是大模式,小內存模式應該會更小一些的代碼。
作者: nearsea    時間: 2023-12-13 17:38
xianfajushi 發表于 2023-12-13 10:55
家里有一臺旭日黃熱水器控制器每天都走時差十幾分鐘,客服給個電話咨詢,回答還沾沾自喜的說只要每月調整即 ...

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

要是都像那樣,估計就該吃免費飯了
作者: xianfajushi    時間: 2023-12-13 18:48
我想起了以前有采集市電頻率做時鐘的了每天誤差也不會是十幾分鐘
作者: 18680365301    時間: 2023-12-14 09:12
xianfajushi 發表于 2023-12-13 18:48
我想起了以前有采集市電頻率做時鐘的了每天誤差也不會是十幾分鐘

電網頻率來做時鐘很準的,一天都差不了2秒
作者: chenmingwu    時間: 2023-12-14 11:07
可以用輪詢,調用一個定時器,每隔一段時間去查詢狀態
作者: Hephaestus    時間: 2023-12-14 12:16
xianfajushi 發表于 2023-12-13 18:48
我想起了以前有采集市電頻率做時鐘的了每天誤差也不會是十幾分鐘

看情況,我家在82年有了個用50Hz做時基的鐘控收音機,一開始非常準,原子鐘級別的,跟收音機報時一秒都不帶差的,到八十年代后期越來越慢,可以一天慢20分鐘,搬家時扔掉了。
作者: nearsea    時間: 2023-12-17 07:42
昨天和客戶一起在無錫做完和產品的電磁兼容認證,因為忙碌只是匆匆手機上看了一眼回帖,記憶中好像有人提出大程序應該怎么寫的問題。

我自己大學的時候學的是無線電,其實和軟件沒啥關系,后來因為興趣愛好系統的學習了軟件工程和數據結構,按照我自己的理解大的軟件首先需要從程序結構上入手分層驅動,自己的程序一般是分為設備層、消息驅動層和業務層,層層之間使用消息或者是FIFO驅動,這樣DEBUGi起來定位會清晰明了,并且各個業務不會相互牽扯。

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

有批評建議請系統完整的有上下文承接,網絡上有個段子,我和你說法制,你和我談人性,當我和你說人性的時候,你又和我談公平,這樣的反復不利于我這樣的菜鳥學習和進步,拜托了。

作者: nearsea    時間: 2023-12-17 10:17
chenmingwu 發表于 2023-12-14 11:07
可以用輪詢,調用一個定時器,每隔一段時間去查詢狀態

是的,可以這樣處理,這就是我說的,每個功能每個函數就應該保證是沒有阻塞的設計,否則因為函數耗時長卡滯在一個功能上就沒有什么意義了
作者: ljchip    時間: 2024-2-7 08:01
所有順序結構都可以改為輪詢。還在用順序結構寫程序只能說明作者是業余編程愛好者,無os軟件編程必須用時間片經典架構。delay只能用us級,總延時不能超過10us。
作者: lkc8210    時間: 2024-2-7 09:04
ljchip 發表于 2024-2-7 08:01
所有順序結構都可以改為輪詢。還在用順序結構寫程序只能說明作者是業余編程愛好者,無os軟件編程必須用時間 ...

如果遇到DS18B20這類咋辦?
作者: hhh402    時間: 2024-2-7 11:49
lkc8210 發表于 2024-2-7 09:04
如果遇到DS18B20這類咋辦?

不用DS18B20,必須對硬件有一定的要求,什么方法都會有缺點不可能適用所以情況。DS18B20除了89C52在用之外,其他有AD的都不用。
作者: sr861126    時間: 2024-2-27 08:38
Hephaestus 發表于 2023-12-13 15:09
又開始吹牛了,8位單片機怎么可能裝得下1萬行c代碼?

60K的可以
作者: lxh2002    時間: 2024-3-12 09:12
可不可以把這部分做一個單獨的分板,讓這塊分板自己去死等,有數據了就串口向主板輸出,主板的串口中斷檢測到就開始處理分板的數據,不知道這樣會不會可行
作者: zmc419    時間: 2024-3-15 15:07
網上有個多定時器庫?看看能否分時。




歡迎光臨 (http://www.raoushi.com/bbs/) Powered by Discuz! X3.1