Actually I just tried the approach I suggested with a quick hack to both
openocd and nuttx and it seems
to be working. So, this eliminates the need to hardcode offsets. A similar
thing should be done for the size
of the tasklist table, since it also depend on build flags.
Anyway, I think the handling of registers is not entirely working since I'm
getting the following:
Id Target Id Frame
2 Thread 536871672 (Name: Idle Task, pid:0, READYTORUN) 0x2000037c in
g_idletcb ()
* 3 Thread 536876112 (Name: init, pid:1, RUNNING) cmd_pwd
(vtbl=0x20001f90, argc=1, argv=0x20001e8c)
at nsh_envcmds.c:333
For some reason the thread IDs do not start at 0 and the idle task has a PC in
SRAM?
Best,
Matias
On Sun, Nov 22, 2020, at 22:36, Matias N. wrote:
> On Sun, Nov 22, 2020, at 22:25, Brennan Ashton wrote:
>> I generally agree at least for the larger ARM platforms where there is
>> overhead. We have some examples that are intentionally small, but for most
>> of the reference examples I think we should be making the debugging better
>> out of the box.
>
> Yes, that is my thinking.
>
>>
>> I also usually reset this to the default when I'm debugging using the
>> nuttx-gdbinit script.
>
> I'm actually trying opencd support for NuttX as QtCreator integrates better
> with it
> compared to the nuttx-gdbinit script.
>
> Just now trying with nrf52832-mdk:nsh, after changing TASK_NAME_SIZE, it
> seems the
> offset for "xcp" does not match the offset in openocd (master). Looking at
> tcb_s, these
> variables that openocd looks for are dispersed in tcb_s, with other variables
> that are optionally
> built, which means offsets will often change.
>
> I'm thinking of two ways that we could have more solid support for this:
> * Reorder these variables so that they are all together inside the struct (a
> bit intrusive, but harmless?)
> * Define some (optional) global struct in NuttX which can hold these offsets
> as constant variables. Something like:
>
> struct tcb_offsets_s
> {
> void *pid;
> void *xcp;
> void *task_state;
> void *name;
> size_t name_size;
> };
>
> const static struct tcb_offsets_s g_tcb_offsets =
> {
> .pid = (void*)&((struct tcb_s *)(0))->pid;
> .xcp = (void*)&((struct tcb_s *)(0))->xcp.regs;
> .task_state = (void*)&((struct tcb_s *)(0))->task_state;
> .name = (void*)&((struct tcb_s *)(0))->name;
> .name_size = sizeof(((struct tcb_s *)(0))->name);
> };
>
> and then have openocd look for this first to get the offsets. I haven't tried
> this and not really familiar with openocd internals but I guess it should be
> possible.
>
> What do you think?
>
> Best,
> Matias
>
>>
>> On Sun, Nov 22, 2020, 5:18 PM Matias N. <[email protected]> wrote:
>>
>> > While trying the integration of openocd with NuttX it was complaining due
>> > to "name" not being defined, which happens when CONFIG_TASK_NAME_SIZE == 0.
>> > Looking at sched/Kconfig the default for this symbol is 31, yet many
>> > configs have this set to zero. Do you think this is due to the default
>> > having changed at some point or is this done to minimize memory use in all
>> > these boards? If the latter, maybe we need to make the default depend on
>> > CONFIG_DEFAULT_SMALL and update all configs that do not have this set.
>> >
>> > Best,
>> > Matias
>>
>