mirror of
https://github.com/FreeRTOS/FreeRTOS.git
synced 2025-12-19 01:55:28 +08:00
First version under SVN is V4.0.1
This commit is contained in:
707
Demo/ARM7_AT91FR40008_GCC/AT91R40008.h
Normal file
707
Demo/ARM7_AT91FR40008_GCC/AT91R40008.h
Normal file
File diff suppressed because it is too large
Load Diff
24
Demo/ARM7_AT91FR40008_GCC/ATEB40x.cfg
Normal file
24
Demo/ARM7_AT91FR40008_GCC/ATEB40x.cfg
Normal file
@@ -0,0 +1,24 @@
|
||||
[SETUP]
|
||||
CpuVendor=Atmel
|
||||
CpuChip=AT91R40807
|
||||
FlashVendor=Atmel
|
||||
FlashChip=AT49BV/F1614A
|
||||
RamAddress=$00000000
|
||||
RamSupport=1
|
||||
FlashAddress=$01000000
|
||||
FlashWidth=16
|
||||
FlashChipsPerSector=1
|
||||
LittleEndian=0
|
||||
SectStart=0
|
||||
SectEnd=38
|
||||
AutoErase=0
|
||||
AutoVerify=1
|
||||
CpuEndian=LITTLE
|
||||
SimCount=3
|
||||
MemoryCount=0
|
||||
ProgramFile=E:\temp\embesttest\Demo\ARM7_AT91R40008_GCC_Embest\rtosdemo.hex
|
||||
UploadFile=c:\EB40_Lower.bin
|
||||
Format=Intel Hex
|
||||
Sim3=EBI_RCR:$00000001
|
||||
Sim2=EBI_CSR1:$02002122
|
||||
Sim1=EBI_CSR0:$01002539
|
||||
79
Demo/ARM7_AT91FR40008_GCC/FreeRTOSConfig.h
Normal file
79
Demo/ARM7_AT91FR40008_GCC/FreeRTOSConfig.h
Normal file
@@ -0,0 +1,79 @@
|
||||
/*
|
||||
FreeRTOS V4.0.1 - Copyright (C) 2003-2006 Richard Barry.
|
||||
|
||||
This file is part of the FreeRTOS distribution.
|
||||
|
||||
FreeRTOS 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 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
FreeRTOS 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 FreeRTOS; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
A special exception to the GPL can be applied should you wish to distribute
|
||||
a combined work that includes FreeRTOS, without being obliged to provide
|
||||
the source code for any proprietary components. See the licensing section
|
||||
of http://www.FreeRTOS.org for full details of how and when the exception
|
||||
can be applied.
|
||||
|
||||
***************************************************************************
|
||||
See http://www.FreeRTOS.org for documentation, latest information, license
|
||||
and contact details. Please ensure to read the configuration and relevant
|
||||
port sections of the online documentation.
|
||||
***************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef FREERTOS_CONFIG_H
|
||||
#define FREERTOS_CONFIG_H
|
||||
|
||||
#include <AT91R40008.h>
|
||||
|
||||
#define configFLASH_SPEED_NSEC 100 /* External flash access speed (for ROM builds) */
|
||||
|
||||
/*-----------------------------------------------------------
|
||||
* Application specific definitions.
|
||||
*
|
||||
* These definitions should be adjusted for your particular hardware and
|
||||
* application requirements.
|
||||
*
|
||||
* THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE
|
||||
* FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.
|
||||
*----------------------------------------------------------*/
|
||||
|
||||
#define configUSE_PREEMPTION 1
|
||||
#define configUSE_IDLE_HOOK 0
|
||||
#define configUSE_TICK_HOOK 0
|
||||
#define configCPU_CLOCK_HZ ( ( unsigned portLONG ) 66000000 ) /* = 66.000MHz clk gen */
|
||||
#define configTICK_RATE_HZ ( ( portTickType ) 1000 )
|
||||
#define configMAX_PRIORITIES ( ( unsigned portBASE_TYPE ) 5 )
|
||||
#define configMINIMAL_STACK_SIZE ( ( unsigned portSHORT ) 128 )
|
||||
#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 25 * 1024 ) )
|
||||
#define configMAX_TASK_NAME_LEN ( 16 )
|
||||
#define configUSE_TRACE_FACILITY 0
|
||||
#define configUSE_16_BIT_TICKS 0
|
||||
#define configIDLE_SHOULD_YIELD 1
|
||||
|
||||
/* Co-routine definitions. */
|
||||
#define configUSE_CO_ROUTINES 0
|
||||
#define configMAX_CO_ROUTINE_PRIORITIES ( 2 )
|
||||
|
||||
/* Set the following definitions to 1 to include the API function, or zero
|
||||
to exclude the API function. */
|
||||
|
||||
#define INCLUDE_vTaskPrioritySet 1
|
||||
#define INCLUDE_uxTaskPriorityGet 1
|
||||
#define INCLUDE_vTaskDelete 1
|
||||
#define INCLUDE_vTaskCleanUpResources 0
|
||||
#define INCLUDE_vTaskSuspend 1
|
||||
#define INCLUDE_vTaskDelayUntil 1
|
||||
#define INCLUDE_vTaskDelay 1
|
||||
|
||||
|
||||
#endif /* FREERTOS_CONFIG_H */
|
||||
99
Demo/ARM7_AT91FR40008_GCC/Makefile
Normal file
99
Demo/ARM7_AT91FR40008_GCC/Makefile
Normal file
@@ -0,0 +1,99 @@
|
||||
# FreeRTOS V4.0.1 - Copyright (C) 2003-2006 Richard Barry.
|
||||
#
|
||||
# This file is part of the FreeRTOS distribution.
|
||||
#
|
||||
# FreeRTOS 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 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# FreeRTOS 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 FreeRTOS; if not, write to the Free Software
|
||||
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
#
|
||||
# A special exception to the GPL can be applied should you wish to distribute
|
||||
# a combined work that includes FreeRTOS, without being obliged to provide
|
||||
# the source code for any proprietary components. See the licensing section
|
||||
# of http://www.FreeRTOS.org for full details of how and when the exception
|
||||
# can be applied.
|
||||
#
|
||||
# ***************************************************************************
|
||||
# See http://www.FreeRTOS.org for documentation, latest information, license
|
||||
# and contact details. Please ensure to read the configuration and relevant
|
||||
# port sections of the online documentation.
|
||||
# ***************************************************************************
|
||||
|
||||
CC=arm-elf-gcc
|
||||
OBJCOPY=arm-elf-objcopy
|
||||
ARCH=arm-elf-ar
|
||||
CRT0=boot.s
|
||||
|
||||
#
|
||||
# CFLAGS common to both the THUMB and ARM mode builds
|
||||
#
|
||||
CFLAGS=-Wall -D $(RUN_MODE) -D GCC_AT91FR40008 -I. -I../../Source/include \
|
||||
-I../Common/include $(DEBUG) -mcpu=arm7tdmi -T$(LDSCRIPT) \
|
||||
-Wcast-align $(OPTIM)
|
||||
|
||||
ifeq ($(USE_THUMB_MODE),YES)
|
||||
CFLAGS += -mthumb-interwork -D THUMB_INTERWORK
|
||||
THUMB_FLAGS=-mthumb
|
||||
endif
|
||||
|
||||
|
||||
LINKER_FLAGS=-Xlinker -ortosdemo.elf -Xlinker -M -Xlinker -Map=rtosdemo.map
|
||||
|
||||
#
|
||||
# Source files that can be built to THUMB mode.
|
||||
#
|
||||
THUMB_SRC = \
|
||||
main.c \
|
||||
serial/serial.c \
|
||||
ParTest/ParTest.c \
|
||||
../Common/Minimal/integer.c \
|
||||
../Common/Minimal/flash.c \
|
||||
../Common/Minimal/PollQ.c \
|
||||
../Common/Minimal/comtest.c \
|
||||
../Common/Minimal/flop.c \
|
||||
../Common/Minimal/semtest.c \
|
||||
../Common/Minimal/dynamic.c \
|
||||
../Common/Minimal/BlockQ.c \
|
||||
../../Source/tasks.c \
|
||||
../../Source/queue.c \
|
||||
../../Source/list.c \
|
||||
../../Source/portable/MemMang/heap_2.c \
|
||||
../../Source/portable/GCC/ARM7_AT91FR40008/port.c
|
||||
|
||||
#
|
||||
# Source files that must be built to ARM mode.
|
||||
#
|
||||
ARM_SRC = \
|
||||
../../Source/portable/GCC/ARM7_AT91FR40008/portISR.c \
|
||||
serial/serialISR.c
|
||||
|
||||
#
|
||||
# Define all object files.
|
||||
#
|
||||
ARM_OBJ = $(ARM_SRC:.c=.o)
|
||||
THUMB_OBJ = $(THUMB_SRC:.c=.o)
|
||||
|
||||
rtosdemo.hex : rtosdemo.elf
|
||||
$(OBJCOPY) rtosdemo.elf -O ihex rtosdemo.hex
|
||||
|
||||
rtosdemo.elf : $(ARM_OBJ) $(THUMB_OBJ) $(CRT0) Makefile
|
||||
$(CC) $(CFLAGS) $(ARM_OBJ) $(THUMB_OBJ) -nostartfiles $(CRT0) $(LINKER_FLAGS)
|
||||
|
||||
$(THUMB_OBJ) : %.o : %.c $(LDSCRIPT) Makefile
|
||||
$(CC) -c $(THUMB_FLAGS) $(CFLAGS) $< -o $@
|
||||
|
||||
$(ARM_OBJ) : %.o : %.c $(LDSCRIPT) Makefile
|
||||
$(CC) -c $(CFLAGS) $< -o $@
|
||||
|
||||
clean :
|
||||
touch Makefile
|
||||
|
||||
120
Demo/ARM7_AT91FR40008_GCC/ParTest/ParTest.c
Normal file
120
Demo/ARM7_AT91FR40008_GCC/ParTest/ParTest.c
Normal file
@@ -0,0 +1,120 @@
|
||||
/*
|
||||
FreeRTOS V4.0.1 - Copyright (C) 2003-2006 Richard Barry.
|
||||
|
||||
This file is part of the FreeRTOS distribution.
|
||||
|
||||
FreeRTOS 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 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
FreeRTOS 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 FreeRTOS; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
A special exception to the GPL can be applied should you wish to distribute
|
||||
a combined work that includes FreeRTOS, without being obliged to provide
|
||||
the source code for any proprietary components. See the licensing section
|
||||
of http://www.FreeRTOS.org for full details of how and when the exception
|
||||
can be applied.
|
||||
|
||||
***************************************************************************
|
||||
See http://www.FreeRTOS.org for documentation, latest information, license
|
||||
and contact details. Please ensure to read the configuration and relevant
|
||||
port sections of the online documentation.
|
||||
***************************************************************************
|
||||
*/
|
||||
|
||||
/* Scheduler includes. */
|
||||
#include "FreeRTOS.h"
|
||||
#include "portable.h"
|
||||
|
||||
/* Demo app includes. */
|
||||
#include "partest.h"
|
||||
|
||||
/* Hardware specific definitions. */
|
||||
#include "AT91R40008.h"
|
||||
#include "pio.h"
|
||||
#include "aic.h"
|
||||
|
||||
#define partstNUM_LEDS ( 8 )
|
||||
#define partstALL_OUTPUTS_OFF ( ( unsigned portLONG ) ~(0xFFFFFFFF << partstNUM_LEDS) )
|
||||
|
||||
static unsigned portLONG ulLEDReg;
|
||||
|
||||
/*-----------------------------------------------------------
|
||||
* Simple parallel port IO routines.
|
||||
*-----------------------------------------------------------*/
|
||||
|
||||
static void SetLeds (unsigned int leds)
|
||||
{
|
||||
unsigned portLONG ulPIOSetReg, ulPIOClearReg;
|
||||
|
||||
/* LEDs are grouped in different port bits: P3-P6 and P16-P19.
|
||||
A port bit set to '0' turns an LED on, '1' turns it off. */
|
||||
|
||||
ulPIOSetReg = ( (leds & 0xF) << 16 ) | ( (leds & 0xF0) >> 1 );
|
||||
ulPIOClearReg = (~ulPIOSetReg) & 0x000F0078;
|
||||
|
||||
AT91C_BASE_PIO->PIO_SODR = ulPIOSetReg;
|
||||
AT91C_BASE_PIO->PIO_CODR = ulPIOClearReg;
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
void vParTestInitialise( void )
|
||||
{
|
||||
/* This is performed from main() as the io bits are shared with other setup
|
||||
functions. Ensure the outputs are off to start. */
|
||||
ulLEDReg = partstALL_OUTPUTS_OFF;
|
||||
|
||||
/* Enable clock to PIO... */
|
||||
AT91C_BASE_PS->PS_PCER = AT91C_PS_PIO;
|
||||
|
||||
/* Enable all 8 LEDs and the four switches to be controlled by PIO... */
|
||||
AT91C_BASE_PIO->PIO_PER = P3 | P4 | P5 | P6 | P16 | P17 | P18 | P19 | P1 | P2 | P9 | P12;
|
||||
|
||||
/* Configure all LED PIO lines for output... */
|
||||
AT91C_BASE_PIO->PIO_OER = P3 | P4 | P5 | P6 | P16 | P17 | P18 | P19;
|
||||
|
||||
/* Configure all switch PIO lines for input... */
|
||||
AT91C_BASE_PIO->PIO_ODR = P1 | P2 | P9 | P12;
|
||||
|
||||
/* Set initial state of LEDs. */
|
||||
SetLeds( ulLEDReg );
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
void vParTestSetLED( unsigned portBASE_TYPE uxLED, signed portBASE_TYPE xValue )
|
||||
{
|
||||
/* Switch an LED on or off as requested. */
|
||||
if (uxLED < partstNUM_LEDS)
|
||||
{
|
||||
if( xValue )
|
||||
{
|
||||
ulLEDReg &= ~(1 << uxLED);
|
||||
}
|
||||
else
|
||||
{
|
||||
ulLEDReg |= (1 << uxLED);
|
||||
}
|
||||
|
||||
SetLeds( ulLEDReg );
|
||||
}
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
void vParTestToggleLED( unsigned portBASE_TYPE uxLED )
|
||||
{
|
||||
/* Toggle the state of the requested LED. */
|
||||
if (uxLED < partstNUM_LEDS)
|
||||
{
|
||||
ulLEDReg ^= ( 1 << uxLED );
|
||||
SetLeds( ulLEDReg );
|
||||
}
|
||||
}
|
||||
|
||||
81
Demo/ARM7_AT91FR40008_GCC/aic.h
Normal file
81
Demo/ARM7_AT91FR40008_GCC/aic.h
Normal file
@@ -0,0 +1,81 @@
|
||||
//*----------------------------------------------------------------------------
|
||||
//* ATMEL Microcontroller Software Support - ROUSSET -
|
||||
//*----------------------------------------------------------------------------
|
||||
//* The software is delivered "AS IS" without warranty or condition of any
|
||||
//* kind, either express, implied or statutory. This includes without
|
||||
//* limitation any warranty or condition with respect to merchantability or
|
||||
//* fitness for any particular purpose, or against the infringements of
|
||||
//* intellectual property rights of others.
|
||||
//*----------------------------------------------------------------------------
|
||||
//* File Name : aic.h
|
||||
//* Object : Advanced Interrupt Controller Definition File.
|
||||
//*
|
||||
//* 1.0 01/04/00 JCZ : Creation
|
||||
//*----------------------------------------------------------------------------
|
||||
|
||||
#ifndef aic_h
|
||||
#define aic_h
|
||||
|
||||
//#include "periph/stdc/std_c.h"
|
||||
|
||||
/*-----------------------------------------*/
|
||||
/* AIC User Interface Structure Definition */
|
||||
/*-----------------------------------------*/
|
||||
|
||||
typedef struct
|
||||
{
|
||||
at91_reg AIC_SMR[32] ; /* Source Mode Register */
|
||||
at91_reg AIC_SVR[32] ; /* Source Vector Register */
|
||||
at91_reg AIC_IVR ; /* IRQ Vector Register */
|
||||
at91_reg AIC_FVR ; /* FIQ Vector Register */
|
||||
at91_reg AIC_ISR ; /* Interrupt Status Register */
|
||||
at91_reg AIC_IPR ; /* Interrupt Pending Register */
|
||||
at91_reg AIC_IMR ; /* Interrupt Mask Register */
|
||||
at91_reg AIC_CISR ; /* Core Interrupt Status Register */
|
||||
at91_reg reserved0 ;
|
||||
at91_reg reserved1 ;
|
||||
at91_reg AIC_IECR ; /* Interrupt Enable Command Register */
|
||||
at91_reg AIC_IDCR ; /* Interrupt Disable Command Register */
|
||||
at91_reg AIC_ICCR ; /* Interrupt Clear Command Register */
|
||||
at91_reg AIC_ISCR ; /* Interrupt Set Command Register */
|
||||
at91_reg AIC_EOICR ; /* End of Interrupt Command Register */
|
||||
at91_reg AIC_SPU ; /* Spurious Vector Register */
|
||||
} StructAIC ;
|
||||
|
||||
/*--------------------------------------------*/
|
||||
/* AIC_SMR[]: Interrupt Source Mode Registers */
|
||||
/*--------------------------------------------*/
|
||||
|
||||
#define AIC_PRIOR 0x07 /* Priority */
|
||||
|
||||
#define AIC_SRCTYPE 0x60 /* Source Type Definition */
|
||||
|
||||
/* Internal Interrupts */
|
||||
#define AIC_SRCTYPE_INT_LEVEL_SENSITIVE 0x00 /* Level Sensitive */
|
||||
#define AIC_SRCTYPE_INT_EDGE_TRIGGERED 0x20 /* Edge Triggered */
|
||||
|
||||
/* External Interrupts */
|
||||
#define AIC_SRCTYPE_EXT_LOW_LEVEL 0x00 /* Low Level */
|
||||
#define AIC_SRCTYPE_EXT_NEGATIVE_EDGE 0x20 /* Negative Edge */
|
||||
#define AIC_SRCTYPE_EXT_HIGH_LEVEL 0x40 /* High Level */
|
||||
#define AIC_SRCTYPE_EXT_POSITIVE_EDGE 0x60 /* Positive Edge */
|
||||
|
||||
/*------------------------------------*/
|
||||
/* AIC_ISR: Interrupt Status Register */
|
||||
/*------------------------------------*/
|
||||
|
||||
#define AIC_IRQID 0x1F /* Current source interrupt */
|
||||
|
||||
/*------------------------------------------*/
|
||||
/* AIC_CISR: Interrupt Core Status Register */
|
||||
/*------------------------------------------*/
|
||||
|
||||
#define AIC_NFIQ 0x01 /* Core FIQ Status */
|
||||
#define AIC_NIRQ 0x02 /* Core IRQ Status */
|
||||
|
||||
/*-------------------------------*/
|
||||
/* Advanced Interrupt Controller */
|
||||
/*-------------------------------*/
|
||||
#define AIC_BASE ((StructAIC *)0xFFFFF000)
|
||||
|
||||
#endif /* aic_h */
|
||||
48
Demo/ARM7_AT91FR40008_GCC/atmel-ram.ld
Normal file
48
Demo/ARM7_AT91FR40008_GCC/atmel-ram.ld
Normal file
@@ -0,0 +1,48 @@
|
||||
MEMORY
|
||||
{
|
||||
ram : ORIGIN = 0x00000000, LENGTH = 256K
|
||||
}
|
||||
|
||||
__stack_end__ = 0x00000000 + 256K - 4;
|
||||
|
||||
SECTIONS
|
||||
{
|
||||
. = 0;
|
||||
startup : { *(.startup)} >ram
|
||||
|
||||
prog :
|
||||
{
|
||||
*(.text)
|
||||
*(.rodata)
|
||||
*(.rodata*)
|
||||
*(.glue_7)
|
||||
*(.glue_7t)
|
||||
} >ram
|
||||
|
||||
__end_of_text__ = .;
|
||||
|
||||
.data :
|
||||
{
|
||||
__data_beg__ = .;
|
||||
__data_beg_src__ = __end_of_text__;
|
||||
*(.data)
|
||||
__data_end__ = .;
|
||||
} >ram
|
||||
|
||||
.bss :
|
||||
{
|
||||
__bss_beg__ = .;
|
||||
*(.bss)
|
||||
} >ram
|
||||
|
||||
/* Align here to ensure that the .bss section occupies space up to
|
||||
_end. Align after .bss to ensure correct alignment even if the
|
||||
.bss section disappears because there are no input sections. */
|
||||
. = ALIGN(32 / 8);
|
||||
}
|
||||
. = ALIGN(32 / 8);
|
||||
_end = .;
|
||||
_bss_end__ = . ; __bss_end__ = . ; __end__ = . ;
|
||||
PROVIDE (end = .);
|
||||
|
||||
|
||||
49
Demo/ARM7_AT91FR40008_GCC/atmel-rom.ld
Normal file
49
Demo/ARM7_AT91FR40008_GCC/atmel-rom.ld
Normal file
@@ -0,0 +1,49 @@
|
||||
MEMORY
|
||||
{
|
||||
flash : ORIGIN = 0x00000000, LENGTH = 2048K
|
||||
ram : ORIGIN = 0x00300000, LENGTH = 256K
|
||||
}
|
||||
|
||||
__stack_end__ = 0x00300000 + 256K - 4;
|
||||
|
||||
SECTIONS
|
||||
{
|
||||
. = 0;
|
||||
startup : { *(.startup)} >flash
|
||||
|
||||
prog :
|
||||
{
|
||||
*(.text)
|
||||
*(.rodata)
|
||||
*(.rodata*)
|
||||
*(.glue_7)
|
||||
*(.glue_7t)
|
||||
} >flash
|
||||
|
||||
__end_of_text__ = .;
|
||||
|
||||
.data :
|
||||
{
|
||||
__data_beg__ = .;
|
||||
__data_beg_src__ = __end_of_text__;
|
||||
*(.data)
|
||||
__data_end__ = .;
|
||||
} >ram AT>flash
|
||||
|
||||
.bss :
|
||||
{
|
||||
__bss_beg__ = .;
|
||||
*(.bss)
|
||||
} >ram
|
||||
|
||||
/* Align here to ensure that the .bss section occupies space up to
|
||||
_end. Align after .bss to ensure correct alignment even if the
|
||||
.bss section disappears because there are no input sections. */
|
||||
. = ALIGN(32 / 8);
|
||||
}
|
||||
. = ALIGN(32 / 8);
|
||||
_end = .;
|
||||
_bss_end__ = . ; __bss_end__ = . ; __end__ = . ;
|
||||
PROVIDE (end = .);
|
||||
|
||||
|
||||
157
Demo/ARM7_AT91FR40008_GCC/boot.s
Normal file
157
Demo/ARM7_AT91FR40008_GCC/boot.s
Normal file
@@ -0,0 +1,157 @@
|
||||
/* Sample initialization file */
|
||||
|
||||
.extern main
|
||||
.extern exit
|
||||
|
||||
.text
|
||||
.code 32
|
||||
|
||||
|
||||
.align 0
|
||||
|
||||
.extern __bss_beg__
|
||||
.extern __bss_end__
|
||||
.extern __stack_end__
|
||||
.extern __data_beg__
|
||||
.extern __data_end__
|
||||
.extern __data+beg_src__
|
||||
|
||||
.global start
|
||||
.global endless_loop
|
||||
|
||||
/* Stack Sizes */
|
||||
.set UND_STACK_SIZE, 0x00000004
|
||||
.set ABT_STACK_SIZE, 0x00000004
|
||||
.set FIQ_STACK_SIZE, 0x00000004
|
||||
.set IRQ_STACK_SIZE, 0X00000400
|
||||
.set SVC_STACK_SIZE, 0x00000400
|
||||
|
||||
/* Standard definitions of Mode bits and Interrupt (I & F) flags in PSRs */
|
||||
.set MODE_USR, 0x10 /* User Mode */
|
||||
.set MODE_FIQ, 0x11 /* FIQ Mode */
|
||||
.set MODE_IRQ, 0x12 /* IRQ Mode */
|
||||
.set MODE_SVC, 0x13 /* Supervisor Mode */
|
||||
.set MODE_ABT, 0x17 /* Abort Mode */
|
||||
.set MODE_UND, 0x1B /* Undefined Mode */
|
||||
.set MODE_SYS, 0x1F /* System Mode */
|
||||
|
||||
.equ I_BIT, 0x80 /* when I bit is set, IRQ is disabled */
|
||||
.equ F_BIT, 0x40 /* when F bit is set, FIQ is disabled */
|
||||
|
||||
|
||||
start:
|
||||
_start:
|
||||
_mainCRTStartup:
|
||||
|
||||
/* Setup a stack for each mode - note that this only sets up a usable stack
|
||||
for system/user, SWI and IRQ modes. Also each mode is setup with
|
||||
interrupts initially disabled. */
|
||||
ldr r0, .LC6
|
||||
msr CPSR_c, #MODE_UND|I_BIT|F_BIT /* Undefined Instruction Mode */
|
||||
mov sp, r0
|
||||
sub r0, r0, #UND_STACK_SIZE
|
||||
msr CPSR_c, #MODE_ABT|I_BIT|F_BIT /* Abort Mode */
|
||||
mov sp, r0
|
||||
sub r0, r0, #ABT_STACK_SIZE
|
||||
msr CPSR_c, #MODE_FIQ|I_BIT|F_BIT /* FIQ Mode */
|
||||
mov sp, r0
|
||||
sub r0, r0, #FIQ_STACK_SIZE
|
||||
msr CPSR_c, #MODE_IRQ|I_BIT|F_BIT /* IRQ Mode */
|
||||
mov sp, r0
|
||||
sub r0, r0, #IRQ_STACK_SIZE
|
||||
msr CPSR_c, #MODE_SVC|I_BIT|F_BIT /* Supervisor Mode */
|
||||
mov sp, r0
|
||||
sub r0, r0, #SVC_STACK_SIZE
|
||||
msr CPSR_c, #MODE_SYS|I_BIT|F_BIT /* System Mode */
|
||||
mov sp, r0
|
||||
|
||||
/* We want to start in supervisor mode. Operation will switch to system
|
||||
mode when the first task starts. */
|
||||
msr CPSR_c, #MODE_SVC|I_BIT|F_BIT
|
||||
|
||||
/* Clear BSS. */
|
||||
|
||||
mov a2, #0 /* Fill value */
|
||||
mov fp, a2 /* Null frame pointer */
|
||||
mov r7, a2 /* Null frame pointer for Thumb */
|
||||
|
||||
ldr r1, .LC1 /* Start of memory block */
|
||||
ldr r3, .LC2 /* End of memory block */
|
||||
subs r3, r3, r1 /* Length of block */
|
||||
beq .end_clear_loop
|
||||
mov r2, #0
|
||||
|
||||
.clear_loop:
|
||||
strb r2, [r1], #1
|
||||
subs r3, r3, #1
|
||||
bgt .clear_loop
|
||||
|
||||
.end_clear_loop:
|
||||
|
||||
/* Initialise data. */
|
||||
|
||||
ldr r1, .LC3 /* Start of memory block */
|
||||
ldr r2, .LC4 /* End of memory block */
|
||||
ldr r3, .LC5
|
||||
subs r3, r3, r1 /* Length of block */
|
||||
beq .end_set_loop
|
||||
|
||||
.set_loop:
|
||||
ldrb r4, [r2], #1
|
||||
strb r4, [r1], #1
|
||||
subs r3, r3, #1
|
||||
bgt .set_loop
|
||||
|
||||
.end_set_loop:
|
||||
|
||||
mov r0, #0 /* no arguments */
|
||||
mov r1, #0 /* no argv either */
|
||||
|
||||
bl main
|
||||
|
||||
endless_loop:
|
||||
b endless_loop
|
||||
|
||||
|
||||
.align 0
|
||||
|
||||
.LC1:
|
||||
.word __bss_beg__
|
||||
.LC2:
|
||||
.word __bss_end__
|
||||
.LC3:
|
||||
.word __data_beg__
|
||||
.LC4:
|
||||
.word __data_beg_src__
|
||||
.LC5:
|
||||
.word __data_end__
|
||||
.LC6:
|
||||
.word __stack_end__
|
||||
|
||||
|
||||
/* Setup vector table. Note that undf, pabt, dabt, fiq just execute
|
||||
a null loop. */
|
||||
|
||||
.section .startup,"ax"
|
||||
.code 32
|
||||
.align 0
|
||||
|
||||
b _start /* reset - _start */
|
||||
ldr pc, _undf /* undefined - _undf */
|
||||
ldr pc, _swi /* SWI - _swi */
|
||||
ldr pc, _pabt /* program abort - _pabt */
|
||||
ldr pc, _dabt /* data abort - _dabt */
|
||||
nop /* reserved */
|
||||
ldr pc, [pc,#-0xF20] /* IRQ - read the AIC */
|
||||
ldr pc, _fiq /* FIQ - _fiq */
|
||||
|
||||
_undf: .word __undf /* undefined */
|
||||
_swi: .word vPortYieldProcessor /* SWI */
|
||||
_pabt: .word __pabt /* program abort */
|
||||
_dabt: .word __dabt /* data abort */
|
||||
_fiq: .word __fiq /* FIQ */
|
||||
|
||||
__undf: b . /* undefined */
|
||||
__pabt: b . /* program abort */
|
||||
__dabt: b . /* data abort */
|
||||
__fiq: b . /* FIQ */
|
||||
121
Demo/ARM7_AT91FR40008_GCC/ebi.h
Normal file
121
Demo/ARM7_AT91FR40008_GCC/ebi.h
Normal file
@@ -0,0 +1,121 @@
|
||||
//*-----------------------------------------------------------------------------
|
||||
//* ATMEL Microcontroller Software Support - ROUSSET -
|
||||
//*-----------------------------------------------------------------------------
|
||||
//* The software is delivered "AS IS" without warranty or condition of any
|
||||
//* kind, either express, implied or statutory. This includes without
|
||||
//* limitation any warranty or condition with respect to merchantability or
|
||||
//* fitness for any particular purpose, or against the infringements of
|
||||
//* intellectual property rights of others.
|
||||
//*-----------------------------------------------------------------------------
|
||||
//* File Name : ebi.h
|
||||
//* Object : External Bus Interface Definition File
|
||||
//* Translator : ARM Software Development Toolkit V2.11a
|
||||
//*
|
||||
//* 1.0 03/11/97 JCZ : Creation
|
||||
//* 2.0 21/10/98 JCZ : Clean up
|
||||
//*-----------------------------------------------------------------------------
|
||||
|
||||
#ifndef ebi_h
|
||||
#define ebi_h
|
||||
|
||||
/*----------------------------------------*/
|
||||
/* Memory Controller Interface Definition */
|
||||
/*----------------------------------------*/
|
||||
|
||||
typedef struct
|
||||
{
|
||||
at91_reg EBI_CSR[8] ; /* Chip Select Register */
|
||||
at91_reg EBI_RCR ; /* Remap Control Register */
|
||||
at91_reg EBI_MCR ; /* Memory Control Register */
|
||||
} StructEBI ;
|
||||
|
||||
/*-----------------------*/
|
||||
/* Chip Select Registers */
|
||||
/*-----------------------*/
|
||||
|
||||
/* Data Bus Width */
|
||||
#define DataBus16 (1<<0)
|
||||
#define DataBus8 (2<<0)
|
||||
#define DBW (3<<0)
|
||||
|
||||
/* Number of Wait States */
|
||||
#define B_NWS 2
|
||||
#define WaitState1 (0<<B_NWS)
|
||||
#define WaitState2 (1<<B_NWS)
|
||||
#define WaitState3 (2<<B_NWS)
|
||||
#define WaitState4 (3<<B_NWS)
|
||||
#define WaitState5 (4<<B_NWS)
|
||||
#define WaitState6 (5<<B_NWS)
|
||||
#define WaitState7 (6<<B_NWS)
|
||||
#define WaitState8 (7<<B_NWS)
|
||||
#define NWS (7<<B_NWS)
|
||||
|
||||
/* Wait State Enable */
|
||||
#define WaitStateDisable (0<<5)
|
||||
#define WaitStateEnable (1<<5)
|
||||
#define WSE (1<<5)
|
||||
|
||||
/* Page size */
|
||||
#define PageSize1M (0<<7)
|
||||
#define PageSize4M (1<<7)
|
||||
#define PageSize16M (2<<7)
|
||||
#define PageSize64M (3<<7)
|
||||
#define PAGES (3<<7)
|
||||
|
||||
/* Number of Data Float Output Time Clock Cycle */
|
||||
#define B_TDF 9
|
||||
#define tDF_0cycle (0<<B_TDF)
|
||||
#define tDF_1cycle (1<<B_TDF)
|
||||
#define tDF_2cycle (2<<B_TDF)
|
||||
#define tDF_3cycle (3<<B_TDF)
|
||||
#define tDF_4cycle (4<<B_TDF)
|
||||
#define tDF_5cycle (5<<B_TDF)
|
||||
#define tDF_6cycle (6<<B_TDF)
|
||||
#define tDF_7cycle (7<<B_TDF)
|
||||
#define TDF (7<<B_TDF)
|
||||
|
||||
/* Byte Access Type */
|
||||
#define ByteWriteAccessType (0<<12)
|
||||
#define ByteSelectAccessType (1<<12)
|
||||
#define BAT 1<<12)
|
||||
|
||||
/* Chip Select Enable */
|
||||
#define CSEnable (1<<13)
|
||||
#define CSDisable (0<<13)
|
||||
#define CSE (1<<13)
|
||||
|
||||
#define BA ((u_int)(0xFFF)<<20)
|
||||
|
||||
/*-------------------------*/
|
||||
/* Memory Control Register */
|
||||
/*-------------------------*/
|
||||
|
||||
/* Address Line Enable */
|
||||
#define ALE (7<<0)
|
||||
#define BankSize16M (0<<0)
|
||||
#define BankSize8M (4<<0)
|
||||
#define BankSize4M (5<<0)
|
||||
#define BankSize2M (6<<0)
|
||||
#define BankSize1M (7<<0)
|
||||
|
||||
/* Data Read Protocol */
|
||||
#define StandardReadProtocol (0<<4)
|
||||
#define EarlyReadProtocol (1<<4)
|
||||
#define DRP (1<<4)
|
||||
|
||||
/*------------------------*/
|
||||
/* Remap Control Register */
|
||||
/*------------------------*/
|
||||
|
||||
#define RCB (1<<0)
|
||||
|
||||
/*--------------------------------*/
|
||||
/* Device Dependancies Definition */
|
||||
/*--------------------------------*/
|
||||
|
||||
#ifdef AT91M40400
|
||||
/* External Bus Interface User Interface BAse Address */
|
||||
#define EBI_BASE ((StructEBI *) 0xFFE00000)
|
||||
#endif
|
||||
|
||||
#endif /* ebi_h */
|
||||
469
Demo/ARM7_AT91FR40008_GCC/main.c
Normal file
469
Demo/ARM7_AT91FR40008_GCC/main.c
Normal file
@@ -0,0 +1,469 @@
|
||||
/*
|
||||
FreeRTOS V4.0.1 - Copyright (C) 2003-2006 Richard Barry.
|
||||
|
||||
This file is part of the FreeRTOS distribution.
|
||||
|
||||
FreeRTOS 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 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
FreeRTOS 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 FreeRTOS; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
A special exception to the GPL can be applied should you wish to distribute
|
||||
a combined work that includes FreeRTOS, without being obliged to provide
|
||||
the source code for any proprietary components. See the licensing section
|
||||
of http://www.FreeRTOS.org for full details of how and when the exception
|
||||
can be applied.
|
||||
|
||||
***************************************************************************
|
||||
See http://www.FreeRTOS.org for documentation, latest information, license
|
||||
and contact details. Please ensure to read the configuration and relevant
|
||||
port sections of the online documentation.
|
||||
***************************************************************************
|
||||
*/
|
||||
|
||||
/*
|
||||
NOTE : Tasks run in system mode and the scheduler runs in Supervisor mode.
|
||||
The processor MUST be in supervisor mode when vTaskStartScheduler is
|
||||
called. The demo applications included in the FreeRTOS.org download switch
|
||||
to supervisor mode prior to main being called. If you are not using one of
|
||||
these demo application projects then ensure Supervisor mode is used.
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
* Creates all the demo application tasks, then starts the scheduler. The WEB
|
||||
* documentation provides more details of the demo application tasks.
|
||||
*
|
||||
* Main.c also creates a task called "Check". This only executes every three
|
||||
* seconds but has the highest priority so is guaranteed to get processor time.
|
||||
* Its main function is to check that all the other tasks are still operational.
|
||||
* Each task (other than the "flash" tasks) maintains a unique count that is
|
||||
* incremented each time the task successfully completes its function. Should
|
||||
* any error occur within such a task the count is permanently halted. The
|
||||
* check task inspects the count of each task to ensure it has changed since
|
||||
* the last time the check task executed. If all the count variables have
|
||||
* changed all the tasks are still executing error free, and the check task
|
||||
* toggles the onboard LED. Should any task contain an error at any time
|
||||
* the LED toggle rate will change from 3 seconds to 500ms.
|
||||
*
|
||||
* To check the operation of the memory allocator the check task also
|
||||
* dynamically creates a task before delaying, and deletes it again when it
|
||||
* wakes. If memory cannot be allocated for the new task the call to xTaskCreate
|
||||
* will fail and an error is signalled. The dynamically created task itself
|
||||
* allocates and frees memory just to give the allocator a bit more exercise.
|
||||
*
|
||||
*/
|
||||
|
||||
/* Standard includes. */
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
/* Scheduler includes. */
|
||||
#include "FreeRTOS.h"
|
||||
#include "task.h"
|
||||
|
||||
/* Demo application includes. */
|
||||
#include "partest.h"
|
||||
#include "flash.h"
|
||||
#include "integer.h"
|
||||
#include "PollQ.h"
|
||||
#include "comtest2.h"
|
||||
#include "semtest.h"
|
||||
#include "flop.h"
|
||||
#include "dynamic.h"
|
||||
#include "BlockQ.h"
|
||||
#include "serial.h"
|
||||
|
||||
/* Hardware specific definitions. */
|
||||
#include "aic.h"
|
||||
#include "ebi.h"
|
||||
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
/* Constants for the ComTest tasks. */
|
||||
#define mainCOM_TEST_BAUD_RATE ( ( unsigned portLONG ) 115200 )
|
||||
#define mainCOM_TEST_LED ( 5 )
|
||||
|
||||
/* Priorities for the demo application tasks. */
|
||||
#define mainLED_TASK_PRIORITY ( tskIDLE_PRIORITY + 3 )
|
||||
#define mainCOM_TEST_PRIORITY ( tskIDLE_PRIORITY + 2 )
|
||||
#define mainQUEUE_POLL_PRIORITY ( tskIDLE_PRIORITY + 2 )
|
||||
#define mainCHECK_TASK_PRIORITY ( tskIDLE_PRIORITY + 4 )
|
||||
#define mainSEM_TEST_PRIORITY ( tskIDLE_PRIORITY + 1 )
|
||||
#define mainBLOCK_Q_PRIORITY ( tskIDLE_PRIORITY + 2 )
|
||||
|
||||
/* The rate at which the on board LED will toggle when there is/is not an
|
||||
error. */
|
||||
#define mainNO_ERROR_FLASH_PERIOD ( ( portTickType ) 3000 / portTICK_RATE_MS )
|
||||
#define mainERROR_FLASH_PERIOD ( ( portTickType ) 500 / portTICK_RATE_MS )
|
||||
#define mainON_BOARD_LED_BIT ( ( unsigned portLONG ) 7 )
|
||||
|
||||
/* Constants used by the vMemCheckTask() task. */
|
||||
#define mainCOUNT_INITIAL_VALUE ( ( unsigned portLONG ) 0 )
|
||||
#define mainNO_TASK ( 0 )
|
||||
|
||||
/* The size of the memory blocks allocated by the vMemCheckTask() task. */
|
||||
#define mainMEM_CHECK_SIZE_1 ( ( size_t ) 51 )
|
||||
#define mainMEM_CHECK_SIZE_2 ( ( size_t ) 52 )
|
||||
#define mainMEM_CHECK_SIZE_3 ( ( size_t ) 151 )
|
||||
|
||||
#define MAX_WAIT_STATES 8
|
||||
static const unsigned portLONG ululCSRWaitValues[ MAX_WAIT_STATES + 1 ] =
|
||||
{
|
||||
WaitState1,/* There is no "zero wait state" value, so use one wait state */
|
||||
WaitState1,
|
||||
WaitState2,
|
||||
WaitState3,
|
||||
WaitState4,
|
||||
WaitState5,
|
||||
WaitState6,
|
||||
WaitState7,
|
||||
WaitState8
|
||||
};
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
/*
|
||||
* Checks that all the demo application tasks are still executing without error
|
||||
* - as described at the top of the file.
|
||||
*/
|
||||
static portLONG prvCheckOtherTasksAreStillRunning( unsigned portLONG ulMemCheckTaskCount );
|
||||
|
||||
/*
|
||||
* The task that executes at the highest priority and calls
|
||||
* prvCheckOtherTasksAreStillRunning(). See the description at the top
|
||||
* of the file.
|
||||
*/
|
||||
static void vErrorChecks( void *pvParameters );
|
||||
|
||||
/*
|
||||
* Dynamically created and deleted during each cycle of the vErrorChecks()
|
||||
* task. This is done to check the operation of the memory allocator.
|
||||
* See the top of vErrorChecks for more details.
|
||||
*/
|
||||
static void vMemCheckTask( void *pvParameters );
|
||||
|
||||
/*
|
||||
* Configure the processor for use with the Olimex demo board. This includes
|
||||
* setup for the I/O, system clock, and access timings.
|
||||
*/
|
||||
static void prvSetupHardware( void );
|
||||
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
/*
|
||||
* Starts all the other tasks, then starts the scheduler.
|
||||
*/
|
||||
int main( void )
|
||||
{
|
||||
/* Setup the hardware for use with the Olimex demo board. */
|
||||
prvSetupHardware();
|
||||
|
||||
/* Start the demo/test application tasks. */
|
||||
vStartIntegerMathTasks( tskIDLE_PRIORITY );
|
||||
vAltStartComTestTasks( mainCOM_TEST_PRIORITY, mainCOM_TEST_BAUD_RATE, mainCOM_TEST_LED );
|
||||
vStartLEDFlashTasks( mainLED_TASK_PRIORITY );
|
||||
vStartPolledQueueTasks( mainQUEUE_POLL_PRIORITY );
|
||||
vStartMathTasks( tskIDLE_PRIORITY );
|
||||
vStartSemaphoreTasks( mainSEM_TEST_PRIORITY );
|
||||
vStartDynamicPriorityTasks();
|
||||
vStartBlockingQueueTasks( mainBLOCK_Q_PRIORITY );
|
||||
|
||||
/* Start the check task - which is defined in this file. */
|
||||
xTaskCreate( vErrorChecks, ( signed portCHAR * ) "Check", configMINIMAL_STACK_SIZE, NULL, mainCHECK_TASK_PRIORITY, NULL );
|
||||
|
||||
/* Now all the tasks have been started - start the scheduler.
|
||||
|
||||
NOTE : Tasks run in system mode and the scheduler runs in Supervisor mode.
|
||||
The processor MUST be in supervisor mode when vTaskStartScheduler is
|
||||
called. The demo applications included in the FreeRTOS.org download switch
|
||||
to supervisor mode prior to main being called. If you are not using one of
|
||||
these demo application projects then ensure Supervisor mode is used here. */
|
||||
vTaskStartScheduler();
|
||||
|
||||
/* Should never reach here! */
|
||||
return 0;
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
static void vErrorChecks( void *pvParameters )
|
||||
{
|
||||
portTickType xDelayPeriod = mainNO_ERROR_FLASH_PERIOD;
|
||||
unsigned portLONG ulMemCheckTaskRunningCount;
|
||||
xTaskHandle xCreatedTask;
|
||||
|
||||
/* Cycle for ever, delaying then checking all the other tasks are still
|
||||
operating without error. If an error is detected then the delay period
|
||||
is decreased from mainNO_ERROR_FLASH_PERIOD to mainERROR_FLASH_PERIOD so
|
||||
the on board LED flash rate will increase.
|
||||
|
||||
In addition to the standard tests the memory allocator is tested through
|
||||
the dynamic creation and deletion of a task each cycle. Each time the
|
||||
task is created memory must be allocated for its stack. When the task is
|
||||
deleted this memory is returned to the heap. If the task cannot be created
|
||||
then it is likely that the memory allocation failed. */
|
||||
|
||||
for( ;; )
|
||||
{
|
||||
/* Reset xCreatedTask. This is modified by the task about to be
|
||||
created so we can tell if it is executing correctly or not. */
|
||||
xCreatedTask = mainNO_TASK;
|
||||
|
||||
/* Dynamically create a task - passing ulMemCheckTaskRunningCount as a
|
||||
parameter. */
|
||||
ulMemCheckTaskRunningCount = mainCOUNT_INITIAL_VALUE;
|
||||
if( xTaskCreate( vMemCheckTask, ( signed portCHAR * ) "MEM_CHECK", configMINIMAL_STACK_SIZE, ( void * ) &ulMemCheckTaskRunningCount, tskIDLE_PRIORITY, &xCreatedTask ) != pdPASS )
|
||||
{
|
||||
/* Could not create the task - we have probably run out of heap. */
|
||||
xDelayPeriod = mainERROR_FLASH_PERIOD;
|
||||
}
|
||||
|
||||
/* Delay until it is time to execute again. */
|
||||
vTaskDelay( xDelayPeriod );
|
||||
|
||||
/* Delete the dynamically created task. */
|
||||
if( xCreatedTask != mainNO_TASK )
|
||||
{
|
||||
vTaskDelete( xCreatedTask );
|
||||
}
|
||||
|
||||
/* Check all the standard demo application tasks are executing without
|
||||
error. ulMemCheckTaskRunningCount is checked to ensure it was
|
||||
modified by the task just deleted. */
|
||||
if( prvCheckOtherTasksAreStillRunning( ulMemCheckTaskRunningCount ) != pdPASS )
|
||||
{
|
||||
/* An error has been detected in one of the tasks - flash faster. */
|
||||
xDelayPeriod = mainERROR_FLASH_PERIOD;
|
||||
}
|
||||
|
||||
/* The toggle rate of the LED depends on how long this task delays for.
|
||||
An error reduces the delay period and so increases the toggle rate. */
|
||||
vParTestToggleLED( mainON_BOARD_LED_BIT );
|
||||
}
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
static void prvSetupHardware( void )
|
||||
{
|
||||
portLONG lCount;
|
||||
|
||||
#ifdef RUN_FROM_ROM
|
||||
{
|
||||
portFLOAT nsecsPerClockTick;
|
||||
portLONG lNumWaitStates;
|
||||
unsigned portLONG ulCSRWaitValue;
|
||||
|
||||
/* We are compiling to run from ROM (either on-chip or off-chip flash).
|
||||
Leave the RAM/flash mapped the way they are on reset
|
||||
(flash @ 0x00000000, RAM @ 0x00300000), and set up the
|
||||
proper flash wait states (starts out at the maximum number
|
||||
of wait states on reset, so we should be able to reduce it).
|
||||
Most of this code will probably get removed by the compiler
|
||||
if optimization is enabled, since these calculations are
|
||||
based on constants. But the compiler should still produce
|
||||
a correct wait state register value. */
|
||||
nsecsPerClockTick = ( portFLOAT ) 1000000000 / configCPU_CLOCK_HZ;
|
||||
lNumWaitStates = ( portLONG )( ( configFLASH_SPEED_NSEC / nsecsPerClockTick ) + 0.5 ) - 1;
|
||||
|
||||
if( lNumWaitStates < 0 )
|
||||
{
|
||||
lNumWaitStates = 0;
|
||||
}
|
||||
|
||||
if( lNumWaitStates > MAX_WAIT_STATES )
|
||||
{
|
||||
lNumWaitStates = MAX_WAIT_STATES;
|
||||
}
|
||||
|
||||
ulCSRWaitValue = ululCSRWaitValues[ lNumWaitStates ];
|
||||
ulCSRWaitValue = WaitState5;
|
||||
|
||||
AT91C_BASE_EBI->EBI_CSR[ 0 ] = ulCSRWaitValue | DataBus16 | WaitStateEnable
|
||||
| PageSize1M | tDF_0cycle
|
||||
| ByteWriteAccessType | CSEnable
|
||||
| 0x00000000 /* Base Address */;
|
||||
}
|
||||
#else /* else we are compiling to run from on-chip RAM */
|
||||
{
|
||||
/* If compiling to run from RAM, we expect the on-chip RAM to already
|
||||
be mapped at 0x00000000. This is typically done with an initialization
|
||||
script for the JTAG emulator you are using to download and run the
|
||||
demo application. So there is nothing to do here in this case. */
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Disable all interrupts at the AIC level initially... */
|
||||
AT91C_BASE_AIC->AIC_IDCR = 0xFFFFFFFF;
|
||||
|
||||
/* Set all SVR and SMR entries to default values (start with a clean slate)... */
|
||||
for( lCount = 0; lCount < 32; lCount++ )
|
||||
{
|
||||
AT91C_BASE_AIC->AIC_SVR[ lCount ] = (unsigned long) 0;
|
||||
AT91C_BASE_AIC->AIC_SMR[ lCount ] = AIC_SRCTYPE_INT_EDGE_TRIGGERED;
|
||||
}
|
||||
|
||||
/* Disable clocks to all peripherals initially... */
|
||||
AT91C_BASE_PS->PS_PCDR = 0xFFFFFFFF;
|
||||
|
||||
/* Clear all interrupts at the AIC level initially... */
|
||||
AT91C_BASE_AIC->AIC_ICCR = 0xFFFFFFFF;
|
||||
|
||||
/* Perform 8 "End Of Interrupt" cmds to make sure AIC will not Lock out
|
||||
nIRQ */
|
||||
for( lCount = 0; lCount < 8; lCount++ )
|
||||
{
|
||||
AT91C_BASE_AIC->AIC_EOICR = 0;
|
||||
}
|
||||
|
||||
/* Initialise LED outputs. */
|
||||
vParTestInitialise();
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
static portLONG prvCheckOtherTasksAreStillRunning( unsigned portLONG ulMemCheckTaskCount )
|
||||
{
|
||||
portLONG lReturn = ( portLONG ) pdPASS;
|
||||
|
||||
/* Check all the demo tasks (other than the flash tasks) to ensure
|
||||
that they are all still running, and that none of them have detected
|
||||
an error. */
|
||||
|
||||
if( xAreIntegerMathsTaskStillRunning() != pdTRUE )
|
||||
{
|
||||
lReturn = ( portLONG ) pdFAIL;
|
||||
}
|
||||
|
||||
if( xAreComTestTasksStillRunning() != pdTRUE )
|
||||
{
|
||||
lReturn = ( portLONG ) pdFAIL;
|
||||
}
|
||||
|
||||
if( xArePollingQueuesStillRunning() != pdTRUE )
|
||||
{
|
||||
lReturn = ( portLONG ) pdFAIL;
|
||||
}
|
||||
|
||||
if( xAreMathsTaskStillRunning() != pdTRUE )
|
||||
{
|
||||
lReturn = ( portLONG ) pdFAIL;
|
||||
}
|
||||
|
||||
if( xAreSemaphoreTasksStillRunning() != pdTRUE )
|
||||
{
|
||||
lReturn = ( portLONG ) pdFAIL;
|
||||
}
|
||||
|
||||
if( xAreDynamicPriorityTasksStillRunning() != pdTRUE )
|
||||
{
|
||||
lReturn = ( portLONG ) pdFAIL;
|
||||
}
|
||||
|
||||
if( xAreBlockingQueuesStillRunning() != pdTRUE )
|
||||
{
|
||||
lReturn = ( portLONG ) pdFAIL;
|
||||
}
|
||||
|
||||
if( ulMemCheckTaskCount == mainCOUNT_INITIAL_VALUE )
|
||||
{
|
||||
/* The vMemCheckTask did not increment the counter - it must
|
||||
have failed. */
|
||||
lReturn = ( portLONG ) pdFAIL;
|
||||
}
|
||||
|
||||
return lReturn;
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
static void vMemCheckTask( void *pvParameters )
|
||||
{
|
||||
unsigned portLONG *pulMemCheckTaskRunningCounter;
|
||||
void *pvMem1, *pvMem2, *pvMem3;
|
||||
static portLONG lErrorOccurred = pdFALSE;
|
||||
|
||||
/* This task is dynamically created then deleted during each cycle of the
|
||||
vErrorChecks task to check the operation of the memory allocator. Each time
|
||||
the task is created memory is allocated for the stack and TCB. Each time
|
||||
the task is deleted this memory is returned to the heap. This task itself
|
||||
exercises the allocator by allocating and freeing blocks.
|
||||
|
||||
The task executes at the idle priority so does not require a delay.
|
||||
|
||||
pulMemCheckTaskRunningCounter is incremented each cycle to indicate to the
|
||||
vErrorChecks() task that this task is still executing without error. */
|
||||
|
||||
pulMemCheckTaskRunningCounter = ( unsigned portLONG * ) pvParameters;
|
||||
|
||||
for( ;; )
|
||||
{
|
||||
if( lErrorOccurred == pdFALSE )
|
||||
{
|
||||
/* We have never seen an error so increment the counter. */
|
||||
( *pulMemCheckTaskRunningCounter )++;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* There has been an error so reset the counter so the check task
|
||||
can tell that an error occurred. */
|
||||
*pulMemCheckTaskRunningCounter = mainCOUNT_INITIAL_VALUE;
|
||||
}
|
||||
|
||||
/* Allocate some memory - just to give the allocator some extra
|
||||
exercise. This has to be in a critical section to ensure the
|
||||
task does not get deleted while it has memory allocated. */
|
||||
vTaskSuspendAll();
|
||||
{
|
||||
pvMem1 = pvPortMalloc( mainMEM_CHECK_SIZE_1 );
|
||||
if( pvMem1 == NULL )
|
||||
{
|
||||
lErrorOccurred = pdTRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
memset( pvMem1, 0xaa, mainMEM_CHECK_SIZE_1 );
|
||||
vPortFree( pvMem1 );
|
||||
}
|
||||
}
|
||||
xTaskResumeAll();
|
||||
|
||||
/* Again - with a different size block. */
|
||||
vTaskSuspendAll();
|
||||
{
|
||||
pvMem2 = pvPortMalloc( mainMEM_CHECK_SIZE_2 );
|
||||
if( pvMem2 == NULL )
|
||||
{
|
||||
lErrorOccurred = pdTRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
memset( pvMem2, 0xaa, mainMEM_CHECK_SIZE_2 );
|
||||
vPortFree( pvMem2 );
|
||||
}
|
||||
}
|
||||
xTaskResumeAll();
|
||||
|
||||
/* Again - with a different size block. */
|
||||
vTaskSuspendAll();
|
||||
{
|
||||
pvMem3 = pvPortMalloc( mainMEM_CHECK_SIZE_3 );
|
||||
if( pvMem3 == NULL )
|
||||
{
|
||||
lErrorOccurred = pdTRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
memset( pvMem3, 0xaa, mainMEM_CHECK_SIZE_3 );
|
||||
vPortFree( pvMem3 );
|
||||
}
|
||||
}
|
||||
xTaskResumeAll();
|
||||
}
|
||||
}
|
||||
|
||||
149
Demo/ARM7_AT91FR40008_GCC/pio.h
Normal file
149
Demo/ARM7_AT91FR40008_GCC/pio.h
Normal file
@@ -0,0 +1,149 @@
|
||||
//*---------------------------------------------------------------------------
|
||||
//* ATMEL Microcontroller Software Support - ROUSSET -
|
||||
//*---------------------------------------------------------------------------
|
||||
//* The software is delivered "AS IS" without warranty or condition of any
|
||||
//* kind, either express, implied or statutory. This includes without
|
||||
//* limitation any warranty or condition with respect to merchantability or
|
||||
//* fitness for any particular purpose, or against the infringements of
|
||||
//* intellectual property rights of others.
|
||||
//*-----------------------------------------------------------------------------
|
||||
//* File Name : pio.h
|
||||
//* Object : Parallel I/O Definition File
|
||||
//* Translator : ARM Software Development Toolkit V2.11a
|
||||
//*
|
||||
//* 1.0 20/10/97 JCZ : Creation
|
||||
//* 2.0 21/10/98 JCZ : Clean up
|
||||
//*---------------------------------------------------------------------------
|
||||
|
||||
#ifndef pio_h
|
||||
#define pio_h
|
||||
|
||||
/*---------------------------------------------*/
|
||||
/* Parallel I/O Interface Structure Definition */
|
||||
/*---------------------------------------------*/
|
||||
|
||||
typedef struct
|
||||
{
|
||||
at91_reg PIO_PER ; /* PIO Enable Register */
|
||||
at91_reg PIO_PDR ; /* PIO Disable Register */
|
||||
at91_reg PIO_PSR ; /* PIO Status Register */
|
||||
at91_reg Reserved0 ;
|
||||
at91_reg PIO_OER ; /* Output Enable Register */
|
||||
at91_reg PIO_ODR ; /* Output Disable Register */
|
||||
at91_reg PIO_OSR ; /* Output Status Register */
|
||||
at91_reg Reserved1 ;
|
||||
at91_reg PIO_IFER ; /* Input Filter Enable Register */
|
||||
at91_reg PIO_IFDR ; /* Input Filter Disable Register */
|
||||
at91_reg PIO_IFSR ; /* Input Filter Status Register */
|
||||
at91_reg Reserved2 ;
|
||||
at91_reg PIO_SODR ; /* Set Output Data Register */
|
||||
at91_reg PIO_CODR ; /* Clear Output Data Register */
|
||||
at91_reg PIO_ODSR ; /* Output Data Status Register */
|
||||
at91_reg PIO_PDSR ; /* Pin Data Status Register */
|
||||
at91_reg PIO_IER ; /* Interrupt Enable Register */
|
||||
at91_reg PIO_IDR ; /* Interrupt Disable Register */
|
||||
at91_reg PIO_IMR ; /* Interrupt Mask Register */
|
||||
at91_reg PIO_ISR ; /* Interrupt Status Register */
|
||||
} StructPIO ;
|
||||
|
||||
/*-----------------------------*/
|
||||
/* PIO Handler type definition */
|
||||
/*-----------------------------*/
|
||||
|
||||
//typedef void (*TypePIOHandler) ( StructPIO *pio_pt, u_int pio_mask ) ;
|
||||
|
||||
/*--------------------------------*/
|
||||
/* Device Dependancies Definition */
|
||||
/*--------------------------------*/
|
||||
|
||||
/* Number of PIO Controller */
|
||||
#define NB_PIO_CTRL 1
|
||||
/* Base Address */
|
||||
#define PIO_BASE ((StructPIO *) 0xFFFF0000 )
|
||||
/* Number of PIO Lines */
|
||||
#define NB_PIO 32
|
||||
|
||||
/* Parallel I/O Bits Definition */
|
||||
#define P0 (1<<0)
|
||||
#define P1 (1<<1)
|
||||
#define P2 (1<<2)
|
||||
#define P3 (1<<3)
|
||||
#define P4 (1<<4)
|
||||
#define P5 (1<<5)
|
||||
#define P6 (1<<6)
|
||||
#define P7 (1<<7)
|
||||
#define P8 (1<<8)
|
||||
#define P9 (1<<9)
|
||||
#define P10 (1<<10)
|
||||
#define P11 (1<<11)
|
||||
#define P12 (1<<12)
|
||||
#define P13 (1<<13)
|
||||
#define P14 (1<<14)
|
||||
#define P15 (1<<15)
|
||||
#define P16 (1<<16)
|
||||
#define P17 (1<<17)
|
||||
#define P18 (1<<18)
|
||||
#define P19 (1<<19)
|
||||
#define P20 (1<<20)
|
||||
#define P21 (1<<21)
|
||||
#define P22 (1<<22)
|
||||
#define P23 (1<<23)
|
||||
#define P24 (1<<24)
|
||||
#define P25 (1<<25)
|
||||
#define P26 (1<<26)
|
||||
#define P27 (1<<27)
|
||||
#define P28 (1<<28)
|
||||
#define P29 (1<<29)
|
||||
#define P30 (1<<30)
|
||||
#define P31 (1<<31)
|
||||
|
||||
/* PIO Multiplexing Definition */
|
||||
|
||||
/* There is only one PIO Controller */
|
||||
#define PIO_CTRL 0
|
||||
|
||||
#define PIO_TC0 PIO_CTRL
|
||||
#define TCLK0 P0
|
||||
#define TIOA0 P1
|
||||
#define TIOB0 P2
|
||||
#define PIN_TC0 (TIOA0|TIOB0|TCLK0)
|
||||
|
||||
#define PIO_TC1 PIO_CTRL
|
||||
#define TCLK1 P3
|
||||
#define TIOA1 P4
|
||||
#define TIOB1 P5
|
||||
#define PIN_TC1 (TIOA1|TIOB1|TCLK1)
|
||||
|
||||
#define PIO_TC2 PIO_CTRL
|
||||
#define TCLK2 P6
|
||||
#define TIOA2 P7
|
||||
#define TIOB2 P8
|
||||
#define PIN_TC2 (TIOA2|TIOB2|TCLK2)
|
||||
|
||||
#define PIO_EXT_IRQ PIO_CTRL
|
||||
#define PIN_IRQ0 P9
|
||||
#define PIN_IRQ1 P10
|
||||
#define PIN_IRQ2 P11
|
||||
#define PIN_FIQ P12
|
||||
|
||||
#define PIO_USART0 PIO_CTRL
|
||||
#define SCK0 P13
|
||||
#define TXD0 P14
|
||||
#define RXD0 P15
|
||||
#define PIN_USART0 (SCK0|TXD0|RXD0)
|
||||
|
||||
#define PIO_USART1 PIO_CTRL
|
||||
#define SCK1 P20
|
||||
#define TXD1 P21
|
||||
#define RXD1 P22
|
||||
#define PIN_USART1 (SCK1|TXD1|RXD1)
|
||||
|
||||
#define MCKO P25
|
||||
#define CS2 P26
|
||||
#define CS3 P27
|
||||
#define CS4 P31
|
||||
#define CS5 P30
|
||||
#define CS6 P29
|
||||
#define CS7 P28
|
||||
|
||||
#endif /* pio_h */
|
||||
6
Demo/ARM7_AT91FR40008_GCC/ram_arm.bat
Normal file
6
Demo/ARM7_AT91FR40008_GCC/ram_arm.bat
Normal file
@@ -0,0 +1,6 @@
|
||||
set USE_THUMB_MODE=NO
|
||||
set DEBUG=-g
|
||||
set OPTIM=-O0
|
||||
set RUN_MODE=RUN_FROM_RAM
|
||||
set LDSCRIPT=atmel-ram.ld
|
||||
make
|
||||
6
Demo/ARM7_AT91FR40008_GCC/ram_thumb.bat
Normal file
6
Demo/ARM7_AT91FR40008_GCC/ram_thumb.bat
Normal file
@@ -0,0 +1,6 @@
|
||||
set USE_THUMB_MODE=YES
|
||||
set DEBUG=-g
|
||||
set OPTIM=-O0
|
||||
set RUN_MODE=RUN_FROM_RAM
|
||||
set LDSCRIPT=atmel-ram.ld
|
||||
make
|
||||
6
Demo/ARM7_AT91FR40008_GCC/rom_arm.bat
Normal file
6
Demo/ARM7_AT91FR40008_GCC/rom_arm.bat
Normal file
@@ -0,0 +1,6 @@
|
||||
set USE_THUMB_MODE=NO
|
||||
set DEBUG=-g
|
||||
set OPTIM=-O2
|
||||
set RUN_MODE=RUN_FROM_ROM
|
||||
set LDSCRIPT=atmel-rom.ld
|
||||
make
|
||||
6
Demo/ARM7_AT91FR40008_GCC/rom_thumb.bat
Normal file
6
Demo/ARM7_AT91FR40008_GCC/rom_thumb.bat
Normal file
@@ -0,0 +1,6 @@
|
||||
set USE_THUMB_MODE=YES
|
||||
set DEBUG=-g
|
||||
set OPTIM=-O2
|
||||
set RUN_MODE=RUN_FROM_ROM
|
||||
set LDSCRIPT=atmel-rom.ld
|
||||
make
|
||||
228
Demo/ARM7_AT91FR40008_GCC/serial/serial.c
Normal file
228
Demo/ARM7_AT91FR40008_GCC/serial/serial.c
Normal file
@@ -0,0 +1,228 @@
|
||||
/*
|
||||
FreeRTOS V4.0.1 - Copyright (C) 2003-2006 Richard Barry.
|
||||
|
||||
This file is part of the FreeRTOS distribution.
|
||||
|
||||
FreeRTOS 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 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
FreeRTOS 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 FreeRTOS; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
A special exception to the GPL can be applied should you wish to distribute
|
||||
a combined work that includes FreeRTOS, without being obliged to provide
|
||||
the source code for any proprietary components. See the licensing section
|
||||
of http://www.FreeRTOS.org for full details of how and when the exception
|
||||
can be applied.
|
||||
|
||||
***************************************************************************
|
||||
See http://www.FreeRTOS.org for documentation, latest information, license
|
||||
and contact details. Please ensure to read the configuration and relevant
|
||||
port sections of the online documentation.
|
||||
***************************************************************************
|
||||
*/
|
||||
|
||||
/*
|
||||
BASIC INTERRUPT DRIVEN SERIAL PORT DRIVER FOR USART0.
|
||||
|
||||
This file contains all the serial port components that can be compiled to
|
||||
either ARM or THUMB mode. Components that must be compiled to ARM mode are
|
||||
contained in serialISR.c.
|
||||
*/
|
||||
|
||||
/* Standard includes. */
|
||||
#include <stdlib.h>
|
||||
|
||||
/* Scheduler includes. */
|
||||
#include "FreeRTOS.h"
|
||||
#include "queue.h"
|
||||
#include "task.h"
|
||||
|
||||
/* Demo application includes. */
|
||||
#include "serial.h"
|
||||
#include "AT91R40008.h"
|
||||
#include "usart.h"
|
||||
#include "pio.h"
|
||||
#include "aic.h"
|
||||
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
/* Constants to setup and access the UART. */
|
||||
#define portUSART0_AIC_CHANNEL ( ( unsigned portLONG ) 2 )
|
||||
|
||||
#define serINVALID_QUEUE ( ( xQueueHandle ) 0 )
|
||||
#define serHANDLE ( ( xComPortHandle ) 1 )
|
||||
#define serNO_BLOCK ( ( portTickType ) 0 )
|
||||
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
/* Queues used to hold received characters, and characters waiting to be
|
||||
transmitted. */
|
||||
static xQueueHandle xRxedChars;
|
||||
static xQueueHandle xCharsForTx;
|
||||
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
/*
|
||||
* The queues are created in serialISR.c as they are used from the ISR.
|
||||
* Obtain references to the queues and THRE Empty flag.
|
||||
*/
|
||||
extern void vSerialISRCreateQueues( unsigned portBASE_TYPE uxQueueLength, xQueueHandle *pxRxedChars, xQueueHandle *pxCharsForTx );
|
||||
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
xComPortHandle xSerialPortInitMinimal( unsigned portLONG ulWantedBaud, unsigned portBASE_TYPE uxQueueLength )
|
||||
{
|
||||
unsigned portLONG ulSpeed;
|
||||
unsigned portLONG ulCD;
|
||||
xComPortHandle xReturn = serHANDLE;
|
||||
extern void ( vUART_ISR )( void );
|
||||
|
||||
/* The queues are used in the serial ISR routine, so are created from
|
||||
serialISR.c (which is always compiled to ARM mode. */
|
||||
vSerialISRCreateQueues( uxQueueLength, &xRxedChars, &xCharsForTx );
|
||||
|
||||
if(
|
||||
( xRxedChars != serINVALID_QUEUE ) &&
|
||||
( xCharsForTx != serINVALID_QUEUE ) &&
|
||||
( ulWantedBaud != ( unsigned portLONG ) 0 )
|
||||
)
|
||||
{
|
||||
portENTER_CRITICAL();
|
||||
{
|
||||
/* Enable clock to USART0... */
|
||||
AT91C_BASE_PS->PS_PCER = AT91C_PS_US0;
|
||||
|
||||
/* Disable all USART0 interrupt sources to begin... */
|
||||
AT91C_BASE_US0->US_IDR = 0xFFFFFFFF;
|
||||
|
||||
/* Reset various status bits (just in case)... */
|
||||
AT91C_BASE_US0->US_CR = US_RSTSTA;
|
||||
|
||||
AT91C_BASE_PIO->PIO_PDR = TXD0 | RXD0; /* Enable RXD and TXD pins */
|
||||
AT91C_BASE_US0->US_CR = US_RSTRX | US_RSTTX | US_RXDIS | US_TXDIS;
|
||||
|
||||
/* Clear Transmit and Receive Counters */
|
||||
AT91C_BASE_US0->US_RCR = 0;
|
||||
AT91C_BASE_US0->US_TCR = 0;
|
||||
|
||||
/* Input clock to baud rate generator is MCK */
|
||||
ulSpeed = configCPU_CLOCK_HZ * 10;
|
||||
ulSpeed = ulSpeed / 16;
|
||||
ulSpeed = ulSpeed / ulWantedBaud;
|
||||
|
||||
/* compute the error */
|
||||
ulCD = ulSpeed / 10;
|
||||
if ((ulSpeed - (ulCD * 10)) >= 5)
|
||||
ulCD++;
|
||||
|
||||
/* Define the baud rate divisor register */
|
||||
AT91C_BASE_US0->US_BRGR = ulCD;
|
||||
|
||||
/* Define the USART mode */
|
||||
AT91C_BASE_US0->US_MR = US_CLKS_MCK | US_CHRL_8 | US_PAR_NO | US_NBSTOP_1 | US_CHMODE_NORMAL;
|
||||
|
||||
/* Write the Timeguard Register */
|
||||
AT91C_BASE_US0->US_TTGR = 0;
|
||||
|
||||
/* Setup the interrupt for USART0.
|
||||
|
||||
Store interrupt handler function address in USART0 vector register... */
|
||||
AT91C_BASE_AIC->AIC_SVR[ portUSART0_AIC_CHANNEL ] = (unsigned long)vUART_ISR;
|
||||
|
||||
/* USART0 interrupt level-sensitive, priority 1... */
|
||||
AT91C_BASE_AIC->AIC_SMR[ portUSART0_AIC_CHANNEL ] = AIC_SRCTYPE_INT_LEVEL_SENSITIVE | 1;
|
||||
|
||||
/* Clear some pending USART0 interrupts (just in case)... */
|
||||
AT91C_BASE_US0->US_CR = US_RSTSTA;
|
||||
|
||||
/* Enable USART0 interrupt sources (but not Tx for now)... */
|
||||
AT91C_BASE_US0->US_IER = US_RXRDY;
|
||||
|
||||
/* Enable USART0 interrupts in the AIC... */
|
||||
AT91C_BASE_AIC->AIC_IECR = ( 1 << portUSART0_AIC_CHANNEL );
|
||||
|
||||
/* Enable receiver and transmitter... */
|
||||
AT91C_BASE_US0->US_CR = US_RXEN | US_TXEN;
|
||||
}
|
||||
portEXIT_CRITICAL();
|
||||
}
|
||||
else
|
||||
{
|
||||
xReturn = ( xComPortHandle ) 0;
|
||||
}
|
||||
|
||||
return xReturn;
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
signed portBASE_TYPE xSerialGetChar( xComPortHandle pxPort, signed portCHAR *pcRxedChar, portTickType xBlockTime )
|
||||
{
|
||||
/* The port handle is not required as this driver only supports UART0. */
|
||||
( void ) pxPort;
|
||||
|
||||
/* Get the next character from the buffer. Return false if no characters
|
||||
are available, or arrive before xBlockTime expires. */
|
||||
if( xQueueReceive( xRxedChars, pcRxedChar, xBlockTime ) )
|
||||
{
|
||||
return pdTRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
return pdFALSE;
|
||||
}
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
void vSerialPutString( xComPortHandle pxPort, const signed portCHAR * const pcString, unsigned portSHORT usStringLength )
|
||||
{
|
||||
signed portCHAR *pxNext;
|
||||
|
||||
/* NOTE: This implementation does not handle the queue being full as no
|
||||
block time is used! */
|
||||
|
||||
/* The port handle is not required as this driver only supports UART0. */
|
||||
( void ) pxPort;
|
||||
|
||||
/* Send each character in the string, one at a time. */
|
||||
pxNext = ( signed portCHAR * ) pcString;
|
||||
while( *pxNext )
|
||||
{
|
||||
xSerialPutChar( pxPort, *pxNext, serNO_BLOCK );
|
||||
pxNext++;
|
||||
}
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
signed portBASE_TYPE xSerialPutChar( xComPortHandle pxPort, signed portCHAR cOutChar, portTickType xBlockTime )
|
||||
{
|
||||
/* Place the character in the queue of characters to be transmitted. */
|
||||
if( xQueueSend( xCharsForTx, &cOutChar, xBlockTime ) != pdPASS )
|
||||
{
|
||||
return pdFAIL;
|
||||
}
|
||||
|
||||
/* Turn on the Tx interrupt so the ISR will remove the character from the
|
||||
queue and send it. This does not need to be in a critical section as
|
||||
if the interrupt has already removed the character the next interrupt
|
||||
will simply turn off the Tx interrupt again. */
|
||||
AT91C_BASE_US0->US_IER = US_TXRDY;
|
||||
|
||||
return pdPASS;
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
void vSerialClose( xComPortHandle xPort )
|
||||
{
|
||||
/* Not supported as not required by the demo application. */
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
144
Demo/ARM7_AT91FR40008_GCC/serial/serialISR.c
Normal file
144
Demo/ARM7_AT91FR40008_GCC/serial/serialISR.c
Normal file
@@ -0,0 +1,144 @@
|
||||
/*
|
||||
FreeRTOS V4.0.1 - Copyright (C) 2003-2006 Richard Barry.
|
||||
|
||||
This file is part of the FreeRTOS distribution.
|
||||
|
||||
FreeRTOS 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 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
FreeRTOS 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 FreeRTOS; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
A special exception to the GPL can be applied should you wish to distribute
|
||||
a combined work that includes FreeRTOS, without being obliged to provide
|
||||
the source code for any proprietary components. See the licensing section
|
||||
of http://www.FreeRTOS.org for full details of how and when the exception
|
||||
can be applied.
|
||||
|
||||
***************************************************************************
|
||||
See http://www.FreeRTOS.org for documentation, latest information, license
|
||||
and contact details. Please ensure to read the configuration and relevant
|
||||
port sections of the online documentation.
|
||||
***************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
BASIC INTERRUPT DRIVEN SERIAL PORT DRIVER FOR USART0.
|
||||
|
||||
This file contains all the serial port components that must be compiled
|
||||
to ARM mode. The components that can be compiled to either ARM or THUMB
|
||||
mode are contained in serial.c.
|
||||
|
||||
*/
|
||||
|
||||
/* Standard includes. */
|
||||
#include <stdlib.h>
|
||||
|
||||
/* Scheduler includes. */
|
||||
#include "FreeRTOS.h"
|
||||
#include "queue.h"
|
||||
#include "task.h"
|
||||
|
||||
/* Demo application includes. */
|
||||
#include "serial.h"
|
||||
#include "AT91R40008.h"
|
||||
#include "usart.h"
|
||||
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
/* Constant to access the AIC. */
|
||||
#define serCLEAR_AIC_INTERRUPT ( ( unsigned portLONG ) 0 )
|
||||
|
||||
/* Constants to determine the ISR source. */
|
||||
#define serSOURCE_THRE ( ( unsigned portCHAR ) 0x02 )
|
||||
#define serSOURCE_RX_TIMEOUT ( ( unsigned portCHAR ) 0x0c )
|
||||
#define serSOURCE_ERROR ( ( unsigned portCHAR ) 0x06 )
|
||||
#define serSOURCE_RX ( ( unsigned portCHAR ) 0x04 )
|
||||
#define serINTERRUPT_SOURCE_MASK ( ( unsigned portLONG ) (US_RXRDY | US_TXRDY | US_RXBRK | US_OVRE | US_FRAME | US_PARE) )
|
||||
|
||||
/* Queues used to hold received characters, and characters waiting to be
|
||||
transmitted. */
|
||||
static xQueueHandle xRxedChars;
|
||||
static xQueueHandle xCharsForTx;
|
||||
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
/* UART0 interrupt service routine. This can cause a context switch so MUST
|
||||
be declared "naked". */
|
||||
void vUART_ISR( void ) __attribute__ ((naked));
|
||||
|
||||
/*-----------------------------------------------------------*/
|
||||
void vSerialISRCreateQueues( unsigned portBASE_TYPE uxQueueLength, xQueueHandle *pxRxedChars, xQueueHandle *pxCharsForTx )
|
||||
{
|
||||
/* Create the queues used to hold Rx and Tx characters. */
|
||||
xRxedChars = xQueueCreate( uxQueueLength, ( unsigned portBASE_TYPE ) sizeof( signed portCHAR ) );
|
||||
xCharsForTx = xQueueCreate( uxQueueLength + 1, ( unsigned portBASE_TYPE ) sizeof( signed portCHAR ) );
|
||||
|
||||
/* Pass back a reference to the queues so the serial API file can
|
||||
post/receive characters. */
|
||||
*pxRxedChars = xRxedChars;
|
||||
*pxCharsForTx = xCharsForTx;
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
void vUART_ISR( void )
|
||||
{
|
||||
/* This ISR can cause a context switch, so the first statement must be a
|
||||
call to the portENTER_SWITCHING_ISR() macro. This must be BEFORE any
|
||||
variable declarations. */
|
||||
portENTER_SWITCHING_ISR();
|
||||
|
||||
/* Now we can declare the local variables. */
|
||||
signed portCHAR cChar;
|
||||
portBASE_TYPE xTaskWokenByTx = pdFALSE, xTaskWokenByRx = pdFALSE;
|
||||
unsigned portLONG ulStatus;
|
||||
|
||||
/* What caused the interrupt? */
|
||||
ulStatus = AT91C_BASE_US0->US_CSR & AT91C_BASE_US0->US_IMR;
|
||||
|
||||
if (ulStatus & US_TXRDY)
|
||||
{
|
||||
/* The interrupt was caused by the THR becoming empty. Are there any
|
||||
more characters to transmit? */
|
||||
if( xQueueReceiveFromISR( xCharsForTx, &cChar, &xTaskWokenByTx ) == pdTRUE )
|
||||
{
|
||||
/* A character was retrieved from the queue so can be sent to the
|
||||
THR now. */
|
||||
AT91C_BASE_US0->US_THR = cChar;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Queue empty, nothing to send so turn off the Tx interrupt. */
|
||||
AT91C_BASE_US0->US_IDR = US_TXRDY;
|
||||
}
|
||||
}
|
||||
|
||||
if (ulStatus & US_RXRDY)
|
||||
{
|
||||
/* The interrupt was caused by the receiver getting data. */
|
||||
cChar = AT91C_BASE_US0->US_RHR;
|
||||
|
||||
if (xQueueSendFromISR(xRxedChars, &cChar, pdFALSE))
|
||||
{
|
||||
xTaskWokenByRx = pdTRUE;
|
||||
}
|
||||
}
|
||||
|
||||
// Acknowledge the interrupt at AIC level...
|
||||
AT91C_BASE_AIC->AIC_EOICR = serCLEAR_AIC_INTERRUPT;
|
||||
|
||||
/* Exit the ISR. If a task was woken by either a character being received
|
||||
or transmitted then a context switch will occur. */
|
||||
portEXIT_SWITCHING_ISR( ( xTaskWokenByTx || xTaskWokenByRx ) );
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
301
Demo/ARM7_AT91FR40008_GCC/tc.h
Normal file
301
Demo/ARM7_AT91FR40008_GCC/tc.h
Normal file
@@ -0,0 +1,301 @@
|
||||
//*----------------------------------------------------------------------------
|
||||
//* ATMEL Microcontroller Software Support - ROUSSET -
|
||||
//*----------------------------------------------------------------------------
|
||||
//* The software is delivered "AS IS" without warranty or condition of any
|
||||
//* kind, either express, implied or statutory. This includes without
|
||||
//* limitation any warranty or condition with respect to merchantability or
|
||||
//* fitness for any particular purpose, or against the infringements of
|
||||
//* intellectual property rights of others.
|
||||
//*-----------------------------------------------------------------------------
|
||||
//* File Name : tc.h
|
||||
//* Object : Timer Counter Header File
|
||||
//*
|
||||
//* 1.0 01/04/00 JCZ : Creation
|
||||
//* 1.0 01/09/00 JPP : modification TC_BEEVT, TC_BEEVT_SET_OUTPUT,
|
||||
//* TC_BEEVT_CLEAR_OUTPUT, TC_BEEVT_TOGGLE_OUTPUT
|
||||
//*-----------------------------------------------------------------------------
|
||||
|
||||
#ifndef tc_h
|
||||
#define tc_h
|
||||
|
||||
//#include "periph/stdc/std_c.h"
|
||||
//#include "periph/pio/lib_pio.h"
|
||||
|
||||
/*-------------------------------------------*/
|
||||
/* Timer User Interface Structure Definition */
|
||||
/*-------------------------------------------*/
|
||||
|
||||
typedef struct
|
||||
{
|
||||
at91_reg TC_CCR ; /* Control Register */
|
||||
at91_reg TC_CMR ; /* Mode Register */
|
||||
at91_reg Reserved0 ;
|
||||
at91_reg Reserved1 ;
|
||||
at91_reg TC_CV ; /* Counter value */
|
||||
at91_reg TC_RA ; /* Register A */
|
||||
at91_reg TC_RB ; /* Register B */
|
||||
at91_reg TC_RC ; /* Register C */
|
||||
at91_reg TC_SR ; /* Status Register */
|
||||
at91_reg TC_IER ; /* Interrupt Enable Register */
|
||||
at91_reg TC_IDR ; /* Interrupt Disable Register */
|
||||
at91_reg TC_IMR ; /* Interrupt Mask Register */
|
||||
at91_reg Reserved2 ;
|
||||
at91_reg Reserved3 ;
|
||||
at91_reg Reserved4 ;
|
||||
at91_reg Reserved5 ;
|
||||
} StructTC ;
|
||||
|
||||
#define NB_TC_CHANNEL 3
|
||||
|
||||
typedef struct
|
||||
{
|
||||
StructTC TC[NB_TC_CHANNEL] ;
|
||||
at91_reg TC_BCR ; /* Block Control Register */
|
||||
at91_reg TC_BMR ; /* Block Mode Register */
|
||||
} StructTCBlock ;
|
||||
|
||||
/*--------------------------------------------------------*/
|
||||
/* TC_CCR: Timer Counter Control Register Bits Definition */
|
||||
/*--------------------------------------------------------*/
|
||||
#define TC_CLKEN 0x1
|
||||
#define TC_CLKDIS 0x2
|
||||
#define TC_SWTRG 0x4
|
||||
|
||||
/*---------------------------------------------------------------*/
|
||||
/* TC_CMR: Timer Counter Channel Mode Register Bits Definition */
|
||||
/*---------------------------------------------------------------*/
|
||||
|
||||
/*-----------------*/
|
||||
/* Clock Selection */
|
||||
/*-----------------*/
|
||||
#define TC_CLKS 0x7
|
||||
#define TC_CLKS_MCK2 0x0
|
||||
#define TC_CLKS_MCK8 0x1
|
||||
#define TC_CLKS_MCK32 0x2
|
||||
#define TC_CLKS_MCK128 0x3
|
||||
#define TC_CLKS_MCK1024 0x4
|
||||
|
||||
#define TC_CLKS_SLCK 0x4
|
||||
|
||||
#define TC_CLKS_XC0 0x5
|
||||
#define TC_CLKS_XC1 0x6
|
||||
#define TC_CLKS_XC2 0x7
|
||||
|
||||
|
||||
/*-----------------*/
|
||||
/* Clock Inversion */
|
||||
/*-----------------*/
|
||||
#define TC_CLKI 0x8
|
||||
|
||||
/*------------------------*/
|
||||
/* Burst Signal Selection */
|
||||
/*------------------------*/
|
||||
#define TC_BURST 0x30
|
||||
#define TC_BURST_NONE 0x0
|
||||
#define TC_BUSRT_XC0 0x10
|
||||
#define TC_BURST_XC1 0x20
|
||||
#define TC_BURST_XC2 0x30
|
||||
|
||||
/*------------------------------------------------------*/
|
||||
/* Capture Mode : Counter Clock Stopped with RB Loading */
|
||||
/*------------------------------------------------------*/
|
||||
#define TC_LDBSTOP 0x40
|
||||
|
||||
/*-------------------------------------------------------*/
|
||||
/* Waveform Mode : Counter Clock Stopped with RC Compare */
|
||||
/*-------------------------------------------------------*/
|
||||
#define TC_CPCSTOP 0x40
|
||||
|
||||
/*-------------------------------------------------------*/
|
||||
/* Capture Mode : Counter Clock Disabled with RB Loading */
|
||||
/*--------------------------------------------------------*/
|
||||
#define TC_LDBDIS 0x80
|
||||
|
||||
/*--------------------------------------------------------*/
|
||||
/* Waveform Mode : Counter Clock Disabled with RC Compare */
|
||||
/*--------------------------------------------------------*/
|
||||
#define TC_CPCDIS 0x80
|
||||
|
||||
/*------------------------------------------------*/
|
||||
/* Capture Mode : External Trigger Edge Selection */
|
||||
/*------------------------------------------------*/
|
||||
#define TC_ETRGEDG 0x300
|
||||
#define TC_ETRGEDG_EDGE_NONE 0x0
|
||||
#define TC_ETRGEDG_RISING_EDGE 0x100
|
||||
#define TC_ETRGEDG_FALLING_EDGE 0x200
|
||||
#define TC_ETRGEDG_BOTH_EDGE 0x300
|
||||
|
||||
/*-----------------------------------------------*/
|
||||
/* Waveform Mode : External Event Edge Selection */
|
||||
/*-----------------------------------------------*/
|
||||
#define TC_EEVTEDG 0x300
|
||||
#define TC_EEVTEDG_EDGE_NONE 0x0
|
||||
#define TC_EEVTEDG_RISING_EDGE 0x100
|
||||
#define TC_EEVTEDG_FALLING_EDGE 0x200
|
||||
#define TC_EEVTEDG_BOTH_EDGE 0x300
|
||||
|
||||
/*--------------------------------------------------------*/
|
||||
/* Capture Mode : TIOA or TIOB External Trigger Selection */
|
||||
/*--------------------------------------------------------*/
|
||||
#define TC_ABETRG 0x400
|
||||
#define TC_ABETRG_TIOB 0x0
|
||||
#define TC_ABETRG_TIOA 0x400
|
||||
|
||||
/*------------------------------------------*/
|
||||
/* Waveform Mode : External Event Selection */
|
||||
/*------------------------------------------*/
|
||||
#define TC_EEVT 0xC00
|
||||
#define TC_EEVT_TIOB 0x0
|
||||
#define TC_EEVT_XC0 0x400
|
||||
#define TC_EEVT_XC1 0x800
|
||||
#define TC_EEVT_XC2 0xC00
|
||||
|
||||
/*--------------------------------------------------*/
|
||||
/* Waveform Mode : Enable Trigger on External Event */
|
||||
/*--------------------------------------------------*/
|
||||
#define TC_ENETRG 0x1000
|
||||
|
||||
/*----------------------------------*/
|
||||
/* RC Compare Enable Trigger Enable */
|
||||
/*----------------------------------*/
|
||||
#define TC_CPCTRG 0x4000
|
||||
|
||||
/*----------------*/
|
||||
/* Mode Selection */
|
||||
/*----------------*/
|
||||
#define TC_WAVE 0x8000
|
||||
#define TC_CAPT 0x0
|
||||
|
||||
/*-------------------------------------*/
|
||||
/* Capture Mode : RA Loading Selection */
|
||||
/*-------------------------------------*/
|
||||
#define TC_LDRA 0x30000
|
||||
#define TC_LDRA_EDGE_NONE 0x0
|
||||
#define TC_LDRA_RISING_EDGE 0x10000
|
||||
#define TC_LDRA_FALLING_EDGE 0x20000
|
||||
#define TC_LDRA_BOTH_EDGE 0x30000
|
||||
|
||||
/*-------------------------------------------*/
|
||||
/* Waveform Mode : RA Compare Effect on TIOA */
|
||||
/*-------------------------------------------*/
|
||||
#define TC_ACPA 0x30000
|
||||
#define TC_ACPA_OUTPUT_NONE 0x0
|
||||
#define TC_ACPA_SET_OUTPUT 0x10000
|
||||
#define TC_ACPA_CLEAR_OUTPUT 0x20000
|
||||
#define TC_ACPA_TOGGLE_OUTPUT 0x30000
|
||||
|
||||
/*-------------------------------------*/
|
||||
/* Capture Mode : RB Loading Selection */
|
||||
/*-------------------------------------*/
|
||||
#define TC_LDRB 0xC0000
|
||||
#define TC_LDRB_EDGE_NONE 0x0
|
||||
#define TC_LDRB_RISING_EDGE 0x40000
|
||||
#define TC_LDRB_FALLING_EDGE 0x80000
|
||||
#define TC_LDRB_BOTH_EDGE 0xC0000
|
||||
|
||||
/*-------------------------------------------*/
|
||||
/* Waveform Mode : RC Compare Effect on TIOA */
|
||||
/*-------------------------------------------*/
|
||||
#define TC_ACPC 0xC0000
|
||||
#define TC_ACPC_OUTPUT_NONE 0x0
|
||||
#define TC_ACPC_SET_OUTPUT 0x40000
|
||||
#define TC_ACPC_CLEAR_OUTPUT 0x80000
|
||||
#define TC_ACPC_TOGGLE_OUTPUT 0xC0000
|
||||
|
||||
/*-----------------------------------------------*/
|
||||
/* Waveform Mode : External Event Effect on TIOA */
|
||||
/*-----------------------------------------------*/
|
||||
#define TC_AEEVT 0x300000
|
||||
#define TC_AEEVT_OUTPUT_NONE 0x0
|
||||
#define TC_AEEVT_SET_OUTPUT 0x100000
|
||||
#define TC_AEEVT_CLEAR_OUTPUT 0x200000
|
||||
#define TC_AEEVT_TOGGLE_OUTPUT 0x300000
|
||||
|
||||
/*-------------------------------------------------*/
|
||||
/* Waveform Mode : Software Trigger Effect on TIOA */
|
||||
/*-------------------------------------------------*/
|
||||
#define TC_ASWTRG 0xC00000
|
||||
#define TC_ASWTRG_OUTPUT_NONE 0x0
|
||||
#define TC_ASWTRG_SET_OUTPUT 0x400000
|
||||
#define TC_ASWTRG_CLEAR_OUTPUT 0x800000
|
||||
#define TC_ASWTRG_TOGGLE_OUTPUT 0xC00000
|
||||
|
||||
/*-------------------------------------------*/
|
||||
/* Waveform Mode : RB Compare Effect on TIOB */
|
||||
/*-------------------------------------------*/
|
||||
#define TC_BCPB 0x1000000
|
||||
#define TC_BCPB_OUTPUT_NONE 0x0
|
||||
#define TC_BCPB_SET_OUTPUT 0x1000000
|
||||
#define TC_BCPB_CLEAR_OUTPUT 0x2000000
|
||||
#define TC_BCPB_TOGGLE_OUTPUT 0x3000000
|
||||
|
||||
/*-------------------------------------------*/
|
||||
/* Waveform Mode : RC Compare Effect on TIOB */
|
||||
/*-------------------------------------------*/
|
||||
#define TC_BCPC 0xC000000
|
||||
#define TC_BCPC_OUTPUT_NONE 0x0
|
||||
#define TC_BCPC_SET_OUTPUT 0x4000000
|
||||
#define TC_BCPC_CLEAR_OUTPUT 0x8000000
|
||||
#define TC_BCPC_TOGGLE_OUTPUT 0xC000000
|
||||
|
||||
/*-----------------------------------------------*/
|
||||
/* Waveform Mode : External Event Effect on TIOB */
|
||||
/*-----------------------------------------------*/
|
||||
#define TC_BEEVT 0x30000000 //* bit 29-28
|
||||
#define TC_BEEVT_OUTPUT_NONE 0x0
|
||||
#define TC_BEEVT_SET_OUTPUT 0x10000000 //* bit 29-28 01
|
||||
#define TC_BEEVT_CLEAR_OUTPUT 0x20000000 //* bit 29-28 10
|
||||
#define TC_BEEVT_TOGGLE_OUTPUT 0x30000000 //* bit 29-28 11
|
||||
|
||||
/*- -----------------------------------------------*/
|
||||
/* Waveform Mode : Software Trigger Effect on TIOB */
|
||||
/*-------------------------------------------------*/
|
||||
#define TC_BSWTRG 0xC0000000
|
||||
#define TC_BSWTRG_OUTPUT_NONE 0x0
|
||||
#define TC_BSWTRG_SET_OUTPUT 0x40000000
|
||||
#define TC_BSWTRG_CLEAR_OUTPUT 0x80000000
|
||||
#define TC_BSWTRG_TOGGLE_OUTPUT 0xC0000000
|
||||
|
||||
/*------------------------------------------------------*/
|
||||
/* TC_SR: Timer Counter Status Register Bits Definition */
|
||||
/*------------------------------------------------------*/
|
||||
#define TC_COVFS 0x1 /* Counter Overflow Status */
|
||||
#define TC_LOVRS 0x2 /* Load Overrun Status */
|
||||
#define TC_CPAS 0x4 /* RA Compare Status */
|
||||
#define TC_CPBS 0x8 /* RB Compare Status */
|
||||
#define TC_CPCS 0x10 /* RC Compare Status */
|
||||
#define TC_LDRAS 0x20 /* RA Loading Status */
|
||||
#define TC_LDRBS 0x40 /* RB Loading Status */
|
||||
#define TC_ETRGS 0x80 /* External Trigger Status */
|
||||
#define TC_CLKSTA 0x10000 /* Clock Status */
|
||||
#define TC_MTIOA 0x20000 /* TIOA Mirror */
|
||||
#define TC_MTIOB 0x40000 /* TIOB Status */
|
||||
|
||||
/*--------------------------------------------------------------*/
|
||||
/* TC_BCR: Timer Counter Block Control Register Bits Definition */
|
||||
/*--------------------------------------------------------------*/
|
||||
#define TC_SYNC 0x1 /* Synchronisation Trigger */
|
||||
|
||||
/*------------------------------------------------------------*/
|
||||
/* TC_BMR: Timer Counter Block Mode Register Bits Definition */
|
||||
/*------------------------------------------------------------*/
|
||||
#define TC_TC0XC0S 0x3 /* External Clock Signal 0 Selection */
|
||||
#define TC_TCLK0XC0 0x0
|
||||
#define TC_NONEXC0 0x1
|
||||
#define TC_TIOA1XC0 0x2
|
||||
#define TC_TIOA2XC0 0x3
|
||||
|
||||
#define TC_TC1XC1S 0xC /* External Clock Signal 1 Selection */
|
||||
#define TC_TCLK1XC1 0x0
|
||||
#define TC_NONEXC1 0x4
|
||||
#define TC_TIOA0XC1 0x8
|
||||
#define TC_TIOA2XC1 0xC
|
||||
|
||||
#define TC_TC2XC2S 0x30 /* External Clock Signal 2 Selection */
|
||||
#define TC_TCLK2XC2 0x0
|
||||
#define TC_NONEXC2 0x10
|
||||
#define TC_TIOA0XC2 0x20
|
||||
#define TC_TIOA1XC2 0x30
|
||||
|
||||
#endif /* tc_h */
|
||||
|
||||
151
Demo/ARM7_AT91FR40008_GCC/usart.h
Normal file
151
Demo/ARM7_AT91FR40008_GCC/usart.h
Normal file
@@ -0,0 +1,151 @@
|
||||
//*----------------------------------------------------------------------------
|
||||
//* ATMEL Microcontroller Software Support - ROUSSET -
|
||||
//*----------------------------------------------------------------------------
|
||||
//* The software is delivered "AS IS" without warranty or condition of any
|
||||
//* kind, either express, implied or statutory. This includes without
|
||||
//* limitation any warranty or condition with respect to merchantability or
|
||||
//* fitness for any particular purpose, or against the infringements of
|
||||
//* intellectual property rights of others.
|
||||
//*-----------------------------------------------------------------------------
|
||||
//* File Name : usart.h
|
||||
//* Object : USART Header File.
|
||||
//*
|
||||
//* 1.0 01/04/00 JCZ : Creation
|
||||
//*----------------------------------------------------------------------------
|
||||
|
||||
#ifndef usart_h
|
||||
#define usart_h
|
||||
|
||||
//#include "periph/stdc/std_c.h"
|
||||
//#include "periph/pio/lib_pio.h"
|
||||
|
||||
/*-------------------------------------------*/
|
||||
/* USART User Interface Structure Definition */
|
||||
/*-------------------------------------------*/
|
||||
|
||||
typedef struct
|
||||
{
|
||||
at91_reg US_CR ; /* Control Register */
|
||||
at91_reg US_MR ; /* Mode Register */
|
||||
at91_reg US_IER ; /* Interrupt Enable Register */
|
||||
at91_reg US_IDR ; /* Interrupt Disable Register */
|
||||
at91_reg US_IMR ; /* Interrupt Mask Register */
|
||||
at91_reg US_CSR ; /* Channel Status Register */
|
||||
at91_reg US_RHR ; /* Receive Holding Register */
|
||||
at91_reg US_THR ; /* Transmit Holding Register */
|
||||
at91_reg US_BRGR ; /* Baud Rate Generator Register */
|
||||
at91_reg US_RTOR ; /* Receiver Timeout Register */
|
||||
at91_reg US_TTGR ; /* Transmitter Time-guard Register */
|
||||
at91_reg Reserved ;
|
||||
at91_reg US_RPR ; /* Receiver Pointer Register */
|
||||
at91_reg US_RCR ; /* Receiver Counter Register */
|
||||
at91_reg US_TPR ; /* Transmitter Pointer Register */
|
||||
at91_reg US_TCR ; /* Transmitter Counter Register */
|
||||
} StructUSART ;
|
||||
|
||||
/*--------------------------*/
|
||||
/* US_CR : Control Register */
|
||||
/*--------------------------*/
|
||||
|
||||
#define US_RSTRX 0x0004 /* Reset Receiver */
|
||||
#define US_RSTTX 0x0008 /* Reset Transmitter */
|
||||
#define US_RXEN 0x0010 /* Receiver Enable */
|
||||
#define US_RXDIS 0x0020 /* Receiver Disable */
|
||||
#define US_TXEN 0x0040 /* Transmitter Enable */
|
||||
#define US_TXDIS 0x0080 /* Transmitter Disable */
|
||||
#define US_RSTSTA 0x0100 /* Reset Status Bits */
|
||||
#define US_STTBRK 0x0200 /* Start Break */
|
||||
#define US_STPBRK 0x0400 /* Stop Break */
|
||||
#define US_STTTO 0x0800 /* Start Time-out */
|
||||
#define US_SENDA 0x1000 /* Send Address */
|
||||
|
||||
/*-----------------------*/
|
||||
/* US_MR : Mode Register */
|
||||
/*-----------------------*/
|
||||
|
||||
#define US_CLKS 0x0030 /* Clock Selection */
|
||||
#define US_CLKS_MCK 0x00 /* Master Clock */
|
||||
#define US_CLKS_MCK8 0x10 /* Master Clock divided by 8 */
|
||||
#define US_CLKS_SCK 0x20 /* External Clock */
|
||||
#define US_CLKS_SLCK 0x30 /* Slow Clock */
|
||||
|
||||
#define US_CHRL 0x00C0 /* Byte Length */
|
||||
#define US_CHRL_5 0x00 /* 5 bits */
|
||||
#define US_CHRL_6 0x40 /* 6 bits */
|
||||
#define US_CHRL_7 0x80 /* 7 bits */
|
||||
#define US_CHRL_8 0xC0 /* 8 bits */
|
||||
|
||||
#define US_SYNC 0x0100 /* Synchronous Mode Enable */
|
||||
|
||||
#define US_PAR 0x0E00 /* Parity Mode */
|
||||
#define US_PAR_EVEN 0x00 /* Even Parity */
|
||||
#define US_PAR_ODD 0x200 /* Odd Parity */
|
||||
#define US_PAR_SPACE 0x400 /* Space Parity to 0 */
|
||||
#define US_PAR_MARK 0x600 /* Marked Parity to 1 */
|
||||
#define US_PAR_NO 0x800 /* No Parity */
|
||||
#define US_PAR_MULTIDROP 0xC00 /* Multi-drop Mode */
|
||||
|
||||
#define US_NBSTOP 0x3000 /* Stop Bit Number */
|
||||
#define US_NBSTOP_1 0x0000 /* 1 Stop Bit */
|
||||
#define US_NBSTOP_1_5 0x1000 /* 1.5 Stop Bits */
|
||||
#define US_NBSTOP_2 0x2000 /* 2 Stop Bits */
|
||||
|
||||
#define US_CHMODE 0xC000 /* Channel Mode */
|
||||
#define US_CHMODE_NORMAL 0x0000 /* Normal Mode */
|
||||
#define US_CHMODE_AUTOMATIC_ECHO 0x4000 /* Automatic Echo */
|
||||
#define US_CHMODE_LOCAL_LOOPBACK 0x8000 /* Local Loopback */
|
||||
#define US_CHMODE_REMOTE_LOOPBACK 0xC000 /* Remote Loopback */
|
||||
|
||||
#define US_MODE9 0x20000 /* 9 Bit Mode */
|
||||
|
||||
#define US_CLKO 0x40000 /* Baud Rate Output Enable */
|
||||
|
||||
/* Mode Register model */
|
||||
|
||||
/* Standard Asynchronous Mode : 8 bits , 1 stop , no parity */
|
||||
#define US_ASYNC_MODE ( US_CHMODE_NORMAL + \
|
||||
US_NBSTOP_1 + \
|
||||
US_PAR_NO + \
|
||||
US_CHRL_8 + \
|
||||
US_CLKS_MCK )
|
||||
|
||||
/* Standard External Asynchronous Mode : 8 bits , 1 stop , no parity */
|
||||
#define US_ASYNC_SCK_MODE ( US_CHMODE_NORMAL + \
|
||||
US_NBSTOP_1 + \
|
||||
US_PAR_NO + \
|
||||
US_CHRL_8 + \
|
||||
US_CLKS_SCK )
|
||||
|
||||
/* Standard Synchronous Mode : 8 bits , 1 stop , no parity */
|
||||
#define US_SYNC_MODE ( US_SYNC + \
|
||||
US_CHMODE_NORMAL + \
|
||||
US_NBSTOP_1 + \
|
||||
US_PAR_NO + \
|
||||
US_CHRL_8 + \
|
||||
US_CLKS_MCK )
|
||||
|
||||
/* SCK used Label */
|
||||
#define SCK_USED (US_CLKO | US_CLKS_SCK)
|
||||
|
||||
/*---------------------------------------------------------------*/
|
||||
/* US_IER, US_IDR, US_IMR, US_IMR: Status and Interrupt Register */
|
||||
/*---------------------------------------------------------------*/
|
||||
|
||||
#define US_RXRDY 0x1 /* Receiver Ready */
|
||||
#define US_TXRDY 0x2 /* Transmitter Ready */
|
||||
#define US_RXBRK 0x4 /* Receiver Break */
|
||||
#define US_ENDRX 0x8 /* End of Receiver PDC Transfer */
|
||||
#define US_ENDTX 0x10 /* End of Transmitter PDC Transfer */
|
||||
#define US_OVRE 0x20 /* Overrun Error */
|
||||
#define US_FRAME 0x40 /* Framing Error */
|
||||
#define US_PARE 0x80 /* Parity Error */
|
||||
#define US_TIMEOUT 0x100 /* Receiver Timeout */
|
||||
#define US_TXEMPTY 0x200 /* Transmitter Empty */
|
||||
|
||||
#define US_MASK_IRQ_TX (US_TXRDY | US_ENDTX | US_TXEMPTY)
|
||||
#define US_MASK_IRQ_RX (US_RXRDY | US_ENDRX | US_TIMEOUT)
|
||||
#define US_MASK_IRQ_ERROR (US_PARE | US_FRAME | US_OVRE | US_RXBRK)
|
||||
|
||||
|
||||
|
||||
#endif /* usart_h */
|
||||
78
Demo/ARM7_AT91SAM7S64_IAR/FreeRTOSConfig.h
Normal file
78
Demo/ARM7_AT91SAM7S64_IAR/FreeRTOSConfig.h
Normal file
@@ -0,0 +1,78 @@
|
||||
/*
|
||||
FreeRTOS V4.0.1 - Copyright (C) 2003-2006 Richard Barry.
|
||||
|
||||
This file is part of the FreeRTOS distribution.
|
||||
|
||||
FreeRTOS 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 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
FreeRTOS 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 FreeRTOS; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
A special exception to the GPL can be applied should you wish to distribute
|
||||
a combined work that includes FreeRTOS, without being obliged to provide
|
||||
the source code for any proprietary components. See the licensing section
|
||||
of http://www.FreeRTOS.org for full details of how and when the exception
|
||||
can be applied.
|
||||
|
||||
***************************************************************************
|
||||
See http://www.FreeRTOS.org for documentation, latest information, license
|
||||
and contact details. Please ensure to read the configuration and relevant
|
||||
port sections of the online documentation.
|
||||
***************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef FREERTOS_CONFIG_H
|
||||
#define FREERTOS_CONFIG_H
|
||||
|
||||
#include <intrinsic.h>
|
||||
#include "board.h"
|
||||
|
||||
/*-----------------------------------------------------------
|
||||
* Application specific definitions.
|
||||
*
|
||||
* These definitions should be adjusted for your particular hardware and
|
||||
* application requirements.
|
||||
*
|
||||
* THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE
|
||||
* FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.
|
||||
*----------------------------------------------------------*/
|
||||
|
||||
#define configUSE_PREEMPTION 1
|
||||
#define configUSE_IDLE_HOOK 0
|
||||
#define configUSE_TICK_HOOK 0
|
||||
#define configCPU_CLOCK_HZ ( ( unsigned portLONG ) 47923200 )
|
||||
#define configTICK_RATE_HZ ( ( portTickType ) 1000 )
|
||||
#define configMAX_PRIORITIES ( ( unsigned portBASE_TYPE ) 5 )
|
||||
#define configMINIMAL_STACK_SIZE ( ( unsigned portSHORT ) 100 )
|
||||
#define configTOTAL_HEAP_SIZE ( ( size_t ) 14200 )
|
||||
#define configMAX_TASK_NAME_LEN ( 16 )
|
||||
#define configUSE_TRACE_FACILITY 0
|
||||
#define configUSE_16_BIT_TICKS 0
|
||||
#define configIDLE_SHOULD_YIELD 1
|
||||
|
||||
/* Co-routine definitions. */
|
||||
#define configUSE_CO_ROUTINES 0
|
||||
#define configMAX_CO_ROUTINE_PRIORITIES ( 2 )
|
||||
|
||||
/* Set the following definitions to 1 to include the API function, or zero
|
||||
to exclude the API function. */
|
||||
|
||||
#define INCLUDE_vTaskPrioritySet 1
|
||||
#define INCLUDE_uxTaskPriorityGet 1
|
||||
#define INCLUDE_vTaskDelete 0
|
||||
#define INCLUDE_vTaskCleanUpResources 0
|
||||
#define INCLUDE_vTaskSuspend 1
|
||||
#define INCLUDE_vTaskDelayUntil 1
|
||||
#define INCLUDE_vTaskDelay 1
|
||||
|
||||
|
||||
#endif /* FREERTOS_CONFIG_H */
|
||||
81
Demo/ARM7_AT91SAM7S64_IAR/ParTest/ParTest.c
Normal file
81
Demo/ARM7_AT91SAM7S64_IAR/ParTest/ParTest.c
Normal file
@@ -0,0 +1,81 @@
|
||||
/*
|
||||
FreeRTOS V4.0.1 - Copyright (C) 2003-2006 Richard Barry.
|
||||
|
||||
This file is part of the FreeRTOS distribution.
|
||||
|
||||
FreeRTOS 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 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
FreeRTOS 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 FreeRTOS; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
A special exception to the GPL can be applied should you wish to distribute
|
||||
a combined work that includes FreeRTOS, without being obliged to provide
|
||||
the source code for any proprietary components. See the licensing section
|
||||
of http://www.FreeRTOS.org for full details of how and when the exception
|
||||
can be applied.
|
||||
|
||||
***************************************************************************
|
||||
See http://www.FreeRTOS.org for documentation, latest information, license
|
||||
and contact details. Please ensure to read the configuration and relevant
|
||||
port sections of the online documentation.
|
||||
***************************************************************************
|
||||
*/
|
||||
|
||||
#include "FreeRTOS.h"
|
||||
#include "partest.h"
|
||||
#include "board.h"
|
||||
|
||||
/*-----------------------------------------------------------
|
||||
* Simple parallel port IO routines for the LED's.
|
||||
*-----------------------------------------------------------*/
|
||||
|
||||
const unsigned portLONG led_mask[ NB_LED ]= { LED1, LED2, LED3, LED4 };
|
||||
|
||||
void vParTestInitialise( void )
|
||||
{
|
||||
/* Start with all LED's off. */
|
||||
AT91F_PIO_SetOutput( AT91C_BASE_PIOA, LED_MASK );
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
void vParTestSetLED( unsigned portBASE_TYPE uxLED, signed portBASE_TYPE xValue )
|
||||
{
|
||||
if( uxLED < ( portBASE_TYPE ) NB_LED )
|
||||
{
|
||||
if( xValue )
|
||||
{
|
||||
AT91F_PIO_SetOutput( AT91C_BASE_PIOA, led_mask[ uxLED ] );
|
||||
}
|
||||
else
|
||||
{
|
||||
AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, led_mask[ uxLED ]);
|
||||
}
|
||||
}
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
void vParTestToggleLED( unsigned portBASE_TYPE uxLED )
|
||||
{
|
||||
if( uxLED < ( portBASE_TYPE ) NB_LED )
|
||||
{
|
||||
if( AT91F_PIO_GetInput( AT91C_BASE_PIOA ) & led_mask[ uxLED ] )
|
||||
{
|
||||
AT91F_PIO_ClearOutput( AT91C_BASE_PIOA, led_mask[ uxLED ]);
|
||||
}
|
||||
else
|
||||
{
|
||||
AT91F_PIO_SetOutput( AT91C_BASE_PIOA, led_mask[ uxLED ] );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
89
Demo/ARM7_AT91SAM7S64_IAR/SrcIAR/Board.h
Normal file
89
Demo/ARM7_AT91SAM7S64_IAR/SrcIAR/Board.h
Normal file
@@ -0,0 +1,89 @@
|
||||
/*----------------------------------------------------------------------------
|
||||
* ATMEL Microcontroller Software Support - ROUSSET -
|
||||
*----------------------------------------------------------------------------
|
||||
* The software is delivered "AS IS" without warranty or condition of any
|
||||
* kind, either express, implied or statutory. This includes without
|
||||
* limitation any warranty or condition with respect to merchantability or
|
||||
* fitness for any particular purpose, or against the infringements of
|
||||
* intellectual property rights of others.
|
||||
*----------------------------------------------------------------------------
|
||||
* File Name : Board.h
|
||||
* Object : AT91SAM7S Evaluation Board Features Definition File.
|
||||
*
|
||||
* Creation : JPP 16/Jun/2004
|
||||
*----------------------------------------------------------------------------
|
||||
*/
|
||||
#ifndef Board_h
|
||||
#define Board_h
|
||||
|
||||
#include "AT91SAM7S64.h"
|
||||
#define __inline inline
|
||||
#include "lib_AT91SAM7S64.h"
|
||||
|
||||
#define true -1
|
||||
#define false 0
|
||||
|
||||
/*-------------------------------*/
|
||||
/* SAM7Board Memories Definition */
|
||||
/*-------------------------------*/
|
||||
// The AT91SAM7S64 embeds a 16-Kbyte SRAM bank, and 64 K-Byte Flash
|
||||
|
||||
#define INT_SARM 0x00200000
|
||||
#define INT_SARM_REMAP 0x00000000
|
||||
|
||||
#define INT_FLASH 0x00000000
|
||||
#define INT_FLASH_REMAP 0x01000000
|
||||
|
||||
#define FLASH_PAGE_NB 512
|
||||
#define FLASH_PAGE_SIZE 128
|
||||
|
||||
/*-----------------*/
|
||||
/* Leds Definition */
|
||||
/*-----------------*/
|
||||
/* PIO Flash PA PB PIN */
|
||||
#define LED1 (1<<0) /* PA0 / PGMEN0 & PWM0 TIOA0 48 */
|
||||
#define LED2 (1<<1) /* PA1 / PGMEN1 & PWM1 TIOB0 47 */
|
||||
#define LED3 (1<<2) /* PA2 & PWM2 SCK0 44 */
|
||||
#define LED4 (1<<3) /* PA3 & TWD NPCS3 43 */
|
||||
#define NB_LED 4
|
||||
|
||||
#define LED_MASK (LED1|LED2|LED3|LED4)
|
||||
|
||||
/*-------------------------*/
|
||||
/* Push Buttons Definition */
|
||||
/*-------------------------*/
|
||||
/* PIO Flash PA PB PIN */
|
||||
#define SW1_MASK (1<<19) /* PA19 / PGMD7 & RK FIQ 13 */
|
||||
#define SW2_MASK (1<<20) /* PA20 / PGMD8 & RF IRQ0 16 */
|
||||
#define SW3_MASK (1<<15) /* PA15 / PGM3 & TF TIOA1 20 */
|
||||
#define SW4_MASK (1<<14) /* PA14 / PGMD2 & SPCK PWM3 21 */
|
||||
#define SW_MASK (SW1_MASK|SW2_MASK|SW3_MASK|SW4_MASK)
|
||||
|
||||
|
||||
#define SW1 (1<<19) // PA19
|
||||
#define SW2 (1<<20) // PA20
|
||||
#define SW3 (1<<15) // PA15
|
||||
#define SW4 (1<<14) // PA14
|
||||
|
||||
/*------------------*/
|
||||
/* USART Definition */
|
||||
/*------------------*/
|
||||
/* SUB-D 9 points J3 DBGU*/
|
||||
#define DBGU_RXD AT91C_PA9_DRXD /* JP11 must be close */
|
||||
#define DBGU_TXD AT91C_PA10_DTXD /* JP12 must be close */
|
||||
#define AT91C_DBGU_BAUD 115200 // Baud rate
|
||||
|
||||
#define US_RXD_PIN AT91C_PA5_RXD0 /* JP9 must be close */
|
||||
#define US_TXD_PIN AT91C_PA6_TXD0 /* JP7 must be close */
|
||||
#define US_RTS_PIN AT91C_PA7_RTS0 /* JP8 must be close */
|
||||
#define US_CTS_PIN AT91C_PA8_CTS0 /* JP6 must be close */
|
||||
|
||||
/*--------------*/
|
||||
/* Master Clock */
|
||||
/*--------------*/
|
||||
|
||||
#define EXT_OC 18432000 // Exetrnal ocilator MAINCK
|
||||
#define MCK 47923200 // MCK (PLLRC div by 2)
|
||||
#define MCKKHz (MCK/1000) //
|
||||
|
||||
#endif /* Board_h */
|
||||
223
Demo/ARM7_AT91SAM7S64_IAR/SrcIAR/Cstartup.s79
Normal file
223
Demo/ARM7_AT91SAM7S64_IAR/SrcIAR/Cstartup.s79
Normal file
@@ -0,0 +1,223 @@
|
||||
;------------------------------------------------------------------------------
|
||||
;- ATMEL Microcontroller Software Support - ROUSSET -
|
||||
;------------------------------------------------------------------------------
|
||||
; The software is delivered "AS IS" without warranty or condition of any
|
||||
; kind, either express, implied or statutory. This includes without
|
||||
; limitation any warranty or condition with respect to merchantability or
|
||||
; fitness for any particular purpose, or against the infringements of
|
||||
; intellectual property rights of others.
|
||||
;-----------------------------------------------------------------------------
|
||||
;- File source : Cstartup.s79
|
||||
;- Object : Generic CStartup for IAR No Use REMAP
|
||||
;- Compilation flag : None
|
||||
;-
|
||||
;- 1.0 15/Jun/04 JPP : Creation
|
||||
;------------------------------------------------------------------------------
|
||||
|
||||
#include "AT91SAM7S64_inc.h"
|
||||
|
||||
;------------------------------------------------------------------------------
|
||||
;- Area Definition
|
||||
;------------------------------------------------------------------------------
|
||||
|
||||
;---------------------------------------------------------------
|
||||
; ?RESET
|
||||
; Reset Vector.
|
||||
; Normally, segment INTVEC is linked at address 0.
|
||||
; For debugging purposes, INTVEC may be placed at other
|
||||
; addresses.
|
||||
; A debugger that honors the entry point will start the
|
||||
; program in a normal way even if INTVEC is not at address 0.
|
||||
;-------------------------------------------------------------
|
||||
|
||||
PROGRAM ?RESET
|
||||
RSEG INTRAMSTART_REMAP
|
||||
RSEG INTRAMEND_REMAP
|
||||
|
||||
EXTERN vPortYieldProcessor
|
||||
|
||||
RSEG ICODE:CODE:ROOT(2)
|
||||
CODE32 ; Always ARM mode after reset
|
||||
org 0
|
||||
reset
|
||||
;------------------------------------------------------------------------------
|
||||
;- Exception vectors
|
||||
;--------------------
|
||||
;- These vectors can be read at address 0 or at RAM address
|
||||
;- They ABSOLUTELY requires to be in relative addresssing mode in order to
|
||||
;- guarantee a valid jump. For the moment, all are just looping.
|
||||
;- If an exception occurs before remap, this would result in an infinite loop.
|
||||
;- To ensure if a exeption occurs before start application to infinite loop.
|
||||
;------------------------------------------------------------------------------
|
||||
|
||||
B InitReset ; 0x00 Reset handler
|
||||
undefvec:
|
||||
B undefvec ; 0x04 Undefined Instruction
|
||||
swivec:
|
||||
B vPortYieldProcessor ; 0x08 Software Interrupt
|
||||
pabtvec:
|
||||
B pabtvec ; 0x0C Prefetch Abort
|
||||
dabtvec:
|
||||
B dabtvec ; 0x10 Data Abort
|
||||
rsvdvec:
|
||||
B rsvdvec ; 0x14 reserved
|
||||
irqvec:
|
||||
LDR PC, [PC, #-0xF20] ; Jump directly to the address given by the AIC
|
||||
|
||||
fiqvec: ; 0x1c FIQ
|
||||
|
||||
;------------------------------------------------------------------------------
|
||||
;- Function : FIQ_Handler_Entry
|
||||
;- Treatments : FIQ Controller Interrupt Handler.
|
||||
;- Called Functions : AIC_FVR[interrupt]
|
||||
;------------------------------------------------------------------------------
|
||||
|
||||
FIQ_Handler_Entry:
|
||||
|
||||
;- Switch in SVC/User Mode to allow User Stack access for C code
|
||||
; because the FIQ is not yet acknowledged
|
||||
|
||||
;- Save and r0 in FIQ_Register
|
||||
mov r9,r0
|
||||
ldr r0 , [r8, #AIC_FVR]
|
||||
msr CPSR_c,#I_BIT | F_BIT | ARM_MODE_SVC
|
||||
|
||||
;- Save scratch/used registers and LR in User Stack
|
||||
stmfd sp!, { r1-r3, r12, lr}
|
||||
|
||||
;- Branch to the routine pointed by the AIC_FVR
|
||||
mov r14, pc
|
||||
bx r0
|
||||
|
||||
;- Restore scratch/used registers and LR from User Stack
|
||||
ldmia sp!, { r1-r3, r12, lr}
|
||||
|
||||
;- Leave Interrupts disabled and switch back in FIQ mode
|
||||
msr CPSR_c, #I_BIT | F_BIT | ARM_MODE_FIQ
|
||||
|
||||
;- Restore the R0 ARM_MODE_SVC register
|
||||
mov r0,r9
|
||||
|
||||
;- Restore the Program Counter using the LR_fiq directly in the PC
|
||||
subs pc,lr,#4
|
||||
|
||||
InitReset:
|
||||
;------------------------------------------------------------------------------
|
||||
;- Low level Init (PMC, AIC, ? ....) by C function AT91F_LowLevelInit
|
||||
;------------------------------------------------------------------------------
|
||||
EXTERN AT91F_LowLevelInit
|
||||
|
||||
#define __iramend SFB(INTRAMEND_REMAP)
|
||||
|
||||
;- minumum C initialization
|
||||
;- call AT91F_LowLevelInit( void)
|
||||
|
||||
ldr r13,=__iramend ; temporary stack in internal RAM
|
||||
;--Call Low level init function in ABSOLUTE through the Interworking
|
||||
ldr r0,=AT91F_LowLevelInit
|
||||
mov lr, pc
|
||||
bx r0
|
||||
;------------------------------------------------------------------------------
|
||||
;- Stack Sizes Definition
|
||||
;------------------------
|
||||
;- Interrupt Stack requires 2 words x 8 priority level x 4 bytes when using
|
||||
;- the vectoring. This assume that the IRQ management.
|
||||
;- The Interrupt Stack must be adjusted depending on the interrupt handlers.
|
||||
;- Fast Interrupt not requires stack If in your application it required you must
|
||||
;- be definehere.
|
||||
;- The System stack size is not defined and is limited by the free internal
|
||||
;- SRAM.
|
||||
;------------------------------------------------------------------------------
|
||||
|
||||
;------------------------------------------------------------------------------
|
||||
;- Top of Stack Definition
|
||||
;-------------------------
|
||||
;- Interrupt and Supervisor Stack are located at the top of internal memory in
|
||||
;- order to speed the exception handling context saving and restoring.
|
||||
;- ARM_MODE_SVC (Application, C) Stack is located at the top of the external memory.
|
||||
;------------------------------------------------------------------------------
|
||||
|
||||
IRQ_STACK_SIZE EQU 300
|
||||
|
||||
ARM_MODE_FIQ EQU 0x11
|
||||
ARM_MODE_IRQ EQU 0x12
|
||||
ARM_MODE_SVC EQU 0x13
|
||||
|
||||
I_BIT EQU 0x80
|
||||
F_BIT EQU 0x40
|
||||
|
||||
;------------------------------------------------------------------------------
|
||||
;- Setup the stack for each mode
|
||||
;-------------------------------
|
||||
ldr r0, =__iramend
|
||||
|
||||
;- Set up Fast Interrupt Mode and set FIQ Mode Stack
|
||||
msr CPSR_c, #ARM_MODE_FIQ | I_BIT | F_BIT
|
||||
;- Init the FIQ register
|
||||
ldr r8, =AT91C_BASE_AIC
|
||||
|
||||
;- Set up Interrupt Mode and set IRQ Mode Stack
|
||||
msr CPSR_c, #ARM_MODE_IRQ | I_BIT | F_BIT
|
||||
mov r13, r0 ; Init stack IRQ
|
||||
sub r0, r0, #IRQ_STACK_SIZE
|
||||
|
||||
;- Enable interrupt & Set up Supervisor Mode and set Supervisor Mode Stack
|
||||
msr CPSR_c, #ARM_MODE_SVC
|
||||
mov r13, r0
|
||||
|
||||
|
||||
;---------------------------------------------------------------
|
||||
; ?CSTARTUP
|
||||
;---------------------------------------------------------------
|
||||
EXTERN __segment_init
|
||||
EXTERN main
|
||||
; Initialize segments.
|
||||
; __segment_init is assumed to use
|
||||
; instruction set and to be reachable by BL from the ICODE segment
|
||||
; (it is safest to link them in segment ICODE).
|
||||
ldr r0,=__segment_init
|
||||
mov lr, pc
|
||||
bx r0
|
||||
|
||||
PUBLIC __main
|
||||
?jump_to_main:
|
||||
ldr lr,=?call_exit
|
||||
ldr r0,=main
|
||||
__main:
|
||||
bx r0
|
||||
|
||||
;------------------------------------------------------------------------------
|
||||
;- Loop for ever
|
||||
;---------------
|
||||
;- End of application. Normally, never occur.
|
||||
;- Could jump on Software Reset ( B 0x0 ).
|
||||
;------------------------------------------------------------------------------
|
||||
?call_exit:
|
||||
End
|
||||
b End
|
||||
|
||||
|
||||
|
||||
;---------------------------------------------------------------
|
||||
; ?EXEPTION_VECTOR
|
||||
; This module is only linked if needed for closing files.
|
||||
;---------------------------------------------------------------
|
||||
PUBLIC AT91F_Default_FIQ_handler
|
||||
PUBLIC AT91F_Default_IRQ_handler
|
||||
PUBLIC AT91F_Spurious_handler
|
||||
|
||||
CODE32 ; Always ARM mode after exeption
|
||||
|
||||
AT91F_Default_FIQ_handler
|
||||
b AT91F_Default_FIQ_handler
|
||||
|
||||
AT91F_Default_IRQ_handler
|
||||
b AT91F_Default_IRQ_handler
|
||||
|
||||
AT91F_Spurious_handler
|
||||
b AT91F_Spurious_handler
|
||||
|
||||
ENDMOD
|
||||
|
||||
END
|
||||
|
||||
84
Demo/ARM7_AT91SAM7S64_IAR/SrcIAR/Cstartup_SAM7.c
Normal file
84
Demo/ARM7_AT91SAM7S64_IAR/SrcIAR/Cstartup_SAM7.c
Normal file
@@ -0,0 +1,84 @@
|
||||
//*----------------------------------------------------------------------------
|
||||
//* ATMEL Microcontroller Software Support - ROUSSET -
|
||||
//*----------------------------------------------------------------------------
|
||||
//* The software is delivered "AS IS" without warranty or condition of any
|
||||
//* kind, either express, implied or statutory. This includes without
|
||||
//* limitation any warranty or condition with respect to merchantability or
|
||||
//* fitness for any particular purpose, or against the infringements of
|
||||
//* intellectual property rights of others.
|
||||
//*----------------------------------------------------------------------------
|
||||
//* File Name : Cstartup_SAM7.c
|
||||
//* Object : Low level initializations written in C for IAR
|
||||
//* tools
|
||||
//* Creation : 12/Jun/04
|
||||
//*
|
||||
//*----------------------------------------------------------------------------
|
||||
|
||||
|
||||
// Include the board file description
|
||||
#include "Board.h"
|
||||
|
||||
// The following functions must be write in ARM mode this function called directly
|
||||
// by exception vector
|
||||
extern void AT91F_Spurious_handler(void);
|
||||
extern void AT91F_Default_IRQ_handler(void);
|
||||
extern void AT91F_Default_FIQ_handler(void);
|
||||
|
||||
//*----------------------------------------------------------------------------
|
||||
//* \fn AT91F_LowLevelInit
|
||||
//* \brief This function performs very low level HW initialization
|
||||
//* this function can be use a Stack, depending the compilation
|
||||
//* optimization mode
|
||||
//*----------------------------------------------------------------------------
|
||||
void AT91F_LowLevelInit( void );
|
||||
void AT91F_LowLevelInit( void) @ "ICODE"
|
||||
{
|
||||
int i;
|
||||
AT91PS_PMC pPMC = AT91C_BASE_PMC;
|
||||
//* Set Flash Waite sate
|
||||
// Single Cycle Access at Up to 30 MHz, or 40
|
||||
// if MCK = 47923200 I have 50 Cycle for 1 useconde ( flied MC_FMR->FMCN
|
||||
AT91C_BASE_MC->MC_FMR = ((AT91C_MC_FMCN)&(50 <<16)) | AT91C_MC_FWS_1FWS ;
|
||||
|
||||
//* Watchdog Disable
|
||||
AT91C_BASE_WDTC->WDTC_WDMR= AT91C_SYSC_WDDIS;
|
||||
|
||||
//* Set MCK at 47 923 200
|
||||
// 1 Enabling the Main Oscillator:
|
||||
// SCK = 1/32768 = 30.51 uSeconde
|
||||
// Start up time = 8 * 6 / SCK = 56 * 30.51 = 1,46484375 ms
|
||||
pPMC->PMC_MOR = (( AT91C_CKGR_OSCOUNT & (0x06 <<8) | AT91C_CKGR_MOSCEN ));
|
||||
// Wait the startup time
|
||||
while(!(pPMC->PMC_SR & AT91C_PMC_MOSCS));
|
||||
// 2 Checking the Main Oscillator Frequency (Optional)
|
||||
// 3 Setting PLL and divider:
|
||||
// - div by 5 Fin = 3,6864 =(18,432 / 5)
|
||||
// - Mul 25+1: Fout = 95,8464 =(3,6864 *26)
|
||||
// for 96 MHz the erroe is 0.16%
|
||||
// Field out NOT USED = 0
|
||||
// PLLCOUNT pll startup time esrtimate at : 0.844 ms
|
||||
// PLLCOUNT 28 = 0.000844 /(1/32768)
|
||||
pPMC->PMC_PLLR = ((AT91C_CKGR_DIV & 0x05) |
|
||||
(AT91C_CKGR_PLLCOUNT & (28<<8)) |
|
||||
(AT91C_CKGR_MUL & (25<<16)));
|
||||
|
||||
// Wait the startup time
|
||||
while(!(pPMC->PMC_SR & AT91C_PMC_LOCK));
|
||||
// 4. Selection of Master Clock and Processor Clock
|
||||
// select the PLL clock divided by 2
|
||||
pPMC->PMC_MCKR = AT91C_PMC_CSS_PLL_CLK | AT91C_PMC_PRES_CLK_2 ;
|
||||
|
||||
// Enable User Reset and set its minimal assertion to 960 us
|
||||
AT91C_BASE_RSTC->RSTC_RMR = AT91C_SYSC_URSTEN | (0x4<<8) | (unsigned int) (0xA5<<24);
|
||||
|
||||
|
||||
// Set up the default interrupts handler vectors
|
||||
AT91C_BASE_AIC->AIC_SVR[0] = (int) AT91F_Default_FIQ_handler ;
|
||||
for (i=1;i < 31; i++)
|
||||
{
|
||||
AT91C_BASE_AIC->AIC_SVR[i] = (int) AT91F_Default_IRQ_handler ;
|
||||
}
|
||||
AT91C_BASE_AIC->AIC_SPU = (int) AT91F_Spurious_handler ;
|
||||
|
||||
}
|
||||
|
||||
1273
Demo/ARM7_AT91SAM7S64_IAR/USB/USBSample.c
Normal file
1273
Demo/ARM7_AT91SAM7S64_IAR/USB/USBSample.c
Normal file
File diff suppressed because it is too large
Load Diff
8
Demo/ARM7_AT91SAM7S64_IAR/USB/USBSample.h
Normal file
8
Demo/ARM7_AT91SAM7S64_IAR/USB/USBSample.h
Normal file
@@ -0,0 +1,8 @@
|
||||
#ifndef USB_DEMO_H
|
||||
#define USB_DEMO_H
|
||||
|
||||
void vUSBDemoTask( void *pvParameters );
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
24
Demo/ARM7_AT91SAM7S64_IAR/USB/USB_ISR.s79
Normal file
24
Demo/ARM7_AT91SAM7S64_IAR/USB/USB_ISR.s79
Normal file
@@ -0,0 +1,24 @@
|
||||
RSEG ICODE:CODE
|
||||
CODE32
|
||||
|
||||
EXTERN vUSB_ISR
|
||||
PUBLIC vUSBISREntry
|
||||
|
||||
; Wrapper for the USB interrupt service routine. This can cause a
|
||||
; context switch so requires an assembly wrapper.
|
||||
|
||||
; Defines the portSAVE_CONTEXT and portRESTORE_CONTEXT macros.
|
||||
#include "ISR_Support.h"
|
||||
|
||||
vUSBISREntry:
|
||||
|
||||
portSAVE_CONTEXT ; Save the context of the current task.
|
||||
|
||||
bl vUSB_ISR ; Call the ISR routine.
|
||||
|
||||
portRESTORE_CONTEXT ; Restore the context of the current task -
|
||||
; which may be different to the task that
|
||||
; was interrupted.
|
||||
|
||||
END
|
||||
|
||||
252
Demo/ARM7_AT91SAM7S64_IAR/main.c
Normal file
252
Demo/ARM7_AT91SAM7S64_IAR/main.c
Normal file
@@ -0,0 +1,252 @@
|
||||
/*
|
||||
FreeRTOS V4.0.1 - Copyright (C) 2003-2006 Richard Barry.
|
||||
|
||||
This file is part of the FreeRTOS distribution.
|
||||
|
||||
FreeRTOS 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 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
FreeRTOS 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 FreeRTOS; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
A special exception to the GPL can be applied should you wish to distribute
|
||||
a combined work that includes FreeRTOS, without being obliged to provide
|
||||
the source code for any proprietary components. See the licensing section
|
||||
of http://www.FreeRTOS.org for full details of how and when the exception
|
||||
can be applied.
|
||||
|
||||
***************************************************************************
|
||||
See http://www.FreeRTOS.org for documentation, latest information, license
|
||||
and contact details. Please ensure to read the configuration and relevant
|
||||
port sections of the online documentation.
|
||||
***************************************************************************
|
||||
*/
|
||||
|
||||
/*
|
||||
NOTE : Tasks run in system mode and the scheduler runs in Supervisor mode.
|
||||
The processor MUST be in supervisor mode when vTaskStartScheduler is
|
||||
called. The demo applications included in the FreeRTOS.org download switch
|
||||
to supervisor mode prior to main being called. If you are not using one of
|
||||
these demo application projects then ensure Supervisor mode is used.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Creates all the demo application tasks, then starts the scheduler. The WEB
|
||||
* documentation provides more details of the demo application tasks. The SAM7
|
||||
* includes a sample USB that emulates a Joystick input to a USB host.
|
||||
*
|
||||
* Main.c also creates a task called "Check". This only executes every three
|
||||
* seconds but has the highest priority so is guaranteed to get processor time.
|
||||
* Its main function is to check that all the other tasks are still operational.
|
||||
* Each task (other than the "flash" tasks) maintains a unique count that is
|
||||
* incremented each time the task successfully completes its function. Should
|
||||
* any error occur within such a task the count is permanently halted. The
|
||||
* check task inspects the count of each task to ensure it has changed since
|
||||
* the last time the check task executed. If all the count variables have
|
||||
* changed all the tasks are still executing error free, and the check task
|
||||
* toggles the onboard LED. Should any task contain an error at any time
|
||||
* the LED toggle rate will change from 3 seconds to 500ms.
|
||||
*
|
||||
*/
|
||||
|
||||
/* Standard includes. */
|
||||
#include <stdlib.h>
|
||||
|
||||
/* Scheduler includes. */
|
||||
#include "FreeRTOS.h"
|
||||
#include "task.h"
|
||||
|
||||
/* Demo application includes. */
|
||||
#include "flash.h"
|
||||
#include "integer.h"
|
||||
#include "PollQ.h"
|
||||
#include "BlockQ.h"
|
||||
#include "semtest.h"
|
||||
#include "dynamic.h"
|
||||
#include "partest.h"
|
||||
#include "comtest2.h"
|
||||
#include "USB/USBSample.h"
|
||||
|
||||
/* Priorities for the demo application tasks. */
|
||||
#define mainLED_TASK_PRIORITY ( tskIDLE_PRIORITY + 3 )
|
||||
#define mainQUEUE_POLL_PRIORITY ( tskIDLE_PRIORITY + 2 )
|
||||
#define mainCHECK_TASK_PRIORITY ( tskIDLE_PRIORITY + 4 )
|
||||
#define mainSEM_TEST_PRIORITY ( tskIDLE_PRIORITY + 1 )
|
||||
#define mainBLOCK_Q_PRIORITY ( tskIDLE_PRIORITY + 2 )
|
||||
#define mainCOM_TEST_PRIORITY ( tskIDLE_PRIORITY + 2 )
|
||||
#define mainUSB_PRIORITY ( tskIDLE_PRIORITY + 2 )
|
||||
|
||||
/* Constants required by the 'Check' task. */
|
||||
#define mainNO_ERROR_FLASH_PERIOD ( ( portTickType ) 3000 / portTICK_RATE_MS )
|
||||
#define mainERROR_FLASH_PERIOD ( ( portTickType ) 500 / portTICK_RATE_MS )
|
||||
#define mainCHECK_TASK_LED ( 3 )
|
||||
|
||||
/* Constants for the ComTest tasks. */
|
||||
#define mainCOM_TEST_BAUD_RATE ( ( unsigned portLONG ) 115200 )
|
||||
#define mainCOM_TEST_LED ( 4 ) /* Off the board. */
|
||||
|
||||
/*
|
||||
* The task that executes at the highest priority and calls
|
||||
* prvCheckOtherTasksAreStillRunning(). See the description at the top
|
||||
* of the file.
|
||||
*/
|
||||
static void vErrorChecks( void *pvParameters );
|
||||
|
||||
/*
|
||||
* Configure the processor for use with the Atmel demo board. Setup is minimal
|
||||
* as the low level init function (called from the startup asm file) takes care
|
||||
* of most things.
|
||||
*/
|
||||
static void prvSetupHardware( void );
|
||||
|
||||
/*
|
||||
* Checks that all the demo application tasks are still executing without error
|
||||
* - as described at the top of the file.
|
||||
*/
|
||||
static portLONG prvCheckOtherTasksAreStillRunning( void );
|
||||
|
||||
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
/*
|
||||
* Starts all the other tasks, then starts the scheduler.
|
||||
*/
|
||||
void main( void )
|
||||
{
|
||||
/* Setup any hardware that has not already been configured by the low
|
||||
level init routines. */
|
||||
prvSetupHardware();
|
||||
|
||||
/* Initialise the LED outputs for use by the demo application tasks. */
|
||||
vParTestInitialise();
|
||||
|
||||
/* Start all the standard demo application tasks. */
|
||||
vStartIntegerMathTasks( tskIDLE_PRIORITY );
|
||||
vStartLEDFlashTasks( mainLED_TASK_PRIORITY );
|
||||
vStartPolledQueueTasks( mainQUEUE_POLL_PRIORITY );
|
||||
vStartSemaphoreTasks( mainSEM_TEST_PRIORITY );
|
||||
vStartBlockingQueueTasks( mainBLOCK_Q_PRIORITY );
|
||||
vStartDynamicPriorityTasks();
|
||||
vAltStartComTestTasks( mainCOM_TEST_PRIORITY, mainCOM_TEST_BAUD_RATE, mainCOM_TEST_LED );
|
||||
|
||||
/* Also start the USB demo which is just for the SAM7. */
|
||||
xTaskCreate( vUSBDemoTask, "USB", configMINIMAL_STACK_SIZE, NULL, mainUSB_PRIORITY, NULL );
|
||||
|
||||
/* Start the check task - which is defined in this file. */
|
||||
xTaskCreate( vErrorChecks, "Check", configMINIMAL_STACK_SIZE, NULL, mainCHECK_TASK_PRIORITY, NULL );
|
||||
|
||||
/* Start the scheduler.
|
||||
|
||||
NOTE : Tasks run in system mode and the scheduler runs in Supervisor mode.
|
||||
The processor MUST be in supervisor mode when vTaskStartScheduler is
|
||||
called. The demo applications included in the FreeRTOS.org download switch
|
||||
to supervisor mode prior to main being called. If you are not using one of
|
||||
these demo application projects then ensure Supervisor mode is used here. */
|
||||
|
||||
vTaskStartScheduler();
|
||||
|
||||
/* We should never get here as control is now taken by the scheduler. */
|
||||
return;
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
static void prvSetupHardware( void )
|
||||
{
|
||||
/* When using the JTAG debugger the hardware is not always initialised to
|
||||
the correct default state. This line just ensures that this does not
|
||||
cause all interrupts to be masked at the start. */
|
||||
AT91C_BASE_AIC->AIC_EOICR = 0;
|
||||
|
||||
/* Most setup is performed by the low level init function called from the
|
||||
startup asm file. */
|
||||
|
||||
/* Configure the PIO Lines corresponding to LED1 to LED4 to be outputs as
|
||||
well as the UART Tx line. */
|
||||
AT91F_PIO_CfgOutput( AT91C_BASE_PIOA, LED_MASK );
|
||||
|
||||
/* Enable the peripheral clock. */
|
||||
AT91F_PMC_EnablePeriphClock( AT91C_BASE_PMC, 1 << AT91C_ID_PIOA );
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
static void vErrorChecks( void *pvParameters )
|
||||
{
|
||||
portTickType xDelayPeriod = mainNO_ERROR_FLASH_PERIOD;
|
||||
|
||||
/* The parameters are not used in this task. */
|
||||
( void ) pvParameters;
|
||||
|
||||
/* Cycle for ever, delaying then checking all the other tasks are still
|
||||
operating without error. If an error is detected then the delay period
|
||||
is decreased from mainNO_ERROR_FLASH_PERIOD to mainERROR_FLASH_PERIOD so
|
||||
the on board LED flash rate will increase. */
|
||||
|
||||
for( ;; )
|
||||
{
|
||||
/* Delay until it is time to execute again. */
|
||||
vTaskDelay( xDelayPeriod );
|
||||
|
||||
/* Check all the standard demo application tasks are executing without
|
||||
error. */
|
||||
if( prvCheckOtherTasksAreStillRunning() != pdPASS )
|
||||
{
|
||||
/* An error has been detected in one of the tasks - flash faster. */
|
||||
xDelayPeriod = mainERROR_FLASH_PERIOD;
|
||||
}
|
||||
|
||||
vParTestToggleLED( mainCHECK_TASK_LED );
|
||||
}
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
static portLONG prvCheckOtherTasksAreStillRunning( void )
|
||||
{
|
||||
portLONG lReturn = ( portLONG ) pdPASS;
|
||||
|
||||
/* Check all the demo tasks (other than the flash tasks) to ensure
|
||||
that they are all still running, and that none of them have detected
|
||||
an error. */
|
||||
|
||||
if( xAreIntegerMathsTaskStillRunning() != pdTRUE )
|
||||
{
|
||||
lReturn = ( portLONG ) pdFAIL;
|
||||
}
|
||||
|
||||
if( xArePollingQueuesStillRunning() != pdTRUE )
|
||||
{
|
||||
lReturn = ( portLONG ) pdFAIL;
|
||||
}
|
||||
|
||||
if( xAreSemaphoreTasksStillRunning() != pdTRUE )
|
||||
{
|
||||
lReturn = ( portLONG ) pdFAIL;
|
||||
}
|
||||
|
||||
if( xAreBlockingQueuesStillRunning() != pdTRUE )
|
||||
{
|
||||
lReturn = ( portLONG ) pdFAIL;
|
||||
}
|
||||
|
||||
if( xAreComTestTasksStillRunning() != pdTRUE )
|
||||
{
|
||||
lReturn = ( portLONG ) pdFAIL;
|
||||
}
|
||||
|
||||
if( xAreDynamicPriorityTasksStillRunning() != pdTRUE )
|
||||
{
|
||||
lReturn = ( portLONG ) pdFAIL;
|
||||
}
|
||||
|
||||
return lReturn;
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
|
||||
180
Demo/ARM7_AT91SAM7S64_IAR/resource/SAM7.mac
Normal file
180
Demo/ARM7_AT91SAM7S64_IAR/resource/SAM7.mac
Normal file
@@ -0,0 +1,180 @@
|
||||
// ---------------------------------------------------------
|
||||
// ATMEL Microcontroller Software Support - ROUSSET -
|
||||
// ---------------------------------------------------------
|
||||
// The software is delivered "AS IS" without warranty or
|
||||
// condition of any kind, either express, implied or
|
||||
// statutory. This includes without limitation any warranty
|
||||
// or condition with respect to merchantability or fitness
|
||||
// for any particular purpose, or against the infringements of
|
||||
// intellectual property rights of others.
|
||||
// ---------------------------------------------------------
|
||||
// File: SAM7.mac
|
||||
//
|
||||
// User setup file for CSPY debugger to simulate interrupt
|
||||
// driven Fibonacchi data input.
|
||||
// 1.1 16/Jun/04 JPP : Creation
|
||||
//
|
||||
// $Revision: 1.3 $
|
||||
//
|
||||
// ---------------------------------------------------------
|
||||
|
||||
__var i;
|
||||
__var pt;
|
||||
|
||||
execUserPreload()
|
||||
{
|
||||
//* Set the RAM memory at 0x0020 0000 for code AT 0 flash area
|
||||
CheckRemap();
|
||||
//* Get the Chip ID (AT91C_DBGU_C1R & AT91C_DBGU_C2R
|
||||
i=__readMemory32(0xFFFFF240,"Memory");
|
||||
__message " ---------------------------------------- Chip ID 0x",i:%X;
|
||||
i=__readMemory32(0xFFFFF244,"Memory");
|
||||
__message " ---------------------------------------- Extention 0x",i:%X;
|
||||
//* Get the chip status
|
||||
|
||||
//* Init AIC
|
||||
AIC();
|
||||
//* Watchdog Disable
|
||||
Watchdog();
|
||||
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Watchdog
|
||||
//-------------------------------
|
||||
// Normally, the Watchdog is enable at the reset for load it's preferable to
|
||||
// Disable.
|
||||
//-----------------------------------------------------------------------------
|
||||
Watchdog()
|
||||
{
|
||||
//* Watchdog Disable
|
||||
// AT91C_BASE_WDTC->WDTC_WDMR= AT91C_SYSC_WDDIS;
|
||||
__writeMemory32(0x00008000,0xFFFFFD44,"Memory");
|
||||
__message "------------------------------- Watchdog Disable ----------------------------------------";
|
||||
}
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Check Remap
|
||||
//-------------
|
||||
//-----------------------------------------------------------------------------
|
||||
CheckRemap()
|
||||
{
|
||||
//* Read the value at 0x0
|
||||
i=__readMemory32(0x00000000,"Memory");
|
||||
i=i+1;
|
||||
__writeMemory32(i,0x00,"Memory");
|
||||
pt=__readMemory32(0x00000000,"Memory");
|
||||
|
||||
if (i == pt)
|
||||
{
|
||||
__message "------------------------------- The Remap is done ----------------------------------------";
|
||||
//* Toggel RESET The remap
|
||||
__writeMemory32(0x00000001,0xFFFFFF00,"Memory");
|
||||
|
||||
} else {
|
||||
__message "------------------------------- The Remap is NOT -----------------------------------------";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
execUserSetup()
|
||||
{
|
||||
ini();
|
||||
__message "-------------------------------Set PC ----------------------------------------";
|
||||
__writeMemory32(0x00000000,0xB4,"Register");
|
||||
}
|
||||
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Reset the Interrupt Controller
|
||||
//-------------------------------
|
||||
// Normally, the code is executed only if a reset has been actually performed.
|
||||
// So, the AIC initialization resumes at setting up the default vectors.
|
||||
//-----------------------------------------------------------------------------
|
||||
AIC()
|
||||
{
|
||||
// Mask All interrupt pAic->AIC_IDCR = 0xFFFFFFFF;
|
||||
__writeMemory32(0xFFFFFFFF,0xFFFFF124,"Memory");
|
||||
|
||||
for (i=0;i < 8; i++)
|
||||
{
|
||||
// AT91C_BASE_AIC->AIC_EOICR
|
||||
pt = __readMemory32(0xFFFFF130,"Memory");
|
||||
|
||||
}
|
||||
__message "------------------------------- AIC INIT ---------------------------------------------";
|
||||
}
|
||||
|
||||
ini()
|
||||
{
|
||||
__writeMemory32(0x0,0x00,"Register");
|
||||
__writeMemory32(0x0,0x04,"Register");
|
||||
__writeMemory32(0x0,0x08,"Register");
|
||||
__writeMemory32(0x0,0x0C,"Register");
|
||||
__writeMemory32(0x0,0x10,"Register");
|
||||
__writeMemory32(0x0,0x14,"Register");
|
||||
__writeMemory32(0x0,0x18,"Register");
|
||||
__writeMemory32(0x0,0x1C,"Register");
|
||||
__writeMemory32(0x0,0x20,"Register");
|
||||
__writeMemory32(0x0,0x24,"Register");
|
||||
__writeMemory32(0x0,0x28,"Register");
|
||||
__writeMemory32(0x0,0x2C,"Register");
|
||||
__writeMemory32(0x0,0x30,"Register");
|
||||
__writeMemory32(0x0,0x34,"Register");
|
||||
__writeMemory32(0x0,0x38,"Register");
|
||||
|
||||
// Set CPSR
|
||||
__writeMemory32(0x0D3,0x98,"Register");
|
||||
|
||||
|
||||
}
|
||||
|
||||
RG()
|
||||
{
|
||||
|
||||
i=__readMemory32(0x00,"Register"); __message "R00 0x",i:%X;
|
||||
i=__readMemory32(0x04,"Register"); __message "R01 0x",i:%X;
|
||||
i=__readMemory32(0x08,"Register"); __message "R02 0x",i:%X;
|
||||
i=__readMemory32(0x0C,"Register"); __message "R03 0x",i:%X;
|
||||
i=__readMemory32(0x10,"Register"); __message "R04 0x",i:%X;
|
||||
i=__readMemory32(0x14,"Register"); __message "R05 0x",i:%X;
|
||||
i=__readMemory32(0x18,"Register"); __message "R06 0x",i:%X;
|
||||
i=__readMemory32(0x1C,"Register"); __message "R07 0x",i:%X;
|
||||
i=__readMemory32(0x20,"Register"); __message "R08 0x",i:%X;
|
||||
i=__readMemory32(0x24,"Register"); __message "R09 0x",i:%X;
|
||||
i=__readMemory32(0x28,"Register"); __message "R10 0x",i:%X;
|
||||
i=__readMemory32(0x2C,"Register"); __message "R11 0x",i:%X;
|
||||
i=__readMemory32(0x30,"Register"); __message "R12 0x",i:%X;
|
||||
i=__readMemory32(0x34,"Register"); __message "R13 0x",i:%X;
|
||||
i=__readMemory32(0x38,"Register"); __message "R14 0x",i:%X;
|
||||
i=__readMemory32(0x3C,"Register"); __message "R13 SVC 0x",i:%X;
|
||||
i=__readMemory32(0x40,"Register"); __message "R14 SVC 0x",i:%X;
|
||||
i=__readMemory32(0x44,"Register"); __message "R13 ABT 0x",i:%X;
|
||||
i=__readMemory32(0x48,"Register"); __message "R14 ABT 0x",i:%X;
|
||||
i=__readMemory32(0x4C,"Register"); __message "R13 UND 0x",i:%X;
|
||||
i=__readMemory32(0x50,"Register"); __message "R14 UND 0x",i:%X;
|
||||
i=__readMemory32(0x54,"Register"); __message "R13 IRQ 0x",i:%X;
|
||||
i=__readMemory32(0x58,"Register"); __message "R14 IRQ 0x",i:%X;
|
||||
i=__readMemory32(0x5C,"Register"); __message "R08 FIQ 0x",i:%X;
|
||||
i=__readMemory32(0x60,"Register"); __message "R09 FIQ 0x",i:%X;
|
||||
i=__readMemory32(0x64,"Register"); __message "R10 FIQ 0x",i:%X;
|
||||
i=__readMemory32(0x68,"Register"); __message "R11 FIQ 0x",i:%X;
|
||||
i=__readMemory32(0x6C,"Register"); __message "R12 FIQ 0x",i:%X;
|
||||
i=__readMemory32(0x70,"Register"); __message "R13 FIQ 0x",i:%X;
|
||||
i=__readMemory32(0x74,"Register"); __message "R14 FIQ0x",i:%X;
|
||||
i=__readMemory32(0x98,"Register"); __message "CPSR ",i:%X;
|
||||
i=__readMemory32(0x94,"Register"); __message "SPSR ",i:%X;
|
||||
i=__readMemory32(0x9C,"Register"); __message "SPSR ABT ",i:%X;
|
||||
i=__readMemory32(0xA0,"Register"); __message "SPSR ABT ",i:%X;
|
||||
i=__readMemory32(0xA4,"Register"); __message "SPSR UND ",i:%X;
|
||||
i=__readMemory32(0xA8,"Register"); __message "SPSR IRQ ",i:%X;
|
||||
i=__readMemory32(0xAC,"Register"); __message "SPSR FIQ ",i:%X;
|
||||
|
||||
i=__readMemory32(0xB4,"Register"); __message "PC 0x",i:%X;
|
||||
|
||||
}
|
||||
|
||||
211
Demo/ARM7_AT91SAM7S64_IAR/resource/SAM7_RAM.mac
Normal file
211
Demo/ARM7_AT91SAM7S64_IAR/resource/SAM7_RAM.mac
Normal file
@@ -0,0 +1,211 @@
|
||||
// ---------------------------------------------------------
|
||||
// ATMEL Microcontroller Software Support - ROUSSET -
|
||||
// ---------------------------------------------------------
|
||||
// The software is delivered "AS IS" without warranty or
|
||||
// condition of any kind, either express, implied or
|
||||
// statutory. This includes without limitation any warranty
|
||||
// or condition with respect to merchantability or fitness
|
||||
// for any particular purpose, or against the infringements of
|
||||
// intellectual property rights of others.
|
||||
// ---------------------------------------------------------
|
||||
// File: SAM7_RAM.mac
|
||||
//
|
||||
// User setup file for CSPY debugger to simulate interrupt
|
||||
// driven Fibonacchi data input.
|
||||
// 1.1 16/Jun/04 JPP : Creation
|
||||
// 1.2 27/Aug/04 JPP : PLL setting
|
||||
//
|
||||
// $Revision: 1.3 $
|
||||
//
|
||||
// ---------------------------------------------------------
|
||||
|
||||
__var i;
|
||||
__var pt;
|
||||
|
||||
execUserPreload()
|
||||
{
|
||||
//*
|
||||
PllSetting();
|
||||
//* Set the RAM memory at 0x0020 0000 for code AT 0 flash area
|
||||
CheckNoRemap();
|
||||
//* Get the Chip ID (AT91C_DBGU_C1R & AT91C_DBGU_C2R
|
||||
i=__readMemory32(0xFFFFF240,"Memory");
|
||||
__message " ---------------------------------------- Chip ID 0x",i:%X;
|
||||
i=__readMemory32(0xFFFFF244,"Memory");
|
||||
__message " ---------------------------------------- Extention 0x",i:%X;
|
||||
i=__readMemory32(0xFFFFFF6C,"Memory");
|
||||
__message " ---------------------------------------- Flash Version 0x",i:%X;
|
||||
//* Get the chip status
|
||||
|
||||
//* Init AIC
|
||||
AIC();
|
||||
//* Watchdog Disable
|
||||
Watchdog();
|
||||
}
|
||||
//-----------------------------------------------------------------------------
|
||||
// PllSetting
|
||||
//-------------------------------
|
||||
// Set PLL
|
||||
//-----------------------------------------------------------------------------
|
||||
PllSetting()
|
||||
{
|
||||
// -1- Enabling the Main Oscillator:
|
||||
//*#define AT91C_PMC_MOR ((AT91_REG *) 0xFFFFFC20) // (PMC) Main Oscillator Register
|
||||
//*#define AT91C_PMC_PLLR ((AT91_REG *) 0xFFFFFC2C) // (PMC) PLL Register
|
||||
//*#define AT91C_PMC_MCKR ((AT91_REG *) 0xFFFFFC30) // (PMC) Master Clock Register
|
||||
|
||||
//*pPMC->PMC_MOR = (( AT91C_CKGR_OSCOUNT & (0x06 <<8) | //0x0000 0600
|
||||
// AT91C_CKGR_MOSCEN )); //0x0000 0001
|
||||
__writeMemory32(0x00000601,0xFFFFFC20,"Memory");
|
||||
|
||||
// -2- Wait
|
||||
// -3- Setting PLL and divider:
|
||||
// - div by 5 Fin = 3,6864 =(18,432 / 5)
|
||||
// - Mul 25+1: Fout = 95,8464 =(3,6864 *26)
|
||||
// for 96 MHz the erroe is 0.16%
|
||||
// Field out NOT USED = 0
|
||||
// PLLCOUNT pll startup time esrtimate at : 0.844 ms
|
||||
// PLLCOUNT 28 = 0.000844 /(1/32768)
|
||||
// pPMC->PMC_PLLR = ((AT91C_CKGR_DIV & 0x05) | //0x0000 0005
|
||||
// (AT91C_CKGR_PLLCOUNT & (28<<8)) //0x0000 1C00
|
||||
// (AT91C_CKGR_MUL & (25<<16))); //0x0019 0000
|
||||
__writeMemory32(0x00191C05,0xFFFFFC2C,"Memory");
|
||||
// -2- Wait
|
||||
// -5- Selection of Master Clock and Processor Clock
|
||||
// select the PLL clock divided by 2
|
||||
// pPMC->PMC_MCKR = AT91C_PMC_CSS_PLL_CLK | //0x0000 0003
|
||||
// AT91C_PMC_PRES_CLK_2 ; //0x0000 0004
|
||||
__writeMemory32(0x00000007,0xFFFFFC30,"Memory");
|
||||
|
||||
__message "------------------------------- PLL Enable ----------------------------------------";
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Watchdog
|
||||
//-------------------------------
|
||||
// Normally, the Watchdog is enable at the reset for load it's preferable to
|
||||
// Disable.
|
||||
//-----------------------------------------------------------------------------
|
||||
Watchdog()
|
||||
{
|
||||
//* Watchdog Disable
|
||||
// AT91C_BASE_WDTC->WDTC_WDMR= AT91C_SYSC_WDDIS;
|
||||
__writeMemory32(0x00008000,0xFFFFFD44,"Memory");
|
||||
__message "------------------------------- Watchdog Disable ----------------------------------------";
|
||||
}
|
||||
|
||||
CheckNoRemap()
|
||||
{
|
||||
//* Read the value at 0x0
|
||||
i=__readMemory32(0x00000000,"Memory");
|
||||
i=i+1;
|
||||
__writeMemory32(i,0x00,"Memory");
|
||||
pt=__readMemory32(0x00000000,"Memory");
|
||||
|
||||
if (i == pt)
|
||||
{
|
||||
__message "------------------------------- The Remap is done ----------------------------------------";
|
||||
|
||||
} else {
|
||||
__message "------------------------------- The Remap is NOT -----------------------------------------";
|
||||
//* Toggel RESET The remap
|
||||
__writeMemory32(0x00000001,0xFFFFFF00,"Memory");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
execUserSetup()
|
||||
{
|
||||
ini();
|
||||
__message "-------------------------------Set PC ----------------------------------------";
|
||||
__writeMemory32(0x00000000,0xB4,"Register");
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
// Reset the Interrupt Controller
|
||||
//-------------------------------
|
||||
// Normally, the code is executed only if a reset has been actually performed.
|
||||
// So, the AIC initialization resumes at setting up the default vectors.
|
||||
//-----------------------------------------------------------------------------
|
||||
AIC()
|
||||
{
|
||||
// Mask All interrupt pAic->AIC_IDCR = 0xFFFFFFFF;
|
||||
__writeMemory32(0xFFFFFFFF,0xFFFFF124,"Memory");
|
||||
|
||||
for (i=0;i < 8; i++)
|
||||
{
|
||||
// AT91C_BASE_AIC->AIC_EOICR
|
||||
pt = __readMemory32(0xFFFFF130,"Memory");
|
||||
|
||||
}
|
||||
__message "------------------------------- AIC INIT ---------------------------------------------";
|
||||
}
|
||||
|
||||
ini()
|
||||
{
|
||||
__writeMemory32(0x0,0x00,"Register");
|
||||
__writeMemory32(0x0,0x04,"Register");
|
||||
__writeMemory32(0x0,0x08,"Register");
|
||||
__writeMemory32(0x0,0x0C,"Register");
|
||||
__writeMemory32(0x0,0x10,"Register");
|
||||
__writeMemory32(0x0,0x14,"Register");
|
||||
__writeMemory32(0x0,0x18,"Register");
|
||||
__writeMemory32(0x0,0x1C,"Register");
|
||||
__writeMemory32(0x0,0x20,"Register");
|
||||
__writeMemory32(0x0,0x24,"Register");
|
||||
__writeMemory32(0x0,0x28,"Register");
|
||||
__writeMemory32(0x0,0x2C,"Register");
|
||||
__writeMemory32(0x0,0x30,"Register");
|
||||
__writeMemory32(0x0,0x34,"Register");
|
||||
__writeMemory32(0x0,0x38,"Register");
|
||||
|
||||
// Set CPSR
|
||||
__writeMemory32(0x0D3,0x98,"Register");
|
||||
|
||||
}
|
||||
|
||||
RG()
|
||||
{
|
||||
|
||||
i=__readMemory32(0x00,"Register"); __message "R00 0x",i:%X;
|
||||
i=__readMemory32(0x04,"Register"); __message "R01 0x",i:%X;
|
||||
i=__readMemory32(0x08,"Register"); __message "R02 0x",i:%X;
|
||||
i=__readMemory32(0x0C,"Register"); __message "R03 0x",i:%X;
|
||||
i=__readMemory32(0x10,"Register"); __message "R04 0x",i:%X;
|
||||
i=__readMemory32(0x14,"Register"); __message "R05 0x",i:%X;
|
||||
i=__readMemory32(0x18,"Register"); __message "R06 0x",i:%X;
|
||||
i=__readMemory32(0x1C,"Register"); __message "R07 0x",i:%X;
|
||||
i=__readMemory32(0x20,"Register"); __message "R08 0x",i:%X;
|
||||
i=__readMemory32(0x24,"Register"); __message "R09 0x",i:%X;
|
||||
i=__readMemory32(0x28,"Register"); __message "R10 0x",i:%X;
|
||||
i=__readMemory32(0x2C,"Register"); __message "R11 0x",i:%X;
|
||||
i=__readMemory32(0x30,"Register"); __message "R12 0x",i:%X;
|
||||
i=__readMemory32(0x34,"Register"); __message "R13 0x",i:%X;
|
||||
i=__readMemory32(0x38,"Register"); __message "R14 0x",i:%X;
|
||||
i=__readMemory32(0x3C,"Register"); __message "R13 SVC 0x",i:%X;
|
||||
i=__readMemory32(0x40,"Register"); __message "R14 SVC 0x",i:%X;
|
||||
i=__readMemory32(0x44,"Register"); __message "R13 ABT 0x",i:%X;
|
||||
i=__readMemory32(0x48,"Register"); __message "R14 ABT 0x",i:%X;
|
||||
i=__readMemory32(0x4C,"Register"); __message "R13 UND 0x",i:%X;
|
||||
i=__readMemory32(0x50,"Register"); __message "R14 UND 0x",i:%X;
|
||||
i=__readMemory32(0x54,"Register"); __message "R13 IRQ 0x",i:%X;
|
||||
i=__readMemory32(0x58,"Register"); __message "R14 IRQ 0x",i:%X;
|
||||
i=__readMemory32(0x5C,"Register"); __message "R08 FIQ 0x",i:%X;
|
||||
i=__readMemory32(0x60,"Register"); __message "R09 FIQ 0x",i:%X;
|
||||
i=__readMemory32(0x64,"Register"); __message "R10 FIQ 0x",i:%X;
|
||||
i=__readMemory32(0x68,"Register"); __message "R11 FIQ 0x",i:%X;
|
||||
i=__readMemory32(0x6C,"Register"); __message "R12 FIQ 0x",i:%X;
|
||||
i=__readMemory32(0x70,"Register"); __message "R13 FIQ 0x",i:%X;
|
||||
i=__readMemory32(0x74,"Register"); __message "R14 FIQ0x",i:%X;
|
||||
i=__readMemory32(0x98,"Register"); __message "CPSR ",i:%X;
|
||||
i=__readMemory32(0x94,"Register"); __message "SPSR ",i:%X;
|
||||
i=__readMemory32(0x9C,"Register"); __message "SPSR ABT ",i:%X;
|
||||
i=__readMemory32(0xA0,"Register"); __message "SPSR ABT ",i:%X;
|
||||
i=__readMemory32(0xA4,"Register"); __message "SPSR UND ",i:%X;
|
||||
i=__readMemory32(0xA8,"Register"); __message "SPSR IRQ ",i:%X;
|
||||
i=__readMemory32(0xAC,"Register"); __message "SPSR FIQ ",i:%X;
|
||||
|
||||
i=__readMemory32(0xB4,"Register"); __message "PC 0x",i:%X;
|
||||
|
||||
}
|
||||
|
||||
135
Demo/ARM7_AT91SAM7S64_IAR/resource/at91SAM7S64_16KRAM.xcl
Normal file
135
Demo/ARM7_AT91SAM7S64_IAR/resource/at91SAM7S64_16KRAM.xcl
Normal file
@@ -0,0 +1,135 @@
|
||||
// ---------------------------------------------------------
|
||||
// ATMEL Microcontroller Software Support - ROUSSET -
|
||||
// ---------------------------------------------------------
|
||||
// The software is delivered "AS IS" without warranty or
|
||||
// condition of any kind, either express, implied or
|
||||
// statutory. This includes without limitation any warranty
|
||||
// or condition with respect to merchantability or fitness
|
||||
// for any particular purpose, or against the infringements of
|
||||
// intellectual property rights of others.
|
||||
// ---------------------------------------------------------
|
||||
// File: at91SAM7S64_16KRAM.xlc
|
||||
//
|
||||
// 1.1 16/Jun/04 JPP : Creation for 4.11A
|
||||
//
|
||||
// $Revision: 1.1.1.1 $
|
||||
//
|
||||
// ---------------------------------------------------------
|
||||
|
||||
//*************************************************************************
|
||||
// XLINK command file template for EWARM/ICCARM
|
||||
//
|
||||
// Usage: xlink -f lnkarm <your_object_file(s)>
|
||||
// -s <program start label> <C/C++ runtime library>
|
||||
//
|
||||
// $Revision: 1.1.1.1 $
|
||||
//*************************************************************************
|
||||
|
||||
//************************************************
|
||||
// Inform the linker about the CPU family used.
|
||||
// AT91SAM7S64 Memory mapping
|
||||
// No remap
|
||||
// ROMSTART
|
||||
// Start address 0x0000 0000
|
||||
// Size 64 Kbo 0x0001 0000
|
||||
// RAMSTART
|
||||
// Start address 0x0020 0000
|
||||
// Size 16 Kbo 0x0000 4000
|
||||
// Remap done
|
||||
// RAMSTART
|
||||
// Start address 0x0000 0000
|
||||
// Size 16 Kbo 0x0000 4000
|
||||
// ROMSTART
|
||||
// Start address 0x0010 0000
|
||||
// Size 64 Kbo 0x0001 0000
|
||||
|
||||
//************************************************
|
||||
-carm
|
||||
|
||||
//*************************************************************************
|
||||
// Internal Ram segments mapped AFTER REMAP 16 K.
|
||||
//*************************************************************************
|
||||
// Use these addresses for the .
|
||||
-Z(CONST)INTRAMSTART_REMAP=00000000
|
||||
-Z(CONST)INTRAMEND_REMAP=00003FFF
|
||||
|
||||
//*************************************************************************
|
||||
// Read-only segments mapped to Flash 64 K.
|
||||
//*************************************************************************
|
||||
-DROMSTART=00000000
|
||||
-DROMEND=0000FFFF
|
||||
//*************************************************************************
|
||||
// Read/write segments mapped to RAM.
|
||||
//*************************************************************************
|
||||
-DRAMSTART=00000000
|
||||
-DRAMEND=00003FFF
|
||||
|
||||
//************************************************
|
||||
// Address range for reset and exception
|
||||
// vectors (INTVEC).
|
||||
// The vector area is 32 bytes,
|
||||
// an additional 32 bytes is allocated for the
|
||||
// constant table used by ldr PC in cstartup.s79.
|
||||
//************************************************
|
||||
-Z(CODE)INTVEC=00-3F
|
||||
|
||||
//************************************************
|
||||
// Startup code and exception routines (ICODE).
|
||||
//************************************************
|
||||
-Z(CODE)ICODE,DIFUNCT=ROMSTART-ROMEND
|
||||
-Z(CODE)SWITAB=ROMSTART-ROMEND
|
||||
|
||||
//************************************************
|
||||
// Code segments may be placed anywhere.
|
||||
//************************************************
|
||||
-Z(CODE)CODE=ROMSTART-ROMEND
|
||||
|
||||
//************************************************
|
||||
// Various constants and initializers.
|
||||
//************************************************
|
||||
-Z(CONST)INITTAB,DATA_ID,DATA_C=ROMSTART-ROMEND
|
||||
-Z(CONST)CHECKSUM=ROMSTART-ROMEND
|
||||
|
||||
//************************************************
|
||||
// Data segments.
|
||||
//************************************************
|
||||
-Z(DATA)DATA_I,DATA_Z,DATA_N=RAMSTART-RAMEND
|
||||
|
||||
//************************************************
|
||||
// __ramfunc code copied to and executed from RAM.
|
||||
//************************************************
|
||||
-Z(DATA)CODE_I=RAMSTART-RAMEND
|
||||
|
||||
//************************************************
|
||||
// ICCARM produces code for __ramfunc functions in
|
||||
// CODE_I segments. The -Q XLINK command line
|
||||
// option redirects XLINK to emit the code in the
|
||||
// debug information associated with the CODE_I
|
||||
// segment, where the code will execute.
|
||||
//************************************************
|
||||
|
||||
//*************************************************************************
|
||||
// Stack and heap segments.
|
||||
//*************************************************************************
|
||||
-D_CSTACK_SIZE=(100*4)
|
||||
-D_IRQ_STACK_SIZE=(2*8*4)
|
||||
|
||||
-Z(DATA)CSTACK+_CSTACK_SIZE=RAMSTART-RAMEND
|
||||
-Z(DATA)IRQ_STACK+_IRQ_STACK_SIZE=RAMSTART-RAMEND
|
||||
|
||||
//*************************************************************************
|
||||
// ELF/DWARF support.
|
||||
//
|
||||
// Uncomment the line "-Felf" below to generate ELF/DWARF output.
|
||||
// Available format specifiers are:
|
||||
//
|
||||
// "-yn": Suppress DWARF debug output
|
||||
// "-yp": Multiple ELF program sections
|
||||
// "-yas": Format suitable for debuggers from ARM Ltd (also sets -p flag)
|
||||
//
|
||||
// "-Felf" and the format specifiers can also be supplied directly as
|
||||
// command line options, or selected from the Xlink Output tab in the
|
||||
// IAR Embedded Workbench.
|
||||
//*************************************************************************
|
||||
|
||||
// -Felf
|
||||
136
Demo/ARM7_AT91SAM7S64_IAR/resource/at91SAM7S64_NoRemap.xcl
Normal file
136
Demo/ARM7_AT91SAM7S64_IAR/resource/at91SAM7S64_NoRemap.xcl
Normal file
@@ -0,0 +1,136 @@
|
||||
// ---------------------------------------------------------
|
||||
// ATMEL Microcontroller Software Support - ROUSSET -
|
||||
// ---------------------------------------------------------
|
||||
// The software is delivered "AS IS" without warranty or
|
||||
// condition of any kind, either express, implied or
|
||||
// statutory. This includes without limitation any warranty
|
||||
// or condition with respect to merchantability or fitness
|
||||
// for any particular purpose, or against the infringements of
|
||||
// intellectual property rights of others.
|
||||
// ---------------------------------------------------------
|
||||
// File: at91SAM7S64_NoRemap.xlc
|
||||
//
|
||||
// 1.1 16/Jun/04 JPP : Creation for 4.11A
|
||||
//
|
||||
// $Revision: 1.1.1.1 $
|
||||
//
|
||||
// ---------------------------------------------------------
|
||||
|
||||
//*************************************************************************
|
||||
// XLINK command file template for EWARM/ICCARM
|
||||
//
|
||||
// Usage: xlink -f lnkarm <your_object_file(s)>
|
||||
// -s <program start label> <C/C++ runtime library>
|
||||
//
|
||||
// $Revision: 1.1.1.1 $
|
||||
//*************************************************************************
|
||||
|
||||
//************************************************
|
||||
// Inform the linker about the CPU family used.
|
||||
// AT91SAM7S64 Memory mapping
|
||||
// No remap
|
||||
// ROMSTART
|
||||
// Start address 0x0000 0000
|
||||
// Size 64 Kbo 0x0001 0000
|
||||
// RAMSTART
|
||||
// Start address 0x0020 0000
|
||||
// Size 16 Kbo 0x0000 4000
|
||||
// Remap done
|
||||
// RAMSTART
|
||||
// Start address 0x0000 0000
|
||||
// Size 16 Kbo 0x0000 4000
|
||||
// ROMSTART
|
||||
// Start address 0x0010 0000
|
||||
// Size 64 Kbo 0x0001 0000
|
||||
|
||||
//************************************************
|
||||
-carm
|
||||
|
||||
//*************************************************************************
|
||||
// Internal Ram segments mapped AFTER REMAP 16 K.
|
||||
//*************************************************************************
|
||||
// Use these addresses for the .
|
||||
-Z(CONST)INTRAMSTART_REMAP=00200000
|
||||
-Z(CONST)INTRAMEND_REMAP=00203FFF
|
||||
|
||||
//*************************************************************************
|
||||
// Read-only segments mapped to Flash 64 K.
|
||||
//*************************************************************************
|
||||
-DROMSTART=00000000
|
||||
-DROMEND=0000FFFF
|
||||
//*************************************************************************
|
||||
// Read/write segments mapped to RAM.
|
||||
//*************************************************************************
|
||||
-DRAMSTART=00200000
|
||||
-DRAMEND=002003FFF
|
||||
|
||||
//************************************************
|
||||
// Address range for reset and exception
|
||||
// vectors (INTVEC).
|
||||
// The vector area is 32 bytes,
|
||||
// an additional 32 bytes is allocated for the
|
||||
// constant table used by ldr PC in cstartup.s79.
|
||||
//************************************************
|
||||
-Z(CODE)INTVEC=00-3F
|
||||
|
||||
//************************************************
|
||||
// Startup code and exception routines (ICODE).
|
||||
//************************************************
|
||||
-Z(CODE)ICODE,DIFUNCT=ROMSTART-ROMEND
|
||||
-Z(CODE)SWITAB=ROMSTART-ROMEND
|
||||
|
||||
//************************************************
|
||||
// Code segments may be placed anywhere.
|
||||
//************************************************
|
||||
-Z(CODE)CODE=ROMSTART-ROMEND
|
||||
|
||||
//************************************************
|
||||
// Various constants and initializers.
|
||||
//************************************************
|
||||
-Z(CONST)INITTAB,DATA_ID,DATA_C=ROMSTART-ROMEND
|
||||
-Z(CONST)CHECKSUM=ROMSTART-ROMEND
|
||||
|
||||
|
||||
//************************************************
|
||||
// Data segments.
|
||||
//************************************************
|
||||
-Z(DATA)DATA_I,DATA_Z,DATA_N=RAMSTART-RAMEND
|
||||
|
||||
//************************************************
|
||||
// __ramfunc code copied to and executed from RAM.
|
||||
//************************************************
|
||||
-Z(DATA)CODE_I=RAMSTART-RAMEND
|
||||
|
||||
//************************************************
|
||||
// ICCARM produces code for __ramfunc functions in
|
||||
// CODE_I segments. The -Q XLINK command line
|
||||
// option redirects XLINK to emit the code in the
|
||||
// debug information associated with the CODE_I
|
||||
// segment, where the code will execute.
|
||||
//************************************************
|
||||
|
||||
//*************************************************************************
|
||||
// Stack and heap segments.
|
||||
//*************************************************************************
|
||||
//-D_CSTACK_SIZE=(100*4)
|
||||
//-D_IRQ_STACK_SIZE=(2*8*4)
|
||||
|
||||
//-Z(DATA)CSTACK+_CSTACK_SIZE=RAMSTART-RAMEND
|
||||
//-Z(DATA)IRQ_STACK+_IRQ_STACK_SIZE=RAMSTART-RAMEND
|
||||
|
||||
//*************************************************************************
|
||||
// ELF/DWARF support.
|
||||
//
|
||||
// Uncomment the line "-Felf" below to generate ELF/DWARF output.
|
||||
// Available format specifiers are:
|
||||
//
|
||||
// "-yn": Suppress DWARF debug output
|
||||
// "-yp": Multiple ELF program sections
|
||||
// "-yas": Format suitable for debuggers from ARM Ltd (also sets -p flag)
|
||||
//
|
||||
// "-Felf" and the format specifiers can also be supplied directly as
|
||||
// command line options, or selected from the Xlink Output tab in the
|
||||
// IAR Embedded Workbench.
|
||||
//*************************************************************************
|
||||
|
||||
// -Felf
|
||||
905
Demo/ARM7_AT91SAM7S64_IAR/rtosdemo.ewd
Normal file
905
Demo/ARM7_AT91SAM7S64_IAR/rtosdemo.ewd
Normal file
File diff suppressed because it is too large
Load Diff
1738
Demo/ARM7_AT91SAM7S64_IAR/rtosdemo.ewp
Normal file
1738
Demo/ARM7_AT91SAM7S64_IAR/rtosdemo.ewp
Normal file
File diff suppressed because it is too large
Load Diff
10
Demo/ARM7_AT91SAM7S64_IAR/rtosdemo.eww
Normal file
10
Demo/ARM7_AT91SAM7S64_IAR/rtosdemo.eww
Normal file
@@ -0,0 +1,10 @@
|
||||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
|
||||
<workspace>
|
||||
<project>
|
||||
<path>$WS_DIR$\rtosdemo.ewp</path>
|
||||
</project>
|
||||
<batchBuild/>
|
||||
</workspace>
|
||||
|
||||
|
||||
246
Demo/ARM7_AT91SAM7S64_IAR/serial/serial.c
Normal file
246
Demo/ARM7_AT91SAM7S64_IAR/serial/serial.c
Normal file
@@ -0,0 +1,246 @@
|
||||
/*
|
||||
FreeRTOS V4.0.1 - Copyright (C) 2003-2006 Richard Barry.
|
||||
|
||||
This file is part of the FreeRTOS distribution.
|
||||
|
||||
FreeRTOS 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 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
FreeRTOS 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 FreeRTOS; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
A special exception to the GPL can be applied should you wish to distribute
|
||||
a combined work that includes FreeRTOS, without being obliged to provide
|
||||
the source code for any proprietary components. See the licensing section
|
||||
of http://www.FreeRTOS.org for full details of how and when the exception
|
||||
can be applied.
|
||||
|
||||
***************************************************************************
|
||||
See http://www.FreeRTOS.org for documentation, latest information, license
|
||||
and contact details. Please ensure to read the configuration and relevant
|
||||
port sections of the online documentation.
|
||||
***************************************************************************
|
||||
*/
|
||||
|
||||
/*
|
||||
BASIC INTERRUPT DRIVEN SERIAL PORT DRIVER FOR UART0.
|
||||
*/
|
||||
|
||||
/* Standard includes. */
|
||||
#include <stdlib.h>
|
||||
|
||||
/* Scheduler includes. */
|
||||
#include "FreeRTOS.h"
|
||||
#include "queue.h"
|
||||
|
||||
/* Demo application includes. */
|
||||
#include "serial.h"
|
||||
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
/* Location of the COM0 registers. */
|
||||
#define serCOM0 ( ( AT91PS_USART ) AT91C_BASE_US0 )
|
||||
|
||||
/* Interrupt control macros. */
|
||||
#define serINTERRUPT_LEVEL ( 5 )
|
||||
#define vInterruptOn() AT91F_US_EnableIt( serCOM0, AT91C_US_TXRDY | AT91C_US_RXRDY )
|
||||
#define vInterruptOff() AT91F_US_DisableIt( serCOM0, AT91C_US_TXRDY )
|
||||
|
||||
/* Misc constants. */
|
||||
#define serINVALID_QUEUE ( ( xQueueHandle ) 0 )
|
||||
#define serHANDLE ( ( xComPortHandle ) 1 )
|
||||
#define serNO_BLOCK ( ( portTickType ) 0 )
|
||||
#define serNO_TIMEGUARD ( ( unsigned portLONG ) 0 )
|
||||
#define serNO_PERIPHERAL_B_SETUP ( ( unsigned portLONG ) 0 )
|
||||
|
||||
|
||||
/* Queues used to hold received characters, and characters waiting to be
|
||||
transmitted. */
|
||||
static xQueueHandle xRxedChars;
|
||||
static xQueueHandle xCharsForTx;
|
||||
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
/* Interrupt entry point written in the assembler file serialISR.s79. */
|
||||
extern void vSerialISREntry( void );
|
||||
|
||||
/* The interrupt service routine - called from the assembly entry point. */
|
||||
__arm void vSerialISR( void );
|
||||
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
/*
|
||||
* See the serial2.h header file.
|
||||
*/
|
||||
xComPortHandle xSerialPortInitMinimal( unsigned portLONG ulWantedBaud, unsigned portBASE_TYPE uxQueueLength )
|
||||
{
|
||||
xComPortHandle xReturn = serHANDLE;
|
||||
extern void ( vUART_ISR )( void );
|
||||
|
||||
/* Create the queues used to hold Rx and Tx characters. */
|
||||
xRxedChars = xQueueCreate( uxQueueLength, ( unsigned portBASE_TYPE ) sizeof( signed portCHAR ) );
|
||||
xCharsForTx = xQueueCreate( uxQueueLength + 1, ( unsigned portBASE_TYPE ) sizeof( signed portCHAR ) );
|
||||
|
||||
/* If the queues were created correctly then setup the serial port
|
||||
hardware. */
|
||||
if( ( xRxedChars != serINVALID_QUEUE ) && ( xCharsForTx != serINVALID_QUEUE ) )
|
||||
{
|
||||
portENTER_CRITICAL();
|
||||
{
|
||||
/* Enable the USART clock. */
|
||||
AT91F_PMC_EnablePeriphClock( AT91C_BASE_PMC, 1 << AT91C_ID_US0 );
|
||||
|
||||
AT91F_PIO_CfgPeriph( AT91C_BASE_PIOA, ( ( unsigned portLONG ) AT91C_PA5_RXD0 ) | ( ( unsigned portLONG ) AT91C_PA6_TXD0 ), serNO_PERIPHERAL_B_SETUP );
|
||||
|
||||
/* Set the required protocol. */
|
||||
AT91F_US_Configure( serCOM0, configCPU_CLOCK_HZ, AT91C_US_ASYNC_MODE, ulWantedBaud, serNO_TIMEGUARD );
|
||||
|
||||
/* Enable Rx and Tx. */
|
||||
serCOM0->US_CR = AT91C_US_RXEN | AT91C_US_TXEN;
|
||||
|
||||
/* Enable the Rx interrupts. The Tx interrupts are not enabled
|
||||
until there are characters to be transmitted. */
|
||||
AT91F_US_EnableIt( serCOM0, AT91C_US_RXRDY );
|
||||
|
||||
/* Enable the interrupts in the AIC. */
|
||||
AT91F_AIC_ConfigureIt( AT91C_BASE_AIC, AT91C_ID_US0, serINTERRUPT_LEVEL, AT91C_AIC_SRCTYPE_INT_LEVEL_SENSITIVE, ( void (*)( void ) ) vSerialISREntry );
|
||||
AT91F_AIC_EnableIt( AT91C_BASE_AIC, AT91C_ID_US0 );
|
||||
}
|
||||
portEXIT_CRITICAL();
|
||||
}
|
||||
else
|
||||
{
|
||||
xReturn = ( xComPortHandle ) 0;
|
||||
}
|
||||
|
||||
/* This demo file only supports a single port but we have to return
|
||||
something to comply with the standard demo header file. */
|
||||
return xReturn;
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
signed portBASE_TYPE xSerialGetChar( xComPortHandle pxPort, signed portCHAR *pcRxedChar, portTickType xBlockTime )
|
||||
{
|
||||
/* The port handle is not required as this driver only supports one port. */
|
||||
( void ) pxPort;
|
||||
|
||||
/* Get the next character from the buffer. Return false if no characters
|
||||
are available, or arrive before xBlockTime expires. */
|
||||
if( xQueueReceive( xRxedChars, pcRxedChar, xBlockTime ) )
|
||||
{
|
||||
return pdTRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
return pdFALSE;
|
||||
}
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
void vSerialPutString( xComPortHandle pxPort, const signed portCHAR * const pcString, unsigned portSHORT usStringLength )
|
||||
{
|
||||
signed portCHAR *pxNext;
|
||||
|
||||
/* A couple of parameters that this port does not use. */
|
||||
( void ) usStringLength;
|
||||
( void ) pxPort;
|
||||
|
||||
/* NOTE: This implementation does not handle the queue being full as no
|
||||
block time is used! */
|
||||
|
||||
/* The port handle is not required as this driver only supports UART0. */
|
||||
( void ) pxPort;
|
||||
|
||||
/* Send each character in the string, one at a time. */
|
||||
pxNext = ( signed portCHAR * ) pcString;
|
||||
while( *pxNext )
|
||||
{
|
||||
xSerialPutChar( pxPort, *pxNext, serNO_BLOCK );
|
||||
pxNext++;
|
||||
}
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
signed portBASE_TYPE xSerialPutChar( xComPortHandle pxPort, signed portCHAR cOutChar, portTickType xBlockTime )
|
||||
{
|
||||
/* Place the character in the queue of characters to be transmitted. */
|
||||
if( xQueueSend( xCharsForTx, &cOutChar, xBlockTime ) != pdPASS )
|
||||
{
|
||||
return pdFAIL;
|
||||
}
|
||||
|
||||
/* Turn on the Tx interrupt so the ISR will remove the character from the
|
||||
queue and send it. This does not need to be in a critical section as
|
||||
if the interrupt has already removed the character the next interrupt
|
||||
will simply turn off the Tx interrupt again. */
|
||||
vInterruptOn();
|
||||
|
||||
return pdPASS;
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
void vSerialClose( xComPortHandle xPort )
|
||||
{
|
||||
/* Not supported as not required by the demo application. */
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
/* Serial port ISR. This can cause a context switch so is not defined as a
|
||||
standard ISR using the __irq keyword. Instead a wrapper function is defined
|
||||
within serialISR.s79 which in turn calls this function. See the port
|
||||
documentation on the FreeRTOS.org website for more information. */
|
||||
__arm void vSerialISR( void )
|
||||
{
|
||||
unsigned portLONG ulStatus;
|
||||
signed portCHAR cChar;
|
||||
portBASE_TYPE xTaskWokenByTx = pdFALSE, xTaskWokenByPost = pdFALSE;
|
||||
|
||||
/* What caused the interrupt? */
|
||||
ulStatus = serCOM0->US_CSR &= serCOM0->US_IMR;
|
||||
|
||||
if( ulStatus & AT91C_US_TXRDY )
|
||||
{
|
||||
/* The interrupt was caused by the THR becoming empty. Are there any
|
||||
more characters to transmit? */
|
||||
if( xQueueReceiveFromISR( xCharsForTx, &cChar, &xTaskWokenByTx ) == pdTRUE )
|
||||
{
|
||||
/* A character was retrieved from the queue so can be sent to the
|
||||
THR now. */
|
||||
serCOM0->US_THR = cChar;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Queue empty, nothing to send so turn off the Tx interrupt. */
|
||||
vInterruptOff();
|
||||
}
|
||||
}
|
||||
|
||||
if( ulStatus & AT91C_US_RXRDY )
|
||||
{
|
||||
/* The interrupt was caused by a character being received. Grab the
|
||||
character from the RHR and place it in the queue or received
|
||||
characters. */
|
||||
cChar = serCOM0->US_RHR;
|
||||
xTaskWokenByPost = xQueueSendFromISR( xRxedChars, &cChar, xTaskWokenByPost );
|
||||
}
|
||||
|
||||
/* If a task was woken by either a character being received or a character
|
||||
being transmitted then we may need to switch to another task. */
|
||||
portEND_SWITCHING_ISR( ( xTaskWokenByPost || xTaskWokenByTx ) );
|
||||
|
||||
/* End the interrupt in the AIC. */
|
||||
AT91C_BASE_AIC->AIC_EOICR = 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
24
Demo/ARM7_AT91SAM7S64_IAR/serial/serialISR.s79
Normal file
24
Demo/ARM7_AT91SAM7S64_IAR/serial/serialISR.s79
Normal file
@@ -0,0 +1,24 @@
|
||||
RSEG ICODE:CODE
|
||||
CODE32
|
||||
|
||||
EXTERN vSerialISR
|
||||
PUBLIC vSerialISREntry
|
||||
|
||||
; Wrapper for the serial port interrupt service routine. This can cause a
|
||||
; context switch so requires an assembly wrapper.
|
||||
|
||||
; Defines the portSAVE_CONTEXT and portRESTORE_CONTEXT macros.
|
||||
#include "ISR_Support.h"
|
||||
|
||||
vSerialISREntry:
|
||||
|
||||
portSAVE_CONTEXT ; Save the context of the current task.
|
||||
|
||||
bl vSerialISR ; Call the ISR routine.
|
||||
|
||||
portRESTORE_CONTEXT ; Restore the context of the current task -
|
||||
; which may be different to the task that
|
||||
; was interrupted.
|
||||
|
||||
END
|
||||
|
||||
71
Demo/ARM7_AT91SAM7S64_IAR/settings/Basic.dbgdt
Normal file
71
Demo/ARM7_AT91SAM7S64_IAR/settings/Basic.dbgdt
Normal file
File diff suppressed because one or more lines are too long
23
Demo/ARM7_AT91SAM7S64_IAR/settings/Basic.dni
Normal file
23
Demo/ARM7_AT91SAM7S64_IAR/settings/Basic.dni
Normal file
@@ -0,0 +1,23 @@
|
||||
[DisAssemblyWindow]
|
||||
NumStates=_ 1
|
||||
State 1=_ 1
|
||||
[JLinkDriver]
|
||||
WatchVectorCatch=_ 0
|
||||
WatchCond=_ 0
|
||||
Watch0=_ 0 "" 0 "" 0 "" 0 "" 0 0 0 0
|
||||
Watch1=_ 0 "" 0 "" 0 "" 0 "" 0 0 0 0
|
||||
[Log file]
|
||||
LoggingEnabled=_ 0
|
||||
LogFile=_ ""
|
||||
Category=_ 0
|
||||
[TermIOLog]
|
||||
LoggingEnabled=_ 0
|
||||
LogFile=_ ""
|
||||
[Disassemble mode]
|
||||
mode=0
|
||||
[Breakpoints]
|
||||
Bp0=_ "Code" "{E:\Dev\FreeRTOS\Source\portable\IAR\AtmelSAM7\port.c}.141.1@1" 1 0 0 0 "" 0 ""
|
||||
Count=1
|
||||
[Low Level]
|
||||
Pipeline mode=0
|
||||
Initialized=0
|
||||
80
Demo/ARM7_AT91SAM7S64_IAR/settings/BasicSAM7.wsdt
Normal file
80
Demo/ARM7_AT91SAM7S64_IAR/settings/BasicSAM7.wsdt
Normal file
File diff suppressed because one or more lines are too long
62
Demo/ARM7_AT91SAM7S64_IAR/settings/rtosdemo.dbgdt
Normal file
62
Demo/ARM7_AT91SAM7S64_IAR/settings/rtosdemo.dbgdt
Normal file
File diff suppressed because one or more lines are too long
22
Demo/ARM7_AT91SAM7S64_IAR/settings/rtosdemo.dni
Normal file
22
Demo/ARM7_AT91SAM7S64_IAR/settings/rtosdemo.dni
Normal file
@@ -0,0 +1,22 @@
|
||||
[DisAssemblyWindow]
|
||||
NumStates=_ 1
|
||||
State 1=_ 1
|
||||
[JLinkDriver]
|
||||
WatchVectorCatch=_ 0
|
||||
WatchCond=_ 0
|
||||
Watch0=_ 0 "" 0 "" 0 "" 0 "" 0 0 0 0
|
||||
Watch1=_ 0 "" 0 "" 0 "" 0 "" 0 0 0 0
|
||||
[Low Level]
|
||||
Pipeline mode=1
|
||||
Initialized=0
|
||||
[Log file]
|
||||
LoggingEnabled=_ 0
|
||||
LogFile=_ ""
|
||||
Category=_ 0
|
||||
[TermIOLog]
|
||||
LoggingEnabled=_ 0
|
||||
LogFile=_ ""
|
||||
[Disassemble mode]
|
||||
mode=0
|
||||
[Breakpoints]
|
||||
Count=0
|
||||
76
Demo/ARM7_AT91SAM7S64_IAR/settings/rtosdemo.wsdt
Normal file
76
Demo/ARM7_AT91SAM7S64_IAR/settings/rtosdemo.wsdt
Normal file
@@ -0,0 +1,76 @@
|
||||
<?xml version="1.0" encoding="iso-8859-1"?>
|
||||
|
||||
<Workspace>
|
||||
<ConfigDictionary>
|
||||
|
||||
<CurrentConfigs><Project>rtosdemo/Flash Debug</Project></CurrentConfigs></ConfigDictionary>
|
||||
<Desktop>
|
||||
<Static>
|
||||
<Workspace>
|
||||
<ColumnWidths>
|
||||
|
||||
|
||||
|
||||
<Column0>221</Column0><Column1>27</Column1><Column2>27</Column2><Column3>27</Column3></ColumnWidths>
|
||||
</Workspace>
|
||||
<Build><ColumnWidth0>18</ColumnWidth0><ColumnWidth1>1155</ColumnWidth1><ColumnWidth2>308</ColumnWidth2><ColumnWidth3>77</ColumnWidth3></Build>
|
||||
<Debug-Log/>
|
||||
<TerminalIO/>
|
||||
<CodeCoveragePlugin/>
|
||||
<Profiling/>
|
||||
<Watch>
|
||||
<Format>
|
||||
<struct_types/>
|
||||
<watch_formats/>
|
||||
</Format>
|
||||
</Watch>
|
||||
<Disassembly><MixedMode>1</MixedMode><CodeCovEnabled>0</CodeCovEnabled><CodeCovShow>0</CodeCovShow></Disassembly><Memory><ZoneNumber>0</ZoneNumber><FindDirection>1</FindDirection><FindAsHex>0</FindAsHex></Memory></Static>
|
||||
<Windows>
|
||||
|
||||
|
||||
<Wnd0>
|
||||
<Tabs>
|
||||
<Tab>
|
||||
<Identity>TabID-17425-14382</Identity>
|
||||
<TabName>Workspace</TabName>
|
||||
<Factory>Workspace</Factory>
|
||||
<Session>
|
||||
|
||||
<NodeDict><ExpandedNode>rtosdemo</ExpandedNode><ExpandedNode>rtosdemo/Demo Source</ExpandedNode><ExpandedNode>rtosdemo/Scheduler Source</ExpandedNode><ExpandedNode>rtosdemo/System Files</ExpandedNode></NodeDict></Session>
|
||||
</Tab>
|
||||
</Tabs>
|
||||
|
||||
<SelectedTab>0</SelectedTab></Wnd0><Wnd1>
|
||||
<Tabs>
|
||||
<Tab>
|
||||
<Identity>TabID-4084-16269</Identity>
|
||||
<TabName>Build</TabName>
|
||||
<Factory>Build</Factory>
|
||||
<Session/>
|
||||
</Tab>
|
||||
<Tab>
|
||||
<Identity>TabID-25581-16276</Identity>
|
||||
<TabName>Debug Log</TabName>
|
||||
<Factory>Debug-Log</Factory>
|
||||
<Session/>
|
||||
</Tab>
|
||||
</Tabs>
|
||||
|
||||
<SelectedTab>0</SelectedTab></Wnd1></Windows>
|
||||
<Editor>
|
||||
|
||||
|
||||
|
||||
|
||||
<Pane><Tab><Factory>TextEditor</Factory><Filename>E:\Dev\FreeRTOS\Demo\ARM7_AT91SAM7S64_IAR\FreeRTOSConfig.h</Filename><XPos>0</XPos><YPos>18</YPos><SelStart>0</SelStart><SelEnd>0</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>E:\Dev\FreeRTOS\Demo\ARM7_AT91SAM7S64_IAR\SrcIAR\Board.h</Filename><XPos>0</XPos><YPos>0</YPos><SelStart>952</SelStart><SelEnd>969</SelEnd></Tab><Tab><Factory>TextEditor</Factory><Filename>E:\Dev\FreeRTOS\Demo\ARM7_AT91SAM7S64_IAR\SrcIAR\Cstartup.s79</Filename><XPos>0</XPos><YPos>142</YPos><SelStart>6503</SelStart><SelEnd>6517</SelEnd></Tab><ActiveTab>2</ActiveTab></Pane><ActivePane>0</ActivePane><Sizes><Pane><X>1000000</X><Y>1000000</Y></Pane></Sizes><SplitMode>1</SplitMode></Editor>
|
||||
<Positions>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<Top><Row0><Sizes><Toolbar-0084c368><key>iaridepm1</key></Toolbar-0084c368></Sizes></Row0></Top><Left><Row0><Sizes><Wnd0><Rect><Top>-2</Top><Left>-2</Left><Bottom>659</Bottom><Right>295</Right><x>-2</x><y>-2</y><xscreen>30</xscreen><yscreen>30</yscreen><sizeHorzCX>18750</sizeHorzCX><sizeHorzCY>26809</sizeHorzCY><sizeVertCX>185625</sizeVertCX><sizeVertCY>590705</sizeVertCY></Rect></Wnd0></Sizes></Row0></Left><Right><Row0><Sizes/></Row0></Right><Bottom><Row0><Sizes><Wnd1><Rect><Top>-2</Top><Left>-2</Left><Bottom>413</Bottom><Right>1602</Right><x>-2</x><y>-2</y><xscreen>1604</xscreen><yscreen>415</yscreen><sizeHorzCX>1002500</sizeHorzCX><sizeHorzCY>370866</sizeHorzCY><sizeVertCX>18750</sizeVertCX><sizeVertCY>26809</sizeVertCY></Rect></Wnd1></Sizes></Row0></Bottom><Float><Sizes/></Float></Positions>
|
||||
</Desktop>
|
||||
</Workspace>
|
||||
|
||||
|
||||
78
Demo/ARM7_LPC2106_GCC/FreeRTOSConfig.h
Normal file
78
Demo/ARM7_LPC2106_GCC/FreeRTOSConfig.h
Normal file
@@ -0,0 +1,78 @@
|
||||
/*
|
||||
FreeRTOS V4.0.1 - Copyright (C) 2003-2006 Richard Barry.
|
||||
|
||||
This file is part of the FreeRTOS distribution.
|
||||
|
||||
FreeRTOS 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 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
FreeRTOS 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 FreeRTOS; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
A special exception to the GPL can be applied should you wish to distribute
|
||||
a combined work that includes FreeRTOS, without being obliged to provide
|
||||
the source code for any proprietary components. See the licensing section
|
||||
of http://www.FreeRTOS.org for full details of how and when the exception
|
||||
can be applied.
|
||||
|
||||
***************************************************************************
|
||||
See http://www.FreeRTOS.org for documentation, latest information, license
|
||||
and contact details. Please ensure to read the configuration and relevant
|
||||
port sections of the online documentation.
|
||||
***************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef FREERTOS_CONFIG_H
|
||||
#define FREERTOS_CONFIG_H
|
||||
|
||||
#include <lpc210x.h>
|
||||
|
||||
|
||||
/*-----------------------------------------------------------
|
||||
* Application specific definitions.
|
||||
*
|
||||
* These definitions should be adjusted for your particular hardware and
|
||||
* application requirements.
|
||||
*
|
||||
* THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE
|
||||
* FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE.
|
||||
*----------------------------------------------------------*/
|
||||
|
||||
#define configUSE_PREEMPTION 1
|
||||
#define configUSE_IDLE_HOOK 0
|
||||
#define configUSE_TICK_HOOK 0
|
||||
#define configCPU_CLOCK_HZ ( ( unsigned portLONG ) 58982400 ) /* =14.7456MHz xtal multiplied by 4 using the PLL. */
|
||||
#define configTICK_RATE_HZ ( ( portTickType ) 1000 )
|
||||
#define configMAX_PRIORITIES ( ( unsigned portBASE_TYPE ) 5 )
|
||||
#define configMINIMAL_STACK_SIZE ( ( unsigned portSHORT ) 128 )
|
||||
#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 23 * 1024 ) )
|
||||
#define configMAX_TASK_NAME_LEN ( 16 )
|
||||
#define configUSE_TRACE_FACILITY 0
|
||||
#define configUSE_16_BIT_TICKS 0
|
||||
#define configIDLE_SHOULD_YIELD 1
|
||||
|
||||
/* Co-routine definitions. */
|
||||
#define configUSE_CO_ROUTINES 0
|
||||
#define configMAX_CO_ROUTINE_PRIORITIES ( 2 )
|
||||
|
||||
/* Set the following definitions to 1 to include the API function, or zero
|
||||
to exclude the API function. */
|
||||
|
||||
#define INCLUDE_vTaskPrioritySet 1
|
||||
#define INCLUDE_uxTaskPriorityGet 1
|
||||
#define INCLUDE_vTaskDelete 1
|
||||
#define INCLUDE_vTaskCleanUpResources 0
|
||||
#define INCLUDE_vTaskSuspend 1
|
||||
#define INCLUDE_vTaskDelayUntil 1
|
||||
#define INCLUDE_vTaskDelay 1
|
||||
|
||||
|
||||
#endif /* FREERTOS_CONFIG_H */
|
||||
118
Demo/ARM7_LPC2106_GCC/Makefile
Normal file
118
Demo/ARM7_LPC2106_GCC/Makefile
Normal file
@@ -0,0 +1,118 @@
|
||||
# FreeRTOS V4.0.1 - Copyright (C) 2003-2006 Richard Barry.
|
||||
#
|
||||
# This file is part of the FreeRTOS distribution.
|
||||
#
|
||||
# FreeRTOS 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 2 of the License, or
|
||||
# (at your option) any later version.
|
||||
#
|
||||
# FreeRTOS 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 FreeRTOS; if not, write to the Free Software
|
||||
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
#
|
||||
# A special exception to the GPL can be applied should you wish to distribute
|
||||
# a combined work that includes FreeRTOS, without being obliged to provide
|
||||
# the source code for any proprietary components. See the licensing section
|
||||
# of http://www.FreeRTOS.org for full details of how and when the exception
|
||||
# can be applied.
|
||||
#
|
||||
# ***************************************************************************
|
||||
# See http://www.FreeRTOS.org for documentation, latest information, license
|
||||
# and contact details. Please ensure to read the configuration and relevant
|
||||
# port sections of the online documentation.
|
||||
# ***************************************************************************
|
||||
|
||||
# Changes from V2.4.2
|
||||
#
|
||||
# + Replaced source/portable/gcc/arm7/portheap.c with source/portable/memmang/heap_2.c.
|
||||
|
||||
CC=arm-elf-gcc
|
||||
OBJCOPY=arm-elf-objcopy
|
||||
ARCH=arm-elf-ar
|
||||
CRT0=boot.s
|
||||
WARNINGS=-Wall -Wextra -Wshadow -Wpointer-arith -Wbad-function-cast -Wcast-align -Wsign-compare \
|
||||
-Waggregate-return -Wstrict-prototypes -Wmissing-prototypes -Wmissing-declarations -Wunused
|
||||
|
||||
#
|
||||
# CFLAGS common to both the THUMB and ARM mode builds
|
||||
#
|
||||
CFLAGS=$(WARNINGS) -D $(RUN_MODE) -D GCC_ARM7 -I. -I../../Source/include \
|
||||
-I../Common/include $(DEBUG) -mcpu=arm7tdmi -T$(LDSCRIPT) \
|
||||
$(OPTIM)
|
||||
|
||||
ifeq ($(USE_THUMB_MODE),YES)
|
||||
CFLAGS += -mthumb-interwork -D THUMB_INTERWORK
|
||||
THUMB_FLAGS=-mthumb
|
||||
endif
|
||||
|
||||
|
||||
LINKER_FLAGS=-Xlinker -ortosdemo.elf -Xlinker -M -Xlinker -Map=rtosdemo.map
|
||||
|
||||
RTOS_SOURCE_DIR=../../Source
|
||||
DEMO_SOURCE_DIR=../Common/Minimal
|
||||
#
|
||||
# Source files that can be built to THUMB mode.
|
||||
#
|
||||
THUMB_SRC = \
|
||||
main.c \
|
||||
serial/serial.c \
|
||||
ParTest/ParTest.c \
|
||||
$(DEMO_SOURCE_DIR)/integer.c \
|
||||
$(DEMO_SOURCE_DIR)/flash.c \
|
||||
$(DEMO_SOURCE_DIR)/PollQ.c \
|
||||
$(DEMO_SOURCE_DIR)/comtest.c \
|
||||
$(DEMO_SOURCE_DIR)/flop.c \
|
||||
$(DEMO_SOURCE_DIR)/semtest.c \
|
||||
$(DEMO_SOURCE_DIR)/dynamic.c \
|
||||
$(DEMO_SOURCE_DIR)/BlockQ.c \
|
||||
$(RTOS_SOURCE_DIR)/tasks.c \
|
||||
$(RTOS_SOURCE_DIR)/queue.c \
|
||||
$(RTOS_SOURCE_DIR)/list.c \
|
||||
$(RTOS_SOURCE_DIR)/portable/MemMang/heap_2.c \
|
||||
$(RTOS_SOURCE_DIR)/portable/GCC/ARM7_LPC2000/port.c
|
||||
|
||||
#
|
||||
# Source files that must be built to ARM mode.
|
||||
#
|
||||
ARM_SRC = \
|
||||
$(RTOS_SOURCE_DIR)/portable/GCC/ARM7_LPC2000/portISR.c \
|
||||
serial/serialISR.c
|
||||
|
||||
#
|
||||
# Define all object files.
|
||||
#
|
||||
ARM_OBJ = $(ARM_SRC:.c=.o)
|
||||
THUMB_OBJ = $(THUMB_SRC:.c=.o)
|
||||
|
||||
rtosdemo.hex : rtosdemo.elf
|
||||
$(OBJCOPY) rtosdemo.elf -O ihex rtosdemo.hex
|
||||
|
||||
rtosdemo.elf : $(ARM_OBJ) $(THUMB_OBJ) $(CRT0) Makefile
|
||||
$(CC) $(CFLAGS) $(ARM_OBJ) $(THUMB_OBJ) -nostartfiles $(CRT0) $(LINKER_FLAGS)
|
||||
|
||||
$(THUMB_OBJ) : %.o : %.c $(LDSCRIPT) Makefile
|
||||
$(CC) -c $(THUMB_FLAGS) $(CFLAGS) $< -o $@
|
||||
|
||||
$(ARM_OBJ) : %.o : %.c $(LDSCRIPT) Makefile
|
||||
$(CC) -c $(CFLAGS) $< -o $@
|
||||
|
||||
clean :
|
||||
touch Makefile
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
106
Demo/ARM7_LPC2106_GCC/ParTest/ParTest.c
Normal file
106
Demo/ARM7_LPC2106_GCC/ParTest/ParTest.c
Normal file
@@ -0,0 +1,106 @@
|
||||
/*
|
||||
FreeRTOS V4.0.1 - Copyright (C) 2003-2006 Richard Barry.
|
||||
|
||||
This file is part of the FreeRTOS distribution.
|
||||
|
||||
FreeRTOS 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 2 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
FreeRTOS 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 FreeRTOS; if not, write to the Free Software
|
||||
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
|
||||
A special exception to the GPL can be applied should you wish to distribute
|
||||
a combined work that includes FreeRTOS, without being obliged to provide
|
||||
the source code for any proprietary components. See the licensing section
|
||||
of http://www.FreeRTOS.org for full details of how and when the exception
|
||||
can be applied.
|
||||
|
||||
***************************************************************************
|
||||
See http://www.FreeRTOS.org for documentation, latest information, license
|
||||
and contact details. Please ensure to read the configuration and relevant
|
||||
port sections of the online documentation.
|
||||
***************************************************************************
|
||||
*/
|
||||
|
||||
/*
|
||||
Changes from V2.5.2
|
||||
|
||||
+ All LED's are turned off to start.
|
||||
*/
|
||||
|
||||
|
||||
#include "FreeRTOS.h"
|
||||
#include "partest.h"
|
||||
|
||||
#define partstFIRST_IO ( ( unsigned portLONG ) 0x400 )
|
||||
#define partstNUM_LEDS ( 4 )
|
||||
#define partstALL_OUTPUTS_OFF ( ( unsigned portLONG ) 0xffffffff )
|
||||
|
||||
/*-----------------------------------------------------------
|
||||
* Simple parallel port IO routines.
|
||||
*-----------------------------------------------------------*/
|
||||
|
||||
void vParTestInitialise( void )
|
||||
{
|
||||
/* This is performed from main() as the io bits are shared with other setup
|
||||
functions. */
|
||||
|
||||
/* Turn all outputs off. */
|
||||
GPIO_IOSET = partstALL_OUTPUTS_OFF;
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
void vParTestSetLED( unsigned portBASE_TYPE uxLED, signed portBASE_TYPE xValue )
|
||||
{
|
||||
unsigned portLONG ulLED = partstFIRST_IO;
|
||||
|
||||
if( uxLED < partstNUM_LEDS )
|
||||
{
|
||||
/* Rotate to the wanted bit of port 0. Only P10 to P13 have an LED
|
||||
attached. */
|
||||
ulLED <<= ( unsigned portLONG ) uxLED;
|
||||
|
||||
/* Set of clear the output. */
|
||||
if( xValue )
|
||||
{
|
||||
GPIO_IOCLR = ulLED;
|
||||
}
|
||||
else
|
||||
{
|
||||
GPIO_IOSET = ulLED;
|
||||
}
|
||||
}
|
||||
}
|
||||
/*-----------------------------------------------------------*/
|
||||
|
||||
void vParTestToggleLED( unsigned portBASE_TYPE uxLED )
|
||||
{
|
||||
unsigned portLONG ulLED = partstFIRST_IO, ulCurrentState;
|
||||
|
||||
if( uxLED < partstNUM_LEDS )
|
||||
{
|
||||
/* Rotate to the wanted bit of port 0. Only P10 to P13 have an LED
|
||||
attached. */
|
||||
ulLED <<= ( unsigned portLONG ) uxLED;
|
||||
|
||||
/* If this bit is already set, clear it, and visa versa. */
|
||||
ulCurrentState = GPIO0_IOPIN;
|
||||
if( ulCurrentState & ulLED )
|
||||
{
|
||||
GPIO_IOCLR = ulLED;
|
||||
}
|
||||
else
|
||||
{
|
||||
GPIO_IOSET = ulLED;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
157
Demo/ARM7_LPC2106_GCC/boot.s
Normal file
157
Demo/ARM7_LPC2106_GCC/boot.s
Normal file
@@ -0,0 +1,157 @@
|
||||
/* Sample initialization file */
|
||||
|
||||
.extern main
|
||||
.extern exit
|
||||
|
||||
.text
|
||||
.code 32
|
||||
|
||||
|
||||
.align 0
|
||||
|
||||
.extern __bss_beg__
|
||||
.extern __bss_end__
|
||||
.extern __stack_end__
|
||||
.extern __data_beg__
|
||||
.extern __data_end__
|
||||
.extern __data+beg_src__
|
||||
|
||||
.global start
|
||||
.global endless_loop
|
||||
|
||||
/* Stack Sizes */
|
||||
.set UND_STACK_SIZE, 0x00000004
|
||||
.set ABT_STACK_SIZE, 0x00000004
|
||||
.set FIQ_STACK_SIZE, 0x00000004
|
||||
.set IRQ_STACK_SIZE, 0X00000400
|
||||
.set SVC_STACK_SIZE, 0x00000400
|
||||
|
||||
/* Standard definitions of Mode bits and Interrupt (I & F) flags in PSRs */
|
||||
.set MODE_USR, 0x10 /* User Mode */
|
||||
.set MODE_FIQ, 0x11 /* FIQ Mode */
|
||||
.set MODE_IRQ, 0x12 /* IRQ Mode */
|
||||
.set MODE_SVC, 0x13 /* Supervisor Mode */
|
||||
.set MODE_ABT, 0x17 /* Abort Mode */
|
||||
.set MODE_UND, 0x1B /* Undefined Mode */
|
||||
.set MODE_SYS, 0x1F /* System Mode */
|
||||
|
||||
.equ I_BIT, 0x80 /* when I bit is set, IRQ is disabled */
|
||||
.equ F_BIT, 0x40 /* when F bit is set, FIQ is disabled */
|
||||
|
||||
|
||||
start:
|
||||
_start:
|
||||
_mainCRTStartup:
|
||||
|
||||
/* Setup a stack for each mode - note that this only sets up a usable stack
|
||||
for system/user, SWI and IRQ modes. Also each mode is setup with
|
||||
interrupts initially disabled. */
|
||||
ldr r0, .LC6
|
||||
msr CPSR_c, #MODE_UND|I_BIT|F_BIT /* Undefined Instruction Mode
|
||||
mov sp, r0
|
||||
sub r0, r0, #UND_STACK_SIZE
|
||||
msr CPSR_c, #MODE_ABT|I_BIT|F_BIT /* Abort Mode */
|
||||
mov sp, r0
|
||||
sub r0, r0, #ABT_STACK_SIZE
|
||||
msr CPSR_c, #MODE_FIQ|I_BIT|F_BIT /* FIQ Mode */
|
||||
mov sp, r0
|
||||
sub r0, r0, #FIQ_STACK_SIZE
|
||||
msr CPSR_c, #MODE_IRQ|I_BIT|F_BIT /* IRQ Mode */
|
||||
mov sp, r0
|
||||
sub r0, r0, #IRQ_STACK_SIZE
|
||||
msr CPSR_c, #MODE_SVC|I_BIT|F_BIT /* Supervisor Mode */
|
||||
mov sp, r0
|
||||
sub r0, r0, #SVC_STACK_SIZE
|
||||
msr CPSR_c, #MODE_SYS|I_BIT|F_BIT /* System Mode */
|
||||
mov sp, r0
|
||||
|
||||
/* We want to start in supervisor mode. Operation will switch to system
|
||||
mode when the first task starts. */
|
||||
msr CPSR_c, #MODE_SVC|I_BIT|F_BIT
|
||||
|
||||
/* Clear BSS. */
|
||||
|
||||
mov a2, #0 /* Fill value */
|
||||
mov fp, a2 /* Null frame pointer */
|
||||
mov r7, a2 /* Null frame pointer for Thumb */
|
||||
|
||||
ldr r1, .LC1 /* Start of memory block */
|
||||
ldr r3, .LC2 /* End of memory block */
|
||||
subs r3, r3, r1 /* Length of block */
|
||||
beq .end_clear_loop
|
||||
mov r2, #0
|
||||
|
||||
.clear_loop:
|
||||
strb r2, [r1], #1
|
||||
subs r3, r3, #1
|
||||
bgt .clear_loop
|
||||
|
||||
.end_clear_loop:
|
||||
|
||||
/* Initialise data. */
|
||||
|
||||
ldr r1, .LC3 /* Start of memory block */
|
||||
ldr r2, .LC4 /* End of memory block */
|
||||
ldr r3, .LC5
|
||||
subs r3, r3, r1 /* Length of block */
|
||||
beq .end_set_loop
|
||||
|
||||
.set_loop:
|
||||
ldrb r4, [r2], #1
|
||||
strb r4, [r1], #1
|
||||
subs r3, r3, #1
|
||||
bgt .set_loop
|
||||
|
||||
.end_set_loop:
|
||||
|
||||
mov r0, #0 /* no arguments */
|
||||
mov r1, #0 /* no argv either */
|
||||
|
||||
bl main
|
||||
|
||||
endless_loop:
|
||||
b endless_loop
|
||||
|
||||
|
||||
.align 0
|
||||
|
||||
.LC1:
|
||||
.word __bss_beg__
|
||||
.LC2:
|
||||
.word __bss_end__
|
||||
.LC3:
|
||||
.word __data_beg__
|
||||
.LC4:
|
||||
.word __data_beg_src__
|
||||
.LC5:
|
||||
.word __data_end__
|
||||
.LC6:
|
||||
.word __stack_end__
|
||||
|
||||
|
||||
/* Setup vector table. Note that undf, pabt, dabt, fiq just execute
|
||||
a null loop. */
|
||||
|
||||
.section .startup,"ax"
|
||||
.code 32
|
||||
.align 0
|
||||
|
||||
b _start /* reset - _start */
|
||||
ldr pc, _undf /* undefined - _undf */
|
||||
ldr pc, _swi /* SWI - _swi */
|
||||
ldr pc, _pabt /* program abort - _pabt */
|
||||
ldr pc, _dabt /* data abort - _dabt */
|
||||
nop /* reserved */
|
||||
ldr pc, [pc,#-0xFF0] /* IRQ - read the VIC */
|
||||
ldr pc, _fiq /* FIQ - _fiq */
|
||||
|
||||
_undf: .word __undf /* undefined */
|
||||
_swi: .word vPortYieldProcessor /* SWI */
|
||||
_pabt: .word __pabt /* program abort */
|
||||
_dabt: .word __dabt /* data abort */
|
||||
_fiq: .word __fiq /* FIQ */
|
||||
|
||||
__undf: b . /* undefined */
|
||||
__pabt: b . /* program abort */
|
||||
__dabt: b . /* data abort */
|
||||
__fiq: b . /* FIQ */
|
||||
49
Demo/ARM7_LPC2106_GCC/lpc2106-ram.ld
Normal file
49
Demo/ARM7_LPC2106_GCC/lpc2106-ram.ld
Normal file
@@ -0,0 +1,49 @@
|
||||
MEMORY
|
||||
{
|
||||
flash : ORIGIN = 0, LENGTH = 120K
|
||||
ram : ORIGIN = 0x40000000, LENGTH = 64K
|
||||
}
|
||||
|
||||
__stack_end__ = 0x40000000 + 64K - 4;
|
||||
|
||||
SECTIONS
|
||||
{
|
||||
. = 0;
|
||||
startup : { *(.startup)} >ram
|
||||
|
||||
prog :
|
||||
{
|
||||
*(.text)
|
||||
*(.rodata)
|
||||
*(.rodata*)
|
||||
*(.glue_7)
|
||||
*(.glue_7t)
|
||||
} >ram
|
||||
|
||||
__end_of_text__ = .;
|
||||
|
||||
.data :
|
||||
{
|
||||
__data_beg__ = .;
|
||||
__data_beg_src__ = __end_of_text__;
|
||||
*(.data)
|
||||
__data_end__ = .;
|
||||
} >ram
|
||||
|
||||
.bss :
|
||||
{
|
||||
__bss_beg__ = .;
|
||||
*(.bss)
|
||||
} >ram
|
||||
|
||||
/* Align here to ensure that the .bss section occupies space up to
|
||||
_end. Align after .bss to ensure correct alignment even if the
|
||||
.bss section disappears because there are no input sections. */
|
||||
. = ALIGN(32 / 8);
|
||||
}
|
||||
. = ALIGN(32 / 8);
|
||||
_end = .;
|
||||
_bss_end__ = . ; __bss_end__ = . ; __end__ = . ;
|
||||
PROVIDE (end = .);
|
||||
|
||||
|
||||
49
Demo/ARM7_LPC2106_GCC/lpc2106-rom.ld
Normal file
49
Demo/ARM7_LPC2106_GCC/lpc2106-rom.ld
Normal file
@@ -0,0 +1,49 @@
|
||||
MEMORY
|
||||
{
|
||||
flash : ORIGIN = 0, LENGTH = 120K
|
||||
ram : ORIGIN = 0x40000000, LENGTH = 64K
|
||||
}
|
||||
|
||||
__stack_end__ = 0x40000000 + 64K - 4;
|
||||
|
||||
SECTIONS
|
||||
{
|
||||
. = 0;
|
||||
startup : { *(.startup)} >flash
|
||||
|
||||
prog :
|
||||
{
|
||||
*(.text)
|
||||
*(.rodata)
|
||||
*(.rodata*)
|
||||
*(.glue_7)
|
||||
*(.glue_7t)
|
||||
} >flash
|
||||
|
||||
__end_of_text__ = .;
|
||||
|
||||
.data :
|
||||
{
|
||||
__data_beg__ = .;
|
||||
__data_beg_src__ = __end_of_text__;
|
||||
*(.data)
|
||||
__data_end__ = .;
|
||||
} >ram AT>flash
|
||||
|
||||
.bss :
|
||||
{
|
||||
__bss_beg__ = .;
|
||||
*(.bss)
|
||||
} >ram
|
||||
|
||||
/* Align here to ensure that the .bss section occupies space up to
|
||||
_end. Align after .bss to ensure correct alignment even if the
|
||||
.bss section disappears because there are no input sections. */
|
||||
. = ALIGN(32 / 8);
|
||||
}
|
||||
. = ALIGN(32 / 8);
|
||||
_end = .;
|
||||
_bss_end__ = . ; __bss_end__ = . ; __end__ = . ;
|
||||
PROVIDE (end = .);
|
||||
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user