Embedded Artistry Framework
Embedded Systems C++ Framework
Classes
Special Function Register

Safer types for working with special-function registers. More...

Collaboration diagram for Special Function Register:

Classes

struct  embutil::rw
 Register access permissions. More...
 
struct  embutil::ro
 Read-only access permission tag. More...
 
struct  embutil::wo
 Write-only access permission tag. More...
 
class  embutil::sfr< TPerm, T, TAddr, StaticAddress >
 
class  embutil::sfr< TPerm, T, TAddr, typename std::enable_if< TAddr==0 >::type >
 SFR Class which supports address assignment with a constructor. More...
 
class  embutil::sfr< TPerm, T, TAddr, typename std::enable_if_t< TAddr !=0, void > >
 This variant of the SFR class is used when the address is known at compile-time. More...
 

Detailed Description

Safer types for working with special-function registers.


Class Documentation

◆ embutil::rw

struct embutil::rw

Register access permissions.

Read-write access permission tag.

◆ embutil::ro

struct embutil::ro

Read-only access permission tag.

◆ embutil::wo

struct embutil::wo

Write-only access permission tag.

◆ embutil::sfr

class embutil::sfr

template<typename TPerm = rw, typename T = uint32_t, uintptr_t TAddr = 0, typename StaticAddress = void>
class embutil::sfr< TPerm, T, TAddr, StaticAddress >

Template Parameters
TPermTag value indicating the permissions to use for this register. Should be rw, rw, or wo.
TThe type corresponding to the SFR representation (i.e., uint32_t on 32-bit systems).
TAddrThe address of the SFR. If the address is 0, it can be assigned during object constrution. Otherwise, the address of TAddr is locked in at compile-time.
StaticAddressSFINAE-enabling parameter. You don't need to use this.

◆ embutil::sfr< TPerm, T, TAddr, typename std::enable_if< TAddr==0 >::type >

class embutil::sfr< TPerm, T, TAddr, typename std::enable_if< TAddr==0 >::type >

template<typename TPerm, typename T, uintptr_t TAddr>
class embutil::sfr< TPerm, T, TAddr, typename std::enable_if< TAddr==0 >::type >

SFR Class which supports address assignment with a constructor.

This variant of the SFR class assigns the register value when the object is created. With an optmizer, this will often result in the same as the static-definition variant.

Inheritance diagram for embutil::sfr< TPerm, T, TAddr, typename std::enable_if< TAddr==0 >::type >:
Inheritance graph

Public Types

using ptr_t = volatile T *
 
using const_ptr_t = volatile const T *
 
using ref_t = volatile T &
 
using const_ref_t = volatile const T &
 

Public Member Functions

 sfr (uintptr_t address) noexcept
 Construct an SFR with an address. More...
 
 sfr (uintptr_t address, T value) noexcept
 Construct an SFR with an address and value. More...
 
 sfr (T *address) noexcept
 Construct an SFR with a pointer. More...
 
 sfr (T *address, T value) noexcept
 Construct an SFR with a pointer and value. More...
 
 sfr (const sfr &)=delete
 Delete the copy constructor. More...
 
const sfroperator= (const sfr &)=delete
 Delete the copy assignment operator. More...
 
 sfr (sfr &&)=default
 
sfroperator= (sfr &&)=default
 
 ~sfr ()=default
 Default destructor. More...
 
constexpr uintptr_t address () const noexcept
 Get the address of this SFR. More...
 
T load () const noexcept
 Read from register, explicit operation. More...
 
 operator T () const noexcept
 Read from register, read-only dereference. More...
 
 operator T () noexcept
 Read from register. More...
 
void store (T value) noexcept
 Write to the register. More...
 
sfroperator= (T value_) noexcept
 Write via copy/assignment. More...
 
ref_t operator * () noexcept
 Read/write dereference. More...
 
const_ref_t operator * () const noexcept
 Read-only dereference. More...
 
sfroperator++ () noexcept
 Increment operator is a no-op, but is used for iterator compatibility. More...
 
sfr operator++ (int) noexcept
 Increment operator is a no-op, but is used for iterator compatibility. More...
 

Protected Attributes

const uintptr_t addr_
 The address of the SFR. More...
 

Member Typedef Documentation

◆ const_ptr_t

template<typename TPerm , typename T , uintptr_t TAddr>
using embutil::sfr< TPerm, T, TAddr, typename std::enable_if< TAddr==0 >::type >::const_ptr_t = volatile const T*

◆ const_ref_t

template<typename TPerm , typename T , uintptr_t TAddr>
using embutil::sfr< TPerm, T, TAddr, typename std::enable_if< TAddr==0 >::type >::const_ref_t = volatile const T&

◆ ptr_t

template<typename TPerm , typename T , uintptr_t TAddr>
using embutil::sfr< TPerm, T, TAddr, typename std::enable_if< TAddr==0 >::type >::ptr_t = volatile T*

◆ ref_t

template<typename TPerm , typename T , uintptr_t TAddr>
using embutil::sfr< TPerm, T, TAddr, typename std::enable_if< TAddr==0 >::type >::ref_t = volatile T&

Constructor & Destructor Documentation

◆ sfr() [1/6]

template<typename TPerm , typename T , uintptr_t TAddr>
embutil::sfr< TPerm, T, TAddr, typename std::enable_if< TAddr==0 >::type >::sfr ( uintptr_t  address)
inlineexplicitnoexcept

Construct an SFR with an address.

Parameters
[in]addressThe address in memory that this SFR points to.

◆ sfr() [2/6]

template<typename TPerm , typename T , uintptr_t TAddr>
embutil::sfr< TPerm, T, TAddr, typename std::enable_if< TAddr==0 >::type >::sfr ( uintptr_t  address,
T  value 
)
inlineexplicitnoexcept

Construct an SFR with an address and value.

Parameters
[in]addressThe address in memory that this SFR points to.
[in]valueThe initial value to set.

◆ sfr() [3/6]

template<typename TPerm , typename T , uintptr_t TAddr>
embutil::sfr< TPerm, T, TAddr, typename std::enable_if< TAddr==0 >::type >::sfr ( T address)
inlineexplicitnoexcept

Construct an SFR with a pointer.

Parameters
[in]addressThe pointer that this SFR points to.

◆ sfr() [4/6]

template<typename TPerm , typename T , uintptr_t TAddr>
embutil::sfr< TPerm, T, TAddr, typename std::enable_if< TAddr==0 >::type >::sfr ( T address,
T  value 
)
inlineexplicitnoexcept

Construct an SFR with a pointer and value.

Parameters
[in]addressThe pointer that this SFR points to.
[in]valueThe initial value to set.

◆ sfr() [5/6]

template<typename TPerm , typename T , uintptr_t TAddr>
embutil::sfr< TPerm, T, TAddr, typename std::enable_if< TAddr==0 >::type >::sfr ( const sfr< TPerm, T, TAddr, typename std::enable_if< TAddr==0 >::type > &  )
delete

Delete the copy constructor.

◆ sfr() [6/6]

template<typename TPerm , typename T , uintptr_t TAddr>
embutil::sfr< TPerm, T, TAddr, typename std::enable_if< TAddr==0 >::type >::sfr ( sfr< TPerm, T, TAddr, typename std::enable_if< TAddr==0 >::type > &&  )
default

◆ ~sfr()

template<typename TPerm , typename T , uintptr_t TAddr>
embutil::sfr< TPerm, T, TAddr, typename std::enable_if< TAddr==0 >::type >::~sfr ( )
default

Default destructor.

Member Function Documentation

◆ address()

template<typename TPerm , typename T , uintptr_t TAddr>
constexpr uintptr_t embutil::sfr< TPerm, T, TAddr, typename std::enable_if< TAddr==0 >::type >::address ( ) const
inlinenoexcept

Get the address of this SFR.

Returns
the address of the SFR.

◆ load()

template<typename TPerm , typename T , uintptr_t TAddr>
T embutil::sfr< TPerm, T, TAddr, typename std::enable_if< TAddr==0 >::type >::load ( ) const
inlinenoexcept

Read from register, explicit operation.

Returns
the current value of the SFR.

◆ operator *() [1/2]

template<typename TPerm , typename T , uintptr_t TAddr>
ref_t embutil::sfr< TPerm, T, TAddr, typename std::enable_if< TAddr==0 >::type >::operator * ( )
inlinenoexcept

Read/write dereference.

◆ operator *() [2/2]

template<typename TPerm , typename T , uintptr_t TAddr>
const_ref_t embutil::sfr< TPerm, T, TAddr, typename std::enable_if< TAddr==0 >::type >::operator * ( ) const
inlinenoexcept

Read-only dereference.

◆ operator T() [1/2]

template<typename TPerm , typename T , uintptr_t TAddr>
embutil::sfr< TPerm, T, TAddr, typename std::enable_if< TAddr==0 >::type >::operator T ( ) const
inlinenoexcept

Read from register, read-only dereference.

Returns
the current value of the SFR.

◆ operator T() [2/2]

template<typename TPerm , typename T , uintptr_t TAddr>
embutil::sfr< TPerm, T, TAddr, typename std::enable_if< TAddr==0 >::type >::operator T ( )
inlinenoexcept

Read from register.

Returns
the current value of the SFR.

◆ operator++() [1/2]

template<typename TPerm , typename T , uintptr_t TAddr>
sfr& embutil::sfr< TPerm, T, TAddr, typename std::enable_if< TAddr==0 >::type >::operator++ ( )
inlinenoexcept

Increment operator is a no-op, but is used for iterator compatibility.

◆ operator++() [2/2]

template<typename TPerm , typename T , uintptr_t TAddr>
sfr embutil::sfr< TPerm, T, TAddr, typename std::enable_if< TAddr==0 >::type >::operator++ ( int  )
inlinenoexcept

Increment operator is a no-op, but is used for iterator compatibility.

◆ operator=() [1/3]

template<typename TPerm , typename T , uintptr_t TAddr>
const sfr& embutil::sfr< TPerm, T, TAddr, typename std::enable_if< TAddr==0 >::type >::operator= ( const sfr< TPerm, T, TAddr, typename std::enable_if< TAddr==0 >::type > &  )
delete

Delete the copy assignment operator.

◆ operator=() [2/3]

template<typename TPerm , typename T , uintptr_t TAddr>
sfr& embutil::sfr< TPerm, T, TAddr, typename std::enable_if< TAddr==0 >::type >::operator= ( sfr< TPerm, T, TAddr, typename std::enable_if< TAddr==0 >::type > &&  )
default

◆ operator=() [3/3]

template<typename TPerm , typename T , uintptr_t TAddr>
sfr& embutil::sfr< TPerm, T, TAddr, typename std::enable_if< TAddr==0 >::type >::operator= ( T  value_)
inlinenoexcept

Write via copy/assignment.

Parameters
[in]value_The value to write to the SFR.

◆ store()

template<typename TPerm , typename T , uintptr_t TAddr>
void embutil::sfr< TPerm, T, TAddr, typename std::enable_if< TAddr==0 >::type >::store ( T  value)
inlinenoexcept

Write to the register.

Parameters
[in]valueThe value to write to the SFR.

Member Data Documentation

◆ addr_

template<typename TPerm , typename T , uintptr_t TAddr>
const uintptr_t embutil::sfr< TPerm, T, TAddr, typename std::enable_if< TAddr==0 >::type >::addr_
protected

The address of the SFR.

◆ embutil::sfr< TPerm, T, TAddr, typename std::enable_if_t< TAddr !=0, void > >

class embutil::sfr< TPerm, T, TAddr, typename std::enable_if_t< TAddr !=0, void > >

template<typename TPerm, typename T, uintptr_t TAddr>
class embutil::sfr< TPerm, T, TAddr, typename std::enable_if_t< TAddr !=0, void > >

This variant of the SFR class is used when the address is known at compile-time.

Inheritance diagram for embutil::sfr< TPerm, T, TAddr, typename std::enable_if_t< TAddr !=0, void > >:
Inheritance graph

Public Types

using ptr_t = volatile T *
 
using const_ptr_t = volatile const T *
 
using ref_t = volatile T &
 
using const_ref_t = volatile const T &
 

Public Member Functions

 sfr ()=default
 Default constructor. More...
 
 sfr (T value) noexcept
 Construct an SFR and set a value. More...
 
 ~sfr ()=default
 Default destructor. More...
 
 sfr (const sfr &)=delete
 Delete the copy constructor. More...
 
const sfroperator= (const sfr &)=delete
 Delete the copy assignment operator. More...
 
 sfr (sfr &&)=default
 
sfroperator= (sfr &&)=default
 
constexpr uintptr_t address () const noexcept
 Get the address of this SFR. More...
 
T load () const noexcept
 Read from register, explicit operation. More...
 
 operator T () const noexcept
 Read from register, read-only dereference. More...
 
 operator T () noexcept
 Read from register. More...
 
void store (T value) noexcept
 Write to the register. More...
 
sfroperator= (T value_) noexcept
 Write via copy/assignment. More...
 
ref_t operator * () noexcept
 Read/write dereference. More...
 
const_ref_t operator * () const noexcept
 Read-only dereference. More...
 
sfroperator++ () noexcept
 Increment operator is a no-op, but is used for iterator compatibility. More...
 
sfr operator++ (int) noexcept
 Increment operator is a no-op, but is used for iterator compatibility. More...
 

Member Typedef Documentation

◆ const_ptr_t

template<typename TPerm , typename T , uintptr_t TAddr>
using embutil::sfr< TPerm, T, TAddr, typename std::enable_if_t< TAddr !=0, void > >::const_ptr_t = volatile const T*

◆ const_ref_t

template<typename TPerm , typename T , uintptr_t TAddr>
using embutil::sfr< TPerm, T, TAddr, typename std::enable_if_t< TAddr !=0, void > >::const_ref_t = volatile const T&

◆ ptr_t

template<typename TPerm , typename T , uintptr_t TAddr>
using embutil::sfr< TPerm, T, TAddr, typename std::enable_if_t< TAddr !=0, void > >::ptr_t = volatile T*

◆ ref_t

template<typename TPerm , typename T , uintptr_t TAddr>
using embutil::sfr< TPerm, T, TAddr, typename std::enable_if_t< TAddr !=0, void > >::ref_t = volatile T&

Constructor & Destructor Documentation

◆ sfr() [1/4]

template<typename TPerm , typename T , uintptr_t TAddr>
embutil::sfr< TPerm, T, TAddr, typename std::enable_if_t< TAddr !=0, void > >::sfr ( )
default

Default constructor.

◆ sfr() [2/4]

template<typename TPerm , typename T , uintptr_t TAddr>
embutil::sfr< TPerm, T, TAddr, typename std::enable_if_t< TAddr !=0, void > >::sfr ( T  value)
inlineexplicitnoexcept

Construct an SFR and set a value.

Parameters
[in]valueThe initial value to set.

◆ ~sfr()

template<typename TPerm , typename T , uintptr_t TAddr>
embutil::sfr< TPerm, T, TAddr, typename std::enable_if_t< TAddr !=0, void > >::~sfr ( )
default

Default destructor.

◆ sfr() [3/4]

template<typename TPerm , typename T , uintptr_t TAddr>
embutil::sfr< TPerm, T, TAddr, typename std::enable_if_t< TAddr !=0, void > >::sfr ( const sfr< TPerm, T, TAddr, typename std::enable_if_t< TAddr !=0, void > > &  )
delete

Delete the copy constructor.

◆ sfr() [4/4]

template<typename TPerm , typename T , uintptr_t TAddr>
embutil::sfr< TPerm, T, TAddr, typename std::enable_if_t< TAddr !=0, void > >::sfr ( sfr< TPerm, T, TAddr, typename std::enable_if_t< TAddr !=0, void > > &&  )
default

Member Function Documentation

◆ address()

template<typename TPerm , typename T , uintptr_t TAddr>
constexpr uintptr_t embutil::sfr< TPerm, T, TAddr, typename std::enable_if_t< TAddr !=0, void > >::address ( ) const
inlinenoexcept

Get the address of this SFR.

Returns
the address of the SFR.

◆ load()

template<typename TPerm , typename T , uintptr_t TAddr>
T embutil::sfr< TPerm, T, TAddr, typename std::enable_if_t< TAddr !=0, void > >::load ( ) const
inlinenoexcept

Read from register, explicit operation.

Returns
the current value of the SFR.

◆ operator *() [1/2]

template<typename TPerm , typename T , uintptr_t TAddr>
ref_t embutil::sfr< TPerm, T, TAddr, typename std::enable_if_t< TAddr !=0, void > >::operator * ( )
inlinenoexcept

Read/write dereference.

◆ operator *() [2/2]

template<typename TPerm , typename T , uintptr_t TAddr>
const_ref_t embutil::sfr< TPerm, T, TAddr, typename std::enable_if_t< TAddr !=0, void > >::operator * ( ) const
inlinenoexcept

Read-only dereference.

◆ operator T() [1/2]

template<typename TPerm , typename T , uintptr_t TAddr>
embutil::sfr< TPerm, T, TAddr, typename std::enable_if_t< TAddr !=0, void > >::operator T ( ) const
inlinenoexcept

Read from register, read-only dereference.

Returns
the current value of the SFR.

◆ operator T() [2/2]

template<typename TPerm , typename T , uintptr_t TAddr>
embutil::sfr< TPerm, T, TAddr, typename std::enable_if_t< TAddr !=0, void > >::operator T ( )
inlinenoexcept

Read from register.

Returns
the current value of the SFR.

◆ operator++() [1/2]

template<typename TPerm , typename T , uintptr_t TAddr>
sfr& embutil::sfr< TPerm, T, TAddr, typename std::enable_if_t< TAddr !=0, void > >::operator++ ( )
inlinenoexcept

Increment operator is a no-op, but is used for iterator compatibility.

◆ operator++() [2/2]

template<typename TPerm , typename T , uintptr_t TAddr>
sfr embutil::sfr< TPerm, T, TAddr, typename std::enable_if_t< TAddr !=0, void > >::operator++ ( int  )
inlinenoexcept

Increment operator is a no-op, but is used for iterator compatibility.

◆ operator=() [1/3]

template<typename TPerm , typename T , uintptr_t TAddr>
const sfr& embutil::sfr< TPerm, T, TAddr, typename std::enable_if_t< TAddr !=0, void > >::operator= ( const sfr< TPerm, T, TAddr, typename std::enable_if_t< TAddr !=0, void > > &  )
delete

Delete the copy assignment operator.

◆ operator=() [2/3]

template<typename TPerm , typename T , uintptr_t TAddr>
sfr& embutil::sfr< TPerm, T, TAddr, typename std::enable_if_t< TAddr !=0, void > >::operator= ( sfr< TPerm, T, TAddr, typename std::enable_if_t< TAddr !=0, void > > &&  )
default

◆ operator=() [3/3]

template<typename TPerm , typename T , uintptr_t TAddr>
sfr& embutil::sfr< TPerm, T, TAddr, typename std::enable_if_t< TAddr !=0, void > >::operator= ( T  value_)
inlinenoexcept

Write via copy/assignment.

Parameters
[in]value_The value to write to the SFR.

◆ store()

template<typename TPerm , typename T , uintptr_t TAddr>
void embutil::sfr< TPerm, T, TAddr, typename std::enable_if_t< TAddr !=0, void > >::store ( T  value)
inlinenoexcept

Write to the register.

Parameters
[in]valueThe value to write to the SFR.