|
Lou Sortman wrote:
> > rom_reset() does the trick, you'll need to #include "rom/system.h". I'm
> > not sure wheter this is safe when multitasking.
>
> What sort of safety are you referring to? Motors left running? My initial
> thought was of lost memory or data structures in an indeterminate state, but
> that would seem to be moot since you are restarting from the ROM, which will
> have forgotten all about legOS.
Well, if rom_reset() gets invoked near the end of your time slice, ROM
has no time to reset the OCIA IRQ vector before the next timer tick. I'm
not certain about the order in which ROM sets up data areas and IRQ
vectors. legOS freely allocates nearly all ROM data areas, so task code
might be overwritten and then switched to. Higher-priority tasks might
stop the reset code from ever continuing. Messy subject.
A safe reset from multitasking would look like this:
disable_interrupts();
set_stack_to_on_chip_area(); // if ROM doesn't do this itself
rom_reset();
> On a tangentially related note, I have learned something that (in hindsight)
> should have been obvious. Static variables, even when you initialize them to a
> certain value, will not be initialized to that value at power-on; only on
> initial program load (firmdl). They retain the value that they last had before
> the power was turned off. This may seem obvious now, but it is a different
> paradigm than I am used to from the world of larger operating systems, where
> programs are loaded (data segment copied) every time you run them.
Oops, I thought this pecularity was well-known? If pre-initialized data
segments are typically small, a future task loader might cache a copy.
Otherwise, this issue will probably remain.
--
Markus L. Noga noga@inrialpes.fr
Check out legOS! http://www.multimania.com/legos/
"Quand on n'a pas de caractere, il faut bien se donner une methode."
-Camus on Software Engineering
|
|
Message has 1 Reply: | | Re: loading s/w
|
| (...) The first instruction (at 03ae) places the stack in on-chip memory, assuming RAME bit of SYSCR is at its initial value of 1. Why not make rom_reset() disable interrupts, then do its thing? That would be the safest thing to do. -Kekoa (26 years ago, 21-Apr-99, to lugnet.robotics.rcx.legos)
|
Message is in Reply To:
| | Re: loading s/w
|
| (...) What sort of safety are you referring to? Motors left running? My initial thought was of lost memory or data structures in an indeterminate state, but that would seem to be moot since you are restarting from the ROM, which will have forgotten (...) (26 years ago, 20-Apr-99, to lugnet.robotics.rcx.legos)
|
11 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
|
|
|
|