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

RTX166Tiny & EC++ have problem!

Good day!

I have a problem with using RTX166 Tiny OS with EC++.
If I try to define tasks in .cpp file, I dont see JUMP to _main() function.

In technical support:
"RTX166 TINY: CAN'T DEFINE TASKS IN EC++"
http://www.keil.com/support/docs/2812.htm
advises to "Simply define your _task_ and interrupt functions in a .C file".
In this case Can I use C++ features (ex. define objects) in tasks functions?

In file C:\Program Files\Keil\C166\Rtx_Tiny\readme5.txt I have read following note:

Function os_start for EC++ compatiblity
=======================================
The function os_start enables the usage of RTX166 Tiny together with EC++. EC++
requires special initalizations that are performed in the main routine. After
this initalizations, the os_start function can be called to start the RTX166
Tiny kernel.


EXTERN_C void _main ()  {
  init_mempool (mempool, sizeof (mempool));  // create memory pool for new & delete
  __sti__init__ ();                          // call initializer functions
  os_start ();                               // start RTX166 kernel
}

But senselessly try to call os_start(), if _main() is not called.

P.S.
Problem "expected {" I resolve using replace _task_ with __task. Is it correct?

Parents
  • Oleg,

    Ignore my previous post, as it is confusing.

    Short answer: define a main() anyway, and see what happens.

    Long answer:

    There is an example in Keil\C166\Rtx_Tiny which is supposed to show how to use EC++ and RTX Tiny. It doesn't work on my machine! _main() is never called, I believe there is a problem with this example.

    It seems that RTX Tiny defines a symbol called main, which in turn calls os_start() (look at the source code for RTX Tiny)

    One workaround is to define, and it can by anywhere in your cpp code really:

    int main() {}
    

    This symbol will override the one in RTX Tiny's library, which means that this function will be called, rather than the one inside the real time library. Then, the EC++ parser will recognize this special function and call _main() automatically, as soon as main() is executed (look at how main() is modified inside the .ic. file)

    Other workaround: modify the .a66 initialization file so it calls _main instead of main. Look for the lines of code that say:

    
    ...
    EXTRN   main:Model
    ...
    
    $IF TINY
                    JMP     main
    $ELSE
                    JMP     FAR main
    $ENDIF
    

    and replace all main with _main.

    Not sure if this makes sense, but I hope this helps...

    -Stéphane

Reply
  • Oleg,

    Ignore my previous post, as it is confusing.

    Short answer: define a main() anyway, and see what happens.

    Long answer:

    There is an example in Keil\C166\Rtx_Tiny which is supposed to show how to use EC++ and RTX Tiny. It doesn't work on my machine! _main() is never called, I believe there is a problem with this example.

    It seems that RTX Tiny defines a symbol called main, which in turn calls os_start() (look at the source code for RTX Tiny)

    One workaround is to define, and it can by anywhere in your cpp code really:

    int main() {}
    

    This symbol will override the one in RTX Tiny's library, which means that this function will be called, rather than the one inside the real time library. Then, the EC++ parser will recognize this special function and call _main() automatically, as soon as main() is executed (look at how main() is modified inside the .ic. file)

    Other workaround: modify the .a66 initialization file so it calls _main instead of main. Look for the lines of code that say:

    
    ...
    EXTRN   main:Model
    ...
    
    $IF TINY
                    JMP     main
    $ELSE
                    JMP     FAR main
    $ENDIF
    

    and replace all main with _main.

    Not sure if this makes sense, but I hope this helps...

    -Stéphane

Children