We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
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?
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
Take a look here: C:\Keil\C166\Examples\EC++\RtxTiny This example shows you how to create an RtxTiny Application with EC++.
Reinhard
Hello Reinhard,
This example seems to be broken (at least for me), that's the problem.
_main() is never called, which is an issue because then EC++ classes are not initialized, neither is the memory pool...
This example is so simple (no constructors, not even a single data member) that it appears to be working, whereas in fact the EC++ initialization is not done at all.
-Stephane