找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1635|回复: 36
收起左侧

非阻塞程序设计代表了一个工程师的水平

  [复制链接]
ID:1101997 发表于 2023-12-12 09:21 | 显示全部楼层 |阅读模式
最近比较崩溃的项目移植,一个是RC522驱动,网络上的代码都是需要死等,很多实例都是一样,还有项目中需要使用CH376S,官方的DEMO也是一样,死等待,仿佛整个系统只做一件事一样

大家有没有什么非阻塞设计的经验分享一下,我自己常用的就是状态机和OS系统两种方法,但抢占式OS用在8位单片机系统总是捉襟见肘,非抢占式有时任务调度不够灵活。
回复

使用道具 举报

ID:1101997 发表于 2023-12-12 12:45 | 显示全部楼层
目前51主要使用的还是keil-tniy,应用简单缺点是缺少了抢占机制。
回复

使用道具 举报

ID:401564 发表于 2023-12-12 22:19 | 显示全部楼层
死等不代表水平,有时候效率并没有多大意义,你知道怎么提高代码运行效率的原理就可以,但并不代表每个程序都要单片机代码达到最高的效率
RC522寻卡,读写的死等并不会用太多的时间,而且,在实际应用中,无非就是把卡片放上去感应一下,然后拿开,这中间有太多的时间来死等了,除非你动作比闪电侠还快
其它需要大数据处理的函数,应该才是你要处理的东西,比如大文件的读写,大量浮点数据的处理,那应该是在寻卡之后的处理
假设是一个打卡程序,我一打卡之后,应该是先把我的工号,上班时间之类的先缓存,我走了之后,到下一个打卡人到来之前处理的
回复

使用道具 举报

ID:883242 发表于 2023-12-13 02:54 | 显示全部楼层
8位机上RTOS显然不是什么好的选择,那就用个定时中断,所有的任务调度放在这个中断里面就行了呗。
回复

使用道具 举报

ID:384109 发表于 2023-12-13 08:28 | 显示全部楼层
不懂得死等的意义,只代表你没做过多少项目,同时也代表你只追求所谓的效率这种表面的东西来体现自己
回复

使用道具 举报

ID:1101997 发表于 2023-12-13 09:37 | 显示全部楼层
Y_G_G 发表于 2023-12-12 22:19
死等不代表水平,有时候效率并没有多大意义,你知道怎么提高代码运行效率的原理就可以,但并不代表每个程序都 ...

我后台需要处理并响应四路通讯任务有主有从,大量的主业务流程,死等肯定完蛋了
回复

使用道具 举报

ID:1101997 发表于 2023-12-13 09:39 | 显示全部楼层
人中狼 发表于 2023-12-13 08:28
不懂得死等的意义,只代表你没做过多少项目,同时也代表你只追求所谓的效率这种表面的东西来体现自己

确实不多,做个万行以上代码的项目估计也就20-30个吧
回复

使用道具 举报

ID:1101997 发表于 2023-12-13 09:43 | 显示全部楼层
Hephaestus 发表于 2023-12-13 02:54
8位机上RTOS显然不是什么好的选择,那就用个定时中断,所有的任务调度放在这个中断里面就行了呗。

是的,这是一个简单的办法,缺点是需要警惕函数再入带来的问题,当然程序结构简单就容易多了,大不了相同的函数重新复制一份
回复

使用道具 举报

ID:1101997 发表于 2023-12-13 10:10 | 显示全部楼层
通常非阻塞函数原型我自己一般都是这么写:

U8 StatFun(,,,,);
把完成状态放在程序返回上,程序调用的时候直接看返回码就可以了,返回可以有(完成,进行中,错误)等状态,而真正需要处理包括需要返回的变量通过形参指针形式来输入输出。
回复

使用道具 举报

ID:108361 发表于 2023-12-13 10:43 | 显示全部楼层
可以考虑在8位机用协程的实现机制来完成非阻塞式程序设计
回复

使用道具 举报

ID:458247 发表于 2023-12-13 10:44 | 显示全部楼层
nearsea 发表于 2023-12-13 09:39
确实不多,做个万行以上代码的项目估计也就20-30个吧

死等确实不是个好办法。特别是做汽车行业的,死等就等着被投诉吧。我们连几微秒的延时都不能用,我们调度周期不高,5ms,所有工作必须在5ms内完成,不能完成的就拆分,每5ms运行一部分。实际上占用了6/70%的cpu时间。
回复

使用道具 举报

ID:958310 发表于 2023-12-13 10:48 | 显示全部楼层
《UML状态图的实用C/C++设计(QP状态机)》
回复

使用道具 举报

ID:332444 发表于 2023-12-13 10:55 | 显示全部楼层
家里有一台旭日黄热水器控制器每天都走时差十几分钟,客服给个电话咨询,回答还沾沾自喜的说只要每月调整即可,无语以对!
回复

使用道具 举报

ID:397054 发表于 2023-12-13 11:12 | 显示全部楼层
这种立论属于不着边际类,毫无意义。。。。。
回复

使用道具 举报

ID:879348 发表于 2023-12-13 11:24 | 显示全部楼层
没必要花这心思,产品关键是稳定
回复

使用道具 举报

ID:336378 发表于 2023-12-13 11:35 | 显示全部楼层
大侠级人物啊,都上万行代码,一般单片机估计上个几千行就可以了吧。
回复

使用道具 举报

ID:401564 发表于 2023-12-13 12:36 | 显示全部楼层
nearsea 发表于 2023-12-13 09:37
我后台需要处理并响应四路通讯任务有主有从,大量的主业务流程,死等肯定完蛋了

不过就是个处理的顺序而已
RC522从寻卡到读写完成,不需要多少时间的,你把卡上的数据存放到缓冲里,随便怎么通讯
这并不是什么太高深的东西
回复

使用道具 举报

ID:1101997 发表于 2023-12-13 14:39 | 显示全部楼层
Y_G_G 发表于 2023-12-13 12:36
不过就是个处理的顺序而已
RC522从寻卡到读写完成,不需要多少时间的,你把卡上的数据存放到缓冲里,随便怎 ...

好吧,以后跟你好好学习
回复

使用道具 举报

ID:1101997 发表于 2023-12-13 14:52 | 显示全部楼层
bigbigcong 发表于 2023-12-13 10:48
《UML状态图的实用C/C++设计(QP状态机)》

挺复杂的,想看看但明显是系统性的,没有那么多时间去深入学习。

谢谢你的推荐
回复

使用道具 举报

ID:883242 发表于 2023-12-13 15:09 | 显示全部楼层
又开始吹牛了,8位单片机怎么可能装得下1万行c代码?
回复

使用道具 举报

ID:1101997 发表于 2023-12-13 15:27 | 显示全部楼层
Hephaestus 发表于 2023-12-13 15:09
又开始吹牛了,8位单片机怎么可能装得下1万行c代码?

万行很多吗?

记得很久很久以前,帮南京一家做消防的公司做中控盘,那个时候也只有51可以选择,代码长度是5万行+,楼主可能不知道有个Bank扩展的事,编译器还不是今天的KEIL,好像是什么阿基米德命令行的,在DOS环境下运行,不知道和今天的IAR是不是有渊源,估计存档文件里面还能找到这玩意儿。
回复

使用道具 举报

ID:883242 发表于 2023-12-13 15:55 | 显示全部楼层
nearsea 发表于 2023-12-13 15:27
万行很多吗?

记得很久很久以前,帮南京一家做消防的公司做中控盘,那个时候也只有51可以选择,代码长 ...

AD2500呗,我电脑里面还有。

就算是5万+行汇编,一行对应2字节算,就有100kbyte,8051根本就放不下。

c语言比汇编大10倍,一行平均能翻译出20个字节,1Mbyte是个概念你有吗???

8位机寻址能力只有64k,你知道是什么意思吗?
回复

使用道具 举报

ID:1101997 发表于 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)
回复

使用道具 举报

ID:1101997 发表于 2023-12-13 16:44 | 显示全部楼层
上个回帖审核的慢,后面的比前面的出来的早。
优化等级还是没针对代码长度,并且只有7级优化,代码和内存都使用的是大模式,小内存模式应该会更小一些的代码。
回复

使用道具 举报

ID:1101997 发表于 2023-12-13 17:38 | 显示全部楼层
xianfajushi 发表于 2023-12-13 10:55
家里有一台旭日黄热水器控制器每天都走时差十几分钟,客服给个电话咨询,回答还沾沾自喜的说只要每月调整即 ...

这才是高手,前十几年一直做消防产品,最近改行做医疗器械设计,所有的产品都需要过强制认证。

要是都像那样,估计就该吃免费饭了
回复

使用道具 举报

ID:332444 发表于 2023-12-13 18:48 | 显示全部楼层
我想起了以前有采集市电频率做时钟的了每天误差也不会是十几分钟
回复

使用道具 举报

ID:485350 发表于 2023-12-14 09:12 | 显示全部楼层
xianfajushi 发表于 2023-12-13 18:48
我想起了以前有采集市电频率做时钟的了每天误差也不会是十几分钟

电网频率来做时钟很准的,一天都差不了2秒
回复

使用道具 举报

ID:1094811 发表于 2023-12-14 11:07 来自手机 | 显示全部楼层
可以用轮询,调用一个定时器,每隔一段时间去查询状态
回复

使用道具 举报

ID:883242 发表于 2023-12-14 12:16 | 显示全部楼层
xianfajushi 发表于 2023-12-13 18:48
我想起了以前有采集市电频率做时钟的了每天误差也不会是十几分钟

看情况,我家在82年有了个用50Hz做时基的钟控收音机,一开始非常准,原子钟级别的,跟收音机报时一秒都不带差的,到八十年代后期越来越慢,可以一天慢20分钟,搬家时扔掉了。
回复

使用道具 举报

ID:1101997 发表于 2023-12-17 07:42 | 显示全部楼层
昨天和客户一起在无锡做完和产品的电磁兼容认证,因为忙碌只是匆匆手机上看了一眼回帖,记忆中好像有人提出大程序应该怎么写的问题。

我自己大学的时候学的是无线电,其实和软件没啥关系,后来因为兴趣爱好系统的学习了软件工程和数据结构,按照我自己的理解大的软件首先需要从程序结构上入手分层驱动,自己的程序一般是分为设备层、消息驱动层和业务层,层层之间使用消息或者是FIFO驱动,这样DEBUGi起来定位会清晰明了,并且各个业务不会相互牵扯。

技术层面我一般是用经过自己改良的匈牙利命名法,因为程序大了需要一眼就能判断出来函数变量等等各自的属性,不能靠猜开解决,并且项目做的越多最后遗忘的也就越多,一个好的命名也方便以后程序的维护。

有批评建议请系统完整的有上下文承接,网络上有个段子,我和你说法制,你和我谈人性,当我和你说人性的时候,你又和我谈公平,这样的反复不利于我这样的菜鸟学习和进步,拜托了。
回复

使用道具 举报

ID:1101997 发表于 2023-12-17 10:17 | 显示全部楼层
chenmingwu 发表于 2023-12-14 11:07
可以用轮询,调用一个定时器,每隔一段时间去查询状态

是的,可以这样处理,这就是我说的,每个功能每个函数就应该保证是没有阻塞的设计,否则因为函数耗时长卡滞在一个功能上就没有什么意义了
回复

使用道具 举报

ID:247571 发表于 2024-2-7 08:01 | 显示全部楼层
所有顺序结构都可以改为轮询。还在用顺序结构写程序只能说明作者是业余编程爱好者,无os软件编程必须用时间片经典架构。delay只能用us级,总延时不能超过10us。
回复

使用道具 举报

ID:161164 发表于 2024-2-7 09:04 | 显示全部楼层
ljchip 发表于 2024-2-7 08:01
所有顺序结构都可以改为轮询。还在用顺序结构写程序只能说明作者是业余编程爱好者,无os软件编程必须用时间 ...

如果遇到DS18B20这类咋办?
回复

使用道具 举报

ID:491577 发表于 2024-2-7 11:49 | 显示全部楼层
lkc8210 发表于 2024-2-7 09:04
如果遇到DS18B20这类咋办?

不用DS18B20,必须对硬件有一定的要求,什么方法都会有缺点不可能适用所以情况。DS18B20除了89C52在用之外,其他有AD的都不用。
回复

使用道具 举报

ID:302293 发表于 2024-2-27 08:38 | 显示全部楼层
Hephaestus 发表于 2023-12-13 15:09
又开始吹牛了,8位单片机怎么可能装得下1万行c代码?

60K的可以
回复

使用道具 举报

ID:237471 发表于 2024-3-12 09:12 | 显示全部楼层
可不可以把这部分做一个单独的分板,让这块分板自己去死等,有数据了就串口向主板输出,主板的串口中断检测到就开始处理分板的数据,不知道这样会不会可行
回复

使用道具 举报

ID:137736 发表于 2024-3-15 15:07 | 显示全部楼层
网上有个多定时器库?看看能否分时。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表