From 1764b2db55a2d35f1e394c6f8edf1beebc5f326e Mon Sep 17 00:00:00 2001 From: gdisirio Date: Thu, 29 May 2014 14:02:06 +0000 Subject: git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@6970 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- demos/LPC21xx/RT-LPC214x-OLIMEX/.project | 7 ++ demos/LPC21xx/RT-LPC214x-OLIMEX/Makefile | 2 +- demos/LPC21xx/RT-LPC214x-OLIMEX/chconf.h | 6 +- demos/LPC21xx/RT-LPC214x-OLIMEX/main.c | 26 ++--- os/common/ports/ARM/compilers/GCC/crt0.s | 6 +- os/common/ports/ARM/compilers/GCC/irq.s | 6 +- os/common/ports/ARM/compilers/GCC/rules.ld | 3 +- os/common/ports/ARM/devices/LPC214x/armparams.h | 14 +-- os/rt/ports/ARM/chcore.h | 61 ++++++------ os/rt/ports/ARM/chcore_timer.h | 125 ++++++++++++++++++++++++ os/rt/ports/ARM/compilers/GCC/chtypes.h | 111 +++++++++++++++++++++ 11 files changed, 308 insertions(+), 59 deletions(-) create mode 100644 os/rt/ports/ARM/chcore_timer.h create mode 100644 os/rt/ports/ARM/compilers/GCC/chtypes.h diff --git a/demos/LPC21xx/RT-LPC214x-OLIMEX/.project b/demos/LPC21xx/RT-LPC214x-OLIMEX/.project index 42c586ee1..c5d521030 100644 --- a/demos/LPC21xx/RT-LPC214x-OLIMEX/.project +++ b/demos/LPC21xx/RT-LPC214x-OLIMEX/.project @@ -23,4 +23,11 @@ org.eclipse.cdt.managedbuilder.core.managedBuildNature org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + os + 2 + CHIBIOS/os + + diff --git a/demos/LPC21xx/RT-LPC214x-OLIMEX/Makefile b/demos/LPC21xx/RT-LPC214x-OLIMEX/Makefile index eed3b5b0c..6aacd92d3 100644 --- a/demos/LPC21xx/RT-LPC214x-OLIMEX/Makefile +++ b/demos/LPC21xx/RT-LPC214x-OLIMEX/Makefile @@ -110,7 +110,7 @@ CHIBIOS = ../../.. #include $(CHIBIOS)/os/hal/ports/STM32/STM32F1xx/platform.mk #include $(CHIBIOS)/os/hal/osal/rt/osal.mk include $(CHIBIOS)/os/rt/rt.mk -include $(CHIBIOS)/os/rt/ports/ARMCMx/compilers/GCC/mk/port_lpc214x.mk +include $(CHIBIOS)/os/rt/ports/ARM/compilers/GCC/mk/port_lpc214x.mk #include $(CHIBIOS)/test/rt/test.mk # Define linker script file here diff --git a/demos/LPC21xx/RT-LPC214x-OLIMEX/chconf.h b/demos/LPC21xx/RT-LPC214x-OLIMEX/chconf.h index 09b91db5c..0ebb02d58 100644 --- a/demos/LPC21xx/RT-LPC214x-OLIMEX/chconf.h +++ b/demos/LPC21xx/RT-LPC214x-OLIMEX/chconf.h @@ -46,7 +46,7 @@ * @details Frequency of the system timer that drives the system ticks. This * setting also defines the system tick time unit. */ -#define CH_CFG_ST_FREQUENCY 10000 +#define CH_CFG_ST_FREQUENCY 1000 /** * @brief Time delta constant for the tick-less mode. @@ -56,7 +56,7 @@ * The value one is not valid, timeouts are rounded up to * this value. */ -#define CH_CFG_ST_TIMEDELTA 2 +#define CH_CFG_ST_TIMEDELTA 0 /** @} */ @@ -137,7 +137,7 @@ * * @note The default is @p TRUE. */ -#define CH_CFG_USE_TM TRUE +#define CH_CFG_USE_TM FALSE /** * @brief Threads registry APIs. diff --git a/demos/LPC21xx/RT-LPC214x-OLIMEX/main.c b/demos/LPC21xx/RT-LPC214x-OLIMEX/main.c index 629b8e6a7..8c0778c32 100644 --- a/demos/LPC21xx/RT-LPC214x-OLIMEX/main.c +++ b/demos/LPC21xx/RT-LPC214x-OLIMEX/main.c @@ -15,9 +15,10 @@ */ #include "ch.h" -#include "hal.h" -#include "test.h" +//#include "hal.h" +//#include "test.h" +#if 0 #define BOTH_BUTTONS (PAL_PORT_BIT(PA_BUTTON1) | PAL_PORT_BIT(PA_BUTTON2)) /* @@ -57,6 +58,7 @@ static msg_t Thread2(void *arg) { } return 0; } +#endif /* * Application entry point. @@ -70,22 +72,22 @@ int main(void) { * - Kernel initialization, the main() function becomes a thread and the * RTOS is active. */ - halInit(); +// halInit(); chSysInit(); /* * Activates the serial driver 1 using the driver default configuration. */ - sdStart(&SD1, NULL); +// sdStart(&SD1, NULL); /* * If a button is pressed during the reset then the blinking leds threads * are not started in order to make accurate benchmarks. */ - if ((palReadPort(IOPORT1) & BOTH_BUTTONS) == BOTH_BUTTONS) { - chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); - chThdCreateStatic(waThread2, sizeof(waThread2), NORMALPRIO, Thread2, NULL); - } +// if ((palReadPort(IOPORT1) & BOTH_BUTTONS) == BOTH_BUTTONS) { +// chThdCreateStatic(waThread1, sizeof(waThread1), NORMALPRIO, Thread1, NULL); +// chThdCreateStatic(waThread2, sizeof(waThread2), NORMALPRIO, Thread2, NULL); +// } /* * Normal main() thread activity, in this demo it does nothing except @@ -93,10 +95,10 @@ int main(void) { * or print "Hello World!" on serial driver 1. */ while (TRUE) { - if (!palReadPad(IOPORT1, PA_BUTTON1)) - sdWrite(&SD1, (uint8_t *)"Hello World!\r\n", 14); - if (!palReadPad(IOPORT1, PA_BUTTON2)) - TestThread(&SD1); +// if (!palReadPad(IOPORT1, PA_BUTTON1)) +// sdWrite(&SD1, (uint8_t *)"Hello World!\r\n", 14); +// if (!palReadPad(IOPORT1, PA_BUTTON2)) +// TestThread(&SD1); chThdSleepMilliseconds(500); } return 0; diff --git a/os/common/ports/ARM/compilers/GCC/crt0.s b/os/common/ports/ARM/compilers/GCC/crt0.s index 8eae3452d..c5fb53092 100644 --- a/os/common/ports/ARM/compilers/GCC/crt0.s +++ b/os/common/ports/ARM/compilers/GCC/crt0.s @@ -146,7 +146,7 @@ bssloop: ldr r1, =_main_exit_handler bx r1 .code 32 -#else /* !defined(THUMB_NO_INTERWORKING) +#else /* !defined(THUMB_NO_INTERWORKING) */ bl main b _main_exit_handler #endif /* !defined(THUMB_NO_INTERWORKING) */ @@ -172,7 +172,6 @@ _main_exit_handler: __early_init: bx lr .code 32 -#endif /* * Default late initialization code. It is declared weak in order to be @@ -188,6 +187,7 @@ __early_init: __late_init: bx lr .code 32 -#endif + +#endif /* !defined(__DOXYGEN__) */ /** @} */ diff --git a/os/common/ports/ARM/compilers/GCC/irq.s b/os/common/ports/ARM/compilers/GCC/irq.s index 8490beb8c..8bce5cc67 100644 --- a/os/common/ports/ARM/compilers/GCC/irq.s +++ b/os/common/ports/ARM/compilers/GCC/irq.s @@ -26,6 +26,9 @@ * @{ */ +#define __FROM_ASM__ +#include "armparams.h" + #if !defined(__DOXYGEN__) .section irq @@ -39,7 +42,8 @@ .global IrqHandler IrqHandler: stmfd sp!, {r0-r3, r12, lr} - ldr r0, [pc, #ARM_IRQ_REGISTER_OFFSET] + ldr r0, =ARM_IRQ_VECTOR_REG + ldr r0, [r0] ldr lr, =_port_irq_common bx r0 diff --git a/os/common/ports/ARM/compilers/GCC/rules.ld b/os/common/ports/ARM/compilers/GCC/rules.ld index 8d131b75b..8c32a27a3 100644 --- a/os/common/ports/ARM/compilers/GCC/rules.ld +++ b/os/common/ports/ARM/compilers/GCC/rules.ld @@ -37,9 +37,10 @@ SECTIONS . = 0; _text = .; - startup : ALIGN(16) SUBALIGN(16) + boot : ALIGN(16) SUBALIGN(16) { KEEP(*(vectors)) + KEEP(*(irq)) } > flash constructors : ALIGN(4) SUBALIGN(4) diff --git a/os/common/ports/ARM/devices/LPC214x/armparams.h b/os/common/ports/ARM/devices/LPC214x/armparams.h index f1296c573..5d8fa8531 100644 --- a/os/common/ports/ARM/devices/LPC214x/armparams.h +++ b/os/common/ports/ARM/devices/LPC214x/armparams.h @@ -35,7 +35,7 @@ /** * @brief ARM core model. */ -#define ARM_MODEL ARM_MODEL_ARM7TDMI +#define ARM_CORE ARM_CORE_ARM7TDMI /** * @brief Thumb-capable. @@ -52,14 +52,10 @@ */ #define ARM_WFI_IMPL (PCON = 1) -/* The following code is not processed when the file is included from an - asm module.*/ -#if !defined(_FROM_ASM_) - -/* Including the device header.*/ -#include "lpc214x.h" - -#endif /* !defined(_FROM_ASM_) */ +/** + * @brief Address of the IRQ vector register in the interrupt controller. + */ +#define ARM_IRQ_VECTOR_REG 0xFFFFF030 #endif /* _ARMPARAMS_H_ */ diff --git a/os/rt/ports/ARM/chcore.h b/os/rt/ports/ARM/chcore.h index 4c7dbdba7..06b4bb8ed 100644 --- a/os/rt/ports/ARM/chcore.h +++ b/os/rt/ports/ARM/chcore.h @@ -42,6 +42,11 @@ */ #define PORT_ARCHITECTURE_ARM +/* The following code is not processed when the file is included from an + asm module because those intrinsic macros are not necessarily defined + by the assembler too.*/ +#if !defined(_FROM_ASM_) + /** * @brief Compiler name and version. */ @@ -127,13 +132,13 @@ /* ARM core check.*/ #if (ARM_CORE == ARM_CORE_ARM7TDMI) || defined(__DOXYGEN__) #define PORT_ARCHITECTURE_ARM_ARM7 -#define PORT_ARCHITECTURE_NAME "ARM7" -#define PORT_CORE_VARIANT_NAME "ARMv4" +#define PORT_ARCHITECTURE_NAME "ARMv4T" +#define PORT_CORE_VARIANT_NAME "ARM7" #elif ARM_CORE == ARM_CORE_ARM9 #define PORT_ARCHITECTURE_ARM_ARM9 -#define PORT_ARCHITECTURE_NAME "ARM9" -#define PORT_CORE_VARIANT_NAME "ARMv5" +#define PORT_ARCHITECTURE_NAME "ARMv5T" +#define PORT_CORE_VARIANT_NAME "ARM9" #elif ARM_CORE == ARM_CORE_CORTEX_A8 #define PORT_ARCHITECTURE_ARM_CORTEXA8 @@ -185,9 +190,9 @@ typedef uint16_t systime_t; typedef uint64_t stkalign_t; /** - * @brief Generic PPC register. + * @brief Generic ARM register. */ -typedef void *regppc_t; +typedef void *regarm_t; /** * @brief Interrupt saved context. @@ -195,14 +200,14 @@ typedef void *regppc_t; * interrupt handler. */ struct port_extctx { - regarm_t spsr_irq; - regarm_t lr_irq; - regarm_t r0; - regarm_t r1; - regarm_t r2; - regarm_t r3; - regarm_t r12; - regarm_t lr_usr; + regarm_t spsr_irq; + regarm_t lr_irq; + regarm_t r0; + regarm_t r1; + regarm_t r2; + regarm_t r3; + regarm_t r12; + regarm_t lr_usr; }; /** @@ -211,15 +216,15 @@ struct port_extctx { * switch. */ struct port_intctx { - regarm_t r4; - regarm_t r5; - regarm_t r6; - regarm_t r7; - regarm_t r8; - regarm_t r9; - regarm_t r10; - regarm_t r11; - regarm_t lr; + regarm_t r4; + regarm_t r5; + regarm_t r6; + regarm_t r7; + regarm_t r8; + regarm_t r9; + regarm_t r10; + regarm_t r11; + regarm_t lr; }; /** @@ -228,12 +233,10 @@ struct port_intctx { * @p port_intctx structure representing the stack pointer * at context switch time. */ -struct port_context { - struct intctx *r13; +struct context { + struct port_intctx *r13; }; -#endif /* !defined(_FROM_ASM_) */ - /*===========================================================================*/ /* Module macros. */ /*===========================================================================*/ @@ -336,9 +339,9 @@ struct port_context { extern "C" { #endif #ifdef THUMB - void _port_switch_thumb(Thread *ntp, Thread *otp); + void _port_switch_thumb(thread_t *ntp, thread_t *otp); #else - void _port_switch_arm(Thread *ntp, Thread *otp); + void _port_switch_arm(thread_t *ntp, thread_t *otp); #endif void _port_thread_start(void); #ifdef __cplusplus diff --git a/os/rt/ports/ARM/chcore_timer.h b/os/rt/ports/ARM/chcore_timer.h new file mode 100644 index 000000000..99c222f62 --- /dev/null +++ b/os/rt/ports/ARM/chcore_timer.h @@ -0,0 +1,125 @@ +/* + ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, + 2011,2012,2013 Giovanni Di Sirio. + + This file is part of ChibiOS/RT. + + ChibiOS/RT is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + ChibiOS/RT is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +/** + * @file chcore_timer.h + * @brief System timer header file. + * + * @addtogroup ARM_TIMER + * @{ + */ + +#ifndef _CHCORE_TIMER_H_ +#define _CHCORE_TIMER_H_ + +/* This is the only header in the HAL designed to be include-able alone.*/ +#include "st.h" + +/*===========================================================================*/ +/* Module constants. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Module pre-compile time settings. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Derived constants and error checks. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Module data structures and types. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Module macros. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* External declarations. */ +/*===========================================================================*/ + +/*===========================================================================*/ +/* Module inline functions. */ +/*===========================================================================*/ + +/** + * @brief Starts the alarm. + * @note Makes sure that no spurious alarms are triggered after + * this call. + * + * @param[in] time the time to be set for the first alarm + * + * @notapi + */ +static inline void port_timer_start_alarm(systime_t time) { + + stStartAlarm(time); +} + +/** + * @brief Stops the alarm interrupt. + * + * @notapi + */ +static inline void port_timer_stop_alarm(void) { + + stStopAlarm(); +} + +/** + * @brief Sets the alarm time. + * + * @param[in] time the time to be set for the next alarm + * + * @notapi + */ +static inline void port_timer_set_alarm(systime_t time) { + + stSetAlarm(time); +} + +/** + * @brief Returns the system time. + * + * @return The system time. + * + * @notapi + */ +static inline systime_t port_timer_get_time(void) { + + return stGetCounter(); +} + +/** + * @brief Returns the current alarm time. + * + * @return The currently set alarm time. + * + * @notapi + */ +static inline systime_t port_timer_get_alarm(void) { + + return stGetAlarm(); +} + +#endif /* _CHCORE_TIMER_H_ */ + +/** @} */ diff --git a/os/rt/ports/ARM/compilers/GCC/chtypes.h b/os/rt/ports/ARM/compilers/GCC/chtypes.h new file mode 100644 index 000000000..77cf3e8ba --- /dev/null +++ b/os/rt/ports/ARM/compilers/GCC/chtypes.h @@ -0,0 +1,111 @@ +/* + ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, + 2011,2012,2013 Giovanni Di Sirio. + + This file is part of ChibiOS/RT. + + ChibiOS/RT is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + ChibiOS/RT is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +/** + * @file ARM/compilers/GCC/chtypes.h + * @brief ARM port system types. + * + * @addtogroup ARM_GCC_CORE + * @{ + */ + +#ifndef _CHTYPES_H_ +#define _CHTYPES_H_ + +#include +#include +#include + +/** + * @name Common constants + */ +/** + * @brief Generic 'false' boolean constant. + */ +#if !defined(FALSE) || defined(__DOXYGEN__) +#define FALSE 0 +#endif + +/** + * @brief Generic 'true' boolean constant. + */ +#if !defined(TRUE) || defined(__DOXYGEN__) +#define TRUE (!FALSE) +#endif +/** @} */ + +/** + * @name Derived generic types + * @{ + */ +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. */ +/** @} */ + +/** + * @name Kernel types + * @{ + */ +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 ROM constant modifier. + * @note It is set to use the "const" keyword in this port. + */ +#define ROMCONST const + +/** + * @brief Makes functions not inlineable. + * @note If the compiler does not support such attribute then the + * realtime counter precision could be degraded. + */ +#define NOINLINE __attribute__((noinline)) + +/** + * @brief Optimized thread function declaration macro. + */ +#define PORT_THD_FUNCTION(tname, arg) msg_t tname(void *arg) + +/** + * @brief Packed variable specifier. + */ +#define PACKED_VAR __attribute__((packed)) + +#endif /* _CHTYPES_H_ */ + +/** @} */ -- cgit v1.2.3