Subject:
|
Re: Strange RCX startup issues
|
Newsgroups:
|
lugnet.robotics.rcx.legos
|
Date:
|
Tue, 9 Dec 2003 17:36:52 GMT
|
Viewed:
|
4130 times
|
| |
| |
In lugnet.robotics.rcx.legos, Rand Krakora wrote:
> Hello,
>
> using brickOS v0.2.6.10...
>
> When I declare an object of type Motor and assign it a port outside of
> main() the RCX does not run the program at all, I have to remove batteries
> and reload firmware to get it back to normal.
>
> Is this related to the 2-byte offset that is skipping the register clear
> that makes the motors run when they are not commanded?
This was only a problem when using certain firmware downloaders. If you use
firmdl3, then you should be fine.
> I didn't notice the motor doing anything, just no RCX operation until I
> moved the definition of the Motor type object back into main().
>
> Any insights will be appreciated, I don't mind figuring out why this
> happens, just want to know if someone else already has or not.
As far as I can tell, I don't think there is any provision in BrickOS to call
the constructors and destructors of globals & staticly declared objects.
The Motor object has function pointers in it that get initialized in the
constructor. If the constructor isn't called then these pointers won't point to
the proper code and your program will crash when you start to use the Motor
object.
Below you'll find a wrapper function that will walk through the global
constructor/destructor tables and call them upon entry/exit to your program.
HTH,
Mark
#include <config.h>
#include <c++/Motor.H>
#include <conio.h>
#include <unistd.h>
// Call the constructors & destructors of global objects
typedef void (*Ftor)();
extern "C" Ftor __ctors[], __ctors_end[];
extern "C" Ftor __dtors[], __dtors_end[];
int main2();
int main()
{
Ftor* f;
int r;
// call constructors
for (f = __ctors; f != __ctors_end; f++)
(*f)();
r = main2();
// call destructors
for (f = __dtors; f != __dtors_end; f++)
(*f)();
return r;
}
// Test motor object
Motor m(Motor::A);
int main2()
{
while (!shutdown_requested())
{
m.forward();
m.speed(m.max);
cputs("F");
sleep(1);
m.reverse();
m.speed((m.max + m.min) / 2);
cputs("r");
sleep(1);
}
return 0;
}
|
|
Message has 1 Reply: | | Global Objects was Strange RCX startup issues
|
| Mark, This is an interesting issue. Initially, after reading your post, I was thinking that it would be easy to add this support to BrickOS. Of course, this is only partially correct. For NON Task Manager builds (therefore no Program manager), it is (...) (21 years ago, 9-Dec-03, to lugnet.robotics.rcx.legos)
|
Message is in Reply To:
| | Strange RCX startup issues
|
| Hello, using brickOS v0.2.6.10... When I declare an object of type Motor and assign it a port outside of main() the RCX does not run the program at all, I have to remove batteries and reload firmware to get it back to normal. Is this related to the (...) (21 years ago, 9-Dec-03, to lugnet.robotics.rcx.legos)
|
12 Messages in This Thread:
- Entire Thread on One Page:
- Nested:
All | Brief | Compact | Dots
Linear:
All | Brief | Compact
This Message and its Replies on One Page:
- Nested:
All | Brief | Compact | Dots
Linear:
All | Brief | Compact
|
|
|
|