程序在fxd1616u.c的程序里无限循环,

[复制链接]
2042|8
 楼主| 08逍客2010 发表于 2013-7-11 16:53 | 显示全部楼层 |阅读模式
我用MCC18做的程序,经常死机,在ICD2仿真状态下可以看到程序在fxd1616u.c的程序里无限循环,fxd1616u.c的路径是: C:\MCC18\src\TRADIT~\math\fxd1616u.c,有谁遇到过类似的问题吗?
  求解答!!
 楼主| 08逍客2010 发表于 2013-7-11 16:57 | 显示全部楼层
/*** Unsigned Integer Division: 16-bit by 16-bit
***
*** Optimized: Dec. 21, 2000
***        by: Daniel R. Madill, Quanser Consulting Inc.
***       for: Saved (for the worst case) at least 5*16 = 80 instruction cycles
***            over the code supplied with MCC18 v1.00.12
***/

void FXD1616U (/*unsigned arg0, unsigned arg1*/)
{
  // use INDF1 for the counter...

      _asm

    // REM = 0
    clrf REMB0, 0
    clrf REMB1, 0
   
    // INDF1 = 16
    movlw 16
    movwf INDF1, 0

    // Clear the carry
        bcf STATUS, 0, 0

loop:

        //AARG16 <<= 1; Carry is always clear at this point.
        rlcf AARGB1, 1, 0
        rlcf AARGB0, 1, 0

        //PROD = (PROD << 1) | (AARG16 >> 16)
        rlcf REMB1, 1, 0
        rlcf REMB0, 1, 0
       
        //if (PROD >= BARG16)
        movf BARGB1, 0, 0
        subwf REMB1, 0, 0
        movf BARGB0, 0, 0
        subwfb REMB0, 0, 0
        bnc endloop
    //{
            //PROD -= BARG16;
            movf BARGB1, 0, 0
            subwf REMB1, 1, 0
            movf BARGB0, 0, 0
            subwfb REMB0, 1, 0

            //++AARG16; Since AARG16 was shift to the left above, the increment will
        //          simply set the LSbit. Using incf also clears the carry, which
        //          means we don't have to clear the carry at the top of the loop.
        incf AARGB1, 1, 0
    //}

endloop:
    decfsz INDF1, 1, 0    // does not affect the carry bit
    bra loop

  _endasm

  /* result in AARG already... */
}
fxd1616u.c源程序
NE5532 发表于 2013-7-12 08:45 | 显示全部楼层
首先你用了这个程序没有?其次ICD2的仿真能力确实令人汗颜,建议盲调,或者换ICD3、Kit3之类。
keal224324 发表于 2013-7-12 14:59 | 显示全部楼层
fxd1616u.c是PIC16位无符号整形的乘除运算,楼主是不是配置位里XINST  Extended Instruction Set设置为Enabled了
yewuyi 发表于 2013-7-12 15:08 | 显示全部楼层
你调用了他,就应该知道怎么才能正确用他。

这个代码里面好像也没见到无限循环的代码。
 楼主| 08逍客2010 发表于 2013-7-13 09:15 | 显示全部楼层
keal224324 发表于 2013-7-12 14:59
fxd1616u.c是PIC16位无符号整形的乘除运算,楼主是不是配置位里XINST  Extended Instruction Set设置为Enab ...

XINST  Extended Instruction Set设置是disabled
 楼主| 08逍客2010 发表于 2013-7-13 09:16 | 显示全部楼层
NE5532 发表于 2013-7-12 08:45
首先你用了这个程序没有?其次ICD2的仿真能力确实令人汗颜,建议盲调,或者换ICD3、Kit3之类。 ...

fxd1616u.c是PIC16位无符号整形的乘除运算的话,,那是有调用的
 楼主| 08逍客2010 发表于 2013-7-13 09:18 | 显示全部楼层
yewuyi 发表于 2013-7-12 15:08
你调用了他,就应该知道怎么才能正确用他。

这个代码里面好像也没见到无限循环的代码。 ...

我是用c写的,程序出问题就停在这个函数里面,在单步运行,就一直在里面循环!
 楼主| 08逍客2010 发表于 2013-7-13 09:39 | 显示全部楼层
08逍客2010 发表于 2013-7-13 09:18
我是用c写的,程序出问题就停在这个函数里面,在单步运行,就一直在里面循环! ...

好像不是在这里面死循环。如图片,变量na,函数调用时是5.函数出问题后,变成很大的一个数字,所以一直在里面循环。
另外,我定义了一个比较大的数组后,会出现Error - section '.idata_dai_sev.o' can not fit the section. Section '.idata_dai_sev.o' length=0x00000200的错误。这个连接文件怎么改,手册看了,但还是不知道用c语言怎么操作。
刚刚开始学PIC,问的问题如果比较笨,大家海涵。

本帖子中包含更多资源

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

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

本版积分规则

13

主题

109

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部