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

fault with calling int main( )

Hello,

I modified a sample app "blinky" on segger, to include main.cpp instead of main.c
Then when I built, I got a compile time error stating in main.cpp "void main(void)" should be changed to "int main( )"
I changed and it compiled successfully.

Now when I am running it on the board, the execution is not entering "int main( )" rather the execution is straight away entering fault_s.S, as in the screenshot:



Kindly help me in understanding why this is happening so and how I can get the execution to return to "int main( )" ..?


PS. I am using blinky sample app on segger, only changes I made is 
- Excluded main.c from the build
- Added main.cpp (Attaching for your reference)
- Added main.cpp in CMakeLists.txt (Attaching for your reference)

It is building successfully.



main.cpp


#include "stdio.h"
#include "stdint.h"

/**** 1. Demonstration On dynamic allocation  ****/
class Sample
{
  Sample* cPtr;
  public:
  Sample()
  {
    printf("ctor called \n");
    cPtr = new Sample();
  }
  
  ~Sample()
  {
    printf("dtor called \n");
    delete cPtr;
    cPtr = nullptr;
  }

};

/*
 * Copyright (c) 2016 Intel Corporation
 *
 * SPDX-License-Identifier: Apache-2.0
 */

//#include <zephyr.h>
//#include <device.h>
//#include <devicetree.h>
//#include <drivers/gpio.h>

///* 1000 msec = 1 sec */
//#define SLEEP_TIME_MS   1000

///* The devicetree node identifier for the "led0" alias. */
//#define LED0_NODE DT_ALIAS(led0)

//#if DT_NODE_HAS_STATUS(LED0_NODE, okay)
//#define LED0	DT_GPIO_LABEL(LED0_NODE, gpios)
//#define PIN	DT_GPIO_PIN(LED0_NODE, gpios)
//#define FLAGS	DT_GPIO_FLAGS(LED0_NODE, gpios)
//#else
///* A build error here means your board isn't set up to blink an LED. */
//#error "Unsupported board: led0 devicetree alias is not defined"
//#define LED0	""
//#define PIN	0
//#define FLAGS	0
//#endif
       void func(void)
       {
        Sample obj;
       }

int main(void)
{
	const struct device *dev;
	bool led_is_on = true;
	int ret;

        func();

	//dev = device_get_binding(LED0);
	//if (dev == NULL) {
	//	return;
	//}

	//ret = gpio_pin_configure(dev, PIN, GPIO_OUTPUT_ACTIVE | FLAGS);
	//if (ret < 0) {
	//	return;
	//}

	//while (1) {
	//	gpio_pin_set(dev, PIN, (int)led_is_on);
	//	led_is_on = !led_is_on;
	//	k_msleep(SLEEP_TIME_MS);
	//}

        return 0;
}

CMakeLists.txt

# SPDX-License-Identifier: Apache-2.0

cmake_minimum_required(VERSION 3.20.0)
find_package(Zephyr REQUIRED HINTS $ENV{ZEPHYR_BASE})
project(blinky)

target_sources(app PRIVATE D:/CPP_Test/cpp_files/main.cpp src/main.c)

Parents
  • Hi,

    Have you set CONFIG_CPLUSPLUS=y in your prj.conf? I recommend you take a look at the C++ Synchronization sample (which is the only C++ sample for now).

  • Hello ,

    Yes i have set the CPLUS_PLUS feature, I have also set below:

    CONFIG_CPLUSPLUS=y
    CONFIG_HEAP_MEM_POOL_SIZE=16384
    CONFIG_NEWLIB_LIBC=y
    CONFIG_LIB_CPLUSPLUS=y

    But, my problem is that execution is not entering "int main( )" in main.cpp

  • I see. I am not able to explain that, as it looks like the basic is in place. However, I do not know the details of your configuration (NCS version, toolchain version, etc). Can you test the sample I referred to from nRF Connect SDK 1.7.0 and using the toolchain manager so that you know the toolchain is good? That should work and does on my side.

    Update: I just noticed that you add both main.c and main.cpp in your CMakeLIsts.txt:

    target_sources(app PRIVATE D:/CPP_Test/cpp_files/main.cpp src/main.c)

    you should have got a linker error if main is defined in both so it is a bit odd, but a smoking gun.

Reply
  • I see. I am not able to explain that, as it looks like the basic is in place. However, I do not know the details of your configuration (NCS version, toolchain version, etc). Can you test the sample I referred to from nRF Connect SDK 1.7.0 and using the toolchain manager so that you know the toolchain is good? That should work and does on my side.

    Update: I just noticed that you add both main.c and main.cpp in your CMakeLIsts.txt:

    target_sources(app PRIVATE D:/CPP_Test/cpp_files/main.cpp src/main.c)

    you should have got a linker error if main is defined in both so it is a bit odd, but a smoking gun.

Children
No Data
Related