1
\$\begingroup\$

I'm working on an implementation of AVR109, where the bootloader times out after two seconds if a given series of bytes aren't received on the serial port, and then starts the main application using a function pointer to address 0.

The bootloader is working fine, and I'm able to program the AVR via serial port. But when the AVR only contains the bootloader, and the flash memory at location 0 is empty, it takes two seconds in addition to the bootloader timeout every time the AVR restarts. Why isn't this instantaneous? Why isn't the AVR resetting immediately when the bootloader sets the pointer to an empty area in the flash? Is this something I can configure?

EDIT: My bootloader conundrum actually proved to be caused by PEBCAK. An error in the initial timing loop in the bootloader caused the extra two second delay, and was fixed. When jumping to the start of a blank/erased flash memory, it actually only took a few milliseconds before the bootloader started up again, i.e. not a big problem. But the best approach is to check the flash memory location before jumping there. If it's erased, just restart the bootloader instead of jumping to the empty area.

asked Jan 24, 2017 at 15:06
\$\endgroup\$
13
  • \$\begingroup\$ There is no such thing as "empty". There is some data that will be executed. \$\endgroup\$ Commented Jan 24, 2017 at 15:12
  • \$\begingroup\$ Didn't you just said it is using these 2 seconds to allow you to program it? \$\endgroup\$ Commented Jan 24, 2017 at 15:13
  • \$\begingroup\$ @EugeneSh. "it takes two seconds in addition to the bootloader timeout every time the AVR restarts." In other words it takes four seconds when the bootloader timeout is set to two seconds. So when the pointer is set to address 0, which I assume is all 0xFF after the flash is erased prior to programming the bootloader, it resets after exactly two seconds. And then takes an additional two seconds to time out again. And so it goes in a four second cycle. \$\endgroup\$ Commented Jan 24, 2017 at 15:15
  • \$\begingroup\$ @PlasmaHH Even when the flash is erased prior to the bootloader being programmed? Isn't the flash set to 0xFF then? What happens when the AVR tries to execute 0xFF? \$\endgroup\$ Commented Jan 24, 2017 at 15:20
  • 1
    \$\begingroup\$ @Oystein: Unless by "erase" you mean "rip off with a pair of pliers", it contains some data. 0xFF is data too. \$\endgroup\$ Commented Jan 24, 2017 at 15:21

1 Answer 1

3
\$\begingroup\$

Well, the answer its to the behavior of the system is "who knows" because you basically have an undefined behavior because there is nothing written to flash to the MCU will try to use whatever is at address 0 as the reset vector for the application, if is erased it will try to use 0xffff and I do not think that the AVR issues an exception when you go outside the memory bounds and it will execute some random instruction and probably hang in there until the watchdog or other invalid instruction causes a reset. Most boot loaders tend to do a check for the value at the reset vector (typically address 0) to verify it is not blank and if it is they just loop the boot loader indefinitely to prevent the MCU to run into undefined behavior.

answered Jan 24, 2017 at 17:13
\$\endgroup\$
2
  • 2
    \$\begingroup\$ +1. Indeed, AVRs will just execute instructions no matter what. \$\endgroup\$ Commented Jan 24, 2017 at 19:09
  • \$\begingroup\$ +1 @TomCarpenter Thanks for information about AVR just running through memory locations until it hits a valid instruction. And for information on "proper" bootloader behavior (that it should check memory at location 0 before jumping there). \$\endgroup\$ Commented Jan 25, 2017 at 7:50

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.