4458565 发表于 2026-6-30 14:18:00

使用MDU16库中的FCASTL出现符号丢失 | 好像没问题了


$NOMOD51

NAME   FCASTL

/**********************************************************************************************
* float R4R5R6R7fcastl(long R4R5R6R7);//低在先!!!
* result   = value1            // long-->float
* R4R5R6R7 = R4R5R6R7
*32位 long-->32位 float

* float R4R5R6R7fcastl(int R4R5);                                          !
* result   = value1            // int-->float
* R6R7 = R4R5R6R7
*16位 int-->32位 float

* float R4R5R6R7fcastl(char R4);
* result   = value1            // char-->float
* R7 = R4R5R6R7
*8位 char-->32位 float

*用   途:STC8系列MCU
*作   者:许意义
*版   本:2.00
*日   期:2022-12-12

**********************************************************************************************/

LD_MD                  MACRO      BYTE_X, INC_DPTR
                        MOV      A,BYTE_X
                        MOVX   @DPTR,A
                IFINC_DPTR
                        INC      DPTR
                ENDIF
                                 ENDM

ST_MD                  MACRO      BYTE_X, INC_DPTR
                        MOVX   A,@DPTR
                        MOV      BYTE_X,A
                IFINC_DPTR
                        INC      DPTR
                ENDIF
                                 ENDM

WAIT                  MACRO
                        MOV      A,#0x01
                        MOVX   @DPTR,A
                        MOVX   A,@DPTR
                        JB       ACC.0,$-1
                                 ENDM

//NOMOD51 SET (SMALL) DEBUG EP
//SET (SMALL) DEBUG EP
; 特殊功能寄存器和位
P_SW2      DATA      0BAH                   ; Bit7: EAXFR
ACC                DATA    0E0H
B                DATA    0F0H
PSW                DATA    0D0H
SP                DATA    81H
DPL                DATA    82H
DPH                DATA    83H
IE                DATA    0A8H
OV          BIT         0D0H.2
P                BIT         0D0H.0
F0                BIT          0D0H.5
F1                BIT         0D0H.1
RS1          BIT         0D0H.4
RS0          BIT         0D0H.3
AC          BIT         0D0H.6
CY          BIT         0D0H.7
EA          BIT         0A8H.7
; MODE= 1, 右移(clock:3-18);MODE= 2, 左移(clock:3-18);MODE= 3, 数据规格化(clock:3-20)
; MODE= 4, 16位乘法(clock:10);MODE= 5, 16位除法(clock:9);MODE= 6, 32位/16位(clock:17)
ARCON   DATA      0FCF6H                   ; Bit: MODE,   Bit: SC
OPCON      DATA      0FCF7H                   ; Bit6: MDOV,Bit1: RST,Bit0: ENOP
MD3   DATA      0FCF0H
MD2                DATA      0FCF1H
MD1   DATA      0FCF2H
MD0                DATA      0FCF3H
MD5   DATA      0FCF4H
MD4                DATA      0FCF5H


?PR?_FCASTL?FCASTL SEGMENT CODE   
EXTRN    CODE (?C?LNEG)
PUBLIC ?C?FCASTL
PUBLIC ?C?FCASTI
PUBLIC ?C?FCASTC

RSEG?PR?_FCASTL?FCASTL

?C?FCASTL:
                  MOV      B, #0x20+0x7E       // long-->float
                  SJMP   FCASTC_002_
?C?FCASTI:
                  MOV      B, #0x10+0x7E      // int-->float
                SJMP   FCASTC_001_
?C?FCASTC:
                  MOV      B, #0x08+0x7E      // char-->float                              
                  MOV      R5, #0x00      
FCASTC_001_:                                 
                  MOV      R6, #0x00
                MOV      R7, #0x00
FCASTC_002_:         
                  RLC      A
                MOV      F0, C
                JNB      F0, FCASTC_003_
                LCALL    ?C?LNEG
FCASTC_003_:
                        PUSH         IE
                        CLR               EA
                        PUSH   P_SW2
                        ORL      P_SW2,#0x80
                        MOV      DPTR, #MD3                           
                        LD_MD    R4, 1
                        LD_MD    R5, 1
                        LD_MD    R6, 1
                        LD_MD    R7, 0
                         MOV      DPTR, #ARCON
                        LD_MD         #0x60, +1                           // 32位规格化左移(clock:3-20)
                        WAIT
                         MOV      DPTR, #ARCON
                        MOVX   A, @DPTR
                        ANL               A, #0x1F
                        XCH          A, B
                        CLR               C
                           SUBB         A, B                                  // 指数 --> R4
                         MOV      C, F0                                 
                         RRC      A
                        MOV      R4, A         
                         MOV      DPTR, #MD3                        // 小数 --> R5R6R7
                        MOVX   A, @DPTR
                         MOV      ACC.7, C
                        MOV      R5, A
                        INC      DPTR
                         ST_MD    R6,+1
                         ST_MD    R7,0
                        POP      P_SW2
                        POP               IE
                        RET

                        END

这是官方给的使用MDU16加速的整数转单精度程序,在主函数和中断同时使用这个程序会导致输出结果符号丢失。

4458565 发表于 2026-6-30 14:20:44

这里看到符号保存在中断保护之前

4458565 发表于 2026-6-30 16:23:18

浮点转整数好像也有一样的问题

狂热主宰 发表于 2026-6-30 16:48:17

如果仅简单应用
变量符号可否分开保存

王昱顺 发表于 2026-6-30 18:21:30

请从此处下载官方LIB库

深圳国芯人工智能有限公司-库函数

4458565 发表于 2026-7-1 14:52:15

王昱顺 发表于 2026-6-30 18:21
请从此处下载官方LIB库

深圳国芯人工智能有限公司-库函数

原来还有最新版的,好像是没问题了
页: [1]
查看完整版本: 使用MDU16库中的FCASTL出现符号丢失 | 好像没问题了