This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

Debugger function that hangs uVision

Hi,
I just created a function in uVision that puts into a pretty tight knot. Take a look at the following modified Dbg_Sim.ini from the CAN demo. When the Test button is pressed in the toolbox, uVision prompts for a number, then immediately prompts for the number again. From then on, uVision does nothing at all other than insist on a number input. It appears to be impossible to break out of this, requires going to the Windows Task Manager and killing uVision. There should be a way to get uVision to cleanly break out of such a condition.
Thanks,
Dan

/*---------------------------------------------------------------------------- * Name: Dbg_Sim.ini * Purpose: Simulator Debug Initialization File * Note(s): *---------------------------------------------------------------------------- * This file is part of the uVision/ARM development tools. * This software may only be used under the terms of a valid, current, * end user licence from KEIL for a compatible version of KEIL software * development tools. Nothing else gives you the right to use this software. * * This software is supplied "AS IS" without warranties of any kind. * * Copyright (c) 2008-2011 Keil - An ARM Company. All rights reserved. *----------------------------------------------------------------------------*/

/*---------------------------------------------------------------------------- CAN_loopback_1_to_2() simulates loopback connection from CAN1 to CAN2 port *----------------------------------------------------------------------------*/

signal void CAN_loopback_1_to_2 (void)
{ while (1) { wwatch(CAN1OUT); CAN2ID = CAN1ID; CAN2B0 = CAN1B0; CAN2B1 = CAN1B1; CAN2B2 = CAN1B2; CAN2B3 = CAN1B3; CAN2B4 = CAN1B4; CAN2B5 = CAN1B5; CAN2B6 = CAN1B6; CAN2B7 = CAN1B7; CAN2L = CAN1L; CAN2IN = CAN1OUT; }
}

/*---------------------------------------------------------------------------- CAN_loopback_2_to_1() simulates loopback connection from CAN2 to CAN1 port *----------------------------------------------------------------------------*/

signal void CAN_loopback_2_to_1 (void)
{ while (1) { wwatch(CAN2OUT); CAN1ID = CAN2ID; CAN1B0 = CAN2B0; CAN1B1 = CAN2B1; CAN1B2 = CAN2B2; CAN1B3 = CAN2B3; CAN1B4 = CAN2B4; CAN1B5 = CAN2B5; CAN1B6 = CAN2B6; CAN1B7 = CAN2B7; CAN1L = CAN2L; CAN1IN = CAN2OUT; }
}

/*---------------------------------------------------------------------------- Analog() simulates analog input values given to channel-2 (AD02) *----------------------------------------------------------------------------*/
signal void Analog (float limit)
{ float volts;

printf ("Analog (%f) entered.\n", limit); while (1) { /* forever */ volts = 0; while (volts <= limit) { AIN2 = volts; /* analog input-2 */ twatch (250000); /* 250000 Cycles Time-Break */ volts += 0.1; /* increase voltage */ } volts = limit; while (volts >= 0.0) { AIN2 = volts; twatch (250000); /* 250000 Cycles Time-Break */ volts -= 0.1; /* decrease voltage */ } }
}

signal void Test (float number)
{ while(1) { printf("Number:%f\n", number); number = getint("Give me a number:"); printf("Number now:%f\n", number); twatch (250000); }
}

kill button *

define button "Analog sweep 0 .. 3.3V", "Analog (3.3)"
define button "Analog sweep STOP", "signal kill Analog"
define button "CAN loopback ON", "CAN_loopback_1_to_2 (); CAN_loopback_2_to_1 ();"
define button "CAN loopback OFF", "signal kill CAN_loopback_1_to_2; signal kill CAN_loopback_2_to_1;"
define button "Test", "Test(3.1)"
define button "Test Done", "signal kill Test"

  • right over the entry window there is some VERY INTERESTING information

    Erik

  • Erik,
    Thanks for your response. I don't see what you're talking about. (It's probably there, staring me in the face!!) I have clicked on just about everything that I can possibly click on. However, I did just discover that if I put in an invalid number in the entry box, it causes a syntax error in the debug function and breaks the "infinite" loop. Still, uVision should offer a more clear way to exit a condition like this, and yes, with more experience, I shouldn't write debug code that leads to an infinite loop!!
    Dan

  • This issue will be corrected in the next MDK version. By entering <ESC> in the getint/getdbl() dialog, you will get out of the while(1) loop thus avoiding looping forever...

  • I don't see what you're talking about
    click on 'reply' (same result as "start a thread" and look up

    also, the preview should have told you that your post was unreadable.

    Erik

  • "It's probably there, staring me in the face!!"

    It certainly is - look at this picture: www.danlhenry.com/.../keil_code.png

  • Thanks for the note on message formatting, and glad to see that this will be addressed in the next MDK release...

    
    /*----------------------------------------------------------------------------
     * Name:    Dbg_Sim.ini
     * Purpose: Simulator Debug Initialization File
     * Note(s):
     *----------------------------------------------------------------------------
     * This file is part of the uVision/ARM development tools.
     * This software may only be used under the terms of a valid, current,
     * end user licence from KEIL for a compatible version of KEIL software
     * development tools. Nothing else gives you the right to use this software.
     *
     * This software is supplied "AS IS" without warranties of any kind.
     *
     * Copyright (c) 2008-2011 Keil - An ARM Company. All rights reserved.
     *----------------------------------------------------------------------------*/
    
    /*----------------------------------------------------------------------------
      CAN_loopback_1_to_2() simulates loopback connection from CAN1 to CAN2 port
     *----------------------------------------------------------------------------*/
    
    signal void CAN_loopback_1_to_2 (void)
    {
      while (1)
      {
        wwatch(CAN1OUT);
        CAN2ID = CAN1ID;
        CAN2B0 = CAN1B0; CAN2B1 = CAN1B1; CAN2B2 = CAN1B2; CAN2B3 = CAN1B3;
        CAN2B4 = CAN1B4; CAN2B5 = CAN1B5; CAN2B6 = CAN1B6; CAN2B7 = CAN1B7;
        CAN2L  = CAN1L;
        CAN2IN = CAN1OUT;
      }
    }
    
    /*----------------------------------------------------------------------------
      CAN_loopback_2_to_1() simulates loopback connection from CAN2 to CAN1 port
     *----------------------------------------------------------------------------*/
    
    signal void CAN_loopback_2_to_1 (void)
    {
      while (1)
      {
        wwatch(CAN2OUT);
        CAN1ID = CAN2ID;
        CAN1B0 = CAN2B0; CAN1B1 = CAN2B1; CAN1B2 = CAN2B2; CAN1B3 = CAN2B3;
        CAN1B4 = CAN2B4; CAN1B5 = CAN2B5; CAN1B6 = CAN2B6; CAN1B7 = CAN2B7;
        CAN1L  = CAN2L;
        CAN1IN = CAN2OUT;
      }
    }
    
    
    /*----------------------------------------------------------------------------
      Analog()  simulates analog input values given to channel-2 (AD02)
     *----------------------------------------------------------------------------*/
    signal void Analog (float limit)
    {
      float volts;
    
      printf ("Analog (%f) entered.\n", limit);
      while (1)
      {          /* forever */
        volts = 0;
        while (volts <= limit)
        {
          AIN2 = volts;     /* analog input-2 */
          twatch (250000);  /* 250000 Cycles Time-Break */
          volts += 0.1;     /* increase voltage */
        }
        volts = limit;
        while (volts >= 0.0)
        {
          AIN2 = volts;
          twatch (250000);  /* 250000 Cycles Time-Break */
          volts -= 0.1;     /* decrease voltage */
        }
      }
    }
    
    
    signal void Test (float number)
    {
      while(1)
      {
        printf("Number:%f\n", number);
        number = getint("Give me a number:");
        printf("Number now:%f\n", number);
        twatch (250000);
      }
    }
    
    kill button *
    
    define button "Analog sweep 0 .. 3.3V",  "Analog (3.3)"
    define button "Analog sweep STOP",       "signal kill Analog"
    define button "CAN loopback ON",         "CAN_loopback_1_to_2 (); CAN_loopback_2_to_1 ();"
    define button "CAN loopback OFF",        "signal kill CAN_loopback_1_to_2; signal kill CAN_loopback_2_to_1;"
    define button "Test",                    "Test(3.1)"
    define button "Test Done",                         "signal kill Test"