But since I'm a Cortex M fanboy I have to defend its reset capabilities :)
For your specific case, try something like
volatile uint32_t *AIRCR = (volatile uint32_t*)0xE000ED0C;
const uint32_t VECTKEY = 0x05FA << 16;
const uint32_t SYSRESETREQ = 1 << 2;
void take_reset()
{
*AIRCR = VECTKEY | SYSRESETREQ;
__dsb();
while(1);
}
It's technically dependent on external hardware in your processor subsystem, but it should work if your implementer has half a brain (or, at least cares enough to read the integration manual). If it doesn't work, please flog your implementer publicly so that I can know to avoid them in the future...Incidentally, even that tiny code snippet is uses a C extension (the __dsb intrinsic) which is either a great example of how C can be wielded to great power (I can generate raw instructions!) or how C is terribly handicapped (I need a special compiler extension or all my system code is horribly broken!). All depends on point of view, I guess...
Anyway, more info @ page 498, http://web.eecs.umich.edu/~prabal/teaching/eecs373-f10/readi...