git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@7528 35acf78f-673a-0410-8e92-d51de3d6d3f4

master
gdisirio 2014-11-23 18:15:56 +00:00
parent 76b6b65929
commit a1052ff43e
6 changed files with 341 additions and 201 deletions

View File

@ -206,7 +206,7 @@ struct port_extctx {
* switching. * switching.
* @note R2 and R13 are not saved because those are assumed to be immutable * @note R2 and R13 are not saved because those are assumed to be immutable
* during the system life cycle. * during the system life cycle.
* @note LR is stored in the caller contex so it is not present in this * @note LR is stored in the caller context so it is not present in this
* structure. * structure.
*/ */
struct port_intctx { struct port_intctx {

View File

@ -35,9 +35,7 @@
*/ */
/** /**
* @defgroup types Types * @defgroup types Kernel Types
* @details The system types are defined into the port layer, please refer to
* the core port implementation section.
* @ingroup kernel * @ingroup kernel
*/ */

View File

@ -115,8 +115,8 @@
/** /**
* @brief Enables an alternative timer implementation. * @brief Enables an alternative timer implementation.
* @details Usually the port uses a timer interface defined in the file * @details Usually the port uses a timer interface defined in the file
* @p nilcore_timer.h, if this option is enabled then the file * @p chcore_timer.h, if this option is enabled then the file
* @p nilcore_timer_alt.h is included instead. * @p chcore_timer_alt.h is included instead.
*/ */
#if !defined(PORT_USE_ALT_TIMER) #if !defined(PORT_USE_ALT_TIMER)
#define PORT_USE_ALT_TIMER FALSE #define PORT_USE_ALT_TIMER FALSE
@ -238,7 +238,7 @@ struct port_extctx {
* switching. * switching.
* @note R2 and R13 are not saved because those are assumed to be immutable * @note R2 and R13 are not saved because those are assumed to be immutable
* during the system life cycle. * during the system life cycle.
* @note LR is stored in the caller contex so it is not present in this * @note LR is stored in the caller context so it is not present in this
* structure. * structure.
*/ */
struct port_intctx { struct port_intctx {

View File

@ -33,89 +33,35 @@
#include "ch.h" #include "ch.h"
/*===========================================================================*/
/* Module local definitions. */
/*===========================================================================*/
/*===========================================================================*/
/* Module exported variables. */
/*===========================================================================*/
/*===========================================================================*/
/* Module local types. */
/*===========================================================================*/
/*===========================================================================*/
/* Module local variables. */
/*===========================================================================*/
/*===========================================================================*/
/* Module local functions. */
/*===========================================================================*/
/*===========================================================================*/
/* Module exported functions. */
/*===========================================================================*/
/** /**
* @brief Port-related initialization code. * @brief Port-related initialization code.
* @note This function is usually empty. * @note This function is usually empty.
*/ */
void port_init(void) { void _port_init(void) {
}
/**
* @brief Kernel-lock action.
* @details Usually this function just disables interrupts but may perform more
* actions.
*/
void port_lock(void) {
}
/**
* @brief Kernel-unlock action.
* @details Usually this function just enables interrupts but may perform more
* actions.
*/
void port_unlock(void) {
}
/**
* @brief Kernel-lock action from an interrupt handler.
* @details This function is invoked before invoking I-class APIs from
* interrupt handlers. The implementation is architecture dependent,
* in its simplest form it is void.
*/
void port_lock_from_isr(void) {
}
/**
* @brief Kernel-unlock action from an interrupt handler.
* @details This function is invoked after invoking I-class APIs from interrupt
* handlers. The implementation is architecture dependent, in its
* simplest form it is void.
*/
void port_unlock_from_isr(void) {
}
/**
* @brief Disables all the interrupt sources.
* @note Of course non-maskable interrupt sources are not included.
*/
void port_disable(void) {
}
/**
* @brief Disables the interrupt sources below kernel-level priority.
* @note Interrupt sources above kernel level remains enabled.
*/
void port_suspend(void) {
}
/**
* @brief Enables all the interrupt sources.
*/
void port_enable(void) {
}
/**
* @brief Enters an architecture-dependent IRQ-waiting mode.
* @details The function is meant to return when an interrupt becomes pending.
* The simplest implementation is an empty function or macro but this
* would not take advantage of architecture-specific power saving
* modes.
*/
void port_wait_for_interrupt(void) {
}
/**
* @brief Halts the system.
* @details This function is invoked by the operating system when an
* unrecoverable error is detected (for example because a programming
* error in the application code that triggers an assertion while in
* debug mode).
*/
void port_halt(void) {
port_disable();
while (TRUE) {
}
} }
/** /**
@ -128,7 +74,7 @@ void port_halt(void) {
* @param[in] ntp the thread to be switched in * @param[in] ntp the thread to be switched in
* @param[in] otp the thread to be switched out * @param[in] otp the thread to be switched out
*/ */
void port_switch(thread_t *ntp, thread_t *otp) { void _port_switch(thread_t *ntp, thread_t *otp) {
} }
/** @} */ /** @} */

View File

@ -32,15 +32,51 @@
#define _CHCORE_H_ #define _CHCORE_H_
/*===========================================================================*/ /*===========================================================================*/
/* Port constants. */ /* Module constants. */
/*===========================================================================*/ /*===========================================================================*/
/*===========================================================================*/ /**
/* Port macros. */ * @name Architecture and Compiler
/*===========================================================================*/ * @{
*/
/**
* @brief Macro defining an XXX architecture.
*/
#define PORT_ARCHITECTURE_XXX
/**
* @brief Macro defining the specific XXX architecture.
*/
#define PORT_ARCHITECTURE_XXX_YYY
/**
* @brief Name of the implemented architecture.
*/
#define PORT_ARCHITECTURE_NAME "XXX Architecture"
/**
* @brief Compiler name and version.
*/
#if defined(__GNUC__) || defined(__DOXYGEN__)
#define PORT_COMPILER_NAME "GCC " __VERSION__
#else
#error "unsupported compiler"
#endif
/**
* @brief This port supports a realtime counter.
*/
#define PORT_SUPPORTS_RT FALSE
/**
* @brief Port-specific information string.
*/
#define PORT_INFO "no info"
/** @} */
/*===========================================================================*/ /*===========================================================================*/
/* Port configurable parameters. */ /* Module pre-compile time settings. */
/*===========================================================================*/ /*===========================================================================*/
/** /**
@ -49,116 +85,100 @@
* the idle thread should take no more space than those reserved * the idle thread should take no more space than those reserved
* by @p PORT_INT_REQUIRED_STACK. * by @p PORT_INT_REQUIRED_STACK.
*/ */
#ifndef PORT_IDLE_THREAD_STACK_SIZE #if !defined(PORT_IDLE_THREAD_STACK_SIZE) || defined(__DOXYGEN__)
#define PORT_IDLE_THREAD_STACK_SIZE 0 #define PORT_IDLE_THREAD_STACK_SIZE 32
#endif #endif
/** /**
* @brief Per-thread stack overhead for interrupts servicing. * @brief Per-thread stack overhead for interrupts servicing.
* @details This constant is used in the calculation of the correct working * @details This constant is used in the calculation of the correct working
* area size. * area size.
* This value can be zero on those architecture where there is a
* separate interrupt stack and the stack space between @p intctx and
* @p extctx is known to be zero.
*/ */
#ifndef PORT_INT_REQUIRED_STACK #if !defined(PORT_INT_REQUIRED_STACK) || defined(__DOXYGEN__)
#define PORT_INT_REQUIRED_STACK 0 #define PORT_INT_REQUIRED_STACK 256
#endif
/**
* @brief Enables an alternative timer implementation.
* @details Usually the port uses a timer interface defined in the file
* @p chcore_timer.h, if this option is enabled then the file
* @p chcore_timer_alt.h is included instead.
*/
#if !defined(PORT_USE_ALT_TIMER)
#define PORT_USE_ALT_TIMER FALSE
#endif #endif
/*===========================================================================*/ /*===========================================================================*/
/* Port derived parameters. */ /* Derived constants and error checks. */
/*===========================================================================*/ /*===========================================================================*/
/*===========================================================================*/ /*===========================================================================*/
/* Port exported info. */ /* Module data structures and types. */
/*===========================================================================*/ /*===========================================================================*/
/**
* @brief Unique macro for the implemented architecture. /* The following code is not processed when the file is included from an
*/ asm module.*/
#define CH_ARCHITECTURE_XXX #if !defined(_FROM_ASM_)
/** /**
* @brief Name of the implemented architecture. * @brief Type of stack and memory alignment enforcement.
* @note In this architecture the stack alignment is enforced to 64 bits.
*/ */
#define CH_ARCHITECTURE_NAME "" typedef uint64_t stkalign_t;
/**
* @brief Name of the architecture variant (optional).
*/
#define CH_ARCHITECTURE_VARIANT_NAME ""
/**
* @brief Name of the compiler supported by this port.
*/
#define CH_COMPILER_NAME "GCC"
/**
* @brief Port-specific information string.
*/
#define CH_PORT_INFO ""
/*===========================================================================*/
/* Port implementation part. */
/*===========================================================================*/
/**
* @brief Base type for stack and memory alignment.
*/
typedef uint8_t stkalign_t;
/** /**
* @brief Interrupt saved context. * @brief Interrupt saved context.
* @details This structure represents the stack frame saved during a * @details This structure represents the stack frame saved during a
* preemption-capable interrupt handler. * preemption-capable interrupt handler.
* @note R2 and R13 are not saved because those are assumed to be immutable
* during the system life cycle.
*/ */
struct extctx { struct port_extctx {
}; };
/** /**
* @brief System saved context. * @brief System saved context.
* @details This structure represents the inner stack frame during a context * @details This structure represents the inner stack frame during a context
* switching. * switching.
* @note R2 and R13 are not saved because those are assumed to be immutable
* during the system life cycle.
* @note LR is stored in the caller context so it is not present in this
* structure.
*/ */
struct intctx { struct port_intctx {
}; };
/** /**
* @brief Platform dependent part of the @p thread_t structure. * @brief Platform dependent part of the @p thread_t structure.
* @details This structure usually contains just the saved stack pointer * @details This structure usually contains just the saved stack pointer
* defined as a pointer to a @p intctx structure. * defined as a pointer to a @p port_intctx structure.
*/ */
struct context { struct context {
struct intctx *sp; struct port_intctx *sp;
}; };
#endif /* !defined(_FROM_ASM_) */
/*===========================================================================*/
/* Module macros. */
/*===========================================================================*/
/** /**
* @brief Platform dependent part of the @p chThdCreateI() API. * @brief Platform dependent part of the @p chThdCreateI() API.
* @details This code usually setup the context switching frame represented * @details This code usually setup the context switching frame represented
* by an @p intctx structure. * by an @p port_intctx structure.
*/ */
#define SETUP_CONTEXT(workspace, wsize, pf, arg) { \ #define PORT_SETUP_CONTEXT(tp, workspace, wsize, pf, arg) { \
} }
/**
* @brief Enforces a correct alignment for a stack area size value.
*/
#define STACK_ALIGN(n) ((((n) - 1) | (sizeof(stkalign_t) - 1)) + 1)
/** /**
* @brief Computes the thread working area global size. * @brief Computes the thread working area global size.
* @note There is no need to perform alignments in this macro.
*/ */
#define THD_WA_SIZE(n) STACK_ALIGN(sizeof(thread_t) + \ #define PORT_WA_SIZE(n) (sizeof(struct port_intctx) + \
sizeof(struct intctx) + \ sizeof(struct port_extctx) + \
sizeof(struct extctx) + \ (n) + (PORT_INT_REQUIRED_STACK))
(n) + (PORT_INT_REQUIRED_STACK))
/**
* @brief Static working area allocation.
* @details This macro is used to allocate a static thread working area
* aligned as both position and size.
*/
#define WORKING_AREA(s, n) stkalign_t s[THD_WA_SIZE(n) / sizeof(stkalign_t)]
/** /**
* @brief IRQ prologue code. * @brief IRQ prologue code.
@ -185,29 +205,187 @@ struct context {
* @brief Fast IRQ handler function declaration. * @brief Fast IRQ handler function declaration.
* @note @p id can be a function name or a vector number depending on the * @note @p id can be a function name or a vector number depending on the
* port implementation. * port implementation.
* @note Not all architectures support fast interrupts, in this case this
* macro must be omitted.
*/ */
#define PORT_FAST_IRQ_HANDLER(id) void id(void) #define PORT_FAST_IRQ_HANDLER(id) void id(void)
/**
* @brief Performs a context switch between two threads.
* @details This is the most critical code in any port, this function
* is responsible for the context switch between 2 threads.
* @note The implementation of this code affects <b>directly</b> the context
* switch performance so optimize here as much as you can.
*
* @param[in] ntp the thread to be switched in
* @param[in] otp the thread to be switched out
*/
#if !CH_DBG_ENABLE_STACK_CHECK || defined(__DOXYGEN__)
#define port_switch(ntp, otp) _port_switch(ntp, otp)
#else
#define port_switch(ntp, otp) { \
register struct port_intctx *sp asm ("%r1"); \
if ((stkalign_t *)(sp - 1) < otp->p_stklimit) \
chSysHalt("stack overflow"); \
_port_switch(ntp, otp); \
}
#endif
/*===========================================================================*/
/* External declarations. */
/*===========================================================================*/
#ifdef __cplusplus #ifdef __cplusplus
extern "C" { extern "C" {
#endif #endif
void port_init(void); void _port_init(void);
void port_lock(void); void _port_switch(thread_t *ntp, thread_t *otp);
void port_unlock(void);
void port_lock_from_isr(void);
void port_unlock_from_isr(void);
void port_disable(void);
void port_suspend(void);
void port_enable(void);
void port_wait_for_interrupt(void);
void port_halt(void);
void port_switch(thread_t *ntp, thread_t *otp);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif
/*===========================================================================*/
/* Module inline functions. */
/*===========================================================================*/
/**
* @brief Returns a word encoding the current interrupts status.
*
* @return The interrupts status.
*/
static inline syssts_t port_get_irq_status(void) {
return 0;
}
/**
* @brief Checks the interrupt status.
*
* @param[in] sts the interrupt status word
*
* @return The interrupt status.
* @retvel false the word specified a disabled interrupts status.
* @retvel true the word specified an enabled interrupts status.
*/
static inline bool port_irq_enabled(syssts_t sts) {
(void)sts;
return false;
}
/**
* @brief Determines the current execution context.
*
* @return The execution context.
* @retval false not running in ISR mode.
* @retval true running in ISR mode.
*/
static inline bool port_is_isr_context(void) {
return false;
}
/**
* @brief Kernel-lock action.
* @details Usually this function just disables interrupts but may perform more
* actions.
*/
static inline void port_lock(void) {
}
/**
* @brief Kernel-unlock action.
* @details Usually this function just enables interrupts but may perform more
* actions.
*/
static inline void port_unlock(void) {
}
/**
* @brief Kernel-lock action from an interrupt handler.
* @details This function is invoked before invoking I-class APIs from
* interrupt handlers. The implementation is architecture dependent,
* in its simplest form it is void.
*/
static inline void port_lock_from_isr(void) {
}
/**
* @brief Kernel-unlock action from an interrupt handler.
* @details This function is invoked after invoking I-class APIs from interrupt
* handlers. The implementation is architecture dependent, in its
* simplest form it is void.
*/
static inline void port_unlock_from_isr(void) {
}
/**
* @brief Disables all the interrupt sources.
* @note Of course non-maskable interrupt sources are not included.
*/
static inline void port_disable(void) {
}
/**
* @brief Disables the interrupt sources below kernel-level priority.
* @note Interrupt sources above kernel level remains enabled.
*/
static inline void port_suspend(void) {
}
/**
* @brief Enables all the interrupt sources.
*/
static inline void port_enable(void) {
}
/**
* @brief Enters an architecture-dependent IRQ-waiting mode.
* @details The function is meant to return when an interrupt becomes pending.
* The simplest implementation is an empty function or macro but this
* would not take advantage of architecture-specific power saving
* modes.
*/
static inline void port_wait_for_interrupt(void) {
#if PPC_ENABLE_WFI_IDLE
#endif
}
/**
* @brief Returns the current value of the realtime counter.
*
* @return The realtime counter value.
*/
static inline rtcnt_t port_rt_get_counter_value(void) {
return 0;
}
#endif /* !defined(_FROM_ASM_) */
/*===========================================================================*/
/* Module late inclusions. */
/*===========================================================================*/
#if !defined(_FROM_ASM_)
#if CH_CFG_ST_TIMEDELTA > 0
#if !PORT_USE_ALT_TIMER
#include "chcore_timer.h"
#else /* PORT_USE_ALT_TIMER */
#include "chcore_timer_alt.h"
#endif /* PORT_USE_ALT_TIMER */
#endif /* CH_CFG_ST_TIMEDELTA > 0 */
#endif /* !defined(_FROM_ASM_) */
#endif /* _CHCORE_H_ */ #endif /* _CHCORE_H_ */
/** @} */ /** @} */

View File

@ -27,70 +27,88 @@
* doing so. * doing so.
* *
* @addtogroup types * @addtogroup types
* @details System types and macros.
* @{ * @{
*/ */
#ifndef _CHTYPES_H_ #ifndef _CHTYPES_H_
#define _CHTYPES_H_ #define _CHTYPES_H_
#define __need_NULL
#define __need_size_t
#include <stddef.h> #include <stddef.h>
#if !defined(_STDINT_H) && !defined(__STDINT_H_)
#include <stdint.h> #include <stdint.h>
#include <stdbool.h>
/**
* @name Common constants
*/
/**
* @brief Generic 'false' boolean constant.
*/
#if !defined(FALSE) || defined(__DOXYGEN__)
#define FALSE 0
#endif #endif
/** /**
* @brief Thread mode flags, uint8_t is ok. * @brief Generic 'true' boolean constant.
*/ */
typedef uint8_t tmode_t; #if !defined(TRUE) || defined(__DOXYGEN__)
#define TRUE (!FALSE)
#endif
/** @} */
/** /**
* @brief Thread state, uint8_t is ok. * @name Derived generic types
* @{
*/ */
typedef uint8_t tstate_t; typedef volatile int8_t vint8_t; /**< Volatile signed 8 bits. */
typedef volatile uint8_t vuint8_t; /**< Volatile unsigned 8 bits. */
typedef volatile int16_t vint16_t; /**< Volatile signed 16 bits. */
typedef volatile uint16_t vuint16_t; /**< Volatile unsigned 16 bits. */
typedef volatile int32_t vint32_t; /**< Volatile signed 32 bits. */
typedef volatile uint32_t vuint32_t; /**< Volatile unsigned 32 bits. */
/** @} */
/** /**
* @brief Thread references counter, uint8_t is ok. * @name Kernel types
* @{
*/ */
typedef uint8_t trefs_t; typedef uint32_t rtcnt_t; /**< Realtime counter. */
typedef uint64_t rttime_t; /**< Realtime accumulator. */
typedef uint32_t syssts_t; /**< System status word. */
typedef uint8_t tmode_t; /**< Thread flags. */
typedef uint8_t tstate_t; /**< Thread state. */
typedef uint8_t trefs_t; /**< Thread references counter. */
typedef uint8_t tslices_t; /**< Thread time slices counter.*/
typedef uint32_t tprio_t; /**< Thread priority. */
typedef int32_t msg_t; /**< Inter-thread message. */
typedef int32_t eventid_t; /**< Numeric event identifier. */
typedef uint32_t eventmask_t; /**< Mask of event identifiers. */
typedef uint32_t eventflags_t; /**< Mask of event flags. */
typedef int32_t cnt_t; /**< Generic signed counter. */
typedef uint32_t ucnt_t; /**< Generic unsigned counter. */
/** @} */
/** /**
* @brief Priority, use the fastest unsigned type. * @brief ROM constant modifier.
* @note It is set to use the "const" keyword in this port.
*/ */
typedef uint32_t tprio_t; #define ROMCONST const
/** /**
* @brief Message, use signed pointer equivalent. * @brief Makes functions not inlineable.
* @note If the compiler does not support such attribute then the
* realtime counter precision could be degraded.
*/ */
typedef int32_t msg_t; #define NOINLINE __attribute__((noinline))
/** /**
* @brief Numeric event identifier, use fastest signed. * @brief Optimized thread function declaration macro.
*/ */
typedef int32_t eventid_t; #define PORT_THD_FUNCTION(tname, arg) msg_t tname(void *arg)
/** /**
* @brief Mask of event identifiers, recommended fastest unsigned. * @brief Packed variable specifier.
*/ */
typedef uint32_t eventmask_t; #define PACKED_VAR __attribute__((packed))
/**
* @brief Mask of event flags, recommended fastest unsigned.
*/
typedef uint32_t eventflags_t;
/**
* @brief System Time, recommended fastest unsigned.
*/
typedef uint32_t systime_t;
/**
* @brief Counter, recommended fastest signed.
*/
typedef int32_t cnt_t;
#endif /* _CHTYPES_H_ */ #endif /* _CHTYPES_H_ */