Kaan Kandemir Kaan Kandemir - 1 month ago 6
C++ Question

Program exit is reached in IAR RL78 V2.20

I am working with YRDKRL78 G13 board. I am using IAR v.2.20 for compiler and ı have created a C++ project on it. And I am using one framework. Anyway I have implemented all my codes and which is working correctly but after 2 minutes IAR is giving information as "The Application is aborted" and "Program exit is reached." I am really confuse about it I used very large stack as 512 and near is 1024 far is the 4096.

Here is my main.cpp

#include "System.h"
extern "C"

{
#include "r_cg_macrodriver.h"
}

#pragma location = "OPTBYTE"
__root const uint8_t opbyte0 = 0x7EU;
#pragma location = "OPTBYTE"
__root const uint8_t opbyte1 = 0xFFU;
#pragma location = "OPTBYTE"
__root const uint8_t opbyte2 = 0xE8U;
#pragma location = "OPTBYTE"
__root const uint8_t opbyte3 = 0x85U;

/* Set security ID */
#pragma location = "SECUID"
__root const uint8_t secuid[10] =
{0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U, 0x00U};

void main(void)
{

System::SystemInstance().SYS_vInit();
System::SystemInstance().SYS_vStart();
System::SystemInstance().SYS_vRun();

while(1)
{
;
}


}


And here is the iar output. IAR Output Console

If somebody faced like this problem or if somebody has got any solution or idea could you please share with me here

Thanks for the help :)

EDIT:
@rjp Firstly thanks for response. I am using special framework on my board which Quantum leaps. these 3 functions are calling framwork functions and SYS_vRUN is calling endless loop

int_t QF::run(void) {
onStartup(); // startup callback

// the combined event-loop and background-loop of the QV kernel
for (;;) {
R_WDT_Restart();
RepaintLCD();
delay_ms(50); /* Leave some room for the system to respond */
QF_INT_DISABLE();
if (QV_readySet_.notEmpty()) {
uint_fast8_t p = QV_readySet_.findMax();
QMActive *a = active_[p];
QF_INT_ENABLE();

// perform the run-to-completion (RTS) step...
// 1. retrieve the event from the AO's event queue, which by this
// time must be non-empty and The "Vanialla" kernel asserts it.
// 2. dispatch the event to the AO's state machine.
// 3. determine if event is garbage and collect it if so
//
QEvt const *e = a->get_();
a->dispatch(e);
gc(e);
}
else {
// QV::onIdle() must be called with interrupts DISABLED because
// the determination of the idle condition (no events in the
// queues) can change at any time by an interrupt posting events
// to a queue. QV::onIdle() MUST enable interrupts internally,
// perhaps at the same time as putting the CPU into a power-saving
// mode.
QP::QV::onIdle();
}
}
}


End I searched all code for exit() function there is no any. But you mentioned another issue about assertion. here you can see assertion macro and custome implemented assertion function.

#define Q_ASSERT_ID(id_, test_) ((test_) \
? (void)0 : Q_onAssert(&Q_this_module_[0], (int_t)(id_)))


Function;

void Q_onAssert(char const Q_ROM * const file, int line) {
// implement the error-handling policy for your application!!!
QF_INT_DISABLE(); // disable all interrupts

// cause the reset of the CPU...
//WDTCTL = WDTPW | WDTHOLD;
//__asm(" push &0xFFFE");
// return from function does the reset
}


EDIT2:
Most dynamic memory processes are done in the LedFactory Class.
Header

/*
* LedFactory.h
*
* Created on: Aug 3, 2016
* Author: Dev
*/

#ifndef APPLICATION_LED_LEDFACTORY_H_
#define APPLICATION_LED_LEDFACTORY_H_

#include "LedController.h"
class LedFactory {
public:
typedef enum{
LED1,
LED2,
LED3,
LED4,
LED5,
LED6,
}LedTypes;
public:
LedFactory();
virtual ~LedFactory();
LedController * FirstLedFactory(LedTypes ledtype);
LedController * SecondLedFactory(LedTypes ledtype);
LedController * ThirdLedFactory(LedTypes ledtype);
LedController * FourthLedFactory(LedTypes ledtype);
LedController * FifthLedFactory(LedTypes ledtype);
LedController * SixthLedFactory(LedTypes ledtype);
public:
static LedFactory& instance();
};

#endif /* APPLICATION_LED_LEDFACTORY_H_ */


Source file.

/*
* LedFactory.cpp
*
* Created on: Aug 3, 2016
* Author: Dev
*/

#include <LedFactory.h>
#include "FirstLed.h"
#include "SecondLed.h"
#include "ThirdLed.h"
#include "FourthLed.h"
#include "FifthLed.h"
#include "SixthLed.h"

LedFactory::LedFactory() {
// TODO Auto-generated constructor stub

}

LedFactory::~LedFactory() {
// TODO Auto-generated destructor stub
}

LedFactory& LedFactory::instance()
{
static LedFactory instance;

return instance;
}
LedController * LedFactory::FirstLedFactory(LedTypes ledtype)
{
if(ledtype == (LedTypes)LED1)
{
return new FirstLed;
}
return NULL;
}
LedController * LedFactory::SecondLedFactory(LedTypes ledtype)
{
if(ledtype == (LedTypes)LED2)
return new SecondLed;
return NULL;
}

LedController * LedFactory::ThirdLedFactory(LedTypes ledtype)
{
if(ledtype == (LedTypes)LED3)
{
return new ThirdLed;
}
return NULL;
}

LedController * LedFactory::FourthLedFactory(LedTypes ledtype)
{
if(ledtype == (LedTypes)LED4)
{
return new FourthLed;
}
return NULL;
}


LedController * LedFactory::FifthLedFactory(LedTypes ledtype)
{
if(ledtype == (LedTypes)LED5)
{
return new FifthLed;
}
return NULL;
}

LedController * LedFactory::SixthLedFactory(LedTypes ledtype)
{
if(ledtype ==(LedTypes)LED6)
{
return new SixthLed;
}
return NULL;
}


Should I remove that class for increase the dynamic allocation memory issue ?
Or how can I fix this class ?

Answer

Problem has been solved. Main reason was the dynamic memory allocation processes which is used at the factory class.