[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