Managed to find a fix here: https://github.com/apache/nuttx/pull/16457

On Tue, May 27, 2025 at 11:24 PM Matteo Golin <matteo.go...@gmail.com>
wrote:

> Thank you for your help KR!
>
> I also noticed this CONFIG_RAM_START=0x800100. Unfortunately, changing
> that value to the proper 0x800200 did not really help the issue.
>
> I went ahead and generated the disassembly like you suggested, and it does
> appear that the .text section starts with jump instructions for all the
> interrupt vectors:
>
> 00000000 <_stext>:
>        0:       0c 94 72 00     jmp     0xe4    ; 0xe4 <__start>
>        4:       0c 94 95 00     jmp     0x12a   ; 0x12a <atmega_int0>
>        8:       0c 94 98 00     jmp     0x130   ; 0x130 <atmega_int1>
>        c:       0c 94 9b 00     jmp     0x136   ; 0x136 <atmega_int2>
>       10:       0c 94 9e 00     jmp     0x13c   ; 0x13c <atmega_int3>
>       14:       0c 94 a1 00     jmp     0x142   ; 0x142 <atmega_int4>
>       18:       0c 94 a4 00     jmp     0x148   ; 0x148 <atmega_int5>
>       1c:       0c 94 a7 00     jmp     0x14e   ; 0x14e <atmega_int6>
>       20:       0c 94 aa 00     jmp     0x154   ; 0x154 <atmega_int7>
>       24:       0c 94 ad 00     jmp     0x15a   ; 0x15a <atmega_pcint0>
>       28:       0c 94 b0 00     jmp     0x160   ; 0x160 <atmega_pcint1>
>       2c:       0c 94 b3 00     jmp     0x166   ; 0x166 <atmega_pcint2>
>       30:       0c 94 b6 00     jmp     0x16c   ; 0x16c <atmega_wdt>
>       34:       0c 94 b9 00     jmp     0x172   ; 0x172 <atmega_tim2_compa>
>       38:       0c 94 bc 00     jmp     0x178   ; 0x178 <atmega_tim2_compb>
>       3c:       0c 94 bf 00     jmp     0x17e   ; 0x17e <atmega_tim2_ovf>
>       40:       0c 94 c2 00     jmp     0x184   ; 0x184 <atmega_tim1_capt>
>       44:       0c 94 c5 00     jmp     0x18a   ; 0x18a <atmega_tim1_compa>
>       48:       0c 94 c8 00     jmp     0x190   ; 0x190 <atmega_tim1_compb>
> ...and so on...
>
> `g_idle_topstack` is 0x800e2b in the disassembly. With RAM_START being
> 0x800200, and a size of 8192 bytes, that gives a `heap_size` of 5076 bytes.
> That all seems fine.
>
> However, printing out the value of `g_idle_topstack` (in binary using
> `up_putc`) I can see that the value does not match. The printed value is
> "1000011001110110" while the binary representation of 0x800e2b is
> "100000000000111000101011".
> Printing out the `heap_size` tells me it's "1111100111001101", which is
> not 5076.
>
> It seems your suspicion about a mismatch is probably correct, although
> it's not due to a misplaced vector table it seems.
>
> I did, for fun, try enabling `CONFIG_DEBUG_OPT_UNUSED_SECTIONS` and it did
> remove the vectors at the start of the assembly file. That image didn't
> work.
> Then I kept `CONFIG_DEBUG_OPT_UNUSED_SECTIONS` enabled and put the
> `KEEP(*(.vectors))` suggestion in the linker script. Vectors are kept in
> the image, and `g_idle_topstack` changes to 0x800be4. This image didn't
> work either.
>
> That got me thinking if there was another section getting unexpectedly
> tossed, so I put `KEEP(...)` around basically everything in the linker
> script. That didn't produce a different result, and still had the
> `g_idle_topstack` of 0x800e2b.
>
> I will continue to debug this, but if you have any other suggestions
> please let me know. Thank you very much for all your help so far!
>
> Matteo
>
> On Tue, May 27, 2025 at 7:33 PM <kr....@kerogit.eu> wrote:
>
>> Thanks to you as well.
>>
>> I spotted an error in the config posted both in the issue #16444 and PR
>> #16443. It is the
>>
>> CONFIG_RAM_START=0x800100
>>
>> Unless I overlooked something, the RAM starts at address 0x200
>> (0x800200) for AtMega 2560.
>>
>> Not sure if that's what causing the problem though - as far as I can
>> see, that value is actually only used as an input to CONFIG_RAM_END
>> calculation and incorrect value in this macro simply reduces heap size.
>>
>> The symptoms of the bug would match though - the program would be trying
>> to use I/O registers as RAM.
>>
>> Thing is - seeing the bug was narrowed down to heap initialization in
>> nx_start - I remember that I ran into pretty much the same issue when
>> adding support for AVR DA/DB family... and I can't remember what was the
>> problem.
>>
>> Maybe check the disassembly file? (RAW_DISASSEMBLY needs to be set for
>> the file to be generated.) Verify that the .text section starts with jmp
>> instructions for interrupt vectors. This is only a vague memory but I
>> think that I ran into the issue because the linker removed .vectors
>> section, thinking it was unreferenced. (But that should not happen here,
>> the linked config shows CONFIG_DEBUG_OPT_UNUSED_SECTIONS is not set.)
>>
>> Anyway, when that happened, the whole program got "shifted" - except for
>> program memory that stored values of initialized variables. The data
>> copy loop in initialization code (atmega_head.S) then read the values
>> from the shifted location leading to a mismatch - variables were
>> populated with wrong data. One of those variables was g_idle_topstack
>> which directly sets start of heap. I think it initialized it to zero...?
>>
>> Again, all of this is based on vague memory. TLDR version is: if able,
>> check g_idle_topstack in up_allocate_heap and verify that it is correct.
>>
>>
>> On 2025-05-27 15:28, Alan C. Assis wrote:
>> > Thank you KR,
>> >
>> > I posted your message in that issue for reference.
>> >
>> > I have a BK-AVR128 board:
>> > https://aliexpress.com/item/1005006234334573.html
>> > and will test NuttX on it to confirm.
>> >
>> > If everything is working as expected I will submit the board support to
>> > the
>> > mainline.
>> >
>> > BR,
>> >
>> > Alan
>> >
>> > On Tue, May 27, 2025 at 6:39 AM <kr....@kerogit.eu> wrote:
>> >
>> >> Hello,
>> >>
>> >> as mentioned in one of my previous e-mails to this list (RFC:
>> >> decoupling
>> >> ability to always panic from board_reset), I noticed #16444 and #16443
>> >> on GitHub.
>> >>
>> >> I found some time to look into this and I believe I found the reason
>> >> for
>> >> "If you add avr_lowputc calls in the board initialization code, you'll
>> >> see that the TX LED stays stuck on indefinitely."
>> >>
>> >> Provided the board initialization code that sentence is talking about
>> >> is
>> >> atmega_boardinitialize() in avr_boot.c, then avr_lowputc() likely does
>> >> not work because of the configuration used. According to #16444, the
>> >> configuration has:
>> >>
>> >> CONFIG_DEV_CONSOLE=y
>> >> CONFIG_CONSOLE_SYSLOG=y
>> >>
>> >> These two are processed in src/atmega/atmega_config.h
>> >>
>> >> #ifndef CONFIG_DEV_CONSOLE
>> >> #  undef  USE_SERIALDRIVER
>> >> #  undef  USE_EARLYSERIALINIT
>> >> #else
>> >> #  if defined(CONFIG_CONSOLE_SYSLOG)
>> >> #    undef  USE_SERIALDRIVER
>> >> #    undef  USE_EARLYSERIALINIT
>> >> #  elif defined(HAVE_USART_DEVICE)
>> >> #    define USE_SERIALDRIVER 1
>> >> #    define USE_EARLYSERIALINIT 1
>> >> #  else
>> >> #    undef  USE_SERIALDRIVER
>> >> #    undef  USE_EARLYSERIALINIT
>> >> #  endif
>> >> #endif
>> >>
>> >> With the configuration above, the outer ifndef is not true and first
>> >> if
>> >> defined in else block is true, which results into:
>> >>
>> >> undef  USE_SERIALDRIVER
>> >> undef  USE_EARLYSERIALINIT
>> >>
>> >> Since CONFIG_STANDARD_SERIAL is also set, the undef of
>> >> USE_SERIALDRIVER
>> >> is reverted by define USE_SERIALDRIVER 1 later. However,
>> >> USE_EARLYSERIALINIT remains unset.
>> >>
>> >> This causes avr_earlyserialinit() to not be built nor called from
>> >> avr_lowinit(). Serial port peripheral is therefore not initialized yet
>> >> when atmega_boardinitialize() is called. I don't know what exactly
>> >> happens when you attempt to transmit data with the port not enabled
>> >> but
>> >> my guess would be that "transmit data register empty" status flag is
>> >> just never cleared and the program ends up in a loop waiting for that
>> >> to
>> >> happen.
>> >>
>> >>
>> >> Other than that - I recently tested NSH on mega1284p-xplained (well, a
>> >> breadboard with the chip stuck in it actually) and it worked for me.
>> >> As
>> >> far as I can see, all AtMega devices use the same code for managing
>> >> serial ports so it should work out of the box.
>> >>
>> >> Someone somewhere in some forum on the net has or had a footer in his
>> >> posts saying something along the lines of that non-functional serial
>> >> port is 99% mismatching baud rates, might be worth a re-check.
>> >>
>> >> As for the PR itself (copying from e-mail mentioned at the beginning)
>> >> -
>> >> I would recommend trying to use KEEP(*(.vectors)) as seen in
>> >> boards/avr/avrdx/breadxavr/scripts/breadxavr.ld - the default config
>> >> should then not need the "# CONFIG_DEBUG_OPT_UNUSED_SECTIONS is not
>> >> set"
>> >> line.
>> >>
>>
>

Reply via email to