mirror of
https://gitlab.rtems.org/rtems/rtos/rtems.git
synced 2025-12-17 13:24:59 +08:00
sparc: Optimize CPU counter support
This commit is contained in:
@@ -26,6 +26,7 @@
|
||||
#include <bspopts.h>
|
||||
#include <rtems/counter.h>
|
||||
#include <rtems/timecounter.h>
|
||||
#include <rtems/score/sparcimpl.h>
|
||||
|
||||
#if SIMSPARC_FAST_IDLE==1
|
||||
#define CLOCK_DRIVER_USE_FAST_IDLE 1
|
||||
@@ -133,8 +134,4 @@ static void erc32_counter_initialize( uint32_t frequency )
|
||||
|
||||
#include "../../../shared/clockdrv_shell.h"
|
||||
|
||||
SPARC_Counter _SPARC_Counter = {
|
||||
.counter_read = _SPARC_Counter_read_address,
|
||||
.counter_difference = _SPARC_Counter_difference_one,
|
||||
.counter_address = (uint32_t *) &_SPARC_Counter
|
||||
};
|
||||
SPARC_COUNTER_DEFINITION;
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
#include <bsp.h>
|
||||
#include <bspopts.h>
|
||||
#include <rtems/timecounter.h>
|
||||
#include <rtems/score/sparcimpl.h>
|
||||
|
||||
#if SIMSPARC_FAST_IDLE==1
|
||||
#define CLOCK_DRIVER_USE_FAST_IDLE 1
|
||||
@@ -106,8 +107,4 @@ extern int CLOCK_SPEED;
|
||||
|
||||
#include "../../../shared/clockdrv_shell.h"
|
||||
|
||||
SPARC_Counter _SPARC_Counter = {
|
||||
.counter_read = _SPARC_Counter_read_address,
|
||||
.counter_difference = _SPARC_Counter_difference_one,
|
||||
.counter_address = (uint32_t *) &_SPARC_Counter
|
||||
};
|
||||
SPARC_COUNTER_DEFINITION;
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
|
||||
#include <rtems/counter.h>
|
||||
#include <rtems/sysinit.h>
|
||||
#include <rtems/score/sparcimpl.h>
|
||||
|
||||
static void leon3_counter_initialize(void)
|
||||
{
|
||||
@@ -73,8 +74,4 @@ RTEMS_SYSINIT_ITEM(
|
||||
RTEMS_SYSINIT_ORDER_THIRD
|
||||
);
|
||||
|
||||
SPARC_Counter _SPARC_Counter = {
|
||||
.counter_read = _SPARC_Counter_read_address,
|
||||
.counter_difference = _SPARC_Counter_difference_one,
|
||||
.counter_address = (uint32_t *) &_SPARC_Counter
|
||||
};
|
||||
SPARC_COUNTER_DEFINITION;
|
||||
|
||||
@@ -6,6 +6,7 @@ include_rtems_HEADERS = rtems/asm.h
|
||||
include_rtems_scoredir = $(includedir)/rtems/score
|
||||
include_rtems_score_HEADERS = rtems/score/sparc.h
|
||||
include_rtems_score_HEADERS += rtems/score/cpu.h
|
||||
include_rtems_score_HEADERS += rtems/score/sparcimpl.h
|
||||
include_rtems_score_HEADERS += rtems/score/types.h
|
||||
include_rtems_score_HEADERS += rtems/score/cpuatomic.h
|
||||
|
||||
|
||||
@@ -35,6 +35,10 @@ $(PROJECT_INCLUDE)/rtems/score/cpu.h: rtems/score/cpu.h $(PROJECT_INCLUDE)/rtems
|
||||
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/score/cpu.h
|
||||
PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/score/cpu.h
|
||||
|
||||
$(PROJECT_INCLUDE)/rtems/score/sparcimpl.h: rtems/score/sparcimpl.h $(PROJECT_INCLUDE)/rtems/score/$(dirstamp)
|
||||
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/score/sparcimpl.h
|
||||
PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/score/sparcimpl.h
|
||||
|
||||
$(PROJECT_INCLUDE)/rtems/score/types.h: rtems/score/types.h $(PROJECT_INCLUDE)/rtems/score/$(dirstamp)
|
||||
$(INSTALL_DATA) $< $(PROJECT_INCLUDE)/rtems/score/types.h
|
||||
PREINSTALL_FILES += $(PROJECT_INCLUDE)/rtems/score/types.h
|
||||
|
||||
@@ -1306,7 +1306,7 @@ typedef uint32_t CPU_Counter_ticks;
|
||||
|
||||
typedef CPU_Counter_ticks ( *SPARC_Counter_read )( void );
|
||||
|
||||
typedef CPU_Counter_ticks (*SPARC_Counter_difference)(
|
||||
typedef CPU_Counter_ticks ( *SPARC_Counter_difference )(
|
||||
CPU_Counter_ticks second,
|
||||
CPU_Counter_ticks first
|
||||
);
|
||||
@@ -1324,42 +1324,7 @@ typedef struct {
|
||||
volatile const CPU_Counter_ticks *counter_address;
|
||||
} SPARC_Counter;
|
||||
|
||||
extern SPARC_Counter _SPARC_Counter;
|
||||
|
||||
CPU_Counter_ticks _SPARC_Counter_read_address( void );
|
||||
|
||||
CPU_Counter_ticks _SPARC_Counter_read_asr23( void );
|
||||
|
||||
CPU_Counter_ticks _SPARC_Counter_difference_normal(
|
||||
CPU_Counter_ticks second,
|
||||
CPU_Counter_ticks first
|
||||
);
|
||||
|
||||
CPU_Counter_ticks _SPARC_Counter_difference_clock_period(
|
||||
CPU_Counter_ticks second,
|
||||
CPU_Counter_ticks first
|
||||
);
|
||||
|
||||
/*
|
||||
* Returns always a value of one regardless of the parameters. This prevents
|
||||
* an infinite loop in rtems_counter_delay_ticks(). Its only a reasonably safe
|
||||
* default.
|
||||
*/
|
||||
CPU_Counter_ticks _SPARC_Counter_difference_one(
|
||||
CPU_Counter_ticks second,
|
||||
CPU_Counter_ticks first
|
||||
);
|
||||
|
||||
static inline void _SPARC_Counter_initialize(
|
||||
SPARC_Counter_read counter_read,
|
||||
SPARC_Counter_difference counter_difference,
|
||||
volatile const CPU_Counter_ticks *counter_address
|
||||
)
|
||||
{
|
||||
_SPARC_Counter.counter_read = counter_read;
|
||||
_SPARC_Counter.counter_difference = counter_difference;
|
||||
_SPARC_Counter.counter_address = counter_address;
|
||||
}
|
||||
extern const SPARC_Counter _SPARC_Counter;
|
||||
|
||||
static inline CPU_Counter_ticks _CPU_Counter_read( void )
|
||||
{
|
||||
|
||||
90
cpukit/score/cpu/sparc/rtems/score/sparcimpl.h
Normal file
90
cpukit/score/cpu/sparc/rtems/score/sparcimpl.h
Normal file
@@ -0,0 +1,90 @@
|
||||
/*
|
||||
* Copyright (c) 2016 embedded brains GmbH. All rights reserved.
|
||||
*
|
||||
* embedded brains GmbH
|
||||
* Dornierstr. 4
|
||||
* 82178 Puchheim
|
||||
* Germany
|
||||
* <rtems@embedded-brains.de>
|
||||
*
|
||||
* The license and distribution terms for this file may be
|
||||
* found in the file LICENSE in this distribution or at
|
||||
* http://www.rtems.org/license/LICENSE.
|
||||
*/
|
||||
|
||||
#ifndef _RTEMS_SCORE_SPARCIMPL_H
|
||||
#define _RTEMS_SCORE_SPARCIMPL_H
|
||||
|
||||
#include <rtems/score/cpu.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
|
||||
/*
|
||||
* Provides a mutable alias to _SPARC_Counter for use in
|
||||
* _SPARC_Counter_initialize(). The _SPARC_Counter and _SPARC_Counter_mutable
|
||||
* are defined via the SPARC_COUNTER_DEFINITION define.
|
||||
*/
|
||||
extern SPARC_Counter _SPARC_Counter_mutable;
|
||||
|
||||
CPU_Counter_ticks _SPARC_Counter_read_address( void );
|
||||
|
||||
CPU_Counter_ticks _SPARC_Counter_read_asr23( void );
|
||||
|
||||
CPU_Counter_ticks _SPARC_Counter_difference_normal(
|
||||
CPU_Counter_ticks second,
|
||||
CPU_Counter_ticks first
|
||||
);
|
||||
|
||||
CPU_Counter_ticks _SPARC_Counter_difference_clock_period(
|
||||
CPU_Counter_ticks second,
|
||||
CPU_Counter_ticks first
|
||||
);
|
||||
|
||||
/*
|
||||
* Returns always a value of one regardless of the parameters. This prevents
|
||||
* an infinite loop in rtems_counter_delay_ticks(). Its only a reasonably safe
|
||||
* default.
|
||||
*/
|
||||
CPU_Counter_ticks _SPARC_Counter_difference_one(
|
||||
CPU_Counter_ticks second,
|
||||
CPU_Counter_ticks first
|
||||
);
|
||||
|
||||
static inline void _SPARC_Counter_initialize(
|
||||
SPARC_Counter_read counter_read,
|
||||
SPARC_Counter_difference counter_difference,
|
||||
volatile const CPU_Counter_ticks *counter_address
|
||||
)
|
||||
{
|
||||
_SPARC_Counter_mutable.counter_read = counter_read;
|
||||
_SPARC_Counter_mutable.counter_difference = counter_difference;
|
||||
_SPARC_Counter_mutable.counter_address = counter_address;
|
||||
}
|
||||
|
||||
/*
|
||||
* Defines the _SPARC_Counter and _SPARC_Counter_mutable global variables.
|
||||
* Place this define in the global file scope of the CPU counter support file
|
||||
* of the BSP.
|
||||
*/
|
||||
#define SPARC_COUNTER_DEFINITION \
|
||||
__asm__ ( \
|
||||
"\t.global\t_SPARC_Counter\n" \
|
||||
"\t.global\t_SPARC_Counter_mutable\n" \
|
||||
"\t.section\t.data._SPARC_Counter,\"aw\",@progbits\n" \
|
||||
"\t.align\t4\n" \
|
||||
"\t.type\t_SPARC_Counter, #object\n" \
|
||||
"\t.size\t_SPARC_Counter, 12\n" \
|
||||
"_SPARC_Counter:\n" \
|
||||
"_SPARC_Counter_mutable:\n" \
|
||||
"\t.long\t_SPARC_Counter_read_address\n" \
|
||||
"\t.long\t_SPARC_Counter_difference_one\n" \
|
||||
"\t.long\t_SPARC_Counter\n" \
|
||||
)
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif /* __cplusplus */
|
||||
|
||||
#endif /* _RTEMS_SCORE_SPARCIMPL_H */
|
||||
@@ -16,7 +16,7 @@
|
||||
#include "config.h"
|
||||
#endif
|
||||
|
||||
#include <rtems/score/cpu.h>
|
||||
#include <rtems/score/sparcimpl.h>
|
||||
#include <rtems/config.h>
|
||||
|
||||
CPU_Counter_ticks _SPARC_Counter_difference_normal(
|
||||
|
||||
Reference in New Issue
Block a user