mirror of
https://github.com/apache/nuttx.git
synced 2026-06-02 01:21:26 +08:00
drivers/timers/arch_alarm.c: Remove ndelay_accurate
Using ONESHOT_CURRENT retrieves the tick number multiplied by tick time; thus it doesn't give the accurate monotonic time - it is quantized by the tick time. This cannot be used as a ndelay timer, it would always loop at least to the end of the ongoing tick. Revert the up_udelay to use the original "coarse" looping. The "accurate" udelay, if such is needed, should either be done under arch specific code, or there should be a function for getting the accurate time that is available for all the platforms. Signed-off-by: Jukka Laitinen <jukkax@ssrc.tii.ae>
This commit is contained in:
committed by
Xiang Xiao
parent
877f42cde5
commit
1a267dc62d
@@ -50,22 +50,6 @@ static clock_t g_current_tick;
|
|||||||
* Private Functions
|
* Private Functions
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
static void ndelay_accurate(unsigned long nanoseconds)
|
|
||||||
{
|
|
||||||
struct timespec now;
|
|
||||||
struct timespec end;
|
|
||||||
struct timespec delta;
|
|
||||||
|
|
||||||
ONESHOT_CURRENT(g_oneshot_lower, &now);
|
|
||||||
clock_nsec2time(&delta, nanoseconds);
|
|
||||||
clock_timespec_add(&now, &delta, &end);
|
|
||||||
|
|
||||||
while (clock_timespec_compare(&now, &end) < 0)
|
|
||||||
{
|
|
||||||
ONESHOT_CURRENT(g_oneshot_lower, &now);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void udelay_coarse(useconds_t microseconds)
|
static void udelay_coarse(useconds_t microseconds)
|
||||||
{
|
{
|
||||||
volatile int i;
|
volatile int i;
|
||||||
@@ -441,13 +425,6 @@ void weak_function up_udelay(useconds_t microseconds)
|
|||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
|
|
||||||
void weak_function up_ndelay(unsigned long nanoseconds)
|
void weak_function up_ndelay(unsigned long nanoseconds)
|
||||||
{
|
|
||||||
if (g_oneshot_lower != NULL)
|
|
||||||
{
|
|
||||||
ndelay_accurate(nanoseconds);
|
|
||||||
}
|
|
||||||
else /* Oneshot timer hasn't been initialized yet */
|
|
||||||
{
|
{
|
||||||
udelay_coarse((nanoseconds + NSEC_PER_USEC - 1) / NSEC_PER_USEC);
|
udelay_coarse((nanoseconds + NSEC_PER_USEC - 1) / NSEC_PER_USEC);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|||||||
Reference in New Issue
Block a user