hrefspace

 找回密码
 立即注册
搜索
热搜: PHP PS 程序设计
查看: 452|回复: 5

有搞单片机的吗

[复制链接]

460

主题

460

帖子

1402

积分

版主

Rank: 7Rank: 7Rank: 7

积分
1402
发表于 2024-4-10 16:20:57 | 显示全部楼层 |阅读模式
都说单片机最好不重入。可是
  1.       ORG 0000H     LJMP 0030H      ORG 002FH     RETISTART:MOV SP,#127      MOV R2,#10    ACALL ADDTO      MOV P1,A     SJMP $ADDTO:MOV A,R2       JZ ZERO     PUSH ACC      DEC R2    ACALL ADDTO      POP B      MOV R2,B      ADD A,B      RETZERO: CLR A      RET          END
复制代码
对应C中
  1. char addto(char i){  return i?addto(i-1)+i:0;}void main(){  P1=addto(10);}
复制代码
不见得花多少时间(82us,164周期)
在大工程中更不觉有什么不同
为什么呢
回复

使用道具 举报

1

主题

184

帖子

5

积分

新手上路

Rank: 1

积分
5
发表于 2024-4-10 16:21:40 | 显示全部楼层
完全不懂单片机,但是听说过VHDL
回复

使用道具 举报

0

主题

184

帖子

18

积分

新手上路

Rank: 1

积分
18
发表于 2024-4-10 16:21:56 | 显示全部楼层
并不是说不能重入。而是因为早期的单片机RAM资源太少,递归深了很快资源耗尽。
回复

使用道具 举报

256

主题

429

帖子

951

积分

中郎将

Rank: 4

积分
951
发表于 2024-4-10 16:22:08 | 显示全部楼层
多用寄存器,少用栈,对吧。

不过,现在的C/C++的函数 都是基于栈这个概念的。
回复

使用道具 举报

0

主题

199

帖子

2

积分

新手上路

Rank: 1

积分
2
发表于 2024-4-10 16:22:23 | 显示全部楼层
  1. #include <stdio.h>int addto(int i){  return i>0?addto(i-1)+i:0;}void addto2(int i,int *ans){  *ans = i>0?addto(i-1)+i:0;}int main(){  int n=0,PI=addto(10);  addto2(10,&n);  printf("PI=%d\tn=%d",PI,n);          return 0;}
复制代码
回复

使用道具 举报

0

主题

167

帖子

36

积分

新手上路

Rank: 1

积分
36
发表于 2024-4-10 16:22:28 | 显示全部楼层
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:     char addto(char i)reentrant { C:0x0003    1508     DEC      ?C_IBP(0x08)C:0x0005    A808     MOV      R0,?C_IBP(0x08)C:0x0007    A607     MOV      @R0,0x07     3:       return i?addto(i-1)+i:0; C:0x0009    A808     MOV      R0,?C_IBP(0x08)C:0x000B    E6       MOV      A,@R0C:0x000C    600C     JZ       C:001AC:0x000E    14       DEC      AC:0x000F    FF       MOV      R7,AC:0x0010    120003   LCALL    addto(C:0003)C:0x0013    A808     MOV      R0,?C_IBP(0x08)C:0x0015    E6       MOV      A,@R0C:0x0016    2F       ADD      A,R7C:0x0017    FF       MOV      R7,AC:0x0018    8002     SJMP     C:001CC:0x001A    7F00     MOV      R7,#0x00     4:     } C:0x001C    0508     INC      ?C_IBP(0x08)C:0x001E    22       RET      C:0x001F    787F     MOV      R0,#0x7FC:0x0021    E4       CLR      AC:0x0022    F6       MOV      @R0,AC:0x0023    D8FD     DJNZ     R0,C:0022C:0x0025    758108   MOV      SP(0x81),#?C_IBP(0x08)C:0x0028    02002B   LJMP     main(C:002B)     5:     void main(){      6:       P1=addto(10); C:0x002B    7F0A     MOV      R7,#0x0AC:0x002D    120003   LCALL    addto(C:0003)C:0x0030    8F90     MOV      P1(0x90),R7     7:     }C:0x0032    22       RET      
复制代码
回复

使用道具 举报

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

本版积分规则

QQ|Archiver|手机版|小黑屋|hrefspace

GMT+8, 2024-5-1 23:52 , Processed in 0.081950 second(s), 21 queries .

Powered by hrefspace X3.4 Licensed

Copyright © 2022, hrefspace.

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