打印

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

[复制链接]
1620|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
我用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了

使用特权

评论回复
5
yewuyi| | 2013-7-12 15:08 | 只看该作者
你调用了他,就应该知道怎么才能正确用他。

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

使用特权

评论回复
6
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

使用特权

评论回复
7
08逍客2010|  楼主 | 2013-7-13 09:16 | 只看该作者
NE5532 发表于 2013-7-12 08:45
首先你用了这个程序没有?其次ICD2的仿真能力确实令人汗颜,建议盲调,或者换ICD3、Kit3之类。 ...

fxd1616u.c是PIC16位无符号整形的乘除运算的话,,那是有调用的

使用特权

评论回复
8
08逍客2010|  楼主 | 2013-7-13 09:18 | 只看该作者
yewuyi 发表于 2013-7-12 15:08
你调用了他,就应该知道怎么才能正确用他。

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

我是用c写的,程序出问题就停在这个函数里面,在单步运行,就一直在里面循环!

使用特权

评论回复
9
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,问的问题如果比较笨,大家海涵。

360截图20130713092309484.jpg (69.74 KB )

360截图20130713092309484.jpg

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

13

主题

109

帖子

0

粉丝