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

Where is __main?

We use Keil tools to generate C++ embedded application that run in our embedded controller.

My initialization code jumps to __main as follows:

IMPORT __main LDR R0, =__main BX R0

Wher is "__main" ?

I searched C:\Keil but could not find definition of __main.

This is what my map file says about __main

__main 0x00008308 ARM Code 8 __main.o(!!!main)

My application starts at 0x8000. __main is at 0x00008308. Where is __main.o ?

Parents Reply Children
  • >>it is where your program starts.

    No it's not. It eventually gets to main(), but before that it uses start up code in the library which initializes the static space (BSS) with initialized variables which are copied, and zero'd space.

  • I never make it to my main() because it looks like static variable nr_mutex never gets
    intialized.

    // Filename RTX_lib.c
    ...
    ...
    static U32 nr_mutex;
    ..
    ...
    ..

    int _mutex_initialize (OS_ID *mutex)

    { /* Allocate and initialize a system mutex. */

    if (nr_mutex >= OS_MUTEXCNT)

    {

    /* If you are here, you need to increase the number OS_MUTEXCNT. */

    for (;;);

    }

    *mutex = &std_libmutex[nr_mutex++];

    mutex_init (*mutex);

    return (1);

    }

    I enter forever loop because 'nr_mutex' has bogus value 0x00800080. I should never
    enter this forever loop.

    When __main() starts running, there is a lot of code. I can see assembly language code.
    What portion of this code is responsible for intializing static variables? My peer runs to
    our main() function. How might my build environment different than his. There must be
    something different. Please advise! Thank you!

  • __main is the entry to the Keil "secret sauce" that run before getting to your main()

    What portion of this code is responsible for intializing static variables?

    no concern of yours

    My peer runs to our main() function.

    what is "my peer"?

    How might my build environment different than his
    you do NOT want to.

    I am not working with Keil at this moment, but do recall that if you have not done something (wish I remember) and are using printf() you get exactly that __main bum out.

    If you are using printf() state so and ask "what is it I have to do to make printf() not blow __main" and someone will tell yo

  • Thank you! Your response is helpful but I cannot get to my main() function. I get stuck
    in forever loop between __main() and my main(). I can't debug the code because it's Keil
    code. How do I resolve this problem? What do I need to do to get Keil to jump to my
    main(). I'm not using any printf() statements.

  • in forever loop between __main() and my main().
    I se two possibilities
    a) active watchdog
    b) no infinite loop in main

    I can't debug the code because it's Keil
    HUH? I know of no means of loading an ARM processor that can not be used for debugging
    code.

    How do I resolve this problem? What do I need to do to get Keil to jump to my
    main().

    you state above "loop between __main() and my main()" so it must "jump to my
    main()" That you need to clarify.

    Erik

  • Well you should probably review your startup.s file, and your target memory settings. Check also if you need to configure registers within your chip, or initialize external RAM, before C can start.

    You'll likely have to uncheck "Run to main()" in order to debug the situation.