[rtems commit] score: Simplify priority bit map implementation
Sebastian Huber
sebh at rtems.org
Thu Jun 9 08:49:38 UTC 2016
Module: rtems
Branch: master
Commit: b04b76c6a0c87ffc9670d356e793108411ce355a
Changeset: http://git.rtems.org/rtems/commit/?id=b04b76c6a0c87ffc9670d356e793108411ce355a
Author: Sebastian Huber <sebastian.huber at embedded-brains.de>
Date: Tue Jun 7 21:36:48 2016 +0200
score: Simplify priority bit map implementation
The priority bit map can deal with a maximum of 256 priority values
ranging from 0 to 255. Consistently use an unsigned int for
computation, due to the usual integer promotion rules.
Make Priority_bit_map_Word definition architecture-independent and
define it to uint16_t. This was already the case for all architectures
except PowerPC. Adjust the PowerPC bitmap support accordingly.
---
cpukit/score/cpu/arm/rtems/score/types.h | 2 -
cpukit/score/cpu/bfin/rtems/score/types.h | 3 --
cpukit/score/cpu/epiphany/rtems/score/cpu.h | 1 -
cpukit/score/cpu/epiphany/rtems/score/types.h | 1 -
cpukit/score/cpu/i386/rtems/score/types.h | 1 -
cpukit/score/cpu/lm32/rtems/score/types.h | 3 --
cpukit/score/cpu/m32c/rtems/score/types.h | 3 --
cpukit/score/cpu/m68k/rtems/score/types.h | 2 -
cpukit/score/cpu/mips/rtems/score/types.h | 1 -
cpukit/score/cpu/moxie/rtems/score/types.h | 1 -
cpukit/score/cpu/nios2/rtems/score/types.h | 1 -
cpukit/score/cpu/no_cpu/rtems/score/types.h | 3 --
cpukit/score/cpu/or1k/rtems/score/cpu.h | 1 -
cpukit/score/cpu/or1k/rtems/score/types.h | 1 -
cpukit/score/cpu/powerpc/rtems/score/cpu.h | 3 +-
cpukit/score/cpu/powerpc/rtems/score/types.h | 1 -
cpukit/score/cpu/sh/rtems/score/types.h | 2 -
cpukit/score/cpu/sparc/rtems/score/types.h | 9 ----
cpukit/score/cpu/sparc64/rtems/score/types.h | 1 -
cpukit/score/cpu/v850/rtems/score/types.h | 3 --
cpukit/score/include/rtems/score/prioritybitmap.h | 5 +-
.../score/include/rtems/score/prioritybitmapimpl.h | 54 ++++++++--------------
22 files changed, 21 insertions(+), 81 deletions(-)
diff --git a/cpukit/score/cpu/arm/rtems/score/types.h b/cpukit/score/cpu/arm/rtems/score/types.h
index deefd54..37a56df 100644
--- a/cpukit/score/cpu/arm/rtems/score/types.h
+++ b/cpukit/score/cpu/arm/rtems/score/types.h
@@ -40,8 +40,6 @@ extern "C" {
/** Type that can store a 32-bit integer or a pointer. */
typedef uintptr_t CPU_Uint32ptr;
-typedef uint16_t Priority_bit_map_Word;
-
/** @} */
#ifdef __cplusplus
diff --git a/cpukit/score/cpu/bfin/rtems/score/types.h b/cpukit/score/cpu/bfin/rtems/score/types.h
index eaa8de6..9865357 100644
--- a/cpukit/score/cpu/bfin/rtems/score/types.h
+++ b/cpukit/score/cpu/bfin/rtems/score/types.h
@@ -34,9 +34,6 @@ extern "C" {
/** Type that can store a 32-bit integer or a pointer. */
typedef uintptr_t CPU_Uint32ptr;
-/** This defines the type for a priority bit map entry. */
-typedef uint16_t Priority_bit_map_Word;
-
/** This defines the return type for an ISR entry point. */
typedef void blackfin_isr;
diff --git a/cpukit/score/cpu/epiphany/rtems/score/cpu.h b/cpukit/score/cpu/epiphany/rtems/score/cpu.h
index e1dae21..9a6428a 100644
--- a/cpukit/score/cpu/epiphany/rtems/score/cpu.h
+++ b/cpukit/score/cpu/epiphany/rtems/score/cpu.h
@@ -699,7 +699,6 @@ typedef struct {
#define CPU_MAXIMUM_PROCESSORS 32
#ifndef ASM
-typedef uint16_t Priority_bit_map_Word;
typedef struct {
uint32_t r[62];
diff --git a/cpukit/score/cpu/epiphany/rtems/score/types.h b/cpukit/score/cpu/epiphany/rtems/score/types.h
index 5b6c503..24c8955 100644
--- a/cpukit/score/cpu/epiphany/rtems/score/types.h
+++ b/cpukit/score/cpu/epiphany/rtems/score/types.h
@@ -53,7 +53,6 @@ extern "C" {
/** Type that can store a 32-bit integer or a pointer. */
typedef uintptr_t CPU_Uint32ptr;
-typedef uint16_t Priority_bit_map_Word;
typedef void epiphany_isr;
typedef void ( *epiphany_isr_entry )( void );
diff --git a/cpukit/score/cpu/i386/rtems/score/types.h b/cpukit/score/cpu/i386/rtems/score/types.h
index 40ccecb..00555d4 100644
--- a/cpukit/score/cpu/i386/rtems/score/types.h
+++ b/cpukit/score/cpu/i386/rtems/score/types.h
@@ -34,7 +34,6 @@ extern "C" {
/** Type that can store a 32-bit integer or a pointer. */
typedef uintptr_t CPU_Uint32ptr;
-typedef uint16_t Priority_bit_map_Word;
typedef void i386_isr;
typedef i386_isr ( *i386_isr_entry )( void );
diff --git a/cpukit/score/cpu/lm32/rtems/score/types.h b/cpukit/score/cpu/lm32/rtems/score/types.h
index c0fc8a8..c3d8666 100644
--- a/cpukit/score/cpu/lm32/rtems/score/types.h
+++ b/cpukit/score/cpu/lm32/rtems/score/types.h
@@ -37,9 +37,6 @@ extern "C" {
/** Type that can store a 32-bit integer or a pointer. */
typedef uintptr_t CPU_Uint32ptr;
-/** This defines the type for a priority bit map entry. */
-typedef uint16_t Priority_bit_map_Word;
-
#ifdef __cplusplus
}
#endif
diff --git a/cpukit/score/cpu/m32c/rtems/score/types.h b/cpukit/score/cpu/m32c/rtems/score/types.h
index 11e0a0c..99d8297 100644
--- a/cpukit/score/cpu/m32c/rtems/score/types.h
+++ b/cpukit/score/cpu/m32c/rtems/score/types.h
@@ -34,9 +34,6 @@ extern "C" {
/** Type that can store a 32-bit integer or a pointer. */
typedef unsigned long CPU_Uint32ptr;
-/** This defines the type for a priority bit map entry. */
-typedef uint16_t Priority_bit_map_Word;
-
/** This defines the return type for an ISR entry point. */
typedef void m32c_isr;
diff --git a/cpukit/score/cpu/m68k/rtems/score/types.h b/cpukit/score/cpu/m68k/rtems/score/types.h
index 96f9a4c..947c6ac 100644
--- a/cpukit/score/cpu/m68k/rtems/score/types.h
+++ b/cpukit/score/cpu/m68k/rtems/score/types.h
@@ -34,8 +34,6 @@ extern "C" {
/** Type that can store a 32-bit integer or a pointer. */
typedef uintptr_t CPU_Uint32ptr;
-typedef uint16_t Priority_bit_map_Word;
-
#ifdef __cplusplus
}
#endif
diff --git a/cpukit/score/cpu/mips/rtems/score/types.h b/cpukit/score/cpu/mips/rtems/score/types.h
index 01950ce..e3226a3 100644
--- a/cpukit/score/cpu/mips/rtems/score/types.h
+++ b/cpukit/score/cpu/mips/rtems/score/types.h
@@ -43,7 +43,6 @@ extern "C" {
/** Type that can store a 32-bit integer or a pointer. */
typedef uintptr_t CPU_Uint32ptr;
-typedef uint16_t Priority_bit_map_Word;
typedef void mips_isr;
typedef void ( *mips_isr_entry )( void );
diff --git a/cpukit/score/cpu/moxie/rtems/score/types.h b/cpukit/score/cpu/moxie/rtems/score/types.h
index 64427a8..99402b0 100644
--- a/cpukit/score/cpu/moxie/rtems/score/types.h
+++ b/cpukit/score/cpu/moxie/rtems/score/types.h
@@ -38,7 +38,6 @@ extern "C" {
/** Type that can store a 32-bit integer or a pointer. */
typedef uintptr_t CPU_Uint32ptr;
-typedef uint16_t Priority_bit_map_Word;
typedef void moxie_isr;
typedef void ( *moxie_isr_entry )( void );
diff --git a/cpukit/score/cpu/nios2/rtems/score/types.h b/cpukit/score/cpu/nios2/rtems/score/types.h
index 6eaee5c..23cf394 100644
--- a/cpukit/score/cpu/nios2/rtems/score/types.h
+++ b/cpukit/score/cpu/nios2/rtems/score/types.h
@@ -34,7 +34,6 @@ extern "C" {
/** Type that can store a 32-bit integer or a pointer. */
typedef uintptr_t CPU_Uint32ptr;
-typedef uint16_t Priority_bit_map_Word;
typedef void nios2_isr;
typedef void ( *nios2_isr_entry )( void );
diff --git a/cpukit/score/cpu/no_cpu/rtems/score/types.h b/cpukit/score/cpu/no_cpu/rtems/score/types.h
index 94a93c2..b330c33 100644
--- a/cpukit/score/cpu/no_cpu/rtems/score/types.h
+++ b/cpukit/score/cpu/no_cpu/rtems/score/types.h
@@ -34,9 +34,6 @@ extern "C" {
/** Type that can store a 32-bit integer or a pointer. */
typedef uintptr_t CPU_Uint32ptr;
-/** This defines the type for a priority bit map entry. */
-typedef uint16_t Priority_bit_map_Word;
-
#ifdef __cplusplus
}
#endif
diff --git a/cpukit/score/cpu/or1k/rtems/score/cpu.h b/cpukit/score/cpu/or1k/rtems/score/cpu.h
index c75d9d8..33717bc 100644
--- a/cpukit/score/cpu/or1k/rtems/score/cpu.h
+++ b/cpukit/score/cpu/or1k/rtems/score/cpu.h
@@ -687,7 +687,6 @@ typedef struct {
#ifndef ASM
typedef uint32_t CPU_Counter_ticks;
-typedef uint16_t Priority_bit_map_Word;
typedef struct {
uint32_t r[32];
diff --git a/cpukit/score/cpu/or1k/rtems/score/types.h b/cpukit/score/cpu/or1k/rtems/score/types.h
index b3beb83..09790fe 100644
--- a/cpukit/score/cpu/or1k/rtems/score/types.h
+++ b/cpukit/score/cpu/or1k/rtems/score/types.h
@@ -39,7 +39,6 @@ extern "C" {
/** Type that can store a 32-bit integer or a pointer. */
typedef uintptr_t CPU_Uint32ptr;
-typedef uint16_t Priority_bit_map_Word;
typedef void or1k_isr;
typedef void ( *or1k_isr_entry )( void );
diff --git a/cpukit/score/cpu/powerpc/rtems/score/cpu.h b/cpukit/score/cpu/powerpc/rtems/score/cpu.h
index beb5127..7a0fa23 100644
--- a/cpukit/score/cpu/powerpc/rtems/score/cpu.h
+++ b/cpukit/score/cpu/powerpc/rtems/score/cpu.h
@@ -981,6 +981,7 @@ void _CPU_Context_Initialize(
{ \
__asm__ volatile ("cntlzw %0, %1" : "=r" ((_output)), "=r" ((_value)) : \
"1" ((_value))); \
+ (_output) = (_output) - 16; \
}
/* end of Bitfield handler macros */
@@ -992,7 +993,7 @@ void _CPU_Context_Initialize(
*/
#define _CPU_Priority_Mask( _bit_number ) \
- ( 0x80000000 >> (_bit_number) )
+ ( 0x8000u >> (_bit_number) )
/*
* This routine translates the bit numbers returned by
diff --git a/cpukit/score/cpu/powerpc/rtems/score/types.h b/cpukit/score/cpu/powerpc/rtems/score/types.h
index f36038f..cdab302 100644
--- a/cpukit/score/cpu/powerpc/rtems/score/types.h
+++ b/cpukit/score/cpu/powerpc/rtems/score/types.h
@@ -51,7 +51,6 @@ extern "C" {
/** Type that can store a 32-bit integer or a pointer. */
typedef uintptr_t CPU_Uint32ptr;
-typedef uint32_t Priority_bit_map_Word;
typedef void ppc_isr;
#ifdef __cplusplus
diff --git a/cpukit/score/cpu/sh/rtems/score/types.h b/cpukit/score/cpu/sh/rtems/score/types.h
index d740b2f..a449a6d 100644
--- a/cpukit/score/cpu/sh/rtems/score/types.h
+++ b/cpukit/score/cpu/sh/rtems/score/types.h
@@ -44,8 +44,6 @@ extern "C" {
/** Type that can store a 32-bit integer or a pointer. */
typedef uintptr_t CPU_Uint32ptr;
-typedef uint16_t Priority_bit_map_Word;
-
typedef void sh_isr;
typedef void ( *sh_isr_entry )( void );
diff --git a/cpukit/score/cpu/sparc/rtems/score/types.h b/cpukit/score/cpu/sparc/rtems/score/types.h
index 4186012..6419c9f 100644
--- a/cpukit/score/cpu/sparc/rtems/score/types.h
+++ b/cpukit/score/cpu/sparc/rtems/score/types.h
@@ -31,15 +31,6 @@ extern "C" {
typedef uintptr_t CPU_Uint32ptr;
/**
- * @brief Priority bit map type.
- *
- * On the SPARC, there is no bitscan instruction and no penalty associated
- * for using 16-bit variables. With no overriding architectural factors,
- * just using a uint16_t.
- */
-typedef uint16_t Priority_bit_map_Word;
-
-/**
* @brief SPARC ISR handler return type.
*
* This is the type which SPARC ISR Handlers return.
diff --git a/cpukit/score/cpu/sparc64/rtems/score/types.h b/cpukit/score/cpu/sparc64/rtems/score/types.h
index c4d1c7f..faf50b7 100644
--- a/cpukit/score/cpu/sparc64/rtems/score/types.h
+++ b/cpukit/score/cpu/sparc64/rtems/score/types.h
@@ -33,7 +33,6 @@ extern "C" {
/** Type that can store a 32-bit integer or a pointer. */
typedef uintptr_t CPU_Uint32ptr;
-typedef uint16_t Priority_bit_map_Word;
typedef void sparc_isr;
typedef void ( *sparc_isr_entry )( void );
diff --git a/cpukit/score/cpu/v850/rtems/score/types.h b/cpukit/score/cpu/v850/rtems/score/types.h
index a209d09..bfec49d 100644
--- a/cpukit/score/cpu/v850/rtems/score/types.h
+++ b/cpukit/score/cpu/v850/rtems/score/types.h
@@ -34,9 +34,6 @@ extern "C" {
/** Type that can store a 32-bit integer or a pointer. */
typedef uintptr_t CPU_Uint32ptr;
-/** This defines the type for a priority bit map entry. */
-typedef uint16_t Priority_bit_map_Word;
-
#ifdef __cplusplus
}
#endif
diff --git a/cpukit/score/include/rtems/score/prioritybitmap.h b/cpukit/score/include/rtems/score/prioritybitmap.h
index f363fe4..40638dd 100644
--- a/cpukit/score/include/rtems/score/prioritybitmap.h
+++ b/cpukit/score/include/rtems/score/prioritybitmap.h
@@ -32,10 +32,7 @@ extern "C" {
*/
/**@{*/
-/*
- * The definition of the Priority_bit_map_Word type is CPU dependent.
- *
- */
+typedef uint16_t Priority_bit_map_Word;
typedef struct {
/**
diff --git a/cpukit/score/include/rtems/score/prioritybitmapimpl.h b/cpukit/score/include/rtems/score/prioritybitmapimpl.h
index 492dbd3..119e837 100644
--- a/cpukit/score/include/rtems/score/prioritybitmapimpl.h
+++ b/cpukit/score/include/rtems/score/prioritybitmapimpl.h
@@ -20,7 +20,6 @@
#define _RTEMS_SCORE_PRIORITYBITMAPIMPL_H
#include <rtems/score/prioritybitmap.h>
-#include <rtems/score/priority.h>
#include <string.h>
@@ -65,8 +64,8 @@ extern const unsigned char _Bitfield_Leading_zeros[256];
#else
#define _Bitfield_Find_first_bit( _value, _bit_number ) \
{ \
- register uint32_t __value = (uint32_t) (_value); \
- register const unsigned char *__p = _Bitfield_Leading_zeros; \
+ unsigned int __value = (_value); \
+ const unsigned char *__p = _Bitfield_Leading_zeros; \
\
if ( __value < 0x100 ) \
(_bit_number) = (Priority_bit_map_Word)( __p[ __value ] + 8 ); \
@@ -108,22 +107,18 @@ extern const unsigned char _Bitfield_Leading_zeros[256];
* This function returns the major portion of the_priority.
*/
-RTEMS_INLINE_ROUTINE Priority_bit_map_Word _Priority_Major (
- Priority_Control the_priority
-)
+RTEMS_INLINE_ROUTINE unsigned int _Priority_Major( unsigned int the_priority )
{
- return (Priority_bit_map_Word)( the_priority / 16 );
+ return the_priority / 16;
}
/**
* This function returns the minor portion of the_priority.
*/
-RTEMS_INLINE_ROUTINE Priority_bit_map_Word _Priority_Minor (
- Priority_Control the_priority
-)
+RTEMS_INLINE_ROUTINE unsigned int _Priority_Minor( unsigned int the_priority )
{
- return (Priority_bit_map_Word)( the_priority % 16 );
+ return the_priority % 16;
}
#if ( CPU_USE_GENERIC_BITFIELD_CODE == TRUE )
@@ -134,31 +129,20 @@ RTEMS_INLINE_ROUTINE Priority_bit_map_Word _Priority_Minor (
*/
RTEMS_INLINE_ROUTINE Priority_bit_map_Word _Priority_Mask (
- uint32_t bit_number
+ unsigned int bit_number
)
{
return (Priority_bit_map_Word)(0x8000u >> bit_number);
}
/**
- * This function returns the mask bit inverted.
- */
-
-RTEMS_INLINE_ROUTINE Priority_bit_map_Word _Priority_Mask_invert (
- uint32_t mask
-)
-{
- return (Priority_bit_map_Word)(~mask);
-}
-
-/**
* This function translates the bit numbers returned by the bit scan
* of a priority bit field into something suitable for use as
* a major or minor component of a priority.
*/
-RTEMS_INLINE_ROUTINE uint32_t _Priority_Bits_index (
- uint32_t bit_number
+RTEMS_INLINE_ROUTINE unsigned int _Priority_Bits_index(
+ unsigned int bit_number
)
{
return bit_number;
@@ -196,15 +180,15 @@ RTEMS_INLINE_ROUTINE void _Priority_bit_map_Remove (
bit_map->major_bit_map &= bit_map_info->block_major;
}
-RTEMS_INLINE_ROUTINE Priority_Control _Priority_bit_map_Get_highest(
+RTEMS_INLINE_ROUTINE unsigned int _Priority_bit_map_Get_highest(
const Priority_bit_map_Control *bit_map
)
{
- Priority_bit_map_Word minor;
- Priority_bit_map_Word major;
+ unsigned int minor;
+ unsigned int major;
/* Avoid problems with some inline ASM statements */
- Priority_bit_map_Word tmp;
+ unsigned int tmp;
tmp = bit_map->major_bit_map;
_Bitfield_Find_first_bit( tmp, major );
@@ -226,11 +210,11 @@ RTEMS_INLINE_ROUTINE bool _Priority_bit_map_Is_empty(
RTEMS_INLINE_ROUTINE void _Priority_bit_map_Initialize_information(
Priority_bit_map_Control *bit_map,
Priority_bit_map_Information *bit_map_info,
- Priority_Control new_priority
+ unsigned int new_priority
)
{
- Priority_bit_map_Word major;
- Priority_bit_map_Word minor;
+ unsigned int major;
+ unsigned int minor;
Priority_bit_map_Word mask;
major = _Priority_Major( new_priority );
@@ -240,13 +224,11 @@ RTEMS_INLINE_ROUTINE void _Priority_bit_map_Initialize_information(
mask = _Priority_Mask( major );
bit_map_info->ready_major = mask;
- /* Add _Priority_Mask_invert to non-generic bitfield then change this code. */
- bit_map_info->block_major = (Priority_bit_map_Word)(~((uint32_t)mask));
+ bit_map_info->block_major = (Priority_bit_map_Word) ~mask;
mask = _Priority_Mask( minor );
bit_map_info->ready_minor = mask;
- /* Add _Priority_Mask_invert to non-generic bitfield then change this code. */
- bit_map_info->block_minor = (Priority_bit_map_Word)(~((uint32_t)mask));
+ bit_map_info->block_minor = (Priority_bit_map_Word) ~mask;
}
/** @} */
More information about the vc
mailing list