bootloader callable from sketch?

Thanks for the link. That specific statement from Atmel doesn't match my own measurements, so I've asked their tech support to clarify the issue for us.

Whether I'm right or wrong doesn't matter a great deal to me. I wouldn't be very good at my job if I attached my ego to every test or measurement I make - especially one as trival as this is.

What has provoked me, and caused this thread to be as long as it is, is Grumpy Mike's attempt to trump an observation with his supposed seniority. This is known as Proof by Assertion Proof by assertion - Wikipedia, and it is very offensive to anybody that loves science or technology.

To anybody still reading this topic, I offer the following code. It generates reset pulses of varying durations, and indicates which if any are successful. After reset it checks the state of the registers and lists any which do not match the expected values. Read the comments before running.

/*
Self-reset test sketch
Made for 16MHz ATmega328-based Arduino

To use:
- Compile, upload, and launch the serial monitor (57600 baud)
- Update the register values in checkreg() to those reported.
- Recompile, re-upload, and check there are no "Register" messages
- Cut the auto-reset connection if present (the track between the solder pads marked "RESET-EN on Uno boards)
- Connect Pin-2 to Reset
- Optionally, connect Pin-3 to an oscilloscope and a resistive load to show when the port is reset.

Disabling Auto-Reset is optional, but required for testing with very short pulses <1ms (do this *after* uploading and checking this sketch)
To re-enable Auto-Reset on an Uno, dab a spot of solder between the pads where the track was cut.

NB. Whilst Pin-2 is connected to Reset and the sketch is running, do not push the reset button (will short Pin-2 to ground)

*/
#define reg_is(x,y) if (x != y) {\
  Serial.print("Register ");\
  Serial.print(#x);\
  Serial.print(" = ");\
  Serial.println(x,HEX);\
  }


void setup() {
  Serial.begin(57600);
  Serial.println("-");
  Serial.println("Started (do not push the Reset button)");
  checkreg();
  PORTD = 0x04; // Pin-2 high, Pin-3 low
  DDRD = 0x0C;

  delay(1000);

  PORTD = 0x08; // Pin-2 low, Pin-3 high
  PORTD = 0x04; // Pin-2 high, Pin-3 low
  Serial.println("Failed to reset after a  60ns pulse (this is normal)");

  delay(1000);

  PORTD = 0x08; // Pin-2 low, Pin-3 high
  asm volatile("nop\n");
  PORTD = 0x04; // Pin-2 high, Pin-3 low
  Serial.println("Failed to reset after a 120ns pulse (this is normal)");

  delay(1000);

  PORTD = 0x08; // Pin-2 low, Pin-3 high
  asm volatile("nop\nnop\n");
  PORTD = 0x04; // Pin-2 high, Pin-3 low
  Serial.println("Failed to reset after a 180ns pulse (this is normal)");

  delay(1000);

  PORTD = 0x08; // Pin-2 low, Pin-3 high
  asm volatile("nop\nnop\nnop\n");
  PORTD = 0x04; // Pin-2 high, Pin-3 low
  Serial.println("Failed to reset after a 250ns pulse (this is normal)");

  delay(1000);

  PORTD = 0x08; // Pin-2 low, Pin-3 high
  asm volatile("nop\nnop\nnop\nnop\n");
  PORTD = 0x04; // Pin-2 high, Pin-3 low
  Serial.println("Failed to reset after a 300ns pulse (within spec, but differs from Tim's result)");

  delay(1000);

  PORTD = 0x08; // Pin-2 low, Pin-3 high
  asm volatile("nop\nnop\nnop\nnop\nnop\nnop\nnop\n");
  PORTD = 0x04; // Pin-2 high, Pin-3 low
  Serial.println("Failed to reset after a 500ns pulse (within spec, but differs from Tim's result)");

  delay(1000);

  PORTD = 0x08; // Pin-2 low, Pin-3 high
  asm volatile("nop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\n");
  asm volatile("nop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\n");
  asm volatile("nop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\n");
  asm volatile("nop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\nnop\n");
  PORTD = 0x04; // Pin-2 high, Pin-3 low
  Serial.println("Failed to reset after a 2.5us pulse (out of spec - is autoreset disconnected?)");

  delay(1000);

  PORTD = 0x08; // Pin-2 low, Pin-3 high
  delay(1);
  PORTD = 0x04; // Pin-2 high, Pin-3 low
  Serial.println("Failed to reset after a   1ms pulse (this shouldn't happen!)");

  delay(1000);

  DDRD = 0x00;
  Serial.println("Stopped (you may now push the reset button)");

}

void loop() {
}

void checkreg() {
 // This routine compares the register contents to values after a "normal" reset
 // Normal values vary from board to board -- update the code below as necessary

 Serial.println("Looking for uninitialised registers...");
//  reg_is(PINB,    0) // floating inputs can be random
  reg_is(DDRB,    0)
  reg_is(PORTB,   0)
//  reg_is(PINC,    0) // floating inputs can be random
  reg_is(DDRC,    0)
  reg_is(PORTC,   0)
//  reg_is(PIND,    0) // floating inputs can be random
  reg_is(DDRD,    0)
  reg_is(PORTD,   0)
//  reg_is(TIFR0,   0) // timer
//  reg_is(TIFR1,   0) // timer
//  reg_is(TIFR2,   0) // timer
  reg_is(PCIFR,   0)
  reg_is(EIFR,    0)
  reg_is(EIMSK,   0)
  reg_is(GPIOR0,  0)
  reg_is(EECR,    0)
  reg_is(EEDR,    0)
  reg_is(EEAR,    0x03DF)
  reg_is(EEARL,   0x00DF)
  reg_is(EEARH,   0x0003)
  reg_is(GTCCR,   0)
  reg_is(TCCR0A,  0x0003)
  reg_is(TCCR0B,  0x0003)
//  reg_is(TCNT0,   0) // timer
  reg_is(OCR0A,   0)
  reg_is(OCR0B,   0)
  reg_is(GPIOR1,  0)
  reg_is(GPIOR2,  0)
  reg_is(SPCR,    0)
  reg_is(SPSR,    0)
  reg_is(SPDR,    0)
  reg_is(ACSR,    0x0030)
  reg_is(SMCR,    0)
  reg_is(MCUSR,   0x0005)
  reg_is(MCUCR,   0)
  reg_is(SPMCSR,  0)
  reg_is(WDTCSR,  0)
  reg_is(CLKPR,   0)
  reg_is(PRR,     0)
  reg_is(OSCCAL,  0x0084)
  reg_is(PCICR,   0)
  reg_is(EICRA,   0)
  reg_is(PCMSK0,  0)
  reg_is(PCMSK1,  0)
  reg_is(PCMSK2,  0)
  reg_is(TIMSK0,  0x0001)
  reg_is(TIMSK1,  0)
  reg_is(TIMSK2,  0)
  reg_is(ADC,     0)
  reg_is(ADCW,    0)
  reg_is(ADCL,    0)
  reg_is(ADCH,    0)
  reg_is(ADCSRA,  0x0087)
  reg_is(ADCSRB,  0)
  reg_is(ADMUX,   0)
  reg_is(DIDR0,   0)
  reg_is(DIDR1,   0)
  reg_is(TCCR1A,  0x0001)
  reg_is(TCCR1B,  0x0003)
  reg_is(TCCR1C,  0)
//  reg_is(TCNT1,   0) // timer
//  reg_is(TCNT1L,  0) // timer
//  reg_is(TCNT1H,  0) // timer
  reg_is(ICR1,    0)
  reg_is(ICR1L,   0)
  reg_is(ICR1H,   0)
  reg_is(OCR1A,   0)
  reg_is(OCR1AL,  0)
  reg_is(OCR1AH,  0)
  reg_is(OCR1B,   0)
  reg_is(OCR1BL,  0)
  reg_is(OCR1BH,  0)
  reg_is(TCCR2A,  0x0001)
  reg_is(TCCR2B,  0x0004)
//  reg_is(TCNT2,   0) // timer
  reg_is(OCR2A,   0)
  reg_is(OCR2B,   0)
  reg_is(ASSR,    0)
  reg_is(TWBR,    0)
  reg_is(TWSR,    0x00F8)
  reg_is(TWAR,    0x00FE)
  reg_is(TWDR,    0x00FF)
  reg_is(TWCR,    0)
  reg_is(TWAMR,   0)
  reg_is(UCSR0A,  0)
  reg_is(UCSR0B,  0x00B8)
  reg_is(UCSR0C,  0x0006)
  reg_is(UBRR0,   0x0010)
  reg_is(UBRR0L,  0x0010)
  reg_is(UBRR0H,  0)
  reg_is(UDR0,    0)
  Serial.println("...finished register check");
}

Oscilloscope traces from an Uno r2:
Yellow = pin-3 (connected via 10kOhm to ground)
Blue = pin-2 (connected to Reset, and two resistors (internal + 10kOhm) in parallel to Vcc)

A 250ns pulse is insufficient to cause reset and sketch execution continues. Note the rapid trailing-edge of the pulses.

Pulses 300ns or longer trigger reset. After 300ns the port outputs go high-impedance. Note the slower voltage decay.