Update all the Rx demos to use timers in their uIP task implementation.

This commit is contained in:
Richard Barry 2011-05-13 17:32:30 +00:00
parent 9ad9969536
commit 4e39c05bb6
47 changed files with 1440 additions and 848 deletions

View file

@ -16,7 +16,8 @@
[WORKSPACE_PROPERTIES]
[HELP_FILES]
"c:\devtools\renesas\hew\tools\renesas\rx\1_0_0\hew\stdlib.chm" "C/C++ Standard Library Help" 0
"c:\devtools\renesas\hew\tools\renesas\rx\1_0_1\hew\stdlib.chm" "C/C++ Standard Library Help" 1
"c:\devtools\renesas\hew\tools\renesas\rx\1_0_1\hew\stdlib.chm" "C/C++ Standard Library Help" 0
"c:\devtools\renesas\hew\tools\renesas\rx\1_0_2\hew\stdlib.chm" "C/C++ Standard Library Help" 1
[GENERAL_DATA_PROJECT]
[USERMENUTOOLS]
[CUSTOMPLACEHOLDERS]

View file

@ -10,8 +10,8 @@
"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\RX600_RX62N-RSK_Renesas\RTOSDemo\main-blinky.c"
"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\RX600_RX62N-RSK_Renesas\RTOSDemo\main-full.c"
[WORKSPACE_FILE_STATES]
"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\RX600_RX62N-RSK_Renesas\RTOSDemo\main-blinky.c" 88 88 1100 433 0 1
"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\RX600_RX62N-RSK_Renesas\RTOSDemo\main-full.c" -4 -23 1310 662 1 0
"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\RX600_RX62N-RSK_Renesas\RTOSDemo\main-blinky.c" 88 88 1100 433 0 0
"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\RX600_RX62N-RSK_Renesas\RTOSDemo\main-full.c" -4 -23 1310 680 1 1
[LOADED_PROJECTS]
"RTOSDemo"
[END]

View file

@ -93,6 +93,12 @@
#define configMAX_PRIORITIES ( ( unsigned portBASE_TYPE ) 7 )
#define configMAX_CO_ROUTINE_PRIORITIES ( 2 )
/* Software timer definitions. */
#define configUSE_TIMERS 1
#define configTIMER_TASK_PRIORITY ( 3 )
#define configTIMER_QUEUE_LENGTH 5
#define configTIMER_TASK_STACK_DEPTH ( configMINIMAL_STACK_SIZE )
/* The interrupt priority used by the kernel itself for the tick interrupt and
the pended interrupt. This would normally be the lowest priority. */
#define configKERNEL_INTERRUPT_PRIORITY 1
@ -120,6 +126,8 @@ to exclude the API function. */
#define INCLUDE_uxTaskGetStackHighWaterMark 1
#define INCLUDE_xTaskGetSchedulerState 1
#define configASSERT( x ) if( ( x ) == 0 ) { taskDISABLE_INTERRUPTS(); for( ;; ); }
extern volatile unsigned long ulHighFrequencyTickCount;
#define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS() nop() /* Run time stats use the same timer as the high frequency timer test. */
#define portGET_RUN_TIME_COUNTER_VALUE() ulHighFrequencyTickCount

View file

@ -162,6 +162,7 @@
"C:\E\Dev\FreeRTOS\WorkingCopy\Source\portable\Renesas\RX600\port_asm.src" "User" "C source file|FreeRTOS|Portable layer" 2
"C:\E\Dev\FreeRTOS\WorkingCopy\Source\queue.c" "User" "C source file|FreeRTOS" 2
"C:\E\Dev\FreeRTOS\WorkingCopy\Source\tasks.c" "User" "C source file|FreeRTOS" 2
"C:\E\Dev\FreeRTOS\WorkingCopy\Source\timers.c" "User" "C source file" 2
[FOLDER]
"Assembly source file" "Assembly source file"
"C source file" "C source file"
@ -190,7 +191,7 @@
[GENERAL_DATA_SESSION_SessionRX600_E1_E20_SYSTEM]
[GENERAL_DATA_SESSION_SimSessionRX600]
[OPTIONS_Blinky_Renesas OptLinker]
"Single Shot" "06039a50d711cc10" 5
"Single Shot" "095444c51911cc10" 5
[OPTIONS_Blinky_Renesas RX Assembler]
"Assembly source file" "0b955de7c711cc10" 4
"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\RX600_RX62N-RSK_Renesas\RTOSDemo\Renesas-Files\lowlvl.src" "0b955de7c711cc10" 4
@ -240,10 +241,11 @@
"C:\E\Dev\FreeRTOS\WorkingCopy\Source\portable\Renesas\RX600\port.c" "0b955de7c711cc10" 2
"C:\E\Dev\FreeRTOS\WorkingCopy\Source\queue.c" "0b955de7c711cc10" 2
"C:\E\Dev\FreeRTOS\WorkingCopy\Source\tasks.c" "0b955de7c711cc10" 2
"C:\E\Dev\FreeRTOS\WorkingCopy\Source\timers.c" "0d5972c51911cc10" 2
[OPTIONS_Blinky_Renesas RX C/C++ Library Generator]
"Single Shot" "0b955de7c711cc10" 1
[OPTIONS_Blinky_Renesas RX Configurator]
"Single Shot" "0bbed540d711cc10" 6
"Single Shot" "0d5972c51911cc10" 6
[OPTIONS_Blinky]
"" 0
"[V|VERSION|1] [B|COMMAND|1] [S|SPEC|UITRON4] [S|OUTPUTPATH|^"$(CONFIGDIR)^"] [S|CPU|RX600] [S|ENDIAN|LITTLE] [S|FINT_REGISTER|0]" 6
@ -288,7 +290,7 @@
[LINKAGE_ORDER_Blinky]
[GENERAL_DATA_CONFIGURATION_Blinky]
[OPTIONS_Debug_Renesas OptLinker]
"Single Shot" "06039a50d711cc10" 5
"Single Shot" "095444c51911cc10" 5
[OPTIONS_Debug_Renesas RX Assembler]
"Assembly source file" "0ce90de7c711cc10" 4
"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\RX600_RX62N-RSK_Renesas\RTOSDemo\Renesas-Files\lowlvl.src" "0ce90de7c711cc10" 4
@ -338,10 +340,11 @@
"C:\E\Dev\FreeRTOS\WorkingCopy\Source\portable\Renesas\RX600\port.c" "0ce90de7c711cc10" 2
"C:\E\Dev\FreeRTOS\WorkingCopy\Source\queue.c" "0ce90de7c711cc10" 2
"C:\E\Dev\FreeRTOS\WorkingCopy\Source\tasks.c" "0ce90de7c711cc10" 2
"C:\E\Dev\FreeRTOS\WorkingCopy\Source\timers.c" "0d5972c51911cc10" 2
[OPTIONS_Debug_Renesas RX C/C++ Library Generator]
"Single Shot" "0ce90de7c711cc10" 1
[OPTIONS_Debug_Renesas RX Configurator]
"Single Shot" "0bbed540d711cc10" 6
"Single Shot" "0d5972c51911cc10" 6
[OPTIONS_Debug]
"" 0
"[V|VERSION|1] [B|COMMAND|1] [S|SPEC|UITRON4] [S|OUTPUTPATH|^"$(CONFIGDIR)^"] [S|CPU|RX600] [S|ENDIAN|LITTLE] [S|FINT_REGISTER|0]" 6
@ -363,7 +366,7 @@
[LINKAGE_ORDER_Debug]
[GENERAL_DATA_CONFIGURATION_Debug]
[OPTIONS_Debug_RX600_E1_E20_SYSTEM_Renesas OptLinker]
"Single Shot" "06039a50d711cc10" 5
"Single Shot" "095444c51911cc10" 5
[OPTIONS_Debug_RX600_E1_E20_SYSTEM_Renesas RX Assembler]
"Assembly source file" "0cd2ece7c711cc10" 4
"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\RX600_RX62N-RSK_Renesas\RTOSDemo\Renesas-Files\lowlvl.src" "0cd2ece7c711cc10" 4
@ -413,10 +416,11 @@
"C:\E\Dev\FreeRTOS\WorkingCopy\Source\portable\Renesas\RX600\port.c" "0d3ebce7c711cc10" 2
"C:\E\Dev\FreeRTOS\WorkingCopy\Source\queue.c" "0d3ebce7c711cc10" 2
"C:\E\Dev\FreeRTOS\WorkingCopy\Source\tasks.c" "0d3ebce7c711cc10" 2
"C:\E\Dev\FreeRTOS\WorkingCopy\Source\timers.c" "0d5972c51911cc10" 2
[OPTIONS_Debug_RX600_E1_E20_SYSTEM_Renesas RX C/C++ Library Generator]
"Single Shot" "0d3ebce7c711cc10" 1
[OPTIONS_Debug_RX600_E1_E20_SYSTEM_Renesas RX Configurator]
"Single Shot" "0bbed540d711cc10" 6
"Single Shot" "0d5972c51911cc10" 6
[OPTIONS_Debug_RX600_E1_E20_SYSTEM]
"" 0
"[S|OUTPUTPATH|^"$(CONFIGDIR)\$(PROJECTNAME).lib^"] [V|VERSION|1] [S|CPU|RX600] [S|ENDIAN|LITTLE] [S|ROUND|NEAREST] [S|DBL_SIZE|4] [B|SIGNED_CHAR|0] [B|SIGNED_BITFIELD|0] [S|BIT_ORDER|RIGHT] [S|FINT_REGISTER|0] [S|BRANCH|24] [S|LANG|C] [B|RUNTIME|1] [B|CTYPE|0] [B|MATH|0] [B|MATHF|0] [B|STDARG|0] [B|STDIO|0] [B|STDLIB|0] [B|STRING|0] [B|IOS|0] [B|NEW|1] [B|COMPLEX|0] [B|CPPSTRING|0] [S|MODE|BUILD/CHANGED]" 1
@ -431,7 +435,7 @@
[LINKAGE_ORDER_Debug_RX600_E1_E20_SYSTEM]
[GENERAL_DATA_CONFIGURATION_Debug_RX600_E1_E20_SYSTEM]
[OPTIONS_Debug_with_optimisation_Renesas OptLinker]
"Single Shot" "06039a50d711cc10" 5
"Single Shot" "095444c51911cc10" 5
[OPTIONS_Debug_with_optimisation_Renesas RX Assembler]
"Assembly source file" "0d3ebce7c711cc10" 4
"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\RX600_RX62N-RSK_Renesas\RTOSDemo\Renesas-Files\lowlvl.src" "0d3ebce7c711cc10" 4
@ -481,10 +485,11 @@
"C:\E\Dev\FreeRTOS\WorkingCopy\Source\portable\Renesas\RX600\port.c" "0d279ce7c711cc10" 2
"C:\E\Dev\FreeRTOS\WorkingCopy\Source\queue.c" "0d279ce7c711cc10" 2
"C:\E\Dev\FreeRTOS\WorkingCopy\Source\tasks.c" "0d279ce7c711cc10" 2
"C:\E\Dev\FreeRTOS\WorkingCopy\Source\timers.c" "0d5972c51911cc10" 2
[OPTIONS_Debug_with_optimisation_Renesas RX C/C++ Library Generator]
"Single Shot" "0d279ce7c711cc10" 1
[OPTIONS_Debug_with_optimisation_Renesas RX Configurator]
"Single Shot" "0bbed540d711cc10" 6
"Single Shot" "0d5972c51911cc10" 6
[OPTIONS_Debug_with_optimisation]
"" 0
"[V|VERSION|1] [B|COMMAND|1] [S|SPEC|UITRON4] [S|OUTPUTPATH|^"$(CONFIGDIR)^"] [S|CPU|RX600] [S|ENDIAN|LITTLE] [S|FINT_REGISTER|0]" 6
@ -504,7 +509,7 @@
[LINKAGE_ORDER_Debug_with_optimisation]
[GENERAL_DATA_CONFIGURATION_Debug_with_optimisation]
[OPTIONS_SimDebug_RX600_Renesas OptLinker]
"Single Shot" "06039a50d711cc10" 5
"Single Shot" "095444c51911cc10" 5
[OPTIONS_SimDebug_RX600_Renesas RX Assembler]
"Assembly source file" "0cf03de7c711cc10" 4
"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\RX600_RX62N-RSK_Renesas\RTOSDemo\Renesas-Files\lowlvl.src" "0cf03de7c711cc10" 4
@ -554,10 +559,11 @@
"C:\E\Dev\FreeRTOS\WorkingCopy\Source\portable\Renesas\RX600\port.c" "0cf03de7c711cc10" 2
"C:\E\Dev\FreeRTOS\WorkingCopy\Source\queue.c" "0cf03de7c711cc10" 2
"C:\E\Dev\FreeRTOS\WorkingCopy\Source\tasks.c" "0cf03de7c711cc10" 2
"C:\E\Dev\FreeRTOS\WorkingCopy\Source\timers.c" "0d5972c51911cc10" 2
[OPTIONS_SimDebug_RX600_Renesas RX C/C++ Library Generator]
"Single Shot" "0cf03de7c711cc10" 1
[OPTIONS_SimDebug_RX600_Renesas RX Configurator]
"Single Shot" "0bbed540d711cc10" 6
"Single Shot" "0d5972c51911cc10" 6
[OPTIONS_SimDebug_RX600]
"" 0
"[S|OUTPUTPATH|^"$(CONFIGDIR)\$(PROJECTNAME).lib^"] [V|VERSION|1] [S|CPU|RX600] [S|ENDIAN|LITTLE] [S|ROUND|NEAREST] [S|DBL_SIZE|4] [B|SIGNED_CHAR|0] [B|SIGNED_BITFIELD|0] [S|BIT_ORDER|RIGHT] [S|FINT_REGISTER|0] [S|BRANCH|24] [S|LANG|C] [B|RUNTIME|1] [B|CTYPE|0] [B|MATH|0] [B|MATHF|0] [B|STDARG|0] [B|STDIO|0] [B|STDLIB|0] [B|STRING|0] [B|IOS|0] [B|NEW|1] [B|COMPLEX|0] [B|CPPSTRING|0] [S|MODE|BUILD/CHANGED]" 1

View file

@ -89,31 +89,31 @@
"{5F75FDA0-6FF0-11D5-B7CE-00E029352378}PACtrlViews" "0"
"{64753FED-D387-4B8C-A91D-D3419C869C07}C_EVAL_DENORMAL_MODE" "16777216"
"{64753FED-D387-4B8C-A91D-D3419C869C07}C_EVAL_ROUND_MODE" "768"
"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_0" "000000000000BD20"
"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_1" "000000000000BB8B"
"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_0" "000000000000CEC4"
"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_1" "0000000000000000"
"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_10" "00000000A5A5A5A5"
"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_11" "00000000A5A5A5A5"
"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_12" "00000000A5A5A5A5"
"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_13" "00000000A5A5A5A5"
"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_14" "0000000000012A60"
"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_15" "0000000000000014"
"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_16" "000000000000BD20"
"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_17" "00000000000130D0"
"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_18" "0000000004030004"
"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_19" "00000000FFF9817C"
"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_2" "00000000FFF8A81A"
"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_20" "00000000FFF8B0C8"
"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_14" "00000000426E0000"
"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_15" "000000000001097C"
"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_16" "000000000000CEC4"
"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_17" "00000000000130CC"
"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_18" "0000000000030004"
"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_19" "00000000FFF8C73C"
"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_2" "0000000000000000"
"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_20" "00000000FFF8B130"
"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_21" "0000000000000000"
"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_22" "0000000000000000"
"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_23" "0000000000000000"
"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_24" "0000000000000100"
"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_25" "1234567887650000"
"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_3" "000000000000000E"
"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_4" "00000000000000A5"
"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_5" "00000000000000A5"
"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_6" "00000000A5A5A5A5"
"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_7" "00000000A5A5A5A5"
"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_8" "00000000A5A5A5A5"
"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_3" "000000000000000A"
"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_4" "0000000000000007"
"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_5" "0000000041380000"
"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_6" "0000000000000000"
"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_7" "0000000000004FD6"
"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_8" "000000000000E6AC"
"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_9" "00000000A5A5A5A5"
"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_COUNT" "26"
"{6C4D5B81-FD67-46A9-A089-EA44DCDE47FD}RAMMonitorManagerCtrlBlockInfoFileDir" ""
@ -370,7 +370,7 @@
0
[WINDOW_POSITION_STATE_DATA_VD1]
"Help" "TOOLBAR 0" 59419 1 5 "0.00" 0 0 0 0 0 17 0 "" "0.0"
"{WK_00000001_CmdLine}" "WINDOW" 59422 0 1 "0.07" 228 0 0 350 200 17 0 "32771|32772|32778|<<separator>>|32773|32774|<<separator>>|32820|<<separator>>|32801|32824" "0.0"
"{WK_00000001_CmdLine}" "WINDOW" 59422 0 1 "0.07" 228 0 0 100 100 17 0 "32771|32772|32778|<<separator>>|32773|32774|<<separator>>" "0.0"
"{WK_00000001_DEBUGCONSOLE}RTOSDemoSessionRX600_E1_E20_SYSTEM" "WINDOW" 59421 0 1 "1.00" 374 0 0 350 200 17 0 "57634|57637|57633|<<separator>>|32781|32782|<<separator>>|32780|32785|32787" "0.0"
"{WK_00000001_DISASSEMBLY}" "WINDOW" 0 0 0 "0.00" 0 0 0 1062 571 9 0 "" "0.0"
"{WK_00000001_IO}RTOSDemoSessionRX600_E1_E20_SYSTEM" "WINDOW" 59422 0 2 "0.39" 228 0 0 350 200 17 0 "32817|32826|32819|32820|32821" "0.0"

View file

@ -2,7 +2,7 @@
DebugMode=0
PowerOut=0
ResetRelease=0
EmulatorSerial=E1:_9KM000237
EmulatorSerial=
McuGroup=RX62N Group
Device=R5F562N8
McuFileDir=RX62NGr

View file

@ -57,7 +57,8 @@
/* Scheduler includes. */
#include "FreeRTOS.h"
#include "task.h"
#include "semphr.h"
#include "timers.h"
#include "queue.h"
/* uip includes. */
#include "net/uip.h"
@ -81,6 +82,15 @@
/* Standard constant. */
#define uipTOTAL_FRAME_HEADER_SIZE 54
/* The ARP timer and the periodic timer share a callback function, so the
respective timer IDs are used to determine which timer actually expired. These
constants are assigned to the timer IDs. */
#define uipARP_TIMER 0
#define uipPERIODIC_TIMER 1
/* A block time of zero ticks simply means, "don't block". */
#define uipDONT_BLOCK 0UL
/*-----------------------------------------------------------*/
/*
@ -88,25 +98,29 @@
*/
static void prvSetMACAddress( void );
/*
* Perform any uIP initialisation necessary.
*/
static void prvInitialise_uIP( void );
/*
* The callback function that is assigned to both the periodic timer and the
* ARP timer.
*/
static void prvUIPTimerCallback( xTimerHandle xTimer );
/*
* Port functions required by the uIP stack.
*/
void clock_init( void );
clock_time_t clock_time( void );
/*-----------------------------------------------------------*/
/* The semaphore used by the ISR to wake the uIP task. */
xSemaphoreHandle xEMACSemaphore = NULL;
/* The queue used to send TCP/IP events to the uIP stack. */
xQueueHandle xEMACEventQueue = NULL;
/*-----------------------------------------------------------*/
void clock_init(void)
{
/* This is done when the scheduler starts. */
}
/*-----------------------------------------------------------*/
clock_time_t clock_time( void )
{
return xTaskGetTickCount();
@ -115,25 +129,14 @@ clock_time_t clock_time( void )
void vuIP_Task( void *pvParameters )
{
portBASE_TYPE i, xDoneSomething;
uip_ipaddr_t xIPAddr;
struct timer periodic_timer, arp_timer;
portBASE_TYPE i;
unsigned long ulNewEvent = 0UL;
unsigned long ulUIP_Events = 0UL;
( void ) pvParameters;
/* Initialise the uIP stack. */
timer_set( &periodic_timer, configTICK_RATE_HZ / 2 );
timer_set( &arp_timer, configTICK_RATE_HZ * 10 );
uip_init();
uip_ipaddr( &xIPAddr, configIP_ADDR0, configIP_ADDR1, configIP_ADDR2, configIP_ADDR3 );
uip_sethostaddr( &xIPAddr );
uip_ipaddr( &xIPAddr, configNET_MASK0, configNET_MASK1, configNET_MASK2, configNET_MASK3 );
uip_setnetmask( &xIPAddr );
prvSetMACAddress();
httpd_init();
/* Create the semaphore used to wake the uIP task. */
vSemaphoreCreateBinary( xEMACSemaphore );
prvInitialise_uIP();
/* Initialise the MAC. */
vInitEmac();
@ -145,49 +148,51 @@ struct timer periodic_timer, arp_timer;
for( ;; )
{
xDoneSomething = pdFALSE;
/* Is there received data ready to be processed? */
uip_len = ( unsigned short ) ulEMACRead();
if( ( uip_len > 0 ) && ( uip_buf != NULL ) )
{
/* Standard uIP loop taken from the uIP manual. */
if( xHeader->type == htons( UIP_ETHTYPE_IP ) )
if( ( ulUIP_Events & uipETHERNET_RX_EVENT ) != 0UL )
{
/* Is there received data ready to be processed? */
uip_len = ( unsigned short ) ulEMACRead();
if( ( uip_len > 0 ) && ( uip_buf != NULL ) )
{
uip_arp_ipin();
uip_input();
/* If the above function invocation resulted in data that
should be sent out on the network, the global variable
uip_len is set to a value > 0. */
if( uip_len > 0 )
/* Standard uIP loop taken from the uIP manual. */
if( xHeader->type == htons( UIP_ETHTYPE_IP ) )
{
uip_arp_out();
vEMACWrite();
uip_arp_ipin();
uip_input();
/* If the above function invocation resulted in data that
should be sent out on the network, the global variable
uip_len is set to a value > 0. */
if( uip_len > 0 )
{
uip_arp_out();
vEMACWrite();
}
}
else if( xHeader->type == htons( UIP_ETHTYPE_ARP ) )
{
uip_arp_arpin();
/* If the above function invocation resulted in data that
should be sent out on the network, the global variable
uip_len is set to a value > 0. */
if( uip_len > 0 )
{
vEMACWrite();
}
}
xDoneSomething = pdTRUE;
}
else if( xHeader->type == htons( UIP_ETHTYPE_ARP ) )
else
{
uip_arp_arpin();
/* If the above function invocation resulted in data that
should be sent out on the network, the global variable
uip_len is set to a value > 0. */
if( uip_len > 0 )
{
vEMACWrite();
}
xDoneSomething = pdTRUE;
ulUIP_Events &= ~uipETHERNET_RX_EVENT;
}
}
if( timer_expired( &periodic_timer ) && ( uip_buf != NULL ) )
if( ( ulUIP_Events & uipPERIODIC_TIMER_EVENT ) != 0UL )
{
timer_reset( &periodic_timer );
ulUIP_Events &= ~uipPERIODIC_TIMER_EVENT;
for( i = 0; i < UIP_CONNS; i++ )
{
uip_periodic( i );
@ -201,25 +206,82 @@ struct timer periodic_timer, arp_timer;
vEMACWrite();
}
}
/* Call the ARP timer function every 10 seconds. */
if( timer_expired( &arp_timer ) )
{
timer_reset( &arp_timer );
uip_arp_timer();
}
xDoneSomething = pdTRUE;
}
if( xDoneSomething == pdFALSE )
/* Call the ARP timer function every 10 seconds. */
if( ( ulUIP_Events & uipARP_TIMER_EVENT ) != 0 )
{
/* We did not receive a packet, and there was no periodic
processing to perform. Block for a fixed period. If a packet
is received during this period we will be woken by the ISR
giving us the Semaphore. */
xSemaphoreTake( xEMACSemaphore, configTICK_RATE_HZ / 20 );
ulUIP_Events &= ~uipARP_TIMER_EVENT;
uip_arp_timer();
}
if( ulUIP_Events == pdFALSE )
{
xQueueReceive( xEMACEventQueue, &ulNewEvent, portMAX_DELAY );
ulUIP_Events |= ulNewEvent;
}
}
}
/*-----------------------------------------------------------*/
static void prvInitialise_uIP( void )
{
xTimerHandle xARPTimer, xPeriodicTimer;
uip_ipaddr_t xIPAddr;
const unsigned long ul_uIPEventQueueLength = 10UL;
/* Initialise the uIP stack. */
uip_init();
uip_ipaddr( &xIPAddr, configIP_ADDR0, configIP_ADDR1, configIP_ADDR2, configIP_ADDR3 );
uip_sethostaddr( &xIPAddr );
uip_ipaddr( &xIPAddr, configNET_MASK0, configNET_MASK1, configNET_MASK2, configNET_MASK3 );
uip_setnetmask( &xIPAddr );
prvSetMACAddress();
httpd_init();
/* Create the queue used to sent TCP/IP events to the uIP stack. */
xEMACEventQueue = xQueueCreate( ul_uIPEventQueueLength, sizeof( unsigned long ) );
/* Create and start the uIP timers. */
xARPTimer = xTimerCreate( ( const signed char * const ) "ARPTimer", /* Just a name that is helpful for debugging, not used by the kernel. */
( 10000UL / portTICK_RATE_MS ), /* Timer period. */
pdTRUE, /* Autor-reload. */
( void * ) uipARP_TIMER,
prvUIPTimerCallback
);
xPeriodicTimer = xTimerCreate( ( const signed char * const ) "PeriodicTimer",
( 500 / portTICK_RATE_MS ),
pdTRUE, /* Autor-reload. */
( void * ) uipPERIODIC_TIMER,
prvUIPTimerCallback
);
configASSERT( xARPTimer );
configASSERT( xPeriodicTimer );
xTimerStart( xARPTimer, portMAX_DELAY );
xTimerStart( xPeriodicTimer, portMAX_DELAY );
}
/*-----------------------------------------------------------*/
static void prvUIPTimerCallback( xTimerHandle xTimer )
{
static const unsigned long ulARPTimerExpired = uipARP_TIMER_EVENT;
static const unsigned long ulPeriodicTimerExpired = uipPERIODIC_TIMER_EVENT;
/* This is a time callback, so calls to xQueueSend() must not attempt to
block. */
switch( ( int ) pvTimerGetTimerID( xTimer ) )
{
case uipARP_TIMER : xQueueSend( xEMACEventQueue, &ulARPTimerExpired, uipDONT_BLOCK );
break;
case uipPERIODIC_TIMER : xQueueSend( xEMACEventQueue, &ulPeriodicTimerExpired, uipDONT_BLOCK );
break;
default : /* Should not get here. */
break;
}
}
/*-----------------------------------------------------------*/
@ -250,28 +312,33 @@ char *c;
{
/* Is there a command in the string? */
c = strstr( pcInputString, "?" );
if( c )
{
if( c )
{
/* Turn the LED's on or off in accordance with the check box status. */
if( strstr( c, "LED0=1" ) != NULL )
{
/* Turn LEDs on. */
vParTestSetLED( 3, 1 );
vParTestSetLED( 4, 1 );
/* Turn the LEDs on. */
vParTestSetLED( 7, 1 );
vParTestSetLED( 8, 1 );
vParTestSetLED( 9, 1 );
vParTestSetLED( 10, 1 );
}
else
{
/* Turn LED 4 off. */
vParTestSetLED( 3, 0 );
vParTestSetLED( 4, 0 );
/* Turn the LEDs off. */
vParTestSetLED( 7, 0 );
vParTestSetLED( 8, 0 );
vParTestSetLED( 9, 0 );
vParTestSetLED( 10, 0 );
}
}
}
else
{
/* Commands to turn LEDs off are not always explicit, turn LED 4
off. */
vParTestSetLED( 3, 0 );
vParTestSetLED( 4, 0 );
/* Commands to turn LEDs off are not always explicit. */
vParTestSetLED( 7, 0 );
vParTestSetLED( 8, 0 );
vParTestSetLED( 9, 0 );
vParTestSetLED( 10, 0 );
}
}
}

View file

@ -246,23 +246,29 @@ unsigned long ulBytesReceived;
if( ulBytesReceived > 0 )
{
pxCurrentRxDesc->status &= ~( FP1 | FP0 );
pxCurrentRxDesc->status |= ACT;
/* Mark the pxDescriptor buffer as free as uip_buf is going to be set to
the buffer that contains the received data. */
prvReturnBuffer( uip_buf );
/* Point uip_buf to the data about ot be processed. */
uip_buf = ( void * ) pxCurrentRxDesc->buf_p;
/* Allocate a new buffer to the descriptor, as uip_buf is now using it's
old descriptor. */
pxCurrentRxDesc->buf_p = prvGetNextBuffer();
/* Prepare the descriptor to go again. */
pxCurrentRxDesc->status &= ~( FP1 | FP0 );
pxCurrentRxDesc->status |= ACT;
/* Move onto the next buffer in the ring. */
pxCurrentRxDesc = pxCurrentRxDesc->next;
if( EDMAC.EDRRR.LONG == 0x00000000L )
{
/* Restart Ethernet if it has stopped */
EDMAC.EDRRR.LONG = 0x00000001L;
}
/* Mark the pxDescriptor buffer as free as uip_buf is going to be set to
the buffer that contains the received data. */
prvReturnBuffer( uip_buf );
uip_buf = ( void * ) pxCurrentRxDesc->buf_p;
/* Move onto the next buffer in the ring. */
pxCurrentRxDesc = pxCurrentRxDesc->next;
}
return ulBytesReceived;
@ -521,7 +527,8 @@ static void prvConfigureEtherCAndEDMAC( void )
EDMAC.TFTR.LONG = 0x00000000; /* Threshold of Tx_FIFO */
EDMAC.FDR.LONG = 0x00000000; /* Transmit fifo & receive fifo is 256 bytes */
EDMAC.RMCR.LONG = 0x00000003; /* Receive function is normal mode(continued) */
ETHERC.ECMR.BIT.PRM = 0; /* Ensure promiscuous mode is off. */
/* Enable the interrupt... */
_IEN( _ETHER_EINT ) = 1;
}
@ -532,19 +539,14 @@ void vEMAC_ISR_Handler( void )
{
unsigned long ul = EDMAC.EESR.LONG;
long lHigherPriorityTaskWoken = pdFALSE;
extern xSemaphoreHandle xEMACSemaphore;
static long ulTxEndInts = 0;
extern xQueueHandle xEMACEventQueue;
const unsigned long ulRxEvent = uipETHERNET_RX_EVENT;
/* Has a Tx end occurred? */
if( ul & emacTX_END_INTERRUPT )
{
++ulTxEndInts;
if( ulTxEndInts >= 2 )
{
/* Only return the buffer to the pool once both Txes have completed. */
prvReturnBuffer( ( void * ) xTxDescriptors[ 0 ].buf_p );
ulTxEndInts = 0;
}
/* Only return the buffer to the pool once both Txes have completed. */
prvReturnBuffer( ( void * ) xTxDescriptors[ 0 ].buf_p );
EDMAC.EESR.LONG = emacTX_END_INTERRUPT;
}
@ -552,7 +554,7 @@ static long ulTxEndInts = 0;
if( ul & emacRX_END_INTERRUPT )
{
/* Make sure the Ethernet task is not blocked waiting for a packet. */
xSemaphoreGiveFromISR( xEMACSemaphore, &lHigherPriorityTaskWoken );
xQueueSendFromISR( xEMACEventQueue, &ulRxEvent, &lHigherPriorityTaskWoken );
portYIELD_FROM_ISR( lHigherPriorityTaskWoken );
EDMAC.EESR.LONG = emacRX_END_INTERRUPT;
}