This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
您好、C2000专家!
我正在编写用于电机控制的裸机代码。
我有与定时器1和定时器2触发的两个中断嵌套相关的问题。
具体而言、ISR2由计时器2触发、ISR1由计时器1触发。
首先, 让我澄清一下 两个中断的嵌套效果很好:我可以在 ISR2中嵌套 ISR1。
但是、我注意到如果 ISR1在 数学运算期间内嵌套 ISR2、则会出现一些问题。
如下图所示:
VADC =-1.5;
IPCA=vADC/16.6664;
预期结果 IADC =-0.09
已获得的结果 IADC =-0.0312
为什么会发生这种情况?
很明显、我注意到、 如果 我在指令 IADC 执行期间禁用嵌套、则不会出现此问题;IADC = vADC/16.6664。
例如、
IER = 0x0;//禁用嵌套
IPCA=vADC/16.6664;
IER = 0x2000;//启用 嵌套
另一方面,如果我用 IPCA=vADC*0.06000096 (实际上0.06000096是16.6664的倒数)替换前面的等式,问题就不会发生。
我愿意做进一步的说明。
等待您的帮助...
此致、
贝尼托
您好 Benito、
您是否启用了任何优化? 如果是、禁用它们时是否会出现问题? 如果您在程序中有问题的位置放置了一个断点、您能否检查用于条件/方程的所有变量的值?
尊敬的先生: Amir,Omer
感谢您的反馈
您是否打开了任何优化? 如果是,则禁用它们时是否会出现问题?
否、我尚未启用编译器优化
如果您在程序中有问题的位置放置一个断点,您可以检查用于条件/方程的所有变量的值吗?
就在这里。
您可以看到、第583行(绿线)有一个断点。
左侧(选项卡表达式)显示了变量:
VADC 实际上等于-1.5。
空间碎片协委会=-1.5/16.6664=-0.03125. 这是错误的结果。 正确结果应为-0.09。
如果我修改代码以禁用嵌套、同时微控制器执行计算 IADC = vADC/16.6664、不会发生这个错误。
同样,如果我 用等效的乘法替换除法(例如 IADC = vADC*0.060),也不会发生此错误。
我可作进一步澄清。
此致、
贝尼托
您好 Benito、
类似地,如果我 用等效的乘法替换除法(例如 IADC = vADC*0.060),则不会发生此错误。
您能否共享 以下汇编代码的屏幕截图:
是否有任何其他修改 vADC 或 IADC 的位置? 这些地方中是否有一个像中断一样的地方有可能发生在 线路 IADC = vADC/16.6664并且达到条件的时间内?
尊敬的先生: Amir,Omer
公式的汇编代码、该公式使用 乘法 :
761F002C MOVW DP, #0x2c 088d08: 0E00 MOVU ACC, @0x0 088d09: BDA90F12 MOV32 R0H, @ACC 088d0b: 7700 NOP 088d0c: E801F839 MOVIZ R1, #0x3f07 088d0e: E80852A9 MOVXI R1H, #0xa55 088d10: E904CBE9 MOVIX R1L, #0x997d 088d12: E6870000 UI32TOF64 R0, R0H 088d14: E90F5659 MOVXI R1L, #0xeacb 088d16: E7800040 MPYF64 R0, R0, R1 088d18: E801FDB9 MOVIZ R1, #0x3fb7 088d1a: E80852A9 MOVXI R1H, #0xa55 088d1c: E904CBE9 MOVIX R1L, #0x997d 088d1e: E90F5659 MOVXI R1L, #0xeacb 088d20: E7A00040 SUBF64 R0, R0, R1 088d22: E8020699 MOVIZ R1, #0x40d3 088d24: E80C4001 MOVXI R1H, #0x8800 088d26: E9000001 MOVIX R1L, #0x0 088d28: E9080001 MOVXI R1L, #0x0 088d2a: E7800040 MPYF64 R0, R0, R1 088d2c: 7700 NOP 088d2d: 7700 NOP 088d2e: E98FF800 ADDF64 R0, #0x3fe0, R0 088d30: 7700 NOP 088d31: 7700 NOP 088d32: E6840000 F64TOI32 R0H, R0 088d34: 761F05C6 MOVW DP, #0x5c6 088d36: E2130031 MOV16 @0x31, R0H
下面、使用德州仪器 TI.com.cn 分部:
088d0a: 761F002C MOVW DP, #0x2c 088d0c: 0E00 MOVU ACC, @0x0 088d0d: BDA90F12 MOV32 R0H, @ACC 088d0f: 7700 NOP 088d10: E802069C MOVIZ R4, #0x40d3 088d12: E80C4004 MOVXI R4H, #0x8800 088d14: E8020183 MOVIZ R3, #0x4030 088d16: E6870000 UI32TOF64 R0, R0H 088d18: E9000004 MOVIX R4L, #0x0 088d1a: E94FD200 MPYF64 R0, #0x3f48, R0 088d1c: E80D54CB MOVXI R3H, #0xaa99 088d1e: E90185F3 MOVIX R3L, #0x30be 088d20: E9AFFE02 ADDF64 R2, #0xbff8, R0 088d22: E9086F6B MOVXI R3L, #0xded 088d24: E9080004 MOVXI R4L, #0x0 088d26: E5BE PREDIVF64 R0H, R2, R1, R3 088d27: E566 SUBC3F64 R2, R1, R3 088d28: E566 SUBC3F64 R2, R1, R3 088d29: E566 SUBC3F64 R2, R1, R3 088d2a: E566 SUBC3F64 R2, R1, R3 088d2b: E566 SUBC3F64 R2, R1, R3 088d2c: E566 SUBC3F64 R2, R1, R3 088d2d: E566 SUBC3F64 R2, R1, R3 088d2e: E566 SUBC3F64 R2, R1, R3 088d2f: E566 SUBC3F64 R2, R1, R3 088d30: E566 SUBC3F64 R2, R1, R3 088d31: E566 SUBC3F64 R2, R1, R3 088d32: E566 SUBC3F64 R2, R1, R3 088d33: E566 SUBC3F64 R2, R1, R3 088d34: E566 SUBC3F64 R2, R1, R3 088d35: E566 SUBC3F64 R2, R1, R3 088d36: E566 SUBC3F64 R2, R1, R3 088d37: E566 SUBC3F64 R2, R1, R3 088d38: E566 SUBC3F64 R2, R1, R3 088d39: E566 SUBC3F64 R2, R1, R3 088d3a: E5BF POSTDIVF64 R1, R0H 088d3b: E7800108 MPYF64 R0, R1, R4 088d3d: 7700 NOP 088d3e: 7700 NOP 088d3f: E98FF800 ADDF64 R0, #0x3fe0, R0 088d41: 7700 NOP 088d42: 7700 NOP 088d43: E6840000 F64TOI32 R0H, R0 088d45: 761F05C6 MOVW DP, #0x5c6 088d47: E2130031 MOV16 @0x31, R0H
下面、托管乘法/除法的函数的代码:
E20204BD MOV32 *SP++, R4L 0875d4: E20304BD MOV32 *SP++, R4H 0875d6: E20205BD MOV32 *SP++, R5L 0875d8: E20305BD MOV32 *SP++, R5H 0875da: E20206BD MOV32 *SP++, R6L 0875dc: E20306BD MOV32 *SP++, R6H 0875de: E20207BD MOV32 *SP++, R7L 0875e0: E20307BD MOV32 *SP++, R7H 0875e2: FE0A ADDB SP, #10 647 i1Rout = 0.0; i1Sout = 0.0; i1Tout = 0.0; 0875e3: E590 ZERO R0 0875e4: E2020046 MOV32 *-SP[6], R0L 0875e6: E2030044 MOV32 *-SP[4], R0H 0875e8: E202004A MOV32 *-SP[10], R0L 0875ea: E2030048 MOV32 *-SP[8], R0H 0875ec: E597 ZERO R7 648 vRSout = 0.0; vSTout = 0.0; vTRout = 0.0; 0875ed: E596 ZERO R6 0875ee: E595 ZERO R5 0875ef: E594 ZERO R4 650 indWin++; 0875f0: 761F02A5 MOVW DP, #0x2a5 0875f2: 0A09 INC @0x9 651 indWin = indWin % NCAMPEFF; 0875f3: 027D MOVB ACC, #125 0875f4: BDA90F1E MOV32 R3H, @ACC 0875f6: 7700 NOP 0875f7: E2C80109 I16TOF32 R1H, @0x9 0875f9: 7700 NOP 0875fa: E851E009 MPYF32 R1H, #0x4780, R1H 0875fc: E68D001B I16TOF32 R3H, R3H 0875fe: E6880009 F32TOI32 R1H, R1H 087600: E688001B F32TOI32 R3H, R3H 087602: 7700 NOP 087603: E568 ABSI32DIV32 R2H, R1H, R3H 087604: E564 SUBC4UI32 R2H, R1H, R3H 087605: E564 SUBC4UI32 R2H, R1H, R3H 087606: E564 SUBC4UI32 R2H, R1H, R3H 087607: E564 SUBC4UI32 R2H, R1H, R3H 087608: E56A NEGI32DIV32 R1H, R2H 087609: 7700 NOP 08760a: BFA90F1A MOV32 @ACC, R2H 08760c: 9609 MOV @0x9, AL 654 xi1R[indWin] = ((float)(varCpu1.tar)) * ((float)(varCpu1.tar)); 08760d: 3B01 SETC SXM 08760e: 761F05C7 MOVW DP, #0x5c7 087610: E2C80032 I16TOF32 R0H, @0x32 087612: 761F02A5 MOVW DP, #0x2a5 087614: 56030109 MOV ACC, @0x9 << 1 087616: 761F05C7 MOVW DP, #0x5c7 087618: E2C80132 I16TOF32 R1H, @0x32 08761a: 8F01743A MOVL XAR4, #0x01743a 08761c: E7000008 MPYF32 R0H, R1H, R0H 08761e: 560100A4 ADDL @XAR4, ACC 087620: E20300C4 MOV32 *+XAR4[0], R0H 655 xi1S[indWin] = ((float)(varCpu1.tas)) * ((float)(varCpu1.tas)); 087622: E2C80033 I16TOF32 R0H, @0x33 087624: 761F02A5 MOVW DP, #0x2a5 087626: 56030109 MOV ACC, @0x9 << 1 087628: 761F05C7 MOVW DP, #0x5c7 08762a: E2C80133 I16TOF32 R1H, @0x33 08762c: 8F017534 MOVL XAR4, #0x017534 08762e: E7000008 MPYF32 R0H, R1H, R0H 087630: 560100A4 ADDL @XAR4, ACC 087632: E20300C4 MOV32 *+XAR4[0], R0H 656 xi1T[indWin] = ((float)(varCpu1.tat)) * ((float)(varCpu1.tat)); 087634: E2C80034 I16TOF32 R0H, @0x34 087636: 761F02A5 MOVW DP, #0x2a5 087638: 56030109 MOV ACC, @0x9 << 1 08763a: 761F05C7 MOVW DP, #0x5c7 08763c: E2C80134 I16TOF32 R1H, @0x34 08763e: 8F01762E MOVL XAR4, #0x01762e 087640: E7000008 MPYF32 R0H, R1H, R0H 087642: 560100A4 ADDL @XAR4, ACC 087644: E20300C4 MOV32 *+XAR4[0], R0H 657 xvRS[indWin] = ((float)(varCpu1.vRS)) * ((float)(varCpu1.vRS)); 087646: E2C8003B I16TOF32 R0H, @0x3b 087648: 761F02A5 MOVW DP, #0x2a5 08764a: 56030109 MOV ACC, @0x9 << 1 08764c: 761F05C7 MOVW DP, #0x5c7 08764e: E2C8013B I16TOF32 R1H, @0x3b 087650: 8F017728 MOVL XAR4, #0x017728 087652: E7000008 MPYF32 R0H, R1H, R0H 087654: 560100A4 ADDL @XAR4, ACC 087656: E20300C4 MOV32 *+XAR4[0], R0H 658 xvST[indWin] = ((float)(varCpu1.vST)) * ((float)(varCpu1.vST)); 087658: E2C8003C I16TOF32 R0H, @0x3c 08765a: 761F02A5 MOVW DP, #0x2a5 08765c: 56030109 MOV ACC, @0x9 << 1 08765e: 761F05C7 MOVW DP, #0x5c7 087660: E2C8013C I16TOF32 R1H, @0x3c 087662: 8F017822 MOVL XAR4, #0x017822 087664: E7000008 MPYF32 R0H, R1H, R0H 087666: 560100A4 ADDL @XAR4, ACC 087668: E20300C4 MOV32 *+XAR4[0], R0H 659 xvTR[indWin] = ((float)(varCpu1.vTR)) * ((float)(varCpu1.vTR)); 08766a: E2C8003D I16TOF32 R0H, @0x3d 08766c: 761F02A5 MOVW DP, #0x2a5 08766e: 56030109 MOV ACC, @0x9 << 1 087670: 761F05C7 MOVW DP, #0x5c7 087672: E2C8013D I16TOF32 R1H, @0x3d 087674: 8F01791C MOVL XAR4, #0x01791c 087676: E7000008 MPYF32 R0H, R1H, R0H 087678: 560100A4 ADDL @XAR4, ACC 08767a: E20300C4 MOV32 *+XAR4[0], R0H 662 for(i=0; i< NCAMPEFF; i++) 08767c: BE00 MOVB XAR6, #0x00 08767d: 92A6 MOV AL, @AR6 08767e: 527D CMPB AL, #0x7d 08767f: 6356 SB $C$L132, GEQ 087680: 3B01 SETC SXM 664 i1Rout += (float64_t)(xi1R[i]); $C$L131: 087681: 560301A6 MOV ACC, @AR6 << 1 087683: 8F01743A MOVL XAR4, #0x01743a 087685: 560100A4 ADDL @XAR4, ACC 087687: E2AF0044 MOV32 R0H, *-SP[4], UNCF 087689: E29F0046 MOV32 R0L, *-SP[6], UNCF 08768b: E28C01C4 F32TOF64 R1, *+XAR4[0] 08768d: E7900040 ADDF64 R0, R0, R1 08768f: 7700 NOP 087690: 7700 NOP 087691: E2020046 MOV32 *-SP[6], R0L 087693: E2030044 MOV32 *-SP[4], R0H 665 i1Sout += (float64_t)(xi1S[i]); 087695: 560301A6 MOV ACC, @AR6 << 1 087697: 8F017534 MOVL XAR4, #0x017534 087699: 560100A4 ADDL @XAR4, ACC 08769b: E2AF0048 MOV32 R0H, *-SP[8], UNCF 08769d: E29F004A MOV32 R0L, *-SP[10], UNCF 08769f: E28C01C4 F32TOF64 R1, *+XAR4[0] 0876a1: E7900040 ADDF64 R0, R0, R1 0876a3: 7700 NOP 0876a4: 7700 NOP 0876a5: E202004A MOV32 *-SP[10], R0L 0876a7: E2030048 MOV32 *-SP[8], R0H 666 i1Tout += (float64_t)(xi1T[i]); 0876a9: 560301A6 MOV ACC, @AR6 << 1 0876ab: 8F01762E MOVL XAR4, #0x01762e 0876ad: 560100A4 ADDL @XAR4, ACC 0876af: E28C02C4 F32TOF64 R2, *+XAR4[0] 0876b1: E79000BF ADDF64 R7, R7, R2 667 vRSout += (float64_t)(xvRS[i]); 0876b3: 560301A6 MOV ACC, @AR6 << 1 0876b5: 8F017728 MOVL XAR4, #0x017728 0876b7: 560100A4 ADDL @XAR4, ACC 0876b9: E28C02C4 F32TOF64 R2, *+XAR4[0] 0876bb: E79000B6 ADDF64 R6, R6, R2 668 vSTout += (float64_t)(xvST[i]); 0876bd: 560301A6 MOV ACC, @AR6 << 1 0876bf: 8F017822 MOVL XAR4, #0x017822 0876c1: 560100A4 ADDL @XAR4, ACC 0876c3: E28C02C4 F32TOF64 R2, *+XAR4[0] 0876c5: E79000AD ADDF64 R5, R5, R2 669 vTRout += (float64_t)(xvTR[i]); 0876c7: 560301A6 MOV ACC, @AR6 << 1 0876c9: 8F01791C MOVL XAR4, #0x01791c 0876cb: 560100A4 ADDL @XAR4, ACC 0876cd: E28C02C4 F32TOF64 R2, *+XAR4[0] 0876cf: E79000A4 ADDF64 R4, R4, R2 662 for(i=0; i< NCAMPEFF; i++) 0876d1: DE01 ADDB XAR6, #1 0876d2: 92A6 MOV AL, @AR6 0876d3: 527D CMPB AL, #0x7d 0876d4: 64AD SB $C$L131, LT 673 i1Rout /= NCAMPEFF ; $C$L132: 0876d5: E80202FB MOVIZ R3, #0x405f 0876d7: E2AF0244 MOV32 R2H, *-SP[4], UNCF 0876d9: E80A0003 MOVXI R3H, #0x4000 0876db: E29F0246 MOV32 R2L, *-SP[6], UNCF 0876dd: E9000003 MOVIX R3L, #0x0 0876df: E9080003 MOVXI R3L, #0x0 0876e1: E5BE PREDIVF64 R0H, R2, R1, R3 0876e2: E566 SUBC3F64 R2, R1, R3 0876e3: E566 SUBC3F64 R2, R1, R3 0876e4: E566 SUBC3F64 R2, R1, R3 0876e5: E566 SUBC3F64 R2, R1, R3 0876e6: E566 SUBC3F64 R2, R1, R3 0876e7: E566 SUBC3F64 R2, R1, R3 0876e8: E566 SUBC3F64 R2, R1, R3 0876e9: E566 SUBC3F64 R2, R1, R3 0876ea: E566 SUBC3F64 R2, R1, R3 0876eb: E566 SUBC3F64 R2, R1, R3 0876ec: E566 SUBC3F64 R2, R1, R3 0876ed: E566 SUBC3F64 R2, R1, R3 0876ee: E566 SUBC3F64 R2, R1, R3 0876ef: E566 SUBC3F64 R2, R1, R3 0876f0: E566 SUBC3F64 R2, R1, R3 0876f1: E566 SUBC3F64 R2, R1, R3 0876f2: E566 SUBC3F64 R2, R1, R3 0876f3: E566 SUBC3F64 R2, R1, R3 0876f4: E566 SUBC3F64 R2, R1, R3 0876f5: E5BF POSTDIVF64 R1, R0H 0876f6: E2020146 MOV32 *-SP[6], R1L 0876f8: E2030144 MOV32 *-SP[4], R1H 674 i1Sout /= NCAMPEFF ; 0876fa: E2AF0248 MOV32 R2H, *-SP[8], UNCF 0876fc: E80202FB MOVIZ R3, #0x405f 0876fe: E29F024A MOV32 R2L, *-SP[10], UNCF 087700: E80A0003 MOVXI R3H, #0x4000 087702: E9000003 MOVIX R3L, #0x0 087704: E9080003 MOVXI R3L, #0x0 087706: E5BE PREDIVF64 R0H, R2, R1, R3 087707: E566 SUBC3F64 R2, R1, R3 087708: E566 SUBC3F64 R2, R1, R3 087709: E566 SUBC3F64 R2, R1, R3 08770a: E566 SUBC3F64 R2, R1, R3 08770b: E566 SUBC3F64 R2, R1, R3 08770c: E566 SUBC3F64 R2, R1, R3 08770d: E566 SUBC3F64 R2, R1, R3 08770e: E566 SUBC3F64 R2, R1, R3 08770f: E566 SUBC3F64 R2, R1, R3 087710: E566 SUBC3F64 R2, R1, R3 087711: E566 SUBC3F64 R2, R1, R3 087712: E566 SUBC3F64 R2, R1, R3 087713: E566 SUBC3F64 R2, R1, R3 087714: E566 SUBC3F64 R2, R1, R3 087715: E566 SUBC3F64 R2, R1, R3 087716: E566 SUBC3F64 R2, R1, R3 087717: E566 SUBC3F64 R2, R1, R3 087718: E566 SUBC3F64 R2, R1, R3 087719: E566 SUBC3F64 R2, R1, R3 08771a: E5BF POSTDIVF64 R1, R0H 08771b: E202014A MOV32 *-SP[10], R1L 08771d: E2030148 MOV32 *-SP[8], R1H 675 i1Tout /= NCAMPEFF ; 08771f: E6DF003A MOV64 R2, R7, UNCF 087721: E80202FB MOVIZ R3, #0x405f 087723: E80A0003 MOVXI R3H, #0x4000 087725: E9000003 MOVIX R3L, #0x0 087727: E9080003 MOVXI R3L, #0x0 087729: E5BE PREDIVF64 R0H, R2, R1, R3 08772a: E566 SUBC3F64 R2, R1, R3 08772b: E566 SUBC3F64 R2, R1, R3 08772c: E566 SUBC3F64 R2, R1, R3 08772d: E566 SUBC3F64 R2, R1, R3 08772e: E566 SUBC3F64 R2, R1, R3 08772f: E566 SUBC3F64 R2, R1, R3 087730: E566 SUBC3F64 R2, R1, R3 087731: E566 SUBC3F64 R2, R1, R3 087732: E566 SUBC3F64 R2, R1, R3 087733: E566 SUBC3F64 R2, R1, R3 087734: E566 SUBC3F64 R2, R1, R3 087735: E566 SUBC3F64 R2, R1, R3 087736: E566 SUBC3F64 R2, R1, R3 087737: E566 SUBC3F64 R2, R1, R3 087738: E566 SUBC3F64 R2, R1, R3 087739: E566 SUBC3F64 R2, R1, R3 08773a: E566 SUBC3F64 R2, R1, R3 08773b: E566 SUBC3F64 R2, R1, R3 08773c: E566 SUBC3F64 R2, R1, R3 08773d: E5BF POSTDIVF64 R1, R0H 08773e: E6DF000F MOV64 R7, R1, UNCF 676 vRSout /= NCAMPEFF ; 087740: E6DF0032 MOV64 R2, R6, UNCF 087742: E80202FB MOVIZ R3, #0x405f 087744: E80A0003 MOVXI R3H, #0x4000 087746: E9000003 MOVIX R3L, #0x0 087748: E9080003 MOVXI R3L, #0x0 08774a: E5BE PREDIVF64 R0H, R2, R1, R3 08774b: E566 SUBC3F64 R2, R1, R3 08774c: E566 SUBC3F64 R2, R1, R3 08774d: E566 SUBC3F64 R2, R1, R3 08774e: E566 SUBC3F64 R2, R1, R3 08774f: E566 SUBC3F64 R2, R1, R3 087750: E566 SUBC3F64 R2, R1, R3 087751: E566 SUBC3F64 R2, R1, R3 087752: E566 SUBC3F64 R2, R1, R3 087753: E566 SUBC3F64 R2, R1, R3 087754: E566 SUBC3F64 R2, R1, R3 087755: E566 SUBC3F64 R2, R1, R3 087756: E566 SUBC3F64 R2, R1, R3 087757: E566 SUBC3F64 R2, R1, R3 087758: E566 SUBC3F64 R2, R1, R3 087759: E566 SUBC3F64 R2, R1, R3 08775a: E566 SUBC3F64 R2, R1, R3 08775b: E566 SUBC3F64 R2, R1, R3 08775c: E566 SUBC3F64 R2, R1, R3 08775d: E566 SUBC3F64 R2, R1, R3 08775e: E5BF POSTDIVF64 R1, R0H 08775f: E6DF000E MOV64 R6, R1, UNCF 677 vSTout /= NCAMPEFF ; 087761: E6DF002A MOV64 R2, R5, UNCF 087763: E80202FB MOVIZ R3, #0x405f 087765: E80A0003 MOVXI R3H, #0x4000 087767: E9000003 MOVIX R3L, #0x0 087769: E9080003 MOVXI R3L, #0x0 08776b: E5BE PREDIVF64 R0H, R2, R1, R3 08776c: E566 SUBC3F64 R2, R1, R3 08776d: E566 SUBC3F64 R2, R1, R3 08776e: E566 SUBC3F64 R2, R1, R3 08776f: E566 SUBC3F64 R2, R1, R3 087770: E566 SUBC3F64 R2, R1, R3 087771: E566 SUBC3F64 R2, R1, R3 087772: E566 SUBC3F64 R2, R1, R3 087773: E566 SUBC3F64 R2, R1, R3 087774: E566 SUBC3F64 R2, R1, R3 087775: E566 SUBC3F64 R2, R1, R3 087776: E566 SUBC3F64 R2, R1, R3 087777: E566 SUBC3F64 R2, R1, R3 087778: E566 SUBC3F64 R2, R1, R3 087779: E566 SUBC3F64 R2, R1, R3 08777a: E566 SUBC3F64 R2, R1, R3 08777b: E566 SUBC3F64 R2, R1, R3 08777c: E566 SUBC3F64 R2, R1, R3 08777d: E566 SUBC3F64 R2, R1, R3 08777e: E566 SUBC3F64 R2, R1, R3 08777f: E5BF POSTDIVF64 R1, R0H 087780: E6DF000D MOV64 R5, R1, UNCF 678 vTRout /= NCAMPEFF ; 087782: E6DF0022 MOV64 R2, R4, UNCF 087784: E80202FB MOVIZ R3, #0x405f 087786: E80A0003 MOVXI R3H, #0x4000 087788: E9000003 MOVIX R3L, #0x0 08778a: E9080003 MOVXI R3L, #0x0 08778c: E5BE PREDIVF64 R0H, R2, R1, R3 08778d: E566 SUBC3F64 R2, R1, R3 08778e: E566 SUBC3F64 R2, R1, R3 08778f: E566 SUBC3F64 R2, R1, R3 087790: E566 SUBC3F64 R2, R1, R3 087791: E566 SUBC3F64 R2, R1, R3 087792: E566 SUBC3F64 R2, R1, R3 087793: E566 SUBC3F64 R2, R1, R3 087794: E566 SUBC3F64 R2, R1, R3 087795: E566 SUBC3F64 R2, R1, R3 087796: E566 SUBC3F64 R2, R1, R3 087797: E566 SUBC3F64 R2, R1, R3 087798: E566 SUBC3F64 R2, R1, R3 087799: E566 SUBC3F64 R2, R1, R3 08779a: E566 SUBC3F64 R2, R1, R3 08779b: E566 SUBC3F64 R2, R1, R3 08779c: E566 SUBC3F64 R2, R1, R3 08779d: E566 SUBC3F64 R2, R1, R3 08779e: E566 SUBC3F64 R2, R1, R3 08779f: E566 SUBC3F64 R2, R1, R3 0877a0: E5BF POSTDIVF64 R1, R0H 0877a1: E6DF000C MOV64 R4, R1, UNCF 681 varCpu1.i1REff = (short)sqrtf(i1Rout); 0877a3: E2AF0044 MOV32 R0H, *-SP[4], UNCF 0877a5: E29F0046 MOV32 R0L, *-SP[6], UNCF 0877a7: E6900000 F64TOF32 R0H, R0 0877a9: 7648CFB8 LCR sqrtf 0877ab: E68C0000 F32TOI16 R0H, R0H 0877ad: 761F05C7 MOVW DP, #0x5c7 0877af: E2130035 MOV16 @0x35, R0H 682 varCpu1.i1SEff = (short)sqrtf(i1Sout); 0877b1: E2AF0048 MOV32 R0H, *-SP[8], UNCF 0877b3: E29F004A MOV32 R0L, *-SP[10], UNCF 0877b5: E6900000 F64TOF32 R0H, R0 0877b7: 7648CFB8 LCR sqrtf 0877b9: E68C0000 F32TOI16 R0H, R0H 0877bb: 761F05C7 MOVW DP, #0x5c7 0877bd: E2130036 MOV16 @0x36, R0H 683 varCpu1.i1TEff = (short)sqrtf(i1Tout); 0877bf: E6900038 F64TOF32 R0H, R7 0877c1: 7648CFB8 LCR sqrtf 0877c3: E68C0000 F32TOI16 R0H, R0H 0877c5: 761F05C7 MOVW DP, #0x5c7 0877c7: E2130037 MOV16 @0x37, R0H 684 varCpu1.vRSEff = (short)sqrtf(vRSout); 0877c9: E6900030 F64TOF32 R0H, R6 0877cb: 7648CFB8 LCR sqrtf 0877cd: E68C0000 F32TOI16 R0H, R0H 0877cf: 761F05C7 MOVW DP, #0x5c7 0877d1: E2130038 MOV16 @0x38, R0H 685 varCpu1.vSTEff = (short)sqrtf(vSTout); 0877d3: E6900028 F64TOF32 R0H, R5 0877d5: 7648CFB8 LCR sqrtf 0877d7: E68C0000 F32TOI16 R0H, R0H 0877d9: 761F05C7 MOVW DP, #0x5c7 0877db: E2130039 MOV16 @0x39, R0H 686 varCpu1.vTREff = (short)sqrtf(vTRout); 0877dd: E6900020 F64TOF32 R0H, R4 0877df: 7648CFB8 LCR sqrtf 0877e1: E68C0000 F32TOI16 R0H, R0H 0877e3: 761F05C7 MOVW DP, #0x5c7 0877e5: E213003A MOV16 @0x3a, R0H 688 dV = varCpu1.vFil2 - varCpu1.vF2Fil; 0877e7: 922B MOV AL, @0x2b 0877e8: 9E2C SUB AL, @0x2c 0877e9: 9641 MOV *-SP[1], AL 689 varCpu1.vF2Fil += dV / 5; //kfvF; 0877ea: 0205 MOVB ACC, #5 0877eb: BDA90F1E MOV32 R3H, @ACC 0877ed: 7700 NOP 0877ee: E2C80141 I16TOF32 R1H, *-SP[1] 0877f0: 7700 NOP 0877f1: E851E009 MPYF32 R1H, #0x4780, R1H 0877f3: E68D001B I16TOF32 R3H, R3H 0877f5: E6880009 F32TOI32 R1H, R1H 0877f7: E688001B F32TOI32 R3H, R3H 0877f9: 7700 NOP 0877fa: E568 ABSI32DIV32 R2H, R1H, R3H 0877fb: E564 SUBC4UI32 R2H, R1H, R3H 0877fc: E564 SUBC4UI32 R2H, R1H, R3H 0877fd: E564 SUBC4UI32 R2H, R1H, R3H 0877fe: E564 SUBC4UI32 R2H, R1H, R3H 0877ff: E56A NEGI32DIV32 R1H, R2H 087800: 7700 NOP 087801: BFA90F16 MOV32 @ACC, R1H 087803: 722C ADD @0x2c, AL 690 } 087804: FE8A SUBB SP, #10 087805: E2AF07BE MOV32 R7H, *--SP, UNCF 087807: E29F07BE MOV32 R7L, *--SP, UNCF 087809: E2AF06BE MOV32 R6H, *--SP, UNCF 08780b: E29F06BE MOV32 R6L, *--SP, UNCF 08780d: E2AF05BE MOV32 R5H, *--SP, UNCF 08780f: E29F05BE MOV32 R5L, *--SP, UNCF 087811: E2AF04BE MOV32 R4H, *--SP, UNCF 087813: E29F04BE MOV32 R4L, *--SP, UNCF 087815: 0006 LRETR 462
是否有任何其他位置修改 vADC 或 IADC? 这些地方中是否有一个像中断一样的地方可能发生在 线路 IADC = vADC/16.6664且达到条件的时间内?
我进行了此检查、因为出现了问题。
没有其它修改 vADC 或 IADC 的点。
感谢您的支持。
贝尼托
您好 Benito、
从效率和解决问题的角度来看、我想说您可能应该使用乘法而不是除法:
您为嵌套而附加的代码不会显示在 getAdcc4函数中 IADC 和 vADC 正在修改的位置、请仅限制您附加的汇编、以便我可以进行适当的一对一比较。 你有一个使用乘法的权变措施、所以你可以继续这样做、但是如果你想要调试带有嵌套中断的除法、那么我将需要这个信息。
尊敬的 Omer:
根据您的要求、我在此处附上 getAdcc4函数在三种情况下的汇编代码:
1)乘法+嵌套启用(无错误)
2) 2)除法+嵌套启用(错误)
3) 3)除法+嵌套禁用(无错误)
1) 1)在下方 使用乘法的 getAdcc4函数 :
C 函数
signed int getAdcc4(unsigned int k_trasd, unsigned int k) { static float vADC = 0; static float iADC = 0; static float iLem = 0; static unsigned int err = 0; vADC = -1.5; if ((vADC > -1.45) || (vADC < -1.55)) err++; iADC = vADC*0.06000096; if ((iADC > -0.09) || (iADC < -0.1)) err++; iLem = (k*k_trasd*iADC)+0.5; if (iLem > -1700) err++; return ((signed int)(iLem)); }
汇编代码
getAdcc4(): FE04 ADDB SP, #4 08b333: 9744 MOV *-SP[4], AH 08b334: 9643 MOV *-SP[3], AL 575 vADC = -1.5; 08b335: E805FE00 MOVIZ R0, #0xbfc0 08b337: 761F02A4 MOVW DP, #0x2a4 08b339: E203001C MOV32 @0x1c, R0H 576 if ((vADC > -1.45) || (vADC < -1.55)) 08b33b: E805FFB9 MOVIZ R1, #0xbff7 08b33d: E8099999 MOVXI R1H, #0x3333 08b33f: E28C001C F32TOF64 R0, @0x1c 08b341: E9019999 MOVIX R1L, #0x3333 08b343: E9099999 MOVXI R1L, #0x3333 08b345: E6980008 CMPF64 R0, R1 08b347: AD14 MOVST0 NF,ZF 08b348: 620F SB $C$L104, GT 08b349: E805FFC1 MOVIZ R1, #0xbff8 08b34b: E28C001C F32TOF64 R0, @0x1c 08b34d: E80E6661 MOVXI R1H, #0xcccc 08b34f: E9066661 MOVIX R1L, #0xcccc 08b351: E90E6669 MOVXI R1L, #0xcccd 08b353: E6980008 CMPF64 R0, R1 08b355: AD14 MOVST0 NF,ZF 08b356: 6302 SB $C$L105, GEQ 577 err++; $C$L104: 08b357: 0A11 INC @0x11 579 iADC = vADC*0.06000096; $C$L105: 08b358: E801FD71 MOVIZ R1, #0x3fae 08b35a: E28C001C F32TOF64 R0, @0x1c 08b35c: E80DC391 MOVXI R1H, #0xb872 08b35e: E9010ED9 MOVIX R1L, #0x21db 08b360: E90B9009 MOVXI R1L, #0x7201 08b362: E7800008 MPYF64 R0, R1, R0 08b364: 7700 NOP 08b365: 7700 NOP 08b366: E6900000 F64TOF32 R0H, R0 08b368: 7700 NOP 08b369: E203001E MOV32 @0x1e, R0H 580 if ((iADC > -0.09) || (iADC < -0.1)) 08b36b: E805FDB9 MOVIZ R1, #0xbfb7 08b36d: E28C001E F32TOF64 R0, @0x1e 08b36f: E80851E9 MOVXI R1H, #0xa3d 08b371: E9038519 MOVIX R1L, #0x70a3 08b373: E90EB851 MOVXI R1L, #0xd70a 08b375: E6980008 CMPF64 R0, R1 08b377: AD14 MOVST0 NF,ZF 08b378: 620F SB $C$L106, GT 08b379: E805FDC9 MOVIZ R1, #0xbfb9 08b37b: E28C001E F32TOF64 R0, @0x1e 08b37d: E80CCCC9 MOVXI R1H, #0x9999 08b37f: E904CCC9 MOVIX R1L, #0x9999 08b381: E90CCCD1 MOVXI R1L, #0x999a 08b383: E6980008 CMPF64 R0, R1 08b385: AD14 MOVST0 NF,ZF 08b386: 6302 SB $C$L107, GEQ 581 err++; $C$L106: 08b387: 0A11 INC @0x11 582 iLem = (k*k_trasd*iADC)+0.5; $C$L107: 08b388: 2D43 MOV T, *-SP[3] 08b389: 1244 MPY ACC, T, *-SP[4] 08b38a: 0EA9 MOVU ACC, @AL 08b38b: BDA90F12 MOV32 R0H, @ACC 08b38d: 7700 NOP 08b38e: 7700 NOP 08b38f: 7700 NOP 08b390: 7700 NOP 08b391: E68B0000 UI32TOF32 R0H, R0H 08b393: E2AF011E MOV32 R1H, @0x1e, UNCF 08b395: E7000008 MPYF32 R0H, R1H, R0H 08b397: 7700 NOP 08b398: E88FC000 ADDF32 R0H, #0x3f00, R0H 08b39a: 7700 NOP 08b39b: E2030020 MOV32 @0x20, R0H 583 if (iLem > -1700) 08b39d: E80626A0 MOVIZ R0, #0xc4d4 08b39f: E2AF0120 MOV32 R1H, @0x20, UNCF 08b3a1: E80C0000 MOVXI R0H, #0x8000 08b3a3: E6940001 CMPF32 R1H, R0H 08b3a5: AD14 MOVST0 NF,ZF 08b3a6: 6502 SB $C$L108, LEQ 584 err++; 08b3a7: 0A11 INC @0x11 585 return ((signed int)(iLem)); $C$L108: 08b3a8: E2AF0020 MOV32 R0H, @0x20, UNCF 08b3aa: E68C0000 F32TOI16 R0H, R0H 08b3ac: 7700 NOP 08b3ad: 7700 NOP 08b3ae: BFA90F12 MOV32 @ACC, R0H 586 } 08b3b0: FE84 SUBB SP, #4 08b3b1: 0006 LRETR
2) 2)在下方 使用除法的 getAdcc4函数 :
C 函数
signed int getAdcc4(unsigned int k_trasd, unsigned int k) { static float vADC = 0; static float iADC = 0; static float iLem = 0; static unsigned int err = 0; vADC = -1.5; if ((vADC > -1.45) || (vADC < -1.55)) err++; iADC = vADC/16.6664; if ((iADC > -0.09) || (iADC < -0.1)) err++; iLem = (k*k_trasd*iADC)+0.5; if (iLem > -1700) err++; return ((signed int)(iLem)); }
汇编代码
getAdcc4(): 08ae58: FE04 ADDB SP, #4 08ae59: 9744 MOV *-SP[4], AH 08ae5a: 9643 MOV *-SP[3], AL 575 vADC = -1.5; 08ae5b: E805FE00 MOVIZ R0, #0xbfc0 08ae5d: 761F02A4 MOVW DP, #0x2a4 08ae5f: E203001C MOV32 @0x1c, R0H 576 if ((vADC > -1.45) || (vADC < -1.55)) 08ae61: E805FFB9 MOVIZ R1, #0xbff7 08ae63: E8099999 MOVXI R1H, #0x3333 08ae65: E28C001C F32TOF64 R0, @0x1c 08ae67: E9019999 MOVIX R1L, #0x3333 08ae69: E9099999 MOVXI R1L, #0x3333 08ae6b: E6980008 CMPF64 R0, R1 08ae6d: AD14 MOVST0 NF,ZF 08ae6e: 620F SB $C$L104, GT 08ae6f: E805FFC1 MOVIZ R1, #0xbff8 08ae71: E28C001C F32TOF64 R0, @0x1c 08ae73: E80E6661 MOVXI R1H, #0xcccc 08ae75: E9066661 MOVIX R1L, #0xcccc 08ae77: E90E6669 MOVXI R1L, #0xcccd 08ae79: E6980008 CMPF64 R0, R1 08ae7b: AD14 MOVST0 NF,ZF 08ae7c: 6302 SB $C$L105, GEQ 577 err++; $C$L104: 08ae7d: 0A11 INC @0x11 578 iADC = vADC/16.6664; $C$L105: 08ae7e: E8020183 MOVIZ R3, #0x4030 08ae80: E28C021C F32TOF64 R2, @0x1c 08ae82: E80D54CB MOVXI R3H, #0xaa99 08ae84: E90185F3 MOVIX R3L, #0x30be 08ae86: E9086F6B MOVXI R3L, #0xded 08ae88: E5BE PREDIVF64 R0H, R2, R1, R3 08ae89: E566 SUBC3F64 R2, R1, R3 08ae8a: E566 SUBC3F64 R2, R1, R3 08ae8b: E566 SUBC3F64 R2, R1, R3 08ae8c: E566 SUBC3F64 R2, R1, R3 08ae8d: E566 SUBC3F64 R2, R1, R3 08ae8e: E566 SUBC3F64 R2, R1, R3 08ae8f: E566 SUBC3F64 R2, R1, R3 08ae90: E566 SUBC3F64 R2, R1, R3 08ae91: E566 SUBC3F64 R2, R1, R3 08ae92: E566 SUBC3F64 R2, R1, R3 08ae93: E566 SUBC3F64 R2, R1, R3 08ae94: E566 SUBC3F64 R2, R1, R3 08ae95: E566 SUBC3F64 R2, R1, R3 08ae96: E566 SUBC3F64 R2, R1, R3 08ae97: E566 SUBC3F64 R2, R1, R3 08ae98: E566 SUBC3F64 R2, R1, R3 08ae99: E566 SUBC3F64 R2, R1, R3 08ae9a: E566 SUBC3F64 R2, R1, R3 08ae9b: E566 SUBC3F64 R2, R1, R3 08ae9c: E5BF POSTDIVF64 R1, R0H 08ae9d: E6900008 F64TOF32 R0H, R1 08ae9f: 7700 NOP 08aea0: E203001E MOV32 @0x1e, R0H 580 if ((iADC > -0.09) || (iADC < -0.1)) 08aea2: E805FDB9 MOVIZ R1, #0xbfb7 08aea4: E28C001E F32TOF64 R0, @0x1e 08aea6: E80851E9 MOVXI R1H, #0xa3d 08aea8: E9038519 MOVIX R1L, #0x70a3 08aeaa: E90EB851 MOVXI R1L, #0xd70a 08aeac: E6980008 CMPF64 R0, R1 08aeae: AD14 MOVST0 NF,ZF 08aeaf: 620F SB $C$L106, GT 08aeb0: E805FDC9 MOVIZ R1, #0xbfb9 08aeb2: E28C001E F32TOF64 R0, @0x1e 08aeb4: E80CCCC9 MOVXI R1H, #0x9999 08aeb6: E904CCC9 MOVIX R1L, #0x9999 08aeb8: E90CCCD1 MOVXI R1L, #0x999a 08aeba: E6980008 CMPF64 R0, R1 08aebc: AD14 MOVST0 NF,ZF 08aebd: 6302 SB $C$L107, GEQ 581 err++; $C$L106: 08aebe: 0A11 INC @0x11 582 iLem = (k*k_trasd*iADC)+0.5; $C$L107: 08aebf: 2D43 MOV T, *-SP[3] 08aec0: 1244 MPY ACC, T, *-SP[4] 08aec1: 0EA9 MOVU ACC, @AL 08aec2: BDA90F12 MOV32 R0H, @ACC 08aec4: 7700 NOP 08aec5: 7700 NOP 08aec6: 7700 NOP 08aec7: 7700 NOP 08aec8: E68B0000 UI32TOF32 R0H, R0H 08aeca: E2AF011E MOV32 R1H, @0x1e, UNCF 08aecc: E7000008 MPYF32 R0H, R1H, R0H 08aece: 7700 NOP 08aecf: E88FC000 ADDF32 R0H, #0x3f00, R0H 08aed1: 7700 NOP 08aed2: E2030020 MOV32 @0x20, R0H 583 if (iLem > -1700) 08aed4: E80626A0 MOVIZ R0, #0xc4d4 08aed6: E2AF0120 MOV32 R1H, @0x20, UNCF 08aed8: E80C0000 MOVXI R0H, #0x8000 08aeda: E6940001 CMPF32 R1H, R0H 08aedc: AD14 MOVST0 NF,ZF 08aedd: 6502 SB $C$L108, LEQ 584 err++; 08aede: 0A11 INC @0x11 585 return ((signed int)(iLem)); $C$L108: 08aedf: E2AF0020 MOV32 R0H, @0x20, UNCF 08aee1: E68C0000 F32TOI16 R0H, R0H 08aee3: 7700 NOP 08aee4: 7700 NOP 08aee5: BFA90F12 MOV32 @ACC, R0H 586 } 08aee7: FE84 SUBB SP, #4 08aee8: 0006 LRETR
3)在下面 禁用除法和嵌套的 getAdcc4函数 :
C 函数
signed int getAdcc4(unsigned int k_trasd, unsigned int k) { static float vADC = 0; static float iADC = 0; static float iLem = 0; static unsigned int err = 0; vADC = -1.5; if ((vADC > -1.45) || (vADC < -1.55)) err++; IER = 0; iADC = vADC/16.6664; IER = M_INT13 ; if ((iADC > -0.09) || (iADC < -0.1)) err++; iLem = (k*k_trasd*iADC)+0.5; if (iLem > -1700) err++; return ((signed int)(iLem)); }
汇编代码
getAdcc4(): 08ae58: FE04 ADDB SP, #4 08ae59: 9744 MOV *-SP[4], AH 08ae5a: 9643 MOV *-SP[3], AL 575 vADC = -1.5; 08ae5b: E805FE00 MOVIZ R0, #0xbfc0 08ae5d: 761F02A4 MOVW DP, #0x2a4 08ae5f: E203001C MOV32 @0x1c, R0H 576 if ((vADC > -1.45) || (vADC < -1.55)) 08ae61: E805FFB9 MOVIZ R1, #0xbff7 08ae63: E8099999 MOVXI R1H, #0x3333 08ae65: E28C001C F32TOF64 R0, @0x1c 08ae67: E9019999 MOVIX R1L, #0x3333 08ae69: E9099999 MOVXI R1L, #0x3333 08ae6b: E6980008 CMPF64 R0, R1 08ae6d: AD14 MOVST0 NF,ZF 08ae6e: 620F SB $C$L104, GT 08ae6f: E805FFC1 MOVIZ R1, #0xbff8 08ae71: E28C001C F32TOF64 R0, @0x1c 08ae73: E80E6661 MOVXI R1H, #0xcccc 08ae75: E9066661 MOVIX R1L, #0xcccc 08ae77: E90E6669 MOVXI R1L, #0xcccd 08ae79: E6980008 CMPF64 R0, R1 08ae7b: AD14 MOVST0 NF,ZF 08ae7c: 6302 SB $C$L105, GEQ 577 err++; $C$L104: 08ae7d: 0A11 INC @0x11 578 IER = 0; $C$L105: 08ae7e: 76260000 AND IER, #0x0000 579 iADC = vADC/16.6664; 08ae80: E8020183 MOVIZ R3, #0x4030 08ae82: E28C021C F32TOF64 R2, @0x1c 08ae84: E80D54CB MOVXI R3H, #0xaa99 08ae86: E90185F3 MOVIX R3L, #0x30be 08ae88: E9086F6B MOVXI R3L, #0xded 08ae8a: E5BE PREDIVF64 R0H, R2, R1, R3 08ae8b: E566 SUBC3F64 R2, R1, R3 08ae8c: E566 SUBC3F64 R2, R1, R3 08ae8d: E566 SUBC3F64 R2, R1, R3 08ae8e: E566 SUBC3F64 R2, R1, R3 08ae8f: E566 SUBC3F64 R2, R1, R3 08ae90: E566 SUBC3F64 R2, R1, R3 08ae91: E566 SUBC3F64 R2, R1, R3 08ae92: E566 SUBC3F64 R2, R1, R3 08ae93: E566 SUBC3F64 R2, R1, R3 08ae94: E566 SUBC3F64 R2, R1, R3 08ae95: E566 SUBC3F64 R2, R1, R3 08ae96: E566 SUBC3F64 R2, R1, R3 08ae97: E566 SUBC3F64 R2, R1, R3 08ae98: E566 SUBC3F64 R2, R1, R3 08ae99: E566 SUBC3F64 R2, R1, R3 08ae9a: E566 SUBC3F64 R2, R1, R3 08ae9b: E566 SUBC3F64 R2, R1, R3 08ae9c: E566 SUBC3F64 R2, R1, R3 08ae9d: E566 SUBC3F64 R2, R1, R3 08ae9e: E5BF POSTDIVF64 R1, R0H 08ae9f: E6900008 F64TOF32 R0H, R1 08aea1: 7700 NOP 08aea2: E203001E MOV32 @0x1e, R0H 580 IER = M_INT13 ; 08aea4: 28A91000 MOV @AL, #0x1000 08aea6: 23A9 MOV IER, @AL 582 if ((iADC > -0.09) || (iADC < -0.1)) 08aea7: E805FDB9 MOVIZ R1, #0xbfb7 08aea9: E28C001E F32TOF64 R0, @0x1e 08aeab: E80851E9 MOVXI R1H, #0xa3d 08aead: E9038519 MOVIX R1L, #0x70a3 08aeaf: E90EB851 MOVXI R1L, #0xd70a 08aeb1: E6980008 CMPF64 R0, R1 08aeb3: AD14 MOVST0 NF,ZF 08aeb4: 620F SB $C$L106, GT 08aeb5: E805FDC9 MOVIZ R1, #0xbfb9 08aeb7: E28C001E F32TOF64 R0, @0x1e 08aeb9: E80CCCC9 MOVXI R1H, #0x9999 08aebb: E904CCC9 MOVIX R1L, #0x9999 08aebd: E90CCCD1 MOVXI R1L, #0x999a 08aebf: E6980008 CMPF64 R0, R1 08aec1: AD14 MOVST0 NF,ZF 08aec2: 6302 SB $C$L107, GEQ 583 err++; $C$L106: 08aec3: 0A11 INC @0x11 584 iLem = (k*k_trasd*iADC)+0.5; $C$L107: 08aec4: 2D43 MOV T, *-SP[3] 08aec5: 1244 MPY ACC, T, *-SP[4] 08aec6: 0EA9 MOVU ACC, @AL 08aec7: BDA90F12 MOV32 R0H, @ACC 08aec9: 7700 NOP 08aeca: 7700 NOP 08aecb: 7700 NOP 08aecc: 7700 NOP 08aecd: E68B0000 UI32TOF32 R0H, R0H 08aecf: E2AF011E MOV32 R1H, @0x1e, UNCF 08aed1: E7000008 MPYF32 R0H, R1H, R0H 08aed3: 7700 NOP 08aed4: E88FC000 ADDF32 R0H, #0x3f00, R0H 08aed6: 7700 NOP 08aed7: E2030020 MOV32 @0x20, R0H 585 if (iLem > -1700) 08aed9: E80626A0 MOVIZ R0, #0xc4d4 08aedb: E2AF0120 MOV32 R1H, @0x20, UNCF 08aedd: E80C0000 MOVXI R0H, #0x8000 08aedf: E6940001 CMPF32 R1H, R0H 08aee1: AD14 MOVST0 NF,ZF 08aee2: 6502 SB $C$L108, LEQ 586 err++; 08aee3: 0A11 INC @0x11 587 return ((signed int)(iLem)); $C$L108: 08aee4: E2AF0020 MOV32 R0H, @0x20, UNCF 08aee6: E68C0000 F32TOI16 R0H, R0H 08aee8: 7700 NOP 08aee9: 7700 NOP 08aeea: BFA90F12 MOV32 @ACC, R0H 588 } 08aeec: FE84 SUBB SP, #4 08aeed: 0006 LRETR 396
感谢您的支持!
此致、
贝尼托
您好 Benito、
是否可以尝试用全局浮点变量(volatile 和非 voltail)和宏(即#define)替换16.6664值? 我想看看这是否与操作数是一个常数相关。
如果结果相同、我认为这可能与浮点运算之间所需的 NOP 相关。 在单步执行代码时、是否可以复制情况2 (启用嵌套的除法)中的问题? 如果是、您能看到浮点寄存器(即 R0、R1、R2和 R3)加载了哪些值、并将其与情况3进行比较吗? 这些值必须不同、但大会中没有任何内容向我表明这一点。
尊敬的先生: Amir,Omer
您能尝试用全局浮点变量(volatile 和非 voltail)和宏(即#define)替换16.6664值吗? 我想看看这是否与操作数是一个常量相关。
我在调试开始时进行了此测试、并验证了是否发生了错误。
然后我用常数值16.6664...替换了宏或变量
。 在单步执行代码时、是否可以复制情况2 (启用嵌套的除法)中的问题? 如果是、您能看到浮点寄存器(即 R0、R1、R2和 R3)加载了哪些值、并将其与情况3进行比较吗?
下面我附上了您建议的测试结果。
启用嵌套的除法
下面、 如果 没有发生错误、FP 寄存器会在除法之后的状态:
如下所示、 发生错误时 FP 寄存器会在除法之后的状态:
禁用嵌套的除法
下面是 fp 寄存器的状态、然后是除法。 在 这种情况下、不会发生错误。
如果您需要进一步的数据、请告诉我。
感谢您的支持、
贝尼托
您好 Benito、
是否可以向我发送您项目的压缩版本? 此调试的其余部分需要单步执行汇编代码、并观察 R0-R3寄存器的加载方式 之前 通过除法了解这些值为何不同。 如果您无法发送工程、则需要执行此操作并尝试找出寄存器值差异的根本原因。 当您找到 为什么 值是不同的、您可以在此处发布、我可以进一步帮助您。
尊敬的先生: Amir,Omer
很遗憾、我 无法 发送项目的版本。
我将尝试监控寄存器 R0-R3。
贝尼托
Benito、
欧默尔本周不在办公室。 我们将等待您的监控寄存器 R0-R3的结果。