找回密码
 欢迎注册
查看: 5214|回复: 5

[讨论] 有搞单片机的吗

[复制链接]
发表于 2014-7-3 11:21:12 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?欢迎注册

×
都说单片机最好不重入。可是
  1.       ORG 0000H
  2.      LJMP 0030H
  3.       ORG 002FH
  4.      RETI
  5. START:MOV SP,#127
  6.       MOV R2,#10
  7.     ACALL ADDTO
  8.       MOV P1,A
  9.      SJMP $
  10. ADDTO:MOV A,R2
  11.        JZ ZERO
  12.      PUSH ACC
  13.       DEC R2
  14.     ACALL ADDTO
  15.       POP B
  16.       MOV R2,B
  17.       ADD A,B
  18.       RET
  19. ZERO: CLR A
  20.       RET
  21.           END
复制代码

对应C中
  1. char addto(char i){
  2.   return i?addto(i-1)+i:0;
  3. }
  4. void main(){
  5.   P1=addto(10);
  6. }
复制代码

不见得花多少时间(82us,164周期)
在大工程中更不觉有什么不同
为什么呢
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2014-7-3 16:23:07 | 显示全部楼层
完全不懂单片机,但是听说过VHDL
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2014-7-3 21:39:34 | 显示全部楼层
并不是说不能重入。而是因为早期的单片机RAM资源太少,递归深了很快资源耗尽。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2014-7-3 22:21:20 | 显示全部楼层
多用寄存器,少用栈,对吧。

不过,现在的C/C++的函数 都是基于栈这个概念的。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2014-7-3 22:47:52 | 显示全部楼层
  1. #include <stdio.h>

  2. int addto(int i){
  3.   return i>0?addto(i-1)+i:0;
  4. }

  5. void addto2(int i,int *ans){
  6.   *ans = i>0?addto(i-1)+i:0;
  7. }

  8. int main(){

  9.   int n=0,PI=addto(10);
  10.   addto2(10,&n);
  11.   printf("PI=%d\tn=%d",PI,n);
  12.        
  13.   return 0;
  14. }
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2014-7-3 23:14:37 | 显示全部楼层
Build target 'Target 1'
compiling main.c...
MAIN.C(3): warning C265: '_addto': recursive call to non-reentrant function
linking...
Program Size: data=10.0 xdata=0 code=43
"a" - 0 Error(s), 1 Warning(s).


用reentrant则
193.5us ~ 324.0us = 130.5
  1. C:0x0000    02001F   LJMP     C:001F
  2.      2:     char addto(char i)reentrant {
  3. C:0x0003    1508     DEC      ?C_IBP(0x08)
  4. C:0x0005    A808     MOV      R0,?C_IBP(0x08)
  5. C:0x0007    A607     MOV      @R0,0x07
  6.      3:       return i?addto(i-1)+i:0;
  7. C:0x0009    A808     MOV      R0,?C_IBP(0x08)
  8. C:0x000B    E6       MOV      A,@R0
  9. C:0x000C    600C     JZ       C:001A
  10. C:0x000E    14       DEC      A
  11. C:0x000F    FF       MOV      R7,A
  12. C:0x0010    120003   LCALL    addto(C:0003)
  13. C:0x0013    A808     MOV      R0,?C_IBP(0x08)
  14. C:0x0015    E6       MOV      A,@R0
  15. C:0x0016    2F       ADD      A,R7
  16. C:0x0017    FF       MOV      R7,A
  17. C:0x0018    8002     SJMP     C:001C
  18. C:0x001A    7F00     MOV      R7,#0x00
  19.      4:     }
  20. C:0x001C    0508     INC      ?C_IBP(0x08)
  21. C:0x001E    22       RET      
  22. C:0x001F    787F     MOV      R0,#0x7F
  23. C:0x0021    E4       CLR      A
  24. C:0x0022    F6       MOV      @R0,A
  25. C:0x0023    D8FD     DJNZ     R0,C:0022
  26. C:0x0025    758108   MOV      SP(0x81),#?C_IBP(0x08)
  27. C:0x0028    02002B   LJMP     main(C:002B)
  28.      5:     void main(){
  29.      6:       P1=addto(10);
  30. C:0x002B    7F0A     MOV      R7,#0x0A
  31. C:0x002D    120003   LCALL    addto(C:0003)
  32. C:0x0030    8F90     MOV      P1(0x90),R7
  33.      7:     }
  34. C:0x0032    22       RET      
复制代码
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-3-28 21:05 , Processed in 0.045221 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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