Why not call up_udelay or up_mdelay? The arch/soc should provide a best
implementation for you.

On Thu, Mar 25, 2021 at 2:00 AM Fotis Panagiotopoulos <f.j.pa...@gmail.com>
wrote:

> If you are using an ARM MCU you may find the following helpful.
> You must ensure that it cannot be scheduled out in any way though...
>
> (Directly copy-pasting from one of our HAL libraries... You will need to
> fine-tune it to your needs.)
>
> /**
>  * Multiplier value for the ASM delay function. The delay cycles will be
>  * the requested uSecs delay multiplied by this value. The ASM loop needs
>  * two instructions per loop, which need 2 cycles to execute (4 if branch
>  * predictor misses, but that would not be the case for most executions).
>  * Assuming a 180MHz clock we need 60 loops per microsecond.
>  * @note The value is verified to be accurate after oscilloscope
> measurements.
>  */
> #define DELAY_ASM_MULTIPLIER        ( 60 )
>
> void delayASM(uint32_t us)
> {
>     us *= DELAY_ASM_MULTIPLIER;
>
>     //This implementation is taking care of the loop in assembly
>     //instructions, making the result much more predictable than
>     //a standard for loop with "nop" instructions, and it is
>     //independent of the compiler, and its optimizations.
>     asm volatile("   mov r0, %[us]          \n\t"
>                  "1: subs r0, #1            \n\t"
>                  "   bhi 1b                 \n\t"
>                  :
>                  : [us] "r" (us)
>                  : "r0");
> }
>
> Στις Τετ, 24 Μαρ 2021 στις 7:53 μ.μ., ο/η Grr <gebbe...@gmail.com> έγραψε:
>
> > This is a SocketCAN driver for MCP2515 with a new SPI system that
> > streamlines the select->write->read->deselect process and so exposes the
> > need to guarantee hold time between read and deselect and disable time
> > between deselect and next select
> >
> > Looking at David's code, it seems the loop is the right answer. The DWT
> > cannot be used for a portable solution but maybe an inline function.
> Thanks
> > for the idea
> >
> > I believe NOPs are optimized away but it seems asm("") or something close
> > to that is not
> >
> > It would be nice to incorporate a general solution for this problem to
> the
> > Nuttx toolbox
> >
> > El mié, 24 mar 2021 a las 11:24, David Sidrane (<david.sidr...@nscdg.com
> >)
> > escribió:
> >
> > > What HW is this on?
> > >
> > > -----Original Message-----
> > > From: Grr [mailto:gebbe...@gmail.com]
> > > Sent: Wednesday, March 24, 2021 10:09 AM
> > > To: dev@nuttx.apache.org
> > > Subject: Re: Sleep Resolution
> > >
> > > Thank you very much for your response
> > >
> > > What I'm trying to do is to generate hold and disable times for SPI CS,
> > > which should be about 50 ns
> > >
> > > I started by an empty for loop but it seems optimization gets rid of it
> > (I
> > > haven't researched the issue properly). Then I thought a proper
> function
> > > would be better but got stuck in that expression "sleep resolution"
> > >
> > > For that scale (10 SYSCLK cycles), a loop is probably OK but I wanted
> to
> > > make sure there's not a more appropriate system tool
> > >
> > > El mié, 24 mar 2021 a las 10:46, Sara da Cunha Monteiro de Souza (<
> > > saramonteirosouz...@gmail.com>) escribió:
> > >
> > > > Hi Grr,
> > > >
> > > > I have never needed to use this function neither this range (ns).
> > > > But I used the usleep function which resolution is defined as
> > > > CONFIG_USEC_PER_TICK.
> > > > But maybe, in your case, for such range, you should consider using a
> > > > hardware timer or a Timer Hook.
> > > > Take a look at this wiki:
> > > > https://cwiki.apache.org/confluence/display/NUTTX/Short+Time+Delays
> > > >
> > > > Sara
> > > >
> > > > Em qua., 24 de mar. de 2021 às 13:37, Grr <gebbe...@gmail.com>
> > escreveu:
> > > >
> > > > > Hello to all.
> > > > >
> > > > > Looking for the right way to create a _very_ short delay (10-100
> > ns), I
> > > > > found clock_nanosleep, whose description says:
> > > > >
> > > > > "The suspension time caused by this function may be longer than
> > > > > requested
> > > > > because the argument value is rounded up to an integer multiple of
> > the
> > > > > sleep resolution"
> > > > >
> > > > > What is the sleep resolution and where/how is defined?
> > > > >
> > > > > TIA
> > > > > Grr
> > > > >
> > > >
> > >
> >
>

Reply via email to