I guess that author avoids github. I will try to proxy patches to GH PR
after Easter next week :-)

Happy Easter Folks! :-)

--
CeDeROM, SQ7MHZ, http://www.tomek.cedro.info

On Sat, Apr 19, 2025, 16:00 Alan C. Assis <acas...@gmail.com> wrote:

> Hi KR,
>
> Sorry for my delay to review your commits.
>
> First kudos for your first contribution, it passed without any issues in
> the checkpatch:
>
> $ ./tools/checkpatch.sh -g HEAD~...HEAD
> $
>
> You did really great including all necessary information in the commit log
> messages:
>
> commit 9ce4bbf808416b9c5be2347c4a19b667c676db48 (HEAD -> master)
> Author: Kerogit <kr....@kerogit.eu>
> Date:   Sat Apr 5 23:41:54 2025 +0200
>
>     arch/avr: fixed PC load on chips with more than 128kB program memory
>
>     The code used subi instruction to decrement the Y pointer but this
>     instruction only affects a byte, not a word. Fixed it by using
>     pre-decrement in the LD instruction instead.
>
> commit b03272ff3d316352a7b735d6325dd0a2bcadb924
> Author: Kerogit <kr....@kerogit.eu>
> Date:   Mon Mar 24 22:43:33 2025 +0100
>
>     nuttx/compiler: replace AVR __flash qualifier with __memx for some
> chips
>
>     The __flash qualifier only allows access to program memory below 64kB
>     mark (uses 16 bit pointer.) Since many chips currently supported
>     have more than that, this qualifier can prove insufficient.
>
>     When flagged __memx the compiler will use 24 bit pointer to access
>     the variable.
>
> commit b3831188fb75b4b13302bf00c37e66e0155ce0cb
> Author: Kerogit <kr....@kerogit.eu>
> Date:   Mon Mar 24 22:17:09 2025 +0100
>
>     arch/avr/atmega: flag microcontrollers that have RAMPZ register
>
>     Define preprocesor macros that trigger adding RAMPZ register
>     into thread context
>
> commit 20883f7ea9f8050f2c51e8067ebfb0fffb621e54
> Author: Kerogit <kr....@kerogit.eu>
> Date:   Mon Mar 17 12:20:35 2025 +0100
>
>     arch/avr: save RAMPZ register into thread context
>
>     On chips that have it, RAMPZ is part of the thread context
>     and needs to be saved as well
>
> commit 00d803331e8aeb5f08dc09eafa0980aff8b83e7e
> Author: Kerogit <kr....@kerogit.eu>
> Date:   Thu Mar 13 20:44:01 2025 +0100
>
>     arch/avr: fixed typo in Kconfig
>
> commit a2977a1fd20ddc9a596e289debaebdfd06685328
> Author: Kerogit <kr....@kerogit.eu>
> Date:   Mon Apr 7 20:43:13 2025 +0200
>
>     Documentation/reference/user/02_task_scheduling: fixed function name
>
>     The document referred to sched_get_rr_interval function but only
>     sched_rr_get_interval exists in the sources.
>
>
> You just missed to signed your commits (git commit -S)
>
> I didn't understand these two configs:
>
> config AVR_HAS_RAMPZ
>         bool
>         depends on AVR_ATMEGA_HAS_RAMPZ
>
>
> config AVR_ATMEGA_HAS_RAMPZ
>         bool
>         select AVR_HAS_RAMPZ
>
> They seem like cross-references.
>
> Why don't you just use AVR_HAS_RAMPZ in Atmega chips directly?
>
> I suggest you open the PR in the github to integrate your contribution into
> the mainline, please read the
> https://nuttx.apache.org/docs/latest/contributing/index.html for
> instructions.
>
> BR,
>
> Alan
>
>
>
> On Thu, Apr 10, 2025 at 5:54 AM <kr....@kerogit.eu> wrote:
>
> > Hello,
> >
> > I would like to solicit a review for some fixes of (mostly) AVR
> > architecture code. These are some things I noticed when attempting to
> > create a port for AVR DA/DB family. I am doing my development based on
> > ATmega family since I am familiar with that and these patches (should)
> > only apply to it. I tried to avoid any changes that would affect the
> > other families but I cannot do any testing to confirm these patches
> > don't break anything for them.
> >
> > I tested these patches with ATmega1284 - since most of them affect
> > context switch code, I made a simple stress application that spawns 4
> > tasks. First reads data from serial port, stores-and-forwards them
> > through tasks 2 and 3 and finally to a task 4 which writes them back to
> > serial port to be verified for integrity by the PC side. As long as no
> > new data are arriving, currently held data is constantly shuffled
> > through registers and stack. None of the tasks ever sleep, forcing as
> > many context switches as possible. I ran this application for a few
> > hours and no data corruption was observed.
> >
> > Please note that I do not have a Github account so, if these patches are
> > accepted, I will be relying on someone else picking them up and doing a
> > PR.
> >
> > I will attempt to post these patches through the mailing list, there is
> > also a git repository nuttx.git available at git.kerogit.eu through
> > HTTP/S . The branch with the changes is called avr_fixes_rfc1 and is
> > based on upstream's releases/12.9 . It also rebases cleanly onto current
> > master if that is the more preferred location where to put these.
> >
> > Description of the patches follows:
> >
> > === 0001 fixed function name ===
> >
> > Mistyped function name in Documentation resulting in something not
> > present in the sources.
> >
> > === 0002 fixed typo in Kconfig ===
> >
> > Missing letter.
> >
> > === 0003 save RAMPZ register into thread context ===
> >
> > RAMPZ is an extension register used when accessing program memory
> > (flash) from the program itself. It is concatenated with value in
> > pointer register pair Z. Since user applications can reasonably be
> > expected to load their data from program memory, this register should be
> > saved into the thread context as well.
> >
> > That said, it's quite unlikely to hit the bug (reading from incorrect
> > address) fixed by this patch - there are three conditions that need to
> > be met:
> >
> > - forced context switch of a task that is currently reading from program
> > memory
> > - any other tasks that receives CPU time also needs to read from program
> > memory
> > - program memory address of those tasks must differ in RAMPZ value,
> > which is the highest byte
> >
> > Meeting the last condition is somewhat unlikely because all data stored
> > in program memory tends to be placed in a single region by the compiler.
> > So to trigger the bug, this region would need to be large enough to
> > cross 64kB boundary. Considering most supported devices have 128kB of
> > flash in total and NuttX itself needs close to 64kB with very few
> > features enabled, it is quite unlikely to have this much const data and
> > NuttX and still an useful program.
> >
> > Still feels worth fixing though, impact on existing users should be
> > negligible - few bytes of memory spent and few extra instructions. The
> > fix also applies to ATmega2560 with 256kB of flash where it is more
> > likely to have a program that can actually hit this.
> >
> > Note that similar bug still exists in ATmega2560 with its EIND register.
> > This register is used to extend address register pair used for making
> > indirect jumps (making jumps to addresses beyond 128kB boundary
> > possible.) This is not addressed by this patch as I don't have such chip
> > to be able to test the change.
> >
> > === 0004 flag microcontrollers that have RAMPZ register ===
> >
> > Enables code from previous patch on all currently supported chips.
> >
> > === 0005 replace AVR __flash qualifier with __memx for some chips ===
> >
> > This one may need some feedback. This patch changes __flash qualifier to
> > __memx in IOBJ macro. These qualifiers instruct the compiler to place
> > (or, rather, keep) const data in program memory and read it from there.
> > The difference is that __flash is only able to address 64kB memory size
> > while __memx extends the pointer size to 24 bits. The (possible) issue
> > here is that this definition of IOBJ is currently restricted to
> > compilation with AVR toolchain which I don't use and therefore can't
> > test. However, I believe that their toolchain is based on gcc (which I
> > use) and therefore behaves the same. At the minimum, the __memx
> > qualifier is supported there for sure as it is the value used in IPTR
> > macro already present in the code.
> >
> > Anyway, with this changes and with corresponding configuration options
> > enabled, the code compiles and - judging from the assembly - seems to do
> > the right thing (ie. does respect the __memx qualifier from IPTR macro
> > used in parameters for syslog and syslog-related functions.)
> >
> > Using __flash qualifier as it is used now may cause bugs when const data
> > is placed to memory regions above 64kB. As of now, compiler tends to put
> > them at the beginning of the .text section so it is again unlikely to
> > happen - as long as the data isn't large enough. And again, might be
> > worth fixing since impact on existing users should be negligible. For
> > starters, this is currently only used for debugging code and the
> > associated cost of using 24 bit pointers is already paid in current form
> > because of IPTR being set to __memx
> >
> > This change does not apply for devices with 64kB or smaller program
> > memory (although there is no such device currently supported.)
> >
> > === 0006 fixed PC load on chips with more than 128kB program memory ===
> >
> > The original code uses Y pointer register pair to load 3 bytes from
> > given memory address. However, using subi (SUBtract Immediate)
> > instruction here is incorrect as it only affects the register it is
> > called upon - YL, low byte from the Y register pair. High byte remains
> > unchanged, resulting in incorrect load if the lower byte value wraps.
> >
> > The correct instruction for this would be sbiw (SuBtract Immediate from
> > Word) which operates on the whole pair. The fix does not do that though
> > - instead, the Y register pair is preloaded with value incremented by 1
> > and loads are executed using pre-decrement in the load instructions.
> > This both fixes the bug and also saves a bit of CPU time. The value in Y
> > register then ends up being different compared to the original code but
> > that should not matter since - as far as I can see - it is not used and
> > is later overwritten.
> >
> >
> > All the feedback and help is appreciated and my apologies for this text
> > being this long
> >
>

Reply via email to