From dfb831fa6315aa4a78e9467e98397cb60643b21c Mon Sep 17 00:00:00 2001 From: Natie van Rooyen Date: Mon, 17 Sep 2012 13:02:09 +0200 Subject: [PATCH] =?UTF-8?q?Added=20=E2=80=9Carm=E2=80=9D=20port=20.=20Adde?= =?UTF-8?q?d=20platforms=20directory.=20Added=20QEMU=20qemu=5Fintegratorcp?= =?UTF-8?q?=20platform=20in=20platforms.=20Modified=20test=20cases=20to=20?= =?UTF-8?q?make=20stack=20top=20DWORD=20aligned.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- platforms/qemu_integratorcp/Makefile | 91 +++++++ .../qemu_integratorcp/atomthreads_test.out | 75 ++++++ platforms/qemu_integratorcp/boot.elf | Bin 0 -> 419255 bytes platforms/qemu_integratorcp/main.c | 85 +++++++ platforms/qemu_integratorcp/modules.c | 115 +++++++++ platforms/qemu_integratorcp/modules.h | 124 ++++++++++ platforms/qemu_integratorcp/startup.s | 55 +++++ platforms/qemu_integratorcp/system.ld | 94 ++++++++ platforms/rules.mk | 60 +++++ ports/{armv7 => arm}/Makefile | 10 +- ports/{armv7 => arm}/README | 0 ports/arm/atomport-tests.h | 50 ++++ ports/{armv7 => arm}/atomport.c | 11 +- ports/{armv7 => arm}/atomport.h | 13 +- ports/arm/atomport.o | Bin 0 -> 5436 bytes ports/arm/atomport_asm.o | Bin 0 -> 2220 bytes ports/{armv7 => arm}/atomport_private.h | 0 ports/arm/atomport_s.S | 227 ++++++++++++++++++ ports/{armv7 => arm}/types.h | 2 +- ports/armv7/atomport_arm.asm | 211 ---------------- tests/atomtests.h | 2 +- tests/kern1.c | 6 +- tests/kern3.c | 4 +- tests/kern4.c | 8 +- tests/mutex1.c | 4 +- tests/mutex2.c | 2 +- tests/mutex3.c | 8 +- tests/mutex4.c | 8 +- tests/mutex5.c | 2 +- tests/mutex6.c | 2 +- tests/mutex7.c | 2 +- tests/mutex8.c | 6 +- tests/mutex9.c | 2 +- tests/queue2.c | 4 +- tests/queue3.c | 4 +- tests/queue5.c | 8 +- tests/queue6.c | 2 +- tests/queue7.c | 6 +- tests/queue9.c | 8 +- tests/sem1.c | 4 +- tests/sem3.c | 8 +- tests/sem4.c | 8 +- tests/sem5.c | 2 +- tests/sem6.c | 2 +- tests/sem7.c | 2 +- tests/sem8.c | 6 +- tests/sem9.c | 6 +- tests/timer2.c | 6 +- 48 files changed, 1062 insertions(+), 293 deletions(-) create mode 100644 platforms/qemu_integratorcp/Makefile create mode 100644 platforms/qemu_integratorcp/atomthreads_test.out create mode 100644 platforms/qemu_integratorcp/boot.elf create mode 100644 platforms/qemu_integratorcp/main.c create mode 100644 platforms/qemu_integratorcp/modules.c create mode 100644 platforms/qemu_integratorcp/modules.h create mode 100644 platforms/qemu_integratorcp/startup.s create mode 100644 platforms/qemu_integratorcp/system.ld create mode 100644 platforms/rules.mk rename ports/{armv7 => arm}/Makefile (68%) rename ports/{armv7 => arm}/README (100%) create mode 100644 ports/arm/atomport-tests.h rename ports/{armv7 => arm}/atomport.c (94%) rename ports/{armv7 => arm}/atomport.h (90%) create mode 100644 ports/arm/atomport.o create mode 100644 ports/arm/atomport_asm.o rename ports/{armv7 => arm}/atomport_private.h (100%) create mode 100644 ports/arm/atomport_s.S rename ports/{armv7 => arm}/types.h (96%) delete mode 100644 ports/armv7/atomport_arm.asm diff --git a/platforms/qemu_integratorcp/Makefile b/platforms/qemu_integratorcp/Makefile new file mode 100644 index 0000000..551529f --- /dev/null +++ b/platforms/qemu_integratorcp/Makefile @@ -0,0 +1,91 @@ +ifeq ($(TARGET_NAME),) +TARGET_NAME=boot +endif +ifeq ($(ATOMTHREADS),) +ATOMTHREADS = $(shell pwd)/../../ +endif +ifeq ($(TEST_NAME),) +TEST_NAME = kern1 +endif + + + +CC = arm-none-eabi-gcc +LN = arm-none-eabi-gcc +AS = arm-none-eabi-gcc + +CFLAGS := $(CFLAGS) -Wall -g -c -mcpu=arm926ej-s -ffreestanding +AFLAGS := $(CFLAGS) -Wall -g -c -mcpu=arm926ej-s -ffreestanding +LFLAGS := $(LFLAGS) -Wall -mcpu=arm926ej-s -Wl,-Map=system.map,--verbose -Tsystem.ld + +CDEFS := $(CDEFS) -DATOMTHREADS_TEST='"$(TEST_NAME)"' +ADEFS := $(ADEFS) + +LLIBS := $(LLIBS) + + +SRCS := $(SRCS) \ + modules.c \ + main.c \ + $(ATOMTHREADS)/tests/$(TEST_NAME).c + +ASMS := $(ASMS) \ + startup.S \ + +INCLUDES := $(INCLUDES) \ + -I$(ATOMTHREADS) + +include $(ATOMTHREADS)/ports/arm/Makefile + +OBJS = $(SRCS:.c=.o) $(ASMS:.S=.o) + +include ../rules.mk + + +run_test: clean all + echo "START TEST $(TEST_NAME)" + qemu-system-arm -M integratorcp -kernel boot.elf -semihosting | tee atomthreads_test.out + +all_tests: + echo "Starting atomthreads test suite" > atomthreads_test.out + make run_test "TEST_NAME=mutex1" + make run_test "TEST_NAME=mutex2" + make run_test "TEST_NAME=mutex3" + make run_test "TEST_NAME=mutex4" + make run_test "TEST_NAME=mutex5" + make run_test "TEST_NAME=mutex6" + make run_test "TEST_NAME=mutex7" + make run_test "TEST_NAME=mutex8" + make run_test "TEST_NAME=mutex9" + make run_test "TEST_NAME=kern1" + make run_test "TEST_NAME=kern2" + make run_test "TEST_NAME=kern3" + make run_test "TEST_NAME=kern4" + make run_test "TEST_NAME=timer1" + make run_test "TEST_NAME=timer2" + make run_test "TEST_NAME=timer3" + make run_test "TEST_NAME=timer5" + make run_test "TEST_NAME=timer6" + make run_test "TEST_NAME=timer7" + make run_test "TEST_NAME=queue1" + make run_test "TEST_NAME=queue2" + make run_test "TEST_NAME=queue3" + make run_test "TEST_NAME=queue4" + make run_test "TEST_NAME=queue5" + make run_test "TEST_NAME=queue6" + make run_test "TEST_NAME=queue7" + make run_test "TEST_NAME=queue8" + make run_test "TEST_NAME=queue9" + make run_test "TEST_NAME=sem1" + make run_test "TEST_NAME=sem2" + make run_test "TEST_NAME=sem3" + make run_test "TEST_NAME=sem4" + make run_test "TEST_NAME=sem5" + make run_test "TEST_NAME=sem6" + make run_test "TEST_NAME=sem7" + make run_test "TEST_NAME=sem8" + make run_test "TEST_NAME=sem9" + +run_last: + qemu-system-arm -M integratorcp -kernel boot.elf -monitor stdio -semihosting + diff --git a/platforms/qemu_integratorcp/atomthreads_test.out b/platforms/qemu_integratorcp/atomthreads_test.out new file mode 100644 index 0000000..1c4897d --- /dev/null +++ b/platforms/qemu_integratorcp/atomthreads_test.out @@ -0,0 +1,75 @@ +Starting atomthreads test suite +VNC server running on `127.0.0.1:5900' +atomthreads starting mutex1... mutex1 PASS +VNC server running on `127.0.0.1:5900' +atomthreads starting mutex2... mutex2 PASS +VNC server running on `127.0.0.1:5900' +atomthreads starting mutex3... mutex3 PASS +VNC server running on `127.0.0.1:5900' +atomthreads starting mutex4... mutex4 PASS +VNC server running on `127.0.0.1:5900' +atomthreads starting mutex5... mutex5 PASS +VNC server running on `127.0.0.1:5900' +atomthreads starting mutex6... mutex6 PASS +VNC server running on `127.0.0.1:5900' +atomthreads starting mutex7... mutex7 PASS +VNC server running on `127.0.0.1:5900' +atomthreads starting mutex8... mutex8 PASS +VNC server running on `127.0.0.1:5900' +atomthreads starting mutex9... mutex9 PASS +VNC server running on `127.0.0.1:5900' +atomthreads starting kern1... kern1 PASS +VNC server running on `127.0.0.1:5900' +atomthreads starting kern2... kern2 PASS +VNC server running on `127.0.0.1:5900' +atomthreads starting kern3... kern3 PASS +VNC server running on `127.0.0.1:5900' +atomthreads starting kern4... kern4 PASS +VNC server running on `127.0.0.1:5900' +atomthreads starting timer1... timer1 PASS +VNC server running on `127.0.0.1:5900' +atomthreads starting timer2... timer2 FAIL +VNC server running on `127.0.0.1:5900' +atomthreads starting timer3... timer3 PASS +VNC server running on `127.0.0.1:5900' +atomthreads starting timer5... timer5 PASS +VNC server running on `127.0.0.1:5900' +atomthreads starting timer6... timer6 PASS +VNC server running on `127.0.0.1:5900' +atomthreads starting timer7... timer7 PASS +VNC server running on `127.0.0.1:5900' +atomthreads starting queue1... queue1 PASS +VNC server running on `127.0.0.1:5900' +atomthreads starting queue2... queue2 PASS +VNC server running on `127.0.0.1:5900' +atomthreads starting queue3... queue3 PASS +VNC server running on `127.0.0.1:5900' +atomthreads starting queue4... queue4 PASS +VNC server running on `127.0.0.1:5900' +atomthreads starting queue5... queue5 PASS +VNC server running on `127.0.0.1:5900' +atomthreads starting queue6... queue6 PASS +VNC server running on `127.0.0.1:5900' +atomthreads starting queue7... queue7 PASS +VNC server running on `127.0.0.1:5900' +atomthreads starting queue8... queue8 PASS +VNC server running on `127.0.0.1:5900' +atomthreads starting queue9... queue9 PASS +VNC server running on `127.0.0.1:5900' +atomthreads starting sem1... sem1 PASS +VNC server running on `127.0.0.1:5900' +atomthreads starting sem2... sem2 PASS +VNC server running on `127.0.0.1:5900' +atomthreads starting sem3... sem3 PASS +VNC server running on `127.0.0.1:5900' +atomthreads starting sem4... sem4 PASS +VNC server running on `127.0.0.1:5900' +atomthreads starting sem5... sem5 PASS +VNC server running on `127.0.0.1:5900' +atomthreads starting sem6... sem6 PASS +VNC server running on `127.0.0.1:5900' +atomthreads starting sem7... sem7 PASS +VNC server running on `127.0.0.1:5900' +atomthreads starting sem8... sem8 PASS +VNC server running on `127.0.0.1:5900' +atomthreads starting sem9... sem9 PASS diff --git a/platforms/qemu_integratorcp/boot.elf b/platforms/qemu_integratorcp/boot.elf new file mode 100644 index 0000000000000000000000000000000000000000..c0f64680228255f4d2967105bc8793e9683e258a GIT binary patch literal 419255 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 z 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 +#include "modules.h" +#include "atom.h" +#include "tests/atomtests.h" + +#ifndef ATOMTHREADS_TEST +#define ATOMTHREADS_TEST "kern1" +#endif + +#define TEST_STACK_BYTE_SIZE 1024 +#define IDLE_STACK_BYTE_SIZE 512 + +static unsigned char test_stack[TEST_STACK_BYTE_SIZE] ; +static unsigned char idle_stack[IDLE_STACK_BYTE_SIZE] ; +ATOM_TCB test_tcb ; + + +/** + * \b test_thread + * + * Function calling the test function of the Atomthreads test suite. + * + */ +void +test_thread (uint32_t param) +{ + uint32_t failures ; + CRITICAL_STORE ; + + failures = test_start () ; + + atomTimerDelay (10) ; + CRITICAL_START() ; + printf ("%s %s\r\n", ATOMTHREADS_TEST, failures ? "FAIL" : "PASS") ; + exit (failures) ; + CRITICAL_END() ; +} + +/** + * \b main + * + * Initialize atomthreads and start a test_thread to run the Atomthreads test suite. + * + */ +int +main (void) +{ + uint32_t failures ; + + printf ("atomthreads starting %s... ", ATOMTHREADS_TEST) ; + + atomOSInit(&idle_stack[IDLE_STACK_BYTE_SIZE - sizeof(unsigned int)], IDLE_STACK_BYTE_SIZE - sizeof(unsigned int)) ; + atomThreadCreate ((ATOM_TCB *)&test_tcb, TEST_THREAD_PRIO, test_thread, 0, &test_stack[(TEST_STACK_BYTE_SIZE) - sizeof(unsigned int)], TEST_STACK_BYTE_SIZE - sizeof(unsigned int)); + atomOSStart() ; + + return 0 ; +} diff --git a/platforms/qemu_integratorcp/modules.c b/platforms/qemu_integratorcp/modules.c new file mode 100644 index 0000000..c611d68 --- /dev/null +++ b/platforms/qemu_integratorcp/modules.c @@ -0,0 +1,115 @@ +/* + * Copyright (c) 2012, Natie van Rooyen. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. No personal names or organizations' names associated with the + * Atomthreads project may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE ATOMTHREADS PROJECT AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#include "modules.h" +#include +#include +#include "atomport_private.h" +#include "atom.h" +#include "atomport.h" +#include "types.h" + +ICP_TIMER_T* const board_timer_0 = (ICP_TIMER_T*) BOARD_BASE_ADDRESS_TIMER_0 ; +ICP_PIC_T * const board_pic = (ICP_PIC_T*) BOARD_BASE_ADDRESS_PIC ; + +/** + * \b dbg_format_msg + * + * Same as printf. + * + */ +void +dbg_format_msg (char *format, ...) +{ + va_list args; + static char msg[256] ; + CRITICAL_STORE ; + + va_start (args, format) ; + CRITICAL_START() ; + vsnprintf ((char*)msg, 256, (char*)format, args) ; + CRITICAL_END() ; + + printf (msg) ; +} + +/** + * \b low_level_init + * + * Initializes the PIC and start the system timer tick intrerupt. + * + */ +int +low_level_init (void) +{ + + board_pic->IRQ_ENABLECLR = ICP_PIC_IRQ_TIMERINT0 ; + board_timer_0->INTCLR = 1 ; + board_pic->IRQ_ENABLESET |= ICP_PIC_IRQ_TIMERINT0 ; + + board_timer_0->LOAD = 0x2000 ; + board_timer_0->BGLOAD = 0x2000 ; + board_timer_0->CONTROL = ICP_TIMER_CONTROL_ENABLE | + ICP_TIMER_CONTROL_MODE | + ICP_TIMER_CONTROL_IE | + /*ICP_TIMER_CONTROL_PRESCALE_256 |*/ + ICP_TIMER_CONTROL_TIMER_SIZE ; + + return 0 ; +} + + +/** + * \b __context_preempt_handler + * + * System timer tic interupt handler. + * + */ +void +__context_preempt_handler (void) +{ + unsigned int status = board_pic->IRQ_STATUS ; + + if (status | ICP_PIC_IRQ_TIMERINT0) { + + atomIntEnter(); + + /* Call the OS system tick handler */ + atomTimerTick(); + + /* ack the interrupt */ + board_timer_0->INTCLR = 0x1 ; + + /* Call the interrupt exit routine */ + atomIntExit(TRUE); + + } + + +} + diff --git a/platforms/qemu_integratorcp/modules.h b/platforms/qemu_integratorcp/modules.h new file mode 100644 index 0000000..38aa37f --- /dev/null +++ b/platforms/qemu_integratorcp/modules.h @@ -0,0 +1,124 @@ +/* + * Copyright (c) 2012, Natie van Rooyen. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. No personal names or organizations' names associated with the + * Atomthreads project may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE ATOMTHREADS PROJECT AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ +#ifndef __MODULES_H__ +#define __MODULES_H__ + +#include "atomport.h" + +extern void dbg_format_msg (char *format, ...) ; + +#define DBG_MESSAGE(fmt_str) { dbg_format_msg fmt_str ; } + + +typedef volatile unsigned int REG_DWORD ;// Hardware register definition +typedef volatile unsigned short REG_WORD ; +typedef volatile unsigned char REG_BYTE ; + + +// ***************************************************************************** +// INTEGRATORCP TIMER +// ***************************************************************************** +typedef struct ICP_TIMER_S { + // offset read/write word size reset Description + REG_DWORD LOAD ; // 0x0000 Read/write 32 0x00000000 Load value for Timer + REG_DWORD VALUE ; // 0x0004 Read 32 0xFFFFFFFF The current value for Timer + REG_BYTE CONTROL ; // 0x0008 Read/write 8 0x20 Timer control register + REG_DWORD INTCLR ; // 0x000C Write - - Timer interrupt clear + REG_DWORD RIS ; // 0x0010 Read 1 0x0 Timer raw interrupt status + REG_DWORD MIS ; // 0x0014 Read 1 0x0 Timer masked interrupt status + REG_DWORD BGLOAD ; // 0x0018 Read/write 32 0x00000000 Background load value for Timer + +} ICP_TIMER_T, *PICP_TIMER_T ; + +// -------- ICP_TIMER_LOAD : (LOAD Offset: 0x00) Load value for Timer -------- +// -------- ICP_TIMER_VALUE : (LOAD Offset: 0x04) The current value for Timer -------- +// -------- ICP_TIMER_CONTROL : (CONTROL Offset: 0x04) Timer control register -------- +#define ICP_TIMER_CONTROL_MASK ((unsigned int)0x0F << 0) // Timer control mask + #define ICP_TIMER_CONTROL_ENABLE ((unsigned int)0x01 << 7) // Timer enable: 0 = disabled 1 = enabled. + #define ICP_TIMER_CONTROL_MODE ((unsigned int)0x01 << 6) // Timer mode: 0 = free running, counts once and then wraps to 0xFFFF 1 = periodic, reloads from load register at the end of each count.. + #define ICP_TIMER_CONTROL_IE ((unsigned int)0x01 << 5) // Interrupt enable. + #define ICP_TIMER_CONTROL_R ((unsigned int)0x01 << 4) // Unused, always write as 0s. + #define ICP_TIMER_CONTROL_PRESCALE_MASK ((unsigned int)0x03 << 2) // Prescale divisor + #define ICP_TIMER_CONTROL_PRESCALE_NONE ((unsigned int)0x00 << 2) // + #define ICP_TIMER_CONTROL_PRESCALE_16 ((unsigned int)0x01 << 2) // + #define ICP_TIMER_CONTROL_PRESCALE_256 ((unsigned int)0x02 << 2) // +#define ICP_TIMER_CONTROL_TIMER_SIZE ((unsigned int)0x01 << 1) // Selects 16/32 bit counter operation: 0 = 16-bit counter (default) 1 = 32-bit counter For 16-bit mode, write the high 16 bits of the 32-bit value as 0. +#define ICP_TIMER_CONTROL_ONE_SHOT ((unsigned int)0x01 << 0) // Selects one-shot or wrapping counter mode: 0 = wrapping mode (default) 1 = one-shot mode +// -------- ICP_TIMER_INTCLR : (INTCLR Offset: 0x0C) Timer interrupt clear -------- +// -------- ICP_TIMER_RIS : (RIS Offset: 0x10) Timer raw interrupt status -------- +// -------- ICP_TIMER_MIS : (MIS Offset: 0x14) Timer masked interrupt status -------- +#define ICP_TIMER_INT ((unsigned int)0x01 << 0) // Interrupt +// -------- ICP_TIMER_BGLOAD : (BGLOAD Offset: 0x18) Timer masked interrupt status -------- + + +// ***************************************************************************** +// INTEGRATORCP PIC +// ***************************************************************************** +typedef struct ICP_PIC_S { + // offset read/write word size reset Description + REG_DWORD IRQ_STATUS ; // 0x0000 Read 22 IRQ gated interrupt status + REG_DWORD IRQ_RAWSTAT ; // 0x0004 Read 22 IRQ raw interrupt status + REG_DWORD IRQ_ENABLESET ; // 0x0008 Read/write 22 IRQ enable set + REG_DWORD IRQ_ENABLECLR ; // 0x000C Write 22 IRQ enable clear + REG_DWORD INT_SOFTSET ; // 0x0010 Read/write 16 Software interrupt set + REG_DWORD INT_SOFTCLR ; // 0x0014 Write 16 Software interrupt clear + REG_DWORD RESERVED[2] ; // 0x0018 + REG_DWORD FIQ_STATUS ; // 0x0020 Read 22 FIQ gated interrupt status + REG_DWORD FIQ_RAWSTAT ; // 0x0024 Read 22 FIQ raw interrupt status + REG_DWORD FIQ_ENABLESET ; // 0x0028 Read/write 22 FIQ enable set + REG_DWORD FIQ_ENABLECLR ; // 0x002C Write-only 22 FIQ enable clear + +} ICP_PIC_T, *PICP_PIC_T ; + +// -------- ICP_PIC_IRQ_STATUS : (IRQ_STATUS Offset: 0x00) IRQ gated interrupt status -------- +// -------- ICP_PIC_IRQ_RAWSTAT : (IRQ_RAWSTAT Offset: 0x04) IRQ raw interrupt status -------- +// -------- ICP_PIC_IRQ_ENABLESET : (IRQ_ENABLESET Offset: 0x08) IRQ enable set -------- +// -------- ICP_PIC_IRQ_ENABLECLR : (IRQ_ENABLECLR Offset: 0x0C) IRQ enable clear -------- +#define ICP_PIC_IRQ_MASK ((unsigned int)0x3FFFFF << 0) // IRQ mask + #define ICP_PIC_IRQ_TIMERINT2 ((unsigned int)0x01 << 7) // TIMERINT2 Counter-timer 2 interrupt + #define ICP_PIC_IRQ_TIMERINT1 ((unsigned int)0x01 << 6) // TIMERINT1 Counter-timer 1 interrupt + #define ICP_PIC_IRQ_TIMERINT0 ((unsigned int)0x01 << 5) // TIMERINT0 Counter-timer 0 interrupt + #define ICP_PIC_IRQ_SOFTINT ((unsigned int)0x01 << 0) // OFTINT Software interrupt +// -------- ICP_PIC_INT_SOFTSET : (INT_SOFTSET Offset: 0x10) Software interrupt set -------- +// -------- ICP_PIC_INT_SOFTCLR : (INT_SOFTCLR Offset: 0x14) Software interrupt clear -------- + + + + +#define BOARD_BASE_ADDRESS_TIMER_0 0x13000000 +#define BOARD_BASE_ADDRESS_PIC 0x14000000 + +extern ICP_TIMER_T* const board_timer_0 ; +extern ICP_PIC_T* const board_pic ; + + + +extern int low_level_init (void) ; + +#endif /* __MODULES_H__ */ diff --git a/platforms/qemu_integratorcp/startup.s b/platforms/qemu_integratorcp/startup.s new file mode 100644 index 0000000..dc4a167 --- /dev/null +++ b/platforms/qemu_integratorcp/startup.s @@ -0,0 +1,55 @@ +.section .vectors, "x" + +.global __interrupt_vector_table +.global __irq_stack_top__ +.global __fiq_stack_top__ +.global __svc_stack_top__ + +.global bsp_ints_enable +.global bsp_ints_disable +.global bsp_ints_restore + + +.equ USR_MODE, 0x10 +.equ FIQ_MODE, 0x11 +.equ IRQ_MODE, 0x12 +.equ SVC_MODE, 0x13 +.equ ABT_MODE, 0x17 +.equ UND_MODE, 0x1B +.equ SYS_MODE, 0x1F + +.equ I_BIT, 0x80 /* when I bit is set, IRQ is disabled */ +.equ F_BIT, 0x40 /* when F bit is set, FIQ is disabled */ + +__interrupt_vector_table: + + B Reset_Handler /* Reset */ + B . /* Undefined */ + B . /* SWI */ + B . /* Prefetch Abort */ + B . /* Data Abort */ + B . /* reserved */ + B IRQ_Handler /* IRQ */ + B . /* FIQ */ + + + +Reset_Handler: + + + MSR CPSR_c,#(IRQ_MODE | I_BIT | F_BIT) + LDR sp,=__irq_stack_top__ /* set the IRQ stack pointer */ + MSR CPSR_c,#(FIQ_MODE | I_BIT | F_BIT) + LDR sp,=__fiq_stack_top__ /* set the FIQ stack pointer */ + MSR CPSR_c,#(SVC_MODE | I_BIT | F_BIT) + LDR sp,=__svc_stack_top__ /* set the SVC stack pointer */ + + BL low_level_init + BL _mainCRTStartup + + + B . + +IRQ_Handler: + B archIRQHandler + diff --git a/platforms/qemu_integratorcp/system.ld b/platforms/qemu_integratorcp/system.ld new file mode 100644 index 0000000..4d4fc2c --- /dev/null +++ b/platforms/qemu_integratorcp/system.ld @@ -0,0 +1,94 @@ + +ENTRY(__interrupt_vector_table) + + +MEMORY +{ + flash (rx) : ORIGIN = 0x00000000, LENGTH = 0x00020000 + sram (rwx) : ORIGIN = 0x00020000, LENGTH = 0x00020000 +} + + +EXTERN(__interrupt_vector_table); + + +C_STACK_SIZE = 512; +IRQ_STACK_SIZE = 256; +FIQ_STACK_SIZE = 256; +SVC_STACK_SIZE = 512; +ABT_STACK_SIZE = 256; +UND_STACK_SIZE = 256; + +SECTIONS +{ + + + .text : + { + *(.vectors) + /* Startup assembly */ + *(.startup) + *(.init) + + /* Rest of the code (C) */ + *(.text) + *(.rodata) + *(.rodata*) + + _end_text = .; + } >flash + + .data : + { + _start_data = .; + *(.data) + _end_data = .; + } >sram + + .bss : + { + _start_bss = .; + __bss_start__ = . ; + *(.bss) + *(.eh_*) + } >sram + + . = ALIGN(4); + _end_bss = .; + __bss_end__ = . ; + + . = ALIGN(256); + + + .stack : { + __stack_start__ = . ; + . += IRQ_STACK_SIZE; + . = ALIGN (4); + __irq_stack_top__ = . ; + . += FIQ_STACK_SIZE; + . = ALIGN (4); + __fiq_stack_top__ = . ; + . += SVC_STACK_SIZE; + . = ALIGN (4); + __svc_stack_top__ = . ; + . += ABT_STACK_SIZE; + . = ALIGN (4); + __abt_stack_top__ = . ; + . += UND_STACK_SIZE; + . = ALIGN (4); + __und_stack_top__ = . ; + . += C_STACK_SIZE; + . = ALIGN (4); + __c_stack_top__ = . ; + __stack_end__ = .; + } >sram + + + /*DISCARD : + { + *(.eh_*) + }*/ +} + +_end = .; +PROVIDE(end = .); \ No newline at end of file diff --git a/platforms/rules.mk b/platforms/rules.mk new file mode 100644 index 0000000..7f0f767 --- /dev/null +++ b/platforms/rules.mk @@ -0,0 +1,60 @@ +# +# The following part of the makefile is generic; it can be used to +# build any executable just by changing the definitions above and by +# deleting dependencies appended to the file from 'make depend' +# +.SUFFIXES: .asm .elf .hex .lst .o .S .s .c .cpp +.PHONY: depend clean + +dump: + @echo "Target: " + @echo $(TARGET_NAME) + @echo "Source files: " + @echo $(SRCS) + @echo $(ASMS) + @echo "Object files: " + @echo $(OBJS) + +all: target + +target: $(OBJS) + $(LN) $(LFLAGS) $(LIBFLAGS) $(OBJS) $(LLIBS) -o $(TARGET_NAME).elf + @echo $(TARGET_NAME).elf was compiled + +clean: + rm -f $(OBJS) + + +# this is a suffix replacement rule for building .o's from .c's +# it uses automatic variables $<: the name of the prerequisite of +# the rule(a .c file) and $@: the name of the target of the rule (a .o file) +# (see the gnu make manual section about automatic variables) + +.c.o: + $(CC) $(CDEFS) $(CFLAGS) $(INCLUDES) -c $< -o $@ + +.cpp.o: + $(CC) $(CDEFS) $(CFLAGS) $(INCLUDES) -c $< -o $@ + +.S.o: + $(AS) $(ADEFS) $(AFLAGS) $(INCLUDES) -c $< -o $@ + +.s.o: + $(AS) $(ADEFS) $(AFLAGS) $(INCLUDES) -c $< -o $@ + +DEPFILE=.depends +DEPTOKEN='\# MAKEDEPENDS' +DEPFLAGS=-Y -f $(DEPFILE) -s $(DEPTOKEN) -p $(OUTDIR)/ + + +depend: + rm -f $(DEPFILE) + make $(DEPFILE) + +$(DEPFILE): + @echo $(DEPTOKEN) > $(DEPFILE) + makedepend $(DEPFLAGS) -- $(CFLAGS) -- $(SRCS) >&/dev/null + +# put this file in the last line of your Makefile +sinclude $(DEPFILE) + \ No newline at end of file diff --git a/ports/armv7/Makefile b/ports/arm/Makefile similarity index 68% rename from ports/armv7/Makefile rename to ports/arm/Makefile index 3a15998..9c33741 100644 --- a/ports/armv7/Makefile +++ b/ports/arm/Makefile @@ -1,5 +1,5 @@ -ATOMTHREADS_PORT = .../libraries/atomthreads/ports/armv7 -ATOMTHREADS_KERNEL = .../libraries/atomthreads/kernel +ATOMTHREADS_PORT = $(ATOMTHREADS)/ports/arm +ATOMTHREADS_KERNEL = $(ATOMTHREADS)/kernel INCLUDES := $(INCLUDES) \ -I$(ATOMTHREADS_KERNEL) \ @@ -14,6 +14,6 @@ SRCS := $(SRCS) \ $(ATOMTHREADS_PORT)/atomport.c ASMS := $(ASMS) \ - $(ATOMTHREADS_PORT)/atomport_arm.asm - - + $(ATOMTHREADS_PORT)/atomport_s.S + + diff --git a/ports/armv7/README b/ports/arm/README similarity index 100% rename from ports/armv7/README rename to ports/arm/README diff --git a/ports/arm/atomport-tests.h b/ports/arm/atomport-tests.h new file mode 100644 index 0000000..cfb909a --- /dev/null +++ b/ports/arm/atomport-tests.h @@ -0,0 +1,50 @@ +/* + * Copyright (c) 2012, Natie van Rooyen. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. No personal names or organizations' names associated with the + * Atomthreads project may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE ATOMTHREADS PROJECT AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE + * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + * POSSIBILITY OF SUCH DAMAGE. + */ + +#ifndef __ATOMPORT_TEST_H__ +#define __ATOMPORT_TEST_H__ + +/* Include Atomthreads kernel API */ +#include "atom.h" + +extern void dbg_format_msg (char *format, ...) ; + + +#define TEST_THREAD_STACK_SIZE 1024 +#define ATOMLOG dbg_format_msg +#define _STR(x) x + + + + +/* API for starting each test */ +extern uint32_t test_start (void); + + +#endif /* __ATOMPORT_TEST_H__ */ diff --git a/ports/armv7/atomport.c b/ports/arm/atomport.c similarity index 94% rename from ports/armv7/atomport.c rename to ports/arm/atomport.c index 8fa0b2a..da96930 100644 --- a/ports/armv7/atomport.c +++ b/ports/arm/atomport.c @@ -33,14 +33,14 @@ /* * * - * Functions defined in atomport_arm.asm + * Functions defined in atomport_s.asm * */ +typedef void * SYSCONTEXT ; + extern void contextInit (void) ; extern void contextSwitch (SYSCONTEXT* save_context, SYSCONTEXT* new_context) ; extern void contextStart (SYSCONTEXT* context) ; -extern uint32_t contextEnterCritical (void) ; -extern void contextExitCritical (uint32_t posture) ; extern void contextEnableInterrupts (void) ; /** @@ -83,7 +83,6 @@ thread_shell (void) void archThreadContextInit (ATOM_TCB *tcb_ptr, void *stack_top, void (*entry_point)(uint32_t), uint32_t entry_param) { - static uint32_t context_thread_id = 0 ; uint32_t * stack_ptr ; tcb_ptr->sp_save_ptr = stack_top; @@ -111,10 +110,10 @@ archThreadContextInit (ATOM_TCB *tcb_ptr, void *stack_top, void (*entry_point)(u stack_ptr--; *stack_ptr = ( uint32_t ) 0x00000404; /* R4 */ -// #ifdef CONTEXT_THREAD_ID +#ifdef CONTEXT_THREAD_ID stack_ptr--; *stack_ptr = context_thread_id++ ; /* thread_id */ -// #endif +#endif tcb_ptr->sp_save_ptr = stack_ptr ; } diff --git a/ports/armv7/atomport.h b/ports/arm/atomport.h similarity index 90% rename from ports/armv7/atomport.h rename to ports/arm/atomport.h index 2a6cf50..39bd0c0 100644 --- a/ports/armv7/atomport.h +++ b/ports/arm/atomport.h @@ -30,10 +30,9 @@ #ifndef __ATOM_PORT_H__ #define __ATOM_PORT_H__ -#include "arch/context.h" #include "types.h" -#define SYSTEM_TICKS_PER_SEC 1000 +#define SYSTEM_TICKS_PER_SEC 100 /** @@ -43,12 +42,18 @@ */ #define POINTER void * +/* * + * + * Functions defined in atomport_arm.asm + * + */ +extern uint32_t contextEnterCritical (void) ; +extern void contextExitCritical (uint32_t posture) ; + /* Critical region protection */ - #define CRITICAL_STORE uint32_t __atom_critical #define CRITICAL_START() __atom_critical = contextEnterCritical() #define CRITICAL_END() contextExitCritical(__atom_critical) - #endif /* __ATOM_PORT_H__ */ diff --git a/ports/arm/atomport.o b/ports/arm/atomport.o new file mode 100644 index 0000000000000000000000000000000000000000..31708720d585be2ba9192034494e6518dee87692 GIT binary patch literal 5436 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 d&fvQFZ$kzR$#^{$Kx~he*tXjaQy%P literal 0 HcmV?d00001 diff --git a/ports/armv7/atomport_private.h b/ports/arm/atomport_private.h similarity index 100% rename from ports/armv7/atomport_private.h rename to ports/arm/atomport_private.h diff --git a/ports/arm/atomport_s.S b/ports/arm/atomport_s.S new file mode 100644 index 0000000..1227c52 --- /dev/null +++ b/ports/arm/atomport_s.S @@ -0,0 +1,227 @@ +/* + Copyright (c) 2012, Natie van Rooyen. All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + 1. Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + 3. No personal names or organizations' names associated with the + Atomthreads project may be used to endorse or promote products + derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE ATOMTHREADS PROJECT AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED + TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR + PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE + LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. +*/ + + + +/**/ + + + +.global archIRQHandler + +.global contextEnterCritical +.global contextExitCritical +.global contextEnableInterrupts +.global contextId +.global contextStart +.global contextSwitch +.global contextInit + + +.global __context_preempt_handler + +/**/ +.equ USR_MODE, 0x10 +.equ FIQ_MODE, 0x11 +.equ IRQ_MODE, 0x12 +.equ SVC_MODE, 0x13 +.equ ABT_MODE, 0x17 +.equ UND_MODE, 0x1B +.equ SYS_MODE, 0x1F + +.equ I_BIT, 0x80 /* when I bit is set, IRQ is disabled */ +.equ F_BIT, 0x40 /* when F bit is set, FIQ is disabled */ + + +.text +.code 32 + +/** + * \b contextInit + * + * Architecture-specific one time initialization. + * + * @return None + */ +contextInit: + + BX lr + +/** + * \b contextSwitch + * + * Architecture-specific context switch routine. + * + * Note that interrupts are always locked out when this routine is + * called. For cooperative switches, the scheduler will have entered + * a critical region. For preemptions (called from an ISR), the + * interrupts will have disabled in the tick_Handler. + * + * @param[in] [r0] -> Address to save old stack pointer + * @param[in] [r1] -> Address where new stack pointer is stored + * + * @return None + */ +contextSwitch: + STMFD sp!, {r4 - r11, lr} /* Save registers */ + +#ifdef CONTEXT_THREAD_ID + MRC p15, 0, r3, c13, c0, 2 + STMFD sp!, {r3} +#endif + + STR sp, [r0] /* Save old stack pointer */ + LDR r1, [r1] /* Load new stack pointer */ + MOV sp, r1 + +#ifdef CONTEXT_THREAD_ID + LDMFD sp!, {r3} + MCR p15, 0, r3, c13, c0, 2 +#endif + + LDMFD sp!, {r4 - r11, pc} /* Load new registers */ + +/** + * \b contextStart + * + * Architecture-specific context start routine. + * + * @param[in] [r0] -> Address where stack pointer is stored + * + * @return Does not return + */ +contextStart: + LDR r0, [r0] + MOV sp, r0 /* Load new stack pointer */ + +#ifdef CONTEXT_THREAD_ID + LDMFD sp!, {r3} + MCR p15, 0, r3, c13, c0, 2 +#endif + + LDMFD sp!, {r4 - r11, pc} /* Load new registers */ + +/** + * \b contextId + * + * Returns a unique ID for the context + * + * @return ID + */ +contextId: +#ifdef CONTEXT_THREAD_ID + MRC p15, 0, r0, c13, c0, 2 +#else + MOV r0, #0 +#endif + BX lr + +/** + * \b contextEnableInterrupts + * + * Enables interrupts on the processor + * + * @return None + */ +contextEnableInterrupts: + MRS r0, CPSR + MOV r1, #I_BIT + BIC r0, r0, r1 + MSR CPSR_c, r0 + BX lr + +/** + * \b contextExitCritical + * + * Exit critical section (restores interrupt posture) + * + * @param[in] r0 Interrupt Posture + * + * @return None + */ +contextExitCritical: + MSR CPSR_cxsf, r0 + BX lr + +/** + * \b contextEnterCritical + * + * Enter critical section (disables interrupts) + * + * @return Current interrupt posture + */ +contextEnterCritical: + MRS r0, CPSR + ORR r1, r0, #I_BIT + MSR CPSR_cxsf, r1 + BX lr + + + +/** + * \b archIRQHandler + * + * IRQ entry point. + * + * Save the process/thread context onto its own stackm before calling __context_preempt_handler (). + * __context_preempt_handler() might switch stacks. On return the same context is poped from the + * stack and control is returned to the process. + * + * @return None + */ +archIRQHandler: + + MSR cpsr_c, #(SVC_MODE | I_BIT) /* Save current process context in process stack */ + STMFD sp!, {r0 - r3, ip, lr} + + MSR cpsr_c, #(IRQ_MODE | I_BIT) /* Save lr_irq and spsr_irq in process stack */ + SUB lr, lr, #4 + MOV r1, lr + MRS r2, spsr + MSR cpsr_c, #(SVC_MODE | I_BIT) + STMFD sp!, {r1, r2} + + BL __context_preempt_handler /* Dispatch the interrupt to archTickHandler for + the timer tick interrupt or a simular function + for other interrupts which might call atomthread + functions. */ + + LDMFD sp!, {r1, r2} /* Restore lr_irq and spsr_irq from process stack */ + MSR cpsr_c, #(IRQ_MODE | I_BIT) + STMFD sp!, {r1} + MSR spsr_cxsf, r2 + + MSR cpsr_c, #(SVC_MODE | I_BIT) /* Restore process regs */ + LDMFD sp!, {r0 - r3, ip, lr} + + MSR cpsr_c, #(IRQ_MODE | I_BIT) /* Exit from IRQ */ + LDMFD sp!, {pc}^ + + + diff --git a/ports/armv7/types.h b/ports/arm/types.h similarity index 96% rename from ports/armv7/types.h rename to ports/arm/types.h index 0fd6feb..d383d84 100644 --- a/ports/armv7/types.h +++ b/ports/arm/types.h @@ -40,7 +40,7 @@ typedef int int32_t ; typedef short int16_t ; typedef char int8_t ; -typedef volatile unsigned int REG_DWORD ;// Hardware register definition +// typedef volatile unsigned int REG_DWORD ;// Hardware register definition #define UWORD64 unsigned long long #define UWORD32 unsigned int diff --git a/ports/armv7/atomport_arm.asm b/ports/armv7/atomport_arm.asm deleted file mode 100644 index 496e779..0000000 --- a/ports/armv7/atomport_arm.asm +++ /dev/null @@ -1,211 +0,0 @@ -; -; Copyright (c) 2012, Natie van Rooyen. All rights reserved. -; -; Redistribution and use in source and binary forms, with or without -; modification, are permitted provided that the following conditions -; are met: -; -; 1. Redistributions of source code must retain the above copyright -; notice, this list of conditions and the following disclaimer. -; 2. Redistributions in binary form must reproduce the above copyright -; notice, this list of conditions and the following disclaimer in the -; documentation and/or other materials provided with the distribution. -; 3. No personal names or organizations' names associated with the -; Atomthreads project may be used to endorse or promote products -; derived from this software without specific prior written permission. -; -; THIS SOFTWARE IS PROVIDED BY THE ATOMTHREADS PROJECT AND CONTRIBUTORS -; "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED -; TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR -; PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE -; LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -; CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -; SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -; INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -; CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -; ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -; POSSIBILITY OF SUCH DAMAGE. -; - - - PRESERVE8 {TRUE} - AREA UTILS, CODE, READONLY -;-- - EXPORT contextInit - EXPORT contextSwitch - EXPORT contextStart - EXPORT contextEnableInterrupts - EXPORT contextEnterCritical - EXPORT contextExitCritical - EXPORT archIRQHandler - - EXTERN __context_preempt_handler [WEAK] - -;-- -ARM_SVC_MODE EQU 0xd3 -ARM_IRQ_MODE EQU 0xD2 -ARM_FIQ_MODE EQU 0xD1 -ARM_MODE_MASK EQU 0x1F -ARM_FIQ_MODE_BITS EQU 0x11 -ARM_IRQ_MODE_BITS EQU 0x12 - - - ARM - -;-- -; \b contextInit -; -; Architecture-specific one time initialization. -; -; @return None -; -contextInit - - BX lr - -;-- -; \b contextSwitch -; -; Architecture-specific context switch routine. -; -; Note that interrupts are always locked out when this routine is -; called. For cooperative switches, the scheduler will have entered -; a critical region. For preemptions (called from an ISR), the -; interrupts will have disabled in the tick_Handler. -; -; @param[in] [r0] -> Address to save old stack pointer -; @param[in] [r1] -> Address where new stack pointer is stored -; -; @return None -; -contextSwitch - STMFD sp!, {r4 - r11, lr} ;- Save registers - - ;- IF :DEF:CONTEXT_THREAD_ID - MRC p15, 0, r3, c13, c0, 2 - STMFD sp!, {r3} - ;- ENDIF - - STR sp, [r0] ;- Save old stack pointer - LDR r1, [r1] ;- Load new stack pointer - MOV sp, r1 - - ISB - - ;- IF :DEF:CONTEXT_THREAD_ID - LDMFD sp!, {r3} - MCR p15, 0, r3, c13, c0, 2 - ;- ENDIF - - LDMFD sp!, {r4 - r11, pc} ;- Load new registers - -;-- -; \b contextStart -; -; Architecture-specific context start routine. -; -; @param[in] [r0] -> Address where stack pointer is stored -; -; @return Does not return -; -contextStart - LDR r0, [r0] - MOV sp, r0 ;- Load new stack pointer - - ;- IF :DEF:CONTEXT_THREAD_ID - LDMFD sp!, {r3} - MCR p15, 0, r3, c13, c0, 2 - ;- ENDIF - - LDMFD sp!, {r4 - r11, pc} ;- Load new registers - -;-- -; \b contextId -; -; Returns a unique ID for the context -; -; @return ID -; -contextId - MRC p15, 0, r0, c13, c0, 2 - BX lr - -;-- -; \b contextEnableInterrupts -; -; Enables interrupts on the processor -; -; @return None -; -contextEnableInterrupts - MRS r0, CPSR - MOV r1, #0x80 - BIC r0, r0, r1 - MSR CPSR_c, r0 - BX lr - -;-- -; \b contextExitCritical -; -; Exit critical section (restores interrupt posture) -; -; @param[in] r0 Interrupt Posture -; -; @return None -; -contextExitCritical - MSR CPSR_cxsf, r0 - BX lr - -;-- -; \b contextEnterCritical -; -; Enter critical section (disables interrupts) -; -; @return Current interrupt posture -; -contextEnterCritical - MRS r0, CPSR - ORR r1, r0, #0x80 - MSR CPSR_cxsf, r1 - BX lr - -;-- -; \b archIRQHandler -; -; IRQ entry point. -; -; Save the process/thread context onto its own stackm before calling __context_preempt_handler (). -; __context_preempt_handler() might switch stacks. On return the same context is poped from the -; stack and control is returned to the process. -; -; @return None -; -archIRQHandler - - MSR cpsr_c, #ARM_SVC_MODE ;- Save current process context in process stack - STMFD sp!, {r0 - r3, ip, lr} - - MSR cpsr_c, #ARM_IRQ_MODE ;- Save lr_irq and spsr_irq in process stack - SUB lr, lr, #4 - MOV r1, lr - MRS r2, spsr - MSR cpsr_c, #ARM_SVC_MODE - STMFD sp!, {r1, r2} - - BL __context_preempt_handler ;- Dispatch the interrupt to archTickHandler for the timer tick interrupt or a simular function for other interrupts which might call atomthread functions. - - LDMFD sp!, {r1, r2} ;- Restore lr_irq and spsr_irq from process stack - MSR cpsr_c, #ARM_IRQ_MODE - STMFD sp!, {r1} - MSR spsr_cxsf, r2 - - MSR cpsr_c, #ARM_SVC_MODE ;- Restore process regs - LDMFD sp!, {r0 - r3, ip, lr} - - MSR cpsr_c, #ARM_IRQ_MODE ;- Exit from IRQ - LDMFD sp!, {pc}^ - - -;-- - END diff --git a/tests/atomtests.h b/tests/atomtests.h index 9e0d0f2..2018a28 100644 --- a/tests/atomtests.h +++ b/tests/atomtests.h @@ -44,4 +44,4 @@ extern uint32_t test_start (void); -#endif /* __ATOM_TESTS_H */ +#endif /* __ATOM_TESTS_H */ \ No newline at end of file diff --git a/tests/kern1.c b/tests/kern1.c index 1695039..d0cce0c 100644 --- a/tests/kern1.c +++ b/tests/kern1.c @@ -64,7 +64,7 @@ uint32_t test_start (void) /* atomThreadCreate: Pass a bad TCB pointer */ if (atomThreadCreate (NULL, TEST_THREAD_PRIO, test_thread_func, 0, - &test_thread_stack[TEST_THREAD_STACK_SIZE - 1], + &test_thread_stack[TEST_THREAD_STACK_SIZE - sizeof(uint32_t)], TEST_THREAD_STACK_SIZE) != ATOM_ERR_PARAM) { ATOMLOG (_STR("Bad TCB check\n")); @@ -73,7 +73,7 @@ uint32_t test_start (void) /* atomThreadCreate: Pass a bad entry point */ if (atomThreadCreate (&tcb1, TEST_THREAD_PRIO, NULL, 0, - &test_thread_stack[TEST_THREAD_STACK_SIZE - 1], + &test_thread_stack[TEST_THREAD_STACK_SIZE - sizeof(uint32_t)], TEST_THREAD_STACK_SIZE) != ATOM_ERR_PARAM) { ATOMLOG (_STR("Bad entry check\n")); @@ -90,7 +90,7 @@ uint32_t test_start (void) /* atomThreadCreate: Pass a bad stack size */ if (atomThreadCreate (&tcb1, TEST_THREAD_PRIO, test_thread_func, 0, - &test_thread_stack[TEST_THREAD_STACK_SIZE - 1], 0) != ATOM_ERR_PARAM) + &test_thread_stack[TEST_THREAD_STACK_SIZE - sizeof(uint32_t)], 0) != ATOM_ERR_PARAM) { ATOMLOG (_STR("Bad stack size check\n")); failures++; diff --git a/tests/kern3.c b/tests/kern3.c index 20304f8..47fc6bb 100644 --- a/tests/kern3.c +++ b/tests/kern3.c @@ -95,7 +95,7 @@ uint32_t test_start (void) /* Create low priority thread */ if (atomThreadCreate (&tcb[0], 253, test_thread_func, 0, - &test_thread_stack[0][TEST_THREAD_STACK_SIZE - 1], + &test_thread_stack[0][TEST_THREAD_STACK_SIZE - sizeof(uint32_t)], TEST_THREAD_STACK_SIZE) != ATOM_OK) { ATOMLOG (_STR("Bad thread create\n")); @@ -104,7 +104,7 @@ uint32_t test_start (void) /* Create high priority thread */ else if (atomThreadCreate (&tcb[1], 252, test_thread_func, 1, - &test_thread_stack[1][TEST_THREAD_STACK_SIZE - 1], + &test_thread_stack[1][TEST_THREAD_STACK_SIZE - sizeof(uint32_t)], TEST_THREAD_STACK_SIZE) != ATOM_OK) { ATOMLOG (_STR("Bad thread create\n")); diff --git a/tests/kern4.c b/tests/kern4.c index 909232e..b38be51 100644 --- a/tests/kern4.c +++ b/tests/kern4.c @@ -97,28 +97,28 @@ uint32_t test_start (void) * a spell in which this thread was run. */ if (atomThreadCreate (&tcb[0], TEST_THREAD_PRIO + 1, test_thread_func, 0, - &test_thread_stack[0][TEST_THREAD_STACK_SIZE - 1], + &test_thread_stack[0][TEST_THREAD_STACK_SIZE - sizeof(uint32_t)], TEST_THREAD_STACK_SIZE) != ATOM_OK) { ATOMLOG (_STR("Bad thread create\n")); failures++; } else if (atomThreadCreate (&tcb[1], TEST_THREAD_PRIO + 1, test_thread_func, 1, - &test_thread_stack[1][TEST_THREAD_STACK_SIZE - 1], + &test_thread_stack[1][TEST_THREAD_STACK_SIZE - sizeof(uint32_t)], TEST_THREAD_STACK_SIZE) != ATOM_OK) { ATOMLOG (_STR("Bad thread create\n")); failures++; } else if (atomThreadCreate (&tcb[2], TEST_THREAD_PRIO + 1, test_thread_func, 2, - &test_thread_stack[2][TEST_THREAD_STACK_SIZE - 1], + &test_thread_stack[2][TEST_THREAD_STACK_SIZE - sizeof(uint32_t)], TEST_THREAD_STACK_SIZE) != ATOM_OK) { ATOMLOG (_STR("Bad thread create\n")); failures++; } else if (atomThreadCreate (&tcb[3], TEST_THREAD_PRIO + 1, test_thread_func, 3, - &test_thread_stack[3][TEST_THREAD_STACK_SIZE - 1], + &test_thread_stack[3][TEST_THREAD_STACK_SIZE - sizeof(uint32_t)], TEST_THREAD_STACK_SIZE) != ATOM_OK) { ATOMLOG (_STR("Bad thread create\n")); diff --git a/tests/mutex1.c b/tests/mutex1.c index e3bc16a..af1e157 100644 --- a/tests/mutex1.c +++ b/tests/mutex1.c @@ -138,7 +138,7 @@ uint32_t test_start (void) } else if (atomThreadCreate(&tcb[0], TEST_THREAD_PRIO, test1_thread_func, 0, - &test_thread_stack[0][TEST_THREAD_STACK_SIZE - 1], + &test_thread_stack[0][TEST_THREAD_STACK_SIZE - sizeof(uint32_t)], TEST_THREAD_STACK_SIZE) != ATOM_OK) { /* Fail */ @@ -201,7 +201,7 @@ uint32_t test_start (void) } else if (atomThreadCreate(&tcb[1], TEST_THREAD_PRIO, test2_thread_func, 0, - &test_thread_stack[1][TEST_THREAD_STACK_SIZE - 1], + &test_thread_stack[1][TEST_THREAD_STACK_SIZE - sizeof(uint32_t)], TEST_THREAD_STACK_SIZE) != ATOM_OK) { /* Fail */ diff --git a/tests/mutex2.c b/tests/mutex2.c index 9725f44..033d8b6 100644 --- a/tests/mutex2.c +++ b/tests/mutex2.c @@ -144,7 +144,7 @@ uint32_t test_start (void) /* Create a test thread, the sole purpose of which is to own mutex2 */ g_owned = 0; if (atomThreadCreate(&tcb[0], TEST_THREAD_PRIO, test_thread_func, 0, - &test_thread_stack[0][TEST_THREAD_STACK_SIZE - 1], + &test_thread_stack[0][TEST_THREAD_STACK_SIZE - sizeof(uint32_t)], TEST_THREAD_STACK_SIZE) != ATOM_OK) { /* Fail */ diff --git a/tests/mutex3.c b/tests/mutex3.c index f604430..1f2becc 100644 --- a/tests/mutex3.c +++ b/tests/mutex3.c @@ -108,7 +108,7 @@ uint32_t test_start (void) { /* Create Thread 1 (lower priority thread A) */ if (atomThreadCreate(&tcb[0], TEST_THREAD_PRIO+1, test_thread_func, 1, - &test_thread_stack[0][TEST_THREAD_STACK_SIZE - 1], + &test_thread_stack[0][TEST_THREAD_STACK_SIZE - sizeof(uint32_t)], TEST_THREAD_STACK_SIZE) != ATOM_OK) { /* Fail */ @@ -121,7 +121,7 @@ uint32_t test_start (void) /* Create Thread 2 (lower priority thread B) */ if (atomThreadCreate(&tcb[1], TEST_THREAD_PRIO+1, test_thread_func, 2, - &test_thread_stack[1][TEST_THREAD_STACK_SIZE - 1], + &test_thread_stack[1][TEST_THREAD_STACK_SIZE - sizeof(uint32_t)], TEST_THREAD_STACK_SIZE) != ATOM_OK) { /* Fail */ @@ -134,7 +134,7 @@ uint32_t test_start (void) /* Create Thread 3 (higher priority thread A) */ if (atomThreadCreate(&tcb[2], TEST_THREAD_PRIO, test_thread_func, 3, - &test_thread_stack[2][TEST_THREAD_STACK_SIZE - 1], + &test_thread_stack[2][TEST_THREAD_STACK_SIZE - sizeof(uint32_t)], TEST_THREAD_STACK_SIZE) != ATOM_OK) { /* Fail */ @@ -147,7 +147,7 @@ uint32_t test_start (void) /* Create Thread 4 (higher priority thread B) */ if (atomThreadCreate(&tcb[3], TEST_THREAD_PRIO, test_thread_func, 4, - &test_thread_stack[3][TEST_THREAD_STACK_SIZE - 1], + &test_thread_stack[3][TEST_THREAD_STACK_SIZE - sizeof(uint32_t)], TEST_THREAD_STACK_SIZE) != ATOM_OK) { /* Fail */ diff --git a/tests/mutex4.c b/tests/mutex4.c index b478517..7d9eeda 100644 --- a/tests/mutex4.c +++ b/tests/mutex4.c @@ -101,7 +101,7 @@ uint32_t test_start (void) /* Create Thread 1 */ if (atomThreadCreate(&tcb[0], TEST_THREAD_PRIO, test_thread_func, 1, - &test_thread_stack[0][TEST_THREAD_STACK_SIZE - 1], + &test_thread_stack[0][TEST_THREAD_STACK_SIZE - sizeof(uint32_t)], TEST_THREAD_STACK_SIZE) != ATOM_OK) { /* Fail */ @@ -113,7 +113,7 @@ uint32_t test_start (void) /* Create Thread 2 */ if (atomThreadCreate(&tcb[1], TEST_THREAD_PRIO, test_thread_func, 2, - &test_thread_stack[1][TEST_THREAD_STACK_SIZE - 1], + &test_thread_stack[1][TEST_THREAD_STACK_SIZE - sizeof(uint32_t)], TEST_THREAD_STACK_SIZE) != ATOM_OK) { /* Fail */ @@ -125,7 +125,7 @@ uint32_t test_start (void) /* Create Thread 3 */ if (atomThreadCreate(&tcb[2], TEST_THREAD_PRIO, test_thread_func, 3, - &test_thread_stack[2][TEST_THREAD_STACK_SIZE - 1], + &test_thread_stack[2][TEST_THREAD_STACK_SIZE - sizeof(uint32_t)], TEST_THREAD_STACK_SIZE) != ATOM_OK) { /* Fail */ @@ -137,7 +137,7 @@ uint32_t test_start (void) /* Create Thread 4 */ if (atomThreadCreate(&tcb[3], TEST_THREAD_PRIO, test_thread_func, 4, - &test_thread_stack[3][TEST_THREAD_STACK_SIZE - 1], + &test_thread_stack[3][TEST_THREAD_STACK_SIZE - sizeof(uint32_t)], TEST_THREAD_STACK_SIZE) != ATOM_OK) { /* Fail */ diff --git a/tests/mutex5.c b/tests/mutex5.c index 9aa18f2..7e91197 100644 --- a/tests/mutex5.c +++ b/tests/mutex5.c @@ -95,7 +95,7 @@ uint32_t test_start (void) /* Create second thread */ else if (atomThreadCreate(&tcb[0], TEST_THREAD_PRIO, test_thread_func, 1, - &test_thread_stack[0][TEST_THREAD_STACK_SIZE - 1], + &test_thread_stack[0][TEST_THREAD_STACK_SIZE - sizeof(uint32_t)], TEST_THREAD_STACK_SIZE) != ATOM_OK) { /* Fail */ diff --git a/tests/mutex6.c b/tests/mutex6.c index ca2c2d6..de4754f 100644 --- a/tests/mutex6.c +++ b/tests/mutex6.c @@ -100,7 +100,7 @@ uint32_t test_start (void) /* Create second thread */ if (atomThreadCreate(&tcb[0], TEST_THREAD_PRIO, test_thread_func, 1, - &test_thread_stack[0][TEST_THREAD_STACK_SIZE - 1], + &test_thread_stack[0][TEST_THREAD_STACK_SIZE - sizeof(uint32_t)], TEST_THREAD_STACK_SIZE) != ATOM_OK) { /* Fail */ diff --git a/tests/mutex7.c b/tests/mutex7.c index 9189dee..5a9f312 100644 --- a/tests/mutex7.c +++ b/tests/mutex7.c @@ -94,7 +94,7 @@ uint32_t test_start (void) /* Create second thread */ else if (atomThreadCreate(&tcb[0], TEST_THREAD_PRIO, test_thread_func, 1, - &test_thread_stack[0][TEST_THREAD_STACK_SIZE - 1], + &test_thread_stack[0][TEST_THREAD_STACK_SIZE - sizeof(uint32_t)], TEST_THREAD_STACK_SIZE) != ATOM_OK) { /* Fail */ diff --git a/tests/mutex8.c b/tests/mutex8.c index 14febb9..3c1776d 100644 --- a/tests/mutex8.c +++ b/tests/mutex8.c @@ -94,7 +94,7 @@ uint32_t test_start (void) /* Create test thread 1 */ if (atomThreadCreate(&tcb[0], TEST_THREAD_PRIO, test_thread_func, 0, - &test_thread_stack[0][TEST_THREAD_STACK_SIZE - 1], + &test_thread_stack[0][TEST_THREAD_STACK_SIZE - sizeof(uint32_t)], TEST_THREAD_STACK_SIZE) != ATOM_OK) { /* Fail */ @@ -104,7 +104,7 @@ uint32_t test_start (void) /* Create test thread 2 */ else if (atomThreadCreate(&tcb[1], TEST_THREAD_PRIO, test_thread_func, 1, - &test_thread_stack[1][TEST_THREAD_STACK_SIZE - 1], + &test_thread_stack[1][TEST_THREAD_STACK_SIZE - sizeof(uint32_t)], TEST_THREAD_STACK_SIZE) != ATOM_OK) { /* Fail */ @@ -114,7 +114,7 @@ uint32_t test_start (void) /* Create test thread 3 */ else if (atomThreadCreate(&tcb[2], TEST_THREAD_PRIO, test_thread_func, 2, - &test_thread_stack[2][TEST_THREAD_STACK_SIZE - 1], + &test_thread_stack[2][TEST_THREAD_STACK_SIZE - sizeof(uint32_t)], TEST_THREAD_STACK_SIZE) != ATOM_OK) { /* Fail */ diff --git a/tests/mutex9.c b/tests/mutex9.c index e509762..23d2782 100644 --- a/tests/mutex9.c +++ b/tests/mutex9.c @@ -88,7 +88,7 @@ uint32_t test_start (void) /* Create second thread */ if (atomThreadCreate(&tcb[0], TEST_THREAD_PRIO, test_thread_func, 1, - &test_thread_stack[0][TEST_THREAD_STACK_SIZE - 1], + &test_thread_stack[0][TEST_THREAD_STACK_SIZE - sizeof(uint32_t)], TEST_THREAD_STACK_SIZE) != ATOM_OK) { /* Fail */ diff --git a/tests/queue2.c b/tests/queue2.c index 8528ade..24bcd60 100644 --- a/tests/queue2.c +++ b/tests/queue2.c @@ -90,7 +90,7 @@ uint32_t test_start (void) /* Create a test thread that will block because the queue is empty */ else if (atomThreadCreate(&tcb[0], TEST_THREAD_PRIO, test1_thread_func, 0, - &test_thread_stack[0][TEST_THREAD_STACK_SIZE - 1], + &test_thread_stack[0][TEST_THREAD_STACK_SIZE - sizeof(uint32_t)], TEST_THREAD_STACK_SIZE) != ATOM_OK) { /* Fail */ @@ -147,7 +147,7 @@ uint32_t test_start (void) /* Create a test thread that will block because the queue is empty */ else if (atomThreadCreate(&tcb[1], TEST_THREAD_PRIO, test2_thread_func, 0, - &test_thread_stack[1][TEST_THREAD_STACK_SIZE - 1], + &test_thread_stack[1][TEST_THREAD_STACK_SIZE - sizeof(uint32_t)], TEST_THREAD_STACK_SIZE) != ATOM_OK) { /* Fail */ diff --git a/tests/queue3.c b/tests/queue3.c index 277a4e3..fed9ca8 100644 --- a/tests/queue3.c +++ b/tests/queue3.c @@ -107,7 +107,7 @@ uint32_t test_start (void) /* Create a test thread that will block because the queue is full */ if (atomThreadCreate(&tcb[0], TEST_THREAD_PRIO, test1_thread_func, 0, - &test_thread_stack[0][TEST_THREAD_STACK_SIZE - 1], + &test_thread_stack[0][TEST_THREAD_STACK_SIZE - sizeof(uint32_t)], TEST_THREAD_STACK_SIZE) != ATOM_OK) { /* Fail */ @@ -178,7 +178,7 @@ uint32_t test_start (void) /* Create a test thread that will block because the queue is full */ if (atomThreadCreate(&tcb[1], TEST_THREAD_PRIO, test2_thread_func, 0, - &test_thread_stack[1][TEST_THREAD_STACK_SIZE - 1], + &test_thread_stack[1][TEST_THREAD_STACK_SIZE - sizeof(uint32_t)], TEST_THREAD_STACK_SIZE) != ATOM_OK) { /* Fail */ diff --git a/tests/queue5.c b/tests/queue5.c index bf07960..bf7303b 100644 --- a/tests/queue5.c +++ b/tests/queue5.c @@ -115,7 +115,7 @@ uint32_t test_start (void) /* Create Thread 1 (lower priority thread A) */ if (atomThreadCreate(&tcb[0], TEST_THREAD_PRIO+1, test_thread_func, 1, - &test_thread_stack[0][TEST_THREAD_STACK_SIZE - 1], + &test_thread_stack[0][TEST_THREAD_STACK_SIZE - sizeof(uint32_t)], TEST_THREAD_STACK_SIZE) != ATOM_OK) { /* Fail */ @@ -128,7 +128,7 @@ uint32_t test_start (void) /* Create Thread 2 (lower priority thread B) */ if (atomThreadCreate(&tcb[1], TEST_THREAD_PRIO+1, test_thread_func, 2, - &test_thread_stack[1][TEST_THREAD_STACK_SIZE - 1], + &test_thread_stack[1][TEST_THREAD_STACK_SIZE - sizeof(uint32_t)], TEST_THREAD_STACK_SIZE) != ATOM_OK) { /* Fail */ @@ -141,7 +141,7 @@ uint32_t test_start (void) /* Create Thread 3 (higher priority thread A) */ if (atomThreadCreate(&tcb[2], TEST_THREAD_PRIO, test_thread_func, 3, - &test_thread_stack[2][TEST_THREAD_STACK_SIZE - 1], + &test_thread_stack[2][TEST_THREAD_STACK_SIZE - sizeof(uint32_t)], TEST_THREAD_STACK_SIZE) != ATOM_OK) { /* Fail */ @@ -154,7 +154,7 @@ uint32_t test_start (void) /* Create Thread 4 (higher priority thread B) */ if (atomThreadCreate(&tcb[3], TEST_THREAD_PRIO, test_thread_func, 4, - &test_thread_stack[3][TEST_THREAD_STACK_SIZE - 1], + &test_thread_stack[3][TEST_THREAD_STACK_SIZE - sizeof(uint32_t)], TEST_THREAD_STACK_SIZE) != ATOM_OK) { /* Fail */ diff --git a/tests/queue6.c b/tests/queue6.c index 4de62f0..eb77e04 100644 --- a/tests/queue6.c +++ b/tests/queue6.c @@ -107,7 +107,7 @@ uint32_t test_start (void) /* Create a test thread that will block because the queue is empty */ else if (atomThreadCreate(&tcb[0], TEST_THREAD_PRIO + 1, test1_thread_func, 0, - &test_thread_stack[0][TEST_THREAD_STACK_SIZE - 1], + &test_thread_stack[0][TEST_THREAD_STACK_SIZE - sizeof(uint32_t)], TEST_THREAD_STACK_SIZE) != ATOM_OK) { /* Fail */ diff --git a/tests/queue7.c b/tests/queue7.c index 5b249d8..fda8132 100644 --- a/tests/queue7.c +++ b/tests/queue7.c @@ -94,7 +94,7 @@ uint32_t test_start (void) /* Create test thread 1 */ if (atomThreadCreate(&tcb[0], TEST_THREAD_PRIO, test_thread_func, 0, - &test_thread_stack[0][TEST_THREAD_STACK_SIZE - 1], + &test_thread_stack[0][TEST_THREAD_STACK_SIZE - sizeof(uint32_t)], TEST_THREAD_STACK_SIZE) != ATOM_OK) { /* Fail */ @@ -104,7 +104,7 @@ uint32_t test_start (void) /* Create test thread 2 */ else if (atomThreadCreate(&tcb[1], TEST_THREAD_PRIO, test_thread_func, 1, - &test_thread_stack[1][TEST_THREAD_STACK_SIZE - 1], + &test_thread_stack[1][TEST_THREAD_STACK_SIZE - sizeof(uint32_t)], TEST_THREAD_STACK_SIZE) != ATOM_OK) { /* Fail */ @@ -114,7 +114,7 @@ uint32_t test_start (void) /* Create test thread 3 */ else if (atomThreadCreate(&tcb[2], TEST_THREAD_PRIO, test_thread_func, 2, - &test_thread_stack[2][TEST_THREAD_STACK_SIZE - 1], + &test_thread_stack[2][TEST_THREAD_STACK_SIZE - sizeof(uint32_t)], TEST_THREAD_STACK_SIZE) != ATOM_OK) { /* Fail */ diff --git a/tests/queue9.c b/tests/queue9.c index 1bc1034..7251dd6 100644 --- a/tests/queue9.c +++ b/tests/queue9.c @@ -103,7 +103,7 @@ uint32_t test_start (void) { /* Create Thread 1 */ if (atomThreadCreate(&tcb[0], TEST_THREAD_PRIO, test_thread_func, 1, - &test_thread_stack[0][TEST_THREAD_STACK_SIZE - 1], + &test_thread_stack[0][TEST_THREAD_STACK_SIZE - sizeof(uint32_t)], TEST_THREAD_STACK_SIZE) != ATOM_OK) { /* Fail */ @@ -115,7 +115,7 @@ uint32_t test_start (void) /* Create Thread 2 */ if (atomThreadCreate(&tcb[1], TEST_THREAD_PRIO, test_thread_func, 2, - &test_thread_stack[1][TEST_THREAD_STACK_SIZE - 1], + &test_thread_stack[1][TEST_THREAD_STACK_SIZE - sizeof(uint32_t)], TEST_THREAD_STACK_SIZE) != ATOM_OK) { /* Fail */ @@ -127,7 +127,7 @@ uint32_t test_start (void) /* Create Thread 3 */ if (atomThreadCreate(&tcb[2], TEST_THREAD_PRIO, test_thread_func, 3, - &test_thread_stack[2][TEST_THREAD_STACK_SIZE - 1], + &test_thread_stack[2][TEST_THREAD_STACK_SIZE - sizeof(uint32_t)], TEST_THREAD_STACK_SIZE) != ATOM_OK) { /* Fail */ @@ -139,7 +139,7 @@ uint32_t test_start (void) /* Create Thread 4 */ if (atomThreadCreate(&tcb[3], TEST_THREAD_PRIO, test_thread_func, 4, - &test_thread_stack[3][TEST_THREAD_STACK_SIZE - 1], + &test_thread_stack[3][TEST_THREAD_STACK_SIZE - sizeof(uint32_t)], TEST_THREAD_STACK_SIZE) != ATOM_OK) { /* Fail */ diff --git a/tests/sem1.c b/tests/sem1.c index b7b6335..69be29b 100644 --- a/tests/sem1.c +++ b/tests/sem1.c @@ -134,7 +134,7 @@ uint32_t test_start (void) } else if (atomThreadCreate(&tcb[0], TEST_THREAD_PRIO, test1_thread_func, 0, - &test_thread_stack[0][TEST_THREAD_STACK_SIZE - 1], + &test_thread_stack[0][TEST_THREAD_STACK_SIZE - sizeof(uint32_t)], TEST_THREAD_STACK_SIZE) != ATOM_OK) { /* Fail */ @@ -201,7 +201,7 @@ uint32_t test_start (void) failures++; } else if (atomThreadCreate(&tcb[1], TEST_THREAD_PRIO, test2_thread_func, 0, - &test_thread_stack[1][TEST_THREAD_STACK_SIZE - 1], + &test_thread_stack[1][TEST_THREAD_STACK_SIZE - sizeof(uint32_t)], TEST_THREAD_STACK_SIZE) != ATOM_OK) { /* Fail */ diff --git a/tests/sem3.c b/tests/sem3.c index 6648b39..7bdb489 100644 --- a/tests/sem3.c +++ b/tests/sem3.c @@ -103,7 +103,7 @@ uint32_t test_start (void) { /* Create Thread 1 (lower priority thread A) */ if (atomThreadCreate(&tcb[0], TEST_THREAD_PRIO+1, test_thread_func, 1, - &test_thread_stack[0][TEST_THREAD_STACK_SIZE - 1], + &test_thread_stack[0][TEST_THREAD_STACK_SIZE - sizeof(uint32_t)], TEST_THREAD_STACK_SIZE) != ATOM_OK) { /* Fail */ @@ -116,7 +116,7 @@ uint32_t test_start (void) /* Create Thread 2 (lower priority thread B) */ if (atomThreadCreate(&tcb[1], TEST_THREAD_PRIO+1, test_thread_func, 2, - &test_thread_stack[1][TEST_THREAD_STACK_SIZE - 1], + &test_thread_stack[1][TEST_THREAD_STACK_SIZE - sizeof(uint32_t)], TEST_THREAD_STACK_SIZE) != ATOM_OK) { /* Fail */ @@ -129,7 +129,7 @@ uint32_t test_start (void) /* Create Thread 3 (higher priority thread A) */ if (atomThreadCreate(&tcb[2], TEST_THREAD_PRIO, test_thread_func, 3, - &test_thread_stack[2][TEST_THREAD_STACK_SIZE - 1], + &test_thread_stack[2][TEST_THREAD_STACK_SIZE - sizeof(uint32_t)], TEST_THREAD_STACK_SIZE) != ATOM_OK) { /* Fail */ @@ -142,7 +142,7 @@ uint32_t test_start (void) /* Create Thread 4 (higher priority thread B) */ if (atomThreadCreate(&tcb[3], TEST_THREAD_PRIO, test_thread_func, 4, - &test_thread_stack[3][TEST_THREAD_STACK_SIZE - 1], + &test_thread_stack[3][TEST_THREAD_STACK_SIZE - sizeof(uint32_t)], TEST_THREAD_STACK_SIZE) != ATOM_OK) { /* Fail */ diff --git a/tests/sem4.c b/tests/sem4.c index 419195c..092b0f9 100644 --- a/tests/sem4.c +++ b/tests/sem4.c @@ -97,7 +97,7 @@ uint32_t test_start (void) { /* Create Thread 1 */ if (atomThreadCreate(&tcb[0], TEST_THREAD_PRIO, test_thread_func, 1, - &test_thread_stack[0][TEST_THREAD_STACK_SIZE - 1], + &test_thread_stack[0][TEST_THREAD_STACK_SIZE - sizeof(uint32_t)], TEST_THREAD_STACK_SIZE) != ATOM_OK) { /* Fail */ @@ -109,7 +109,7 @@ uint32_t test_start (void) /* Create Thread 2 */ if (atomThreadCreate(&tcb[1], TEST_THREAD_PRIO, test_thread_func, 2, - &test_thread_stack[1][TEST_THREAD_STACK_SIZE - 1], + &test_thread_stack[1][TEST_THREAD_STACK_SIZE - sizeof(uint32_t)], TEST_THREAD_STACK_SIZE) != ATOM_OK) { /* Fail */ @@ -121,7 +121,7 @@ uint32_t test_start (void) /* Create Thread 3 */ if (atomThreadCreate(&tcb[2], TEST_THREAD_PRIO, test_thread_func, 3, - &test_thread_stack[2][TEST_THREAD_STACK_SIZE - 1], + &test_thread_stack[2][TEST_THREAD_STACK_SIZE - sizeof(uint32_t)], TEST_THREAD_STACK_SIZE) != ATOM_OK) { /* Fail */ @@ -133,7 +133,7 @@ uint32_t test_start (void) /* Create Thread 4 */ if (atomThreadCreate(&tcb[3], TEST_THREAD_PRIO, test_thread_func, 4, - &test_thread_stack[3][TEST_THREAD_STACK_SIZE - 1], + &test_thread_stack[3][TEST_THREAD_STACK_SIZE - sizeof(uint32_t)], TEST_THREAD_STACK_SIZE) != ATOM_OK) { /* Fail */ diff --git a/tests/sem5.c b/tests/sem5.c index dc87f9f..ae0c0a5 100644 --- a/tests/sem5.c +++ b/tests/sem5.c @@ -84,7 +84,7 @@ uint32_t test_start (void) { /* Create second thread */ if (atomThreadCreate(&tcb[0], TEST_THREAD_PRIO, test_thread_func, 1, - &test_thread_stack[0][TEST_THREAD_STACK_SIZE - 1], + &test_thread_stack[0][TEST_THREAD_STACK_SIZE - sizeof(uint32_t)], TEST_THREAD_STACK_SIZE) != ATOM_OK) { /* Fail */ diff --git a/tests/sem6.c b/tests/sem6.c index 851f9b8..309de97 100644 --- a/tests/sem6.c +++ b/tests/sem6.c @@ -94,7 +94,7 @@ uint32_t test_start (void) /* Create second thread */ else if (atomThreadCreate(&tcb[0], TEST_THREAD_PRIO, test_thread_func, 1, - &test_thread_stack[0][TEST_THREAD_STACK_SIZE - 1], + &test_thread_stack[0][TEST_THREAD_STACK_SIZE - sizeof(uint32_t)], TEST_THREAD_STACK_SIZE) != ATOM_OK) { /* Fail */ diff --git a/tests/sem7.c b/tests/sem7.c index 62fa16f..5507c70 100644 --- a/tests/sem7.c +++ b/tests/sem7.c @@ -100,7 +100,7 @@ uint32_t test_start (void) /* Create second thread */ else if (atomThreadCreate(&tcb[0], TEST_THREAD_PRIO, test_thread_func, 1, - &test_thread_stack[0][TEST_THREAD_STACK_SIZE - 1], + &test_thread_stack[0][TEST_THREAD_STACK_SIZE - sizeof(uint32_t)], TEST_THREAD_STACK_SIZE) != ATOM_OK) { /* Fail */ diff --git a/tests/sem8.c b/tests/sem8.c index 432cf32..67e2ea3 100644 --- a/tests/sem8.c +++ b/tests/sem8.c @@ -110,7 +110,7 @@ uint32_t test_start (void) /* Create thread 1: Higher priority than main thread so should sleep */ else if (atomThreadCreate(&tcb[0], TEST_THREAD_PRIO - 1, test_thread_func, 1, - &test_thread_stack[0][TEST_THREAD_STACK_SIZE - 1], + &test_thread_stack[0][TEST_THREAD_STACK_SIZE - sizeof(uint32_t)], TEST_THREAD_STACK_SIZE) != ATOM_OK) { /* Fail */ @@ -120,7 +120,7 @@ uint32_t test_start (void) /* Create thread 2: Same priority as main thread so should not sleep */ else if (atomThreadCreate(&tcb[1], TEST_THREAD_PRIO, test_thread_func, 0, - &test_thread_stack[1][TEST_THREAD_STACK_SIZE - 1], + &test_thread_stack[1][TEST_THREAD_STACK_SIZE - sizeof(uint32_t)], TEST_THREAD_STACK_SIZE) != ATOM_OK) { /* Fail */ @@ -130,7 +130,7 @@ uint32_t test_start (void) /* Create thread 3: Same priority as main thread so should not sleep */ else if (atomThreadCreate(&tcb[2], TEST_THREAD_PRIO + 1, test_thread_func, 0, - &test_thread_stack[2][TEST_THREAD_STACK_SIZE - 1], + &test_thread_stack[2][TEST_THREAD_STACK_SIZE - sizeof(uint32_t)], TEST_THREAD_STACK_SIZE) != ATOM_OK) { /* Fail */ diff --git a/tests/sem9.c b/tests/sem9.c index d7a86d6..ab4653d 100644 --- a/tests/sem9.c +++ b/tests/sem9.c @@ -87,7 +87,7 @@ uint32_t test_start (void) { /* Create test thread 1 */ if (atomThreadCreate(&tcb[0], TEST_THREAD_PRIO, test_thread_func, 0, - &test_thread_stack[0][TEST_THREAD_STACK_SIZE - 1], + &test_thread_stack[0][TEST_THREAD_STACK_SIZE - sizeof(uint32_t)], TEST_THREAD_STACK_SIZE) != ATOM_OK) { /* Fail */ @@ -97,7 +97,7 @@ uint32_t test_start (void) /* Create test thread 2 */ else if (atomThreadCreate(&tcb[1], TEST_THREAD_PRIO, test_thread_func, 1, - &test_thread_stack[1][TEST_THREAD_STACK_SIZE - 1], + &test_thread_stack[1][TEST_THREAD_STACK_SIZE - sizeof(uint32_t)], TEST_THREAD_STACK_SIZE) != ATOM_OK) { /* Fail */ @@ -107,7 +107,7 @@ uint32_t test_start (void) /* Create test thread 3 */ else if (atomThreadCreate(&tcb[2], TEST_THREAD_PRIO, test_thread_func, 2, - &test_thread_stack[2][TEST_THREAD_STACK_SIZE - 1], + &test_thread_stack[2][TEST_THREAD_STACK_SIZE - sizeof(uint32_t)], TEST_THREAD_STACK_SIZE) != ATOM_OK) { /* Fail */ diff --git a/tests/timer2.c b/tests/timer2.c index a606830..95c1dc6 100644 --- a/tests/timer2.c +++ b/tests/timer2.c @@ -73,7 +73,7 @@ uint32_t test_start (void) /* Create Thread 1 */ if (atomThreadCreate(&tcb[0], TEST_THREAD_PRIO, test_thread_func, 1, - &test_thread_stack[0][TEST_THREAD_STACK_SIZE - 1], + &test_thread_stack[0][TEST_THREAD_STACK_SIZE - sizeof(uint32_t)], TEST_THREAD_STACK_SIZE) != ATOM_OK) { /* Fail */ @@ -83,7 +83,7 @@ uint32_t test_start (void) /* Create Thread 2 */ if (atomThreadCreate(&tcb[1], TEST_THREAD_PRIO, test_thread_func, 2, - &test_thread_stack[1][TEST_THREAD_STACK_SIZE - 1], + &test_thread_stack[1][TEST_THREAD_STACK_SIZE - sizeof(uint32_t)], TEST_THREAD_STACK_SIZE) != ATOM_OK) { /* Fail */ @@ -93,7 +93,7 @@ uint32_t test_start (void) /* Create Thread 3 */ if (atomThreadCreate(&tcb[2], TEST_THREAD_PRIO, test_thread_func, 3, - &test_thread_stack[2][TEST_THREAD_STACK_SIZE - 1], + &test_thread_stack[2][TEST_THREAD_STACK_SIZE - sizeof(uint32_t)], TEST_THREAD_STACK_SIZE) != ATOM_OK) { /* Fail */