From ba7d8018dce965fa138129f5bbcff61747bbd34b Mon Sep 17 00:00:00 2001 From: richardbarry Date: Fri, 13 May 2011 17:32:30 +0000 Subject: [PATCH] Update all the Rx demos to use timers in their uIP task implementation. git-svn-id: https://svn.code.sf.net/p/freertos/code/trunk@1423 1d2547de-c912-0410-9cb9-b8ca96c0e9e2 --- .../RTOSDemo/FreeRTOSConfig.h | 8 + .../RTOSDemo/RTOSDemo.hwp | 13 +- .../RTOSDemo/RTOSDemo.nav | Bin 136220 -> 140409 bytes .../RTOSDemo/RTOSDemo.tps | 4 +- .../RTOSDemo/SessionRX600_E1_E20_SYSTEM.hsf | 47 ++-- .../RX600_RX62N-RDK_GNURX/RTOSDemo/uIP_Task.c | 214 +++++++++------ .../RTOSDemo/webserver/EMAC.c | 42 +-- .../RX600_RX62N_RDK_GNURX.tws | 4 +- Demo/RX600_RX62N-RDK_IAR/FreeRTOSConfig.h | 5 + Demo/RX600_RX62N-RDK_IAR/RTOSDemo.ewp | 111 +++++++- .../settings/RTOSDemo.cspy.bat | 38 +-- .../settings/RTOSDemo.dbgdt | 8 +- .../RX600_RX62N-RDK_IAR/settings/RTOSDemo.dni | 48 +++- .../settings/RTOSDemo.wsdt | 8 +- Demo/RX600_RX62N-RDK_IAR/uIP_Task.c | 214 +++++++++------ Demo/RX600_RX62N-RDK_IAR/webserver/EMAC.c | 66 ++--- Demo/RX600_RX62N-RDK_Renesas/RTOSDemo.tws | 4 +- .../RTOSDemo/RTOSDemo.nav | Bin 148815 -> 148815 bytes .../RTOSDemo/SessionRX600_E1_E20_SYSTEM.hsf | 32 +-- .../RTOSDemo/uIP_Task.c | 1 - .../RTOSDemo/FreeRTOSConfig.h | 8 + .../RTOSDemo/RTOSDemo.hwp | 185 ++++++------- .../RTOSDemo/RTOSDemo.nav | Bin 126758 -> 130904 bytes .../RTOSDemo/SessionRX600_E1_E20_SYSTEM.hsf | 37 +-- .../RX600_RX62N-RSK_GNURX/RTOSDemo/uIP_Task.c | 246 +++++++++++------- .../RTOSDemo/webserver/EMAC.c | 42 +-- .../RX600_RX62N_RSK_GNURX.tws | 2 + Demo/RX600_RX62N-RSK_IAR/FreeRTOSConfig.h | 15 +- Demo/RX600_RX62N-RSK_IAR/RTOSDemo.ewp | 111 +++++++- .../settings/RTOSDemo.cspy.bat | 38 +-- .../settings/RTOSDemo.dbgdt | 8 +- .../RX600_RX62N-RSK_IAR/settings/RTOSDemo.dni | 35 ++- .../settings/RTOSDemo.wsdt | 10 +- Demo/RX600_RX62N-RSK_IAR/uIP_Task.c | 246 +++++++++++------- Demo/RX600_RX62N-RSK_IAR/webserver/EMAC.c | 66 ++--- Demo/RX600_RX62N-RSK_Renesas/RTOSDemo.hws | 3 +- Demo/RX600_RX62N-RSK_Renesas/RTOSDemo.tws | 4 +- .../RTOSDemo/Debug/Debug.hdp | Bin 342061 -> 352135 bytes .../Debug_RX600_E1_E20_SYSTEM.hdp | Bin 4867 -> 4950 bytes .../RTOSDemo/FreeRTOSConfig.h | 8 + .../RTOSDemo/RTOSDemo.hwp | 26 +- .../RTOSDemo/RTOSDemo.nav | Bin 171517 -> 173774 bytes .../RTOSDemo/SessionRX600_E1_E20_SYSTEM.hsf | 34 +-- .../RTOSDemo/SessionRX600_E1_E20_SYSTEM.ini | 2 +- .../SimDebug_RX600/SimDebug_RX600.hdp | Bin 4845 -> 4928 bytes .../RTOSDemo/uIP_Task.c | 245 ++++++++++------- .../RTOSDemo/webserver/EMAC.c | 44 ++-- 47 files changed, 1437 insertions(+), 845 deletions(-) diff --git a/Demo/RX600_RX62N-RDK_GNURX/RTOSDemo/FreeRTOSConfig.h b/Demo/RX600_RX62N-RDK_GNURX/RTOSDemo/FreeRTOSConfig.h index 249fc9895..c4a7da88c 100644 --- a/Demo/RX600_RX62N-RDK_GNURX/RTOSDemo/FreeRTOSConfig.h +++ b/Demo/RX600_RX62N-RDK_GNURX/RTOSDemo/FreeRTOSConfig.h @@ -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 @@ -115,6 +121,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() portNOP() /* Run time stats use the same timer as the high frequency timer test. */ #define portGET_RUN_TIME_COUNTER_VALUE() ulHighFrequencyTickCount diff --git a/Demo/RX600_RX62N-RDK_GNURX/RTOSDemo/RTOSDemo.hwp b/Demo/RX600_RX62N-RDK_GNURX/RTOSDemo/RTOSDemo.hwp index 5d7f002a0..780e1aba3 100644 --- a/Demo/RX600_RX62N-RDK_GNURX/RTOSDemo/RTOSDemo.hwp +++ b/Demo/RX600_RX62N-RDK_GNURX/RTOSDemo/RTOSDemo.hwp @@ -159,6 +159,7 @@ "C:\E\Dev\FreeRTOS\WorkingCopy\Source\portable\MemMang\heap_2.c" "User" "C source file|FreeRTOS Source|Portable Layer" 2 "C:\E\Dev\FreeRTOS\WorkingCopy\Source\queue.c" "User" "C source file|FreeRTOS Source" 2 "C:\E\Dev\FreeRTOS\WorkingCopy\Source\tasks.c" "User" "C source file|FreeRTOS Source" 2 +"C:\E\Dev\FreeRTOS\WorkingCopy\Source\timers.c" "User" "C source file|FreeRTOS Source" 2 [FOLDER] "C header file" "C header file" "C source file" "C source file" @@ -224,11 +225,12 @@ "C:\E\Dev\FreeRTOS\WorkingCopy\Source\portable\MemMang\heap_2.c" "099d5a320aa5bc10" 2 "C:\E\Dev\FreeRTOS\WorkingCopy\Source\queue.c" "099d5a320aa5bc10" 2 "C:\E\Dev\FreeRTOS\WorkingCopy\Source\tasks.c" "099d5a320aa5bc10" 2 +"C:\E\Dev\FreeRTOS\WorkingCopy\Source\timers.c" "0b0cb036c811cc10" 2 "Preprocess Assembly file" "099d5a320aa5bc10" 2 [OPTIONS_Blinky_GNU Library Generator] "Single Shot" "099d5a320aa5bc10" 1 [OPTIONS_Blinky_GNU Linker] -"Single Shot" "099d5a320aa5bc10" 4 +"Single Shot" "083de136c811cc10" 4 [OPTIONS_Blinky] "" 0 "[V|VERSION|2] [B|DOEXTF|1] [S|INCDIR|^"$(TCINSTALL)\rx-elf\lib\gcc\rx-elf\4.5-GNURX_v10.03^"|^"$(CONFIGDIR)^"] [B|RSARCH|1] [B|FIXUPLIBS|1] [S|ARCHIVE|lib$(PROJECTNAME).a*libgcc.a] [S|OUTFORM|BOTH] [B|MFILEGEN|1] [S|PLMFILE|^"$(CONFIGDIR)\$(PROJECTNAME).map^"] [S|OUTFILE|^"$(CONFIGDIR)\$(PROJECTNAME).x^"] [S|GROUPDET|.fvectors|0|0||1|0xFFFFFF80|0|1|0|.fvectors|All-files|<>|<>|<>|.text|0|0||1|0xFFF80000|0|0|0|.text|All-files|<>|0|.text.*|All-files|<>|0|P|All-files|<>|1|etext|<>|<>|<>|.rvectors|0|0||0||0|1|1|_rvectors_start|<>|0|.rvectors|All-files|<>|1|_rvectors_end|<>|<>|<>|.init|0|0||0||0|0|0|.init|All-files|<>|<>|<>|.fini|0|0||0||0|0|0|.fini|All-files|<>|<>|<>|.got|0|0||0||0|0|0|.got|All-files|<>|0|.got.plt|All-files|<>|<>|<>|.rodata|0|0||0||0|0|0|.rodata|All-files|<>|0|.rodata.*|All-files|<>|0|C_1|All-files|<>|0|C_2|All-files|<>|0|C|All-files|<>|1|_erodata|<>|<>|<>|.eh_frame_hdr|0|0||0||0|0|0|.eh_frame_hdr|All-files|<>|<>|<>|.eh_frame|0|0||0||0|0|0|.eh_frame|All-files|<>|<>|<>|.jcr|0|0||0||0|0|0|.jcr|All-files|<>|<>|<>|.tors|0|0||0||0|0|1|__CTOR_LIST__|<>|1|___ctors|<>|0|.ctors|All-files|<>|1|___ctors_end|<>|1|__CTOR_END__|<>|1|__DTOR_LIST__|<>|1|___dtors|<>|0|.dtors|All-files|<>|1|___dtors_end|<>|1|__DTOR_END__|<>|1|_mdata|<>|<>|<>|.istack|0|0||1|0x00017FFC|0|0|1|_istack|<>|<>|<>|.ustack|0|0||1|0x000179BC|0|0|1|_ustack|<>|<>|<>|.data|0|2|_mdata|1|0x00001000|0|0|1|_data|<>|0|.data|All-files|<>|0|.data.*|All-files|<>|0|D|All-files|<>|0|D_1|All-files|<>|0|D_2|All-files|<>|1|_edata|<>|<>|<>|.gcc_exc|0|0||0||0|0|0|.gcc_exc|All-files|<>|<>|<>|.bss|0|0||0||0|0|1|_bss|<>|0|.bss|All-files|<>|0|.bss.*|All-files|<>|0|COMMON|All-files|<>|0|B|All-files|<>|0|B_1|All-files|<>|0|B_2|All-files|<>|1|_ebss|<>|1|_end|<>|<>|<>|] [S|APPTXT|^"-e _start^"] [S|CPUTYPE|RX600] [S|ENDIAN|LITTLE] [S|CPU|Other] [I|RMINTREGVAL|0] [I|RMMAXCONSTVAL|0] [I|RMMAXVARSVAL|0] [S|PROJECTTYPE|CAPPPROJECT] [B|DOOPTLIB|1] [B|DOPROJBUILT|1] @@ -309,11 +311,12 @@ "C:\E\Dev\FreeRTOS\WorkingCopy\Source\portable\MemMang\heap_2.c" "0adae9320aa5bc10" 2 "C:\E\Dev\FreeRTOS\WorkingCopy\Source\queue.c" "0adae9320aa5bc10" 2 "C:\E\Dev\FreeRTOS\WorkingCopy\Source\tasks.c" "0adae9320aa5bc10" 2 +"C:\E\Dev\FreeRTOS\WorkingCopy\Source\timers.c" "0b0cb036c811cc10" 2 "Preprocess Assembly file" "0adae9320aa5bc10" 2 [OPTIONS_Debug_GNU Library Generator] "Single Shot" "0adae9320aa5bc10" 1 [OPTIONS_Debug_GNU Linker] -"Single Shot" "097f0a320aa5bc10" 4 +"Single Shot" "083de136c811cc10" 4 [OPTIONS_Debug] "" 0 "[V|VERSION|2] [B|DOEXTF|1] [S|INCDIR|^"$(TCINSTALL)\rx-elf\lib\gcc\rx-elf\4.5-GNURX_v10.03^"|^"$(CONFIGDIR)^"] [B|RSARCH|1] [B|FIXUPLIBS|1] [S|ARCHIVE|libgcc.a*lib$(PROJECTNAME).a] [S|OUTFORM|BOTH] [B|MFILEGEN|1] [S|PLMFILE|^"$(CONFIGDIR)\$(PROJECTNAME).map^"] [S|OUTFILE|^"$(CONFIGDIR)\$(PROJECTNAME).x^"] [S|GROUPDET|.fvectors|0|0||1|0xFFFFFF80|0|1|0|.fvectors|All-files|<>|<>|<>|.text|0|0||1|0xFFF80000|0|0|0|.text|All-files|<>|0|.text.*|All-files|<>|0|P|All-files|<>|1|etext|<>|<>|<>|.rvectors|0|0||0||0|1|1|_rvectors_start|<>|0|.rvectors|All-files|<>|1|_rvectors_end|<>|<>|<>|.init|0|0||0||0|0|0|.init|All-files|<>|<>|<>|.fini|0|0||0||0|0|0|.fini|All-files|<>|<>|<>|.got|0|0||0||0|0|0|.got|All-files|<>|0|.got.plt|All-files|<>|<>|<>|.rodata|0|0||0||0|0|0|.rodata|All-files|<>|0|.rodata.*|All-files|<>|0|C_1|All-files|<>|0|C_2|All-files|<>|0|C|All-files|<>|1|_erodata|<>|<>|<>|.eh_frame_hdr|0|0||0||0|0|0|.eh_frame_hdr|All-files|<>|<>|<>|.eh_frame|0|0||0||0|0|0|.eh_frame|All-files|<>|<>|<>|.jcr|0|0||0||0|0|0|.jcr|All-files|<>|<>|<>|.tors|0|0||0||0|0|1|__CTOR_LIST__|<>|1|___ctors|<>|0|.ctors|All-files|<>|1|___ctors_end|<>|1|__CTOR_END__|<>|1|__DTOR_LIST__|<>|1|___dtors|<>|0|.dtors|All-files|<>|1|___dtors_end|<>|1|__DTOR_END__|<>|1|_mdata|<>|<>|<>|.istack|0|0||1|0x00017FFC|0|0|1|_istack|<>|<>|<>|.ustack|0|0||1|0x000179BC|0|0|1|_ustack|<>|<>|<>|.data|0|2|_mdata|1|0x00001000|0|0|1|_data|<>|0|.data|All-files|<>|0|.data.*|All-files|<>|0|D|All-files|<>|0|D_1|All-files|<>|0|D_2|All-files|<>|1|_edata|<>|<>|<>|.gcc_exc|0|0||0||0|0|0|.gcc_exc|All-files|<>|<>|<>|.bss|0|0||0||0|0|1|_bss|<>|0|.bss|All-files|<>|0|.bss.*|All-files|<>|0|COMMON|All-files|<>|0|B|All-files|<>|0|B_1|All-files|<>|0|B_2|All-files|<>|1|_ebss|<>|1|_end|<>|<>|<>|] [B|WONCEU|1] [B|OUTTRAD|1] [S|APPTXT|^"-e _start^"] [S|CPUTYPE|RX600] [S|ENDIAN|LITTLE] [S|CPU|Other] [I|RMINTREGVAL|0] [I|RMMAXCONSTVAL|0] [I|RMMAXVARSVAL|0] [S|PROJECTTYPE|CAPPPROJECT] [B|DOOPTLIB|1] [B|DOPROJBUILT|1] @@ -370,11 +373,12 @@ "C:\E\Dev\FreeRTOS\WorkingCopy\Source\portable\MemMang\heap_2.c" "08328a320aa5bc10" 2 "C:\E\Dev\FreeRTOS\WorkingCopy\Source\queue.c" "08328a320aa5bc10" 2 "C:\E\Dev\FreeRTOS\WorkingCopy\Source\tasks.c" "08328a320aa5bc10" 2 +"C:\E\Dev\FreeRTOS\WorkingCopy\Source\timers.c" "0b0cb036c811cc10" 2 "Preprocess Assembly file" "08328a320aa5bc10" 2 [OPTIONS_Debug_RX600_E1_E20_SYSTEM_GNU Library Generator] "Single Shot" "08328a320aa5bc10" 1 [OPTIONS_Debug_RX600_E1_E20_SYSTEM_GNU Linker] -"Single Shot" "0849aa320aa5bc10" 4 +"Single Shot" "083de136c811cc10" 4 [OPTIONS_Debug_RX600_E1_E20_SYSTEM] "" 0 "[V|VERSION|2] [S|OBJPATH|^"$(CONFIGDIR)\$(FILELEAF).o^"] [I|DEBUGLV|2] [B|LINCHLS|1] [B|LINCASS|1] [B|LINCSYM|1] [S|LFILE|^"$(CONFIGDIR)\$(FILELEAF).^"] [S|PROJECTTYPE|CAPPPROJECT] [S|INCDIR|^"$(PROJDIR)^"] [S|CPUTYPE|RX600] [S|ENDIAN|LITTLE] [S|CPU|Other] " 3 @@ -427,11 +431,12 @@ "C:\E\Dev\FreeRTOS\WorkingCopy\Source\portable\MemMang\heap_2.c" "020673517aa5bc10" 2 "C:\E\Dev\FreeRTOS\WorkingCopy\Source\queue.c" "020673517aa5bc10" 2 "C:\E\Dev\FreeRTOS\WorkingCopy\Source\tasks.c" "020673517aa5bc10" 2 +"C:\E\Dev\FreeRTOS\WorkingCopy\Source\timers.c" "0b0cb036c811cc10" 2 "Preprocess Assembly file" "020673517aa5bc10" 2 [OPTIONS_Debug_with_optimisation_GNU Library Generator] "Single Shot" "097f0a320aa5bc10" 1 [OPTIONS_Debug_with_optimisation_GNU Linker] -"Single Shot" "09863a320aa5bc10" 4 +"Single Shot" "083de136c811cc10" 4 [OPTIONS_Debug_with_optimisation] "" 0 "[V|VERSION|2] [B|DOEXTF|1] [S|INCDIR|^"$(TCINSTALL)\rx-elf\lib\gcc\rx-elf\4.5-GNURX_v10.03^"|^"$(CONFIGDIR)^"] [B|RSARCH|1] [B|FIXUPLIBS|1] [S|ARCHIVE|lib$(PROJECTNAME).a*libgcc.a] [S|OUTFORM|BOTH] [B|MFILEGEN|1] [S|PLMFILE|^"$(CONFIGDIR)\$(PROJECTNAME).map^"] [S|OUTFILE|^"$(CONFIGDIR)\$(PROJECTNAME).x^"] [S|GROUPDET|.fvectors|0|0||1|0xFFFFFF80|0|1|0|.fvectors|All-files|<>|<>|<>|.text|0|0||1|0xFFF80000|0|0|0|.text|All-files|<>|0|.text.*|All-files|<>|0|P|All-files|<>|1|etext|<>|<>|<>|.rvectors|0|0||0||0|1|1|_rvectors_start|<>|0|.rvectors|All-files|<>|1|_rvectors_end|<>|<>|<>|.init|0|0||0||0|0|0|.init|All-files|<>|<>|<>|.fini|0|0||0||0|0|0|.fini|All-files|<>|<>|<>|.got|0|0||0||0|0|0|.got|All-files|<>|0|.got.plt|All-files|<>|<>|<>|.rodata|0|0||0||0|0|0|.rodata|All-files|<>|0|.rodata.*|All-files|<>|0|C_1|All-files|<>|0|C_2|All-files|<>|0|C|All-files|<>|1|_erodata|<>|<>|<>|.eh_frame_hdr|0|0||0||0|0|0|.eh_frame_hdr|All-files|<>|<>|<>|.eh_frame|0|0||0||0|0|0|.eh_frame|All-files|<>|<>|<>|.jcr|0|0||0||0|0|0|.jcr|All-files|<>|<>|<>|.tors|0|0||0||0|0|1|__CTOR_LIST__|<>|1|___ctors|<>|0|.ctors|All-files|<>|1|___ctors_end|<>|1|__CTOR_END__|<>|1|__DTOR_LIST__|<>|1|___dtors|<>|0|.dtors|All-files|<>|1|___dtors_end|<>|1|__DTOR_END__|<>|1|_mdata|<>|<>|<>|.istack|0|0||1|0x00017FFC|0|0|1|_istack|<>|<>|<>|.ustack|0|0||1|0x000179BC|0|0|1|_ustack|<>|<>|<>|.data|0|2|_mdata|1|0x00001000|0|0|1|_data|<>|0|.data|All-files|<>|0|.data.*|All-files|<>|0|D|All-files|<>|0|D_1|All-files|<>|0|D_2|All-files|<>|1|_edata|<>|<>|<>|.gcc_exc|0|0||0||0|0|0|.gcc_exc|All-files|<>|<>|<>|.bss|0|0||0||0|0|1|_bss|<>|0|.bss|All-files|<>|0|.bss.*|All-files|<>|0|COMMON|All-files|<>|0|B|All-files|<>|0|B_1|All-files|<>|0|B_2|All-files|<>|1|_ebss|<>|1|_end|<>|<>|<>|] [S|APPTXT|^"-e _start^"] [S|CPUTYPE|RX600] [S|ENDIAN|LITTLE] [S|CPU|Other] [I|RMINTREGVAL|0] [I|RMMAXCONSTVAL|0] [I|RMMAXVARSVAL|0] [S|PROJECTTYPE|CAPPPROJECT] [B|DOOPTLIB|1] [B|DOPROJBUILT|1] diff --git a/Demo/RX600_RX62N-RDK_GNURX/RTOSDemo/RTOSDemo.nav b/Demo/RX600_RX62N-RDK_GNURX/RTOSDemo/RTOSDemo.nav index 31df56a75b8798cad9467bb6bfa997807c9c8705..f53607514e5fc4903cf1524f54408f5629c1bfe6 100644 GIT binary patch delta 12555 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 aY142MaBh~2GSP?HgtP^6Hif8Z2mBxD5TyA4 delta 9570 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 diff --git a/Demo/RX600_RX62N-RDK_GNURX/RTOSDemo/RTOSDemo.tps b/Demo/RX600_RX62N-RDK_GNURX/RTOSDemo/RTOSDemo.tps index fa61cca1f..dd7288e79 100644 --- a/Demo/RX600_RX62N-RDK_GNURX/RTOSDemo/RTOSDemo.tps +++ b/Demo/RX600_RX62N-RDK_GNURX/RTOSDemo/RTOSDemo.tps @@ -11,7 +11,7 @@ "Debug_RX600_E1_E20_SYSTEM" "Debug_with_optimisation" [CURRENT_CONFIGURATION] -"Debug_with_optimisation" +"Debug" [CURRENT_SESSION] "SessionRX600_E1_E20_SYSTEM" [GENERAL_DATA_PROJECT] @@ -21,7 +21,7 @@ "DefaultSession" "SessionRX600_E1_E20_SYSTEM" [GENERAL_DATA_CONFIGURATION_Debug] -"PROJECT_FILES_MODIFIED_DATA_TAG" "TRUE" +"PROJECT_FILES_MODIFIED_DATA_TAG" "FALSE" [SESSIONS_Debug] "DefaultSession" "SessionRX600_E1_E20_SYSTEM" diff --git a/Demo/RX600_RX62N-RDK_GNURX/RTOSDemo/SessionRX600_E1_E20_SYSTEM.hsf b/Demo/RX600_RX62N-RDK_GNURX/RTOSDemo/SessionRX600_E1_E20_SYSTEM.hsf index d84bc7a5e..8f6b59b09 100644 --- a/Demo/RX600_RX62N-RDK_GNURX/RTOSDemo/SessionRX600_E1_E20_SYSTEM.hsf +++ b/Demo/RX600_RX62N-RDK_GNURX/RTOSDemo/SessionRX600_E1_E20_SYSTEM.hsf @@ -104,32 +104,32 @@ "{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" "000000000000B0FC" -"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_1" "000000000000C504" -"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_10" "000000000000C518" -"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_11" "000000000000C514" -"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_12" "000000000000C510" -"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_13" "000000000000C50C" -"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_14" "0000000042900000" -"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_15" "000000000000C51C" -"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_16" "000000000000B0FC" -"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_17" "0000000000017FE0" +"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_0" "000000000000BBB0" +"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_1" "000000000000C9BC" +"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_10" "0000000000000004" +"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_11" "0000000041180000" +"{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" "00000000A5A5A5A5" +"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_15" "00000000A5A5A5A5" +"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_16" "000000000000BBB0" +"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_17" "0000000000017FA0" "{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_18" "0000000000030000" -"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_19" "00000000FFF9135E" -"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_2" "0000000000000000" -"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_20" "00000000FFF92768" +"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_19" "00000000FFF8B898" +"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_2" "00000000A5A5A5A5" +"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_20" "00000000FFF8E908" "{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_21" "0000000080000000" "{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" "0000000000000000" -"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_4" "0000000000000000" -"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_5" "0000000000000000" -"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_6" "0000000000000000" +"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_3" "00000000A5A5A5A5" +"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_4" "00000000A5A5A5A5" +"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_5" "00000000A5A5A5A5" +"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_6" "000000000000BBB0" "{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_7" "0000000000000000" -"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_8" "0000000000000000" -"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_9" "000000000000C508" +"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_8" "00000000A5A5A5A5" +"{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" "" "{6C4D5B81-FD67-46A9-A089-EA44DCDE47FD}RAMMonitorManagerCtrlBlockInfoFileName" "" @@ -209,7 +209,7 @@ "{B39CE26B-928D-4241-BF8F-E15980C81200}DebugConsoleCtrlPortBaudIndex" "0" "{B39CE26B-928D-4241-BF8F-E15980C81200}DebugConsoleCtrlPortName" "" "{B39CE26B-928D-4241-BF8F-E15980C81200}DebugConsoleCtrlSendDataTimeout" "50" -"{B39CE26B-928D-4241-BF8F-E15980C81200}DebugConsoleCtrlViews" "0" +"{B39CE26B-928D-4241-BF8F-E15980C81200}DebugConsoleCtrlViews" "1" "{B39CE26B-928D-4241-BF8F-E15980C81200}DebugConsoleWndInstanceKey0" "{WK_00000001_DEBUGCONSOLE}RTOSDemoSessionRX600_E1_E20_SYSTEM" "{B6AE2E1F-5221-4A44-91C2-8C3097B41A69}StartStopCheckAfter" "0" "{B6AE2E1F-5221-4A44-91C2-8C3097B41A69}StartStopCheckBefore" "0" @@ -222,7 +222,7 @@ "{EEDC9300-6FBE-11D5-8613-00A024591A38}LocalsCtrlViews" "0" "{EEDC9301-6FBE-11D5-8613-00A024591A38}StackTraceCtrlViews" "0" "{F866DB60-6186-11D5-8BBE-0004E2013C71}IOCtrlIOFile" "" -"{F866DB60-6186-11D5-8BBE-0004E2013C71}IOCtrlSaveFileDir" "" +"{F866DB60-6186-11D5-8BBE-0004E2013C71}IOCtrlSaveFileDir" "$(CONFIGDIR)" "{F866DB60-6186-11D5-8BBE-0004E2013C71}IOCtrlSaveFileName" "" "{F866DB60-6186-11D5-8BBE-0004E2013C71}IOCtrlViews" "0" "{F923CED3-3318-4B43-B931-0AE76B289176}TaskTraceCtrlAnalyzeViews" "0" @@ -240,10 +240,10 @@ 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" 400 0 0 100 100 17 0 "32771|32772|32778|<>|32773|32774|<>" "0.0" +"{WK_00000001_CmdLine}" "WINDOW" 59422 0 1 "0.07" 372 0 0 100 100 17 0 "32771|32772|32778|<>|32773|32774|<>" "0.0" "{WK_00000001_DEBUGCONSOLE}RTOSDemoSessionRX600_E1_E20_SYSTEM" "WINDOW" 59422 5 0 "1.00" 146 0 0 350 200 17 0 "57634|57637|57633|<>|32781|32782|<>|32780|32785|32787" "0.0" "{WK_00000001_MEMORY}RTOSDemoSessionRX600_E1_E20_SYSTEM" "WINDOW" 59422 0 0 "0.27" 252 0 0 350 200 2065 0 "42202|42203|42204|42233|<>|42206|42205|42230|42229|42207|<>|42208|42209|42210|49076|42228|42227|<>|42231|42232|42234|42235|<>|42211|<>" "0.0" -"{WK_00000001_OUTPUT}" "WINDOW" 59422 0 0 "1.00" 400 560 340 350 200 18 0 "36756|36757|36758|36759|<>|36746|36747|<>|39531|<>|39500|39534|<>|36687" "0.0" +"{WK_00000001_OUTPUT}" "WINDOW" 59422 0 0 "1.00" 372 560 340 350 200 18 0 "36756|36757|36758|36759|<>|36746|36747|<>|39531|<>|39500|39534|<>|36687" "0.0" "{WK_00000001_REGISTERS}RTOSDemoSessionRX600_E1_E20_SYSTEM" "WINDOW" 59421 0 0 "1.00" 413 0 0 350 200 2065 0 "" "0.0" "{WK_00000001_WATCH}RTOSDemoSessionRX600_E1_E20_SYSTEM" "WINDOW" 59421 0 0 "1.00" 441 0 0 853 610 17 0 "32781|32783|<>|32771|32829|32772|32827|32773|<>|32786|<>|32810|32811" "0.0" "{WK_00000002_WORKSPACE}" "WINDOW" 59420 0 0 "1.00" 342 560 340 350 200 18 0 "" "0.0" @@ -273,6 +273,7 @@ [WINDOW_POSITION_STATE_DATA_VD4] [WINDOW_Z_ORDER] "C:\E\Dev\FreeRTOS\WorkingCopy\Demo\RX600_RX62N-RDK_GNURX\RTOSDemo\main-full.c" +"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\RX600_RX62N-RDK_GNURX\RTOSDemo\main-blinky.c" [TARGET_NAME] "RX600 Segger J-Link" "" 0 [STATUSBAR_STATEINFO_VD1] diff --git a/Demo/RX600_RX62N-RDK_GNURX/RTOSDemo/uIP_Task.c b/Demo/RX600_RX62N-RDK_GNURX/RTOSDemo/uIP_Task.c index 1521ef895..847c9cbe3 100644 --- a/Demo/RX600_RX62N-RDK_GNURX/RTOSDemo/uIP_Task.c +++ b/Demo/RX600_RX62N-RDK_GNURX/RTOSDemo/uIP_Task.c @@ -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,23 +98,27 @@ */ 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 ) @@ -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(); + } } - - xDoneSomething = pdTRUE; - } - 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 ) + else if( xHeader->type == htons( UIP_ETHTYPE_ARP ) ) { - vEMACWrite(); + 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 + { + 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,29 +206,86 @@ 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 ) + { + ulUIP_Events &= ~uipARP_TIMER_EVENT; + uip_arp_timer(); + } + + if( ulUIP_Events == pdFALSE ) { - /* 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 ); + 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; + } +} +/*-----------------------------------------------------------*/ + static void prvSetMACAddress( void ) { struct uip_eth_addr xAddr; diff --git a/Demo/RX600_RX62N-RDK_GNURX/RTOSDemo/webserver/EMAC.c b/Demo/RX600_RX62N-RDK_GNURX/RTOSDemo/webserver/EMAC.c index bf63bb659..945796ab5 100644 --- a/Demo/RX600_RX62N-RDK_GNURX/RTOSDemo/webserver/EMAC.c +++ b/Demo/RX600_RX62N-RDK_GNURX/RTOSDemo/webserver/EMAC.c @@ -242,23 +242,29 @@ unsigned long ulBytesReceived; if( ulBytesReceived > 0 ) { - pxCurrentRxDesc->status &= ~( FP1 | FP0 ); - pxCurrentRxDesc->status |= ACT; - - 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 ); - + + /* 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 = ( char * ) 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; + } } return ulBytesReceived; @@ -517,6 +523,7 @@ 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; @@ -527,8 +534,8 @@ 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; /* Re-enabled interrupts. */ __asm volatile( "SETPSW I" ); @@ -536,13 +543,8 @@ static long ulTxEndInts = 0; /* 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; } @@ -550,7 +552,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; } diff --git a/Demo/RX600_RX62N-RDK_GNURX/RX600_RX62N_RDK_GNURX.tws b/Demo/RX600_RX62N-RDK_GNURX/RX600_RX62N_RDK_GNURX.tws index be1f60a3f..1b881c695 100644 --- a/Demo/RX600_RX62N-RDK_GNURX/RX600_RX62N_RDK_GNURX.tws +++ b/Demo/RX600_RX62N-RDK_GNURX/RX600_RX62N_RDK_GNURX.tws @@ -7,9 +7,11 @@ [GENERAL_DATA] [BREAKPOINTS] [OPEN_WORKSPACE_FILES] +"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\RX600_RX62N-RDK_GNURX\RTOSDemo\main-blinky.c" "C:\E\Dev\FreeRTOS\WorkingCopy\Demo\RX600_RX62N-RDK_GNURX\RTOSDemo\main-full.c" [WORKSPACE_FILE_STATES] -"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\RX600_RX62N-RDK_GNURX\RTOSDemo\main-full.c" -4 -23 1314 460 1 0 +"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\RX600_RX62N-RDK_GNURX\RTOSDemo\main-blinky.c" 66 66 1174 329 0 1 +"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\RX600_RX62N-RDK_GNURX\RTOSDemo\main-full.c" -4 -23 1314 488 1 0 [LOADED_PROJECTS] "RTOSDemo" [END] diff --git a/Demo/RX600_RX62N-RDK_IAR/FreeRTOSConfig.h b/Demo/RX600_RX62N-RDK_IAR/FreeRTOSConfig.h index 7cb94b7d7..17d4fc2f1 100644 --- a/Demo/RX600_RX62N-RDK_IAR/FreeRTOSConfig.h +++ b/Demo/RX600_RX62N-RDK_IAR/FreeRTOSConfig.h @@ -93,6 +93,11 @@ #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 diff --git a/Demo/RX600_RX62N-RDK_IAR/RTOSDemo.ewp b/Demo/RX600_RX62N-RDK_IAR/RTOSDemo.ewp index b8d0cbc26..6350bd8d7 100644 --- a/Demo/RX600_RX62N-RDK_IAR/RTOSDemo.ewp +++ b/Demo/RX600_RX62N-RDK_IAR/RTOSDemo.ewp @@ -12,7 +12,7 @@ General 2 - 3 + 4 1 1 + ICCRX 3 - 10 + 11 1 1 + + + ARX 2 - 3 + 5 1 1 + + @@ -581,7 +605,7 @@ ILINK 1 - 0 + 1 1 1 + @@ -846,7 +874,7 @@ General 2 - 3 + 4 1 1 + ICCRX 3 - 10 + 11 1 1 + + + ARX 2 - 3 + 5 1 1 + + @@ -1414,7 +1466,7 @@ ILINK 1 - 0 + 1 1 1 + @@ -1679,7 +1735,7 @@ General 2 - 3 + 4 1 1 + ICCRX 3 - 10 + 11 1 1 + + + ARX 2 - 3 + 5 1 1 + + @@ -2248,7 +2328,7 @@ ILINK 1 - 0 + 1 1 1 + @@ -2568,6 +2652,9 @@ $PROJ_DIR$\..\..\Source\tasks.c + + $PROJ_DIR$\..\..\Source\timers.c + FreeTCPIP (based on uIP) diff --git a/Demo/RX600_RX62N-RDK_IAR/settings/RTOSDemo.cspy.bat b/Demo/RX600_RX62N-RDK_IAR/settings/RTOSDemo.cspy.bat index b5065a38e..90ccab79a 100644 --- a/Demo/RX600_RX62N-RDK_IAR/settings/RTOSDemo.cspy.bat +++ b/Demo/RX600_RX62N-RDK_IAR/settings/RTOSDemo.cspy.bat @@ -1,33 +1,15 @@ -@REM This bat file has been generated by the IAR Embeddded Workbench -@REM C-SPY interactive debugger,as an aid to preparing a command -@REM line for running the cspybat command line utility with the -@REM appropriate settings. +@REM This batch file has been generated by the IAR Embedded Workbench +@REM C-SPY Debugger, as an aid to preparing a command line for running +@REM the cspybat command line utility using the appropriate settings. @REM -@REM After making some adjustments to this file, you can launch cspybat -@REM by typing the name of this file followed by the name of the debug -@REM file (usually an ubrof file). Note that this file is generated -@REM every time a new debug session is initialized, so you may want to -@REM move or rename the file before making changes. -@REM -@REM Note: some command line arguments cannot be properly generated -@REM by this process. Specifically, the plugin which is responsible -@REM for the Terminal I/O window (and other C runtime functionality) -@REM comes in a special version for cspybat, and the name of that -@REM plugin dll is not known when generating this file. It resides in -@REM the $TOOLKIT_DIR$\bin folder and is usually called XXXbat.dll or -@REM XXXlibsupportbat.dll, where XXX is the name of the corresponding -@REM tool chain. Replace the '' parameter -@REM below with the appropriate file name. Other plugins loaded by -@REM C-SPY are usually not needed by, or will not work in, cspybat -@REM but they are listed at the end of this file for reference. +@REM You can launch cspybat by typing the name of this batch file followed +@REM by the name of the debug file (usually an ELF/DWARF or UBROF file). +@REM Note that this file is generated every time a new debug session +@REM is initialized, so you may want to move or rename the file before +@REM making changes. +@REM -"C:\devtools\IAR Systems\Embedded Workbench 6.0\common\bin\cspybat" "C:\devtools\IAR Systems\Embedded Workbench 6.0\rx\bin\rxproc.dll" "C:\devtools\IAR Systems\Embedded Workbench 6.0\rx\bin\rxemue20.dll" %1 --plugin "C:\devtools\IAR Systems\Embedded Workbench 6.0\rx\bin\" --backend -B "--core" "RX600" "-p" "C:\devtools\IAR Systems\Embedded Workbench 6.0\rx\config\debugger\ior5f562n8.ddf" "--double" "32" "--endian" "l" "--int" "32" "-d" "emue20" "--emu" "jlink" "--drv_communication" "USB" "--verify_download" "all" +"C:\devtools\IAR Systems\Embedded Workbench 6.0\common\bin\cspybat" "C:\devtools\IAR Systems\Embedded Workbench 6.0\rx\bin\rxproc.dll" "C:\devtools\IAR Systems\Embedded Workbench 6.0\rx\bin\rxemue20.dll" %1 --plugin "C:\devtools\IAR Systems\Embedded Workbench 6.0\rx\bin\rxbat.dll" --backend -B "--core" "RX600" "-p" "C:\devtools\IAR Systems\Embedded Workbench 6.0\rx\config\debugger\ior5f562n8.ddf" "--double" "32" "--endian" "l" "--int" "32" "-d" "emue20" "--emu" "jlink" "--drv_communication" "USB" "--verify_download" "all" -@REM Loaded plugins: -@REM rxLibSupport.dll -@REM C:\devtools\IAR Systems\Embedded Workbench 6.0\common\plugins\CodeCoverage\CodeCoverage.dll -@REM C:\devtools\IAR Systems\Embedded Workbench 6.0\common\plugins\Profiling\Profiling.dll -@REM C:\devtools\IAR Systems\Embedded Workbench 6.0\common\plugins\stack\stack.dll -@REM C:\devtools\IAR Systems\Embedded Workbench 6.0\common\plugins\SymList\SymList.dll diff --git a/Demo/RX600_RX62N-RDK_IAR/settings/RTOSDemo.dbgdt b/Demo/RX600_RX62N-RDK_IAR/settings/RTOSDemo.dbgdt index d48cbdf65..973cd3fce 100644 --- a/Demo/RX600_RX62N-RDK_IAR/settings/RTOSDemo.dbgdt +++ b/Demo/RX600_RX62N-RDK_IAR/settings/RTOSDemo.dbgdt @@ -31,7 +31,7 @@ - + TabID-20000-3827 @@ -43,20 +43,20 @@ - 0TabID-2655-13188Debug LogDebug-Log0 + 0TabID-2655-13188Debug LogDebug-Log0 - TextEditor$WS_DIR$\main-full.c0533048304800100000010000001 + TextEditor$WS_DIR$\main-full.c025112353123530TextEditor$WS_DIR$\FreeRTOSConfig.h011360956104TextEditor$WS_DIR$\webserver\EMAC.c013458335833TextEditor$WS_DIR$\uIP_Task.c022671067106TextEditor$WS_DIR$\main-blinky.c087480448040100000010000001 - iaridepm.enu1debuggergui.enu1-2-2740238-2-212114172024143585142857755601-2-21981682-2-216842001002381203666119048203666 + iaridepm.enu1debuggergui.enu1-2-2740238-2-212114172024143585142857755601-2-21981682-2-216842001002381203666119048203666 diff --git a/Demo/RX600_RX62N-RDK_IAR/settings/RTOSDemo.dni b/Demo/RX600_RX62N-RDK_IAR/settings/RTOSDemo.dni index 05ba900d9..48339b9d7 100644 --- a/Demo/RX600_RX62N-RDK_IAR/settings/RTOSDemo.dni +++ b/Demo/RX600_RX62N-RDK_IAR/settings/RTOSDemo.dni @@ -1,7 +1,7 @@ [E20] -TimeConnected=1285248097 -ComuniDllSave=84541440 -FfwnsdDllSave=81330176 +TimeConnected=1305306990 +ComuniDllSave=194838528 +FfwnsdDllSave=194969600 ChipName=R5F562N8 CpuMode=0 InputClock=12.500000 @@ -10,8 +10,18 @@ JtagClock=10 DebugFlags=0,0 EmulatorMode=0 NeedInit=1 +BlockBits=0 +B0=0,0 +B1=0,0 +B2=0,0 +B3=0,0 +TraceMode=0 +TraceOutput=2 +TraceCapacity=0 +TraceRestart=0 +OperatingFrequency=12.500000 [DebugChecksum] -Checksum=188492037 +Checksum=-1259593031 [DisAssemblyWindow] NumStates=_ 1 State 1=_ 1 @@ -31,10 +41,25 @@ UseTrigger=1 TriggerName=main LimitSize=0 ByteLimit=50 -[DriverProfiling] -Enabled=0 -Source=2 -Graph=0 +[Stack] +FillEnabled=0 +OverflowWarningsEnabled=1 +WarningThreshold=90 +SpWarningsEnabled=1 +WarnLogOnly=1 +UseTrigger=1 +TriggerName=main +LimitSize=0 +ByteLimit=50 +[CallStack] +ShowArgs=0 +[PowerLog] +LogEnabled=0 +GraphEnabled=0 +ShowTimeLog=1 +ShowTimeSum=0 +Title0=Power +Setup0=0 1 0 500 2 0 4 1 0 [Log file] LoggingEnabled=_ 0 LogFile=_ "" @@ -42,6 +67,13 @@ Category=_ 0 [TermIOLog] LoggingEnabled=_ 0 LogFile=_ "" +[CallStackLog] +Enabled=0 +[DriverProfiling] +Enabled=0 +Mode=3 +Graph=0 +Symbiont=0 [Breakpoints] Count=0 [Monitor Execution] diff --git a/Demo/RX600_RX62N-RDK_IAR/settings/RTOSDemo.wsdt b/Demo/RX600_RX62N-RDK_IAR/settings/RTOSDemo.wsdt index 62d2bb0d7..6dd1c2cc6 100644 --- a/Demo/RX600_RX62N-RDK_IAR/settings/RTOSDemo.wsdt +++ b/Demo/RX600_RX62N-RDK_IAR/settings/RTOSDemo.wsdt @@ -3,7 +3,7 @@ - RTOSDemo/Debug-with-optimisation + RTOSDemo/Debug @@ -33,7 +33,7 @@ Workspace - RTOSDemoRTOSDemo/FreeRTOS SourceRTOSDemo/FreeRTOS Source/Portable Layer + RTOSDemo @@ -53,14 +53,14 @@ - TextEditor$WS_DIR$\main-full.c0533048304800100000010000001 + TextEditor$WS_DIR$\main-full.c0441235312353TextEditor$WS_DIR$\main-blinky.c0494804480410100000010000001 - iaridepm.enu1-2-2706351-2-2331284197024289206210119720978-2-22321682-2-216842341002381238289197024289206 + iaridepm.enu1-2-2706351-2-2331284197024289206210119720978-2-22321682-2-216842341002381238289197024289206 diff --git a/Demo/RX600_RX62N-RDK_IAR/uIP_Task.c b/Demo/RX600_RX62N-RDK_IAR/uIP_Task.c index 1521ef895..17a5925a1 100644 --- a/Demo/RX600_RX62N-RDK_IAR/uIP_Task.c +++ b/Demo/RX600_RX62N-RDK_IAR/uIP_Task.c @@ -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,23 +98,27 @@ */ 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 ) @@ -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(); + } } - - xDoneSomething = pdTRUE; - } - 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 ) + else if( xHeader->type == htons( UIP_ETHTYPE_ARP ) ) { - vEMACWrite(); + 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 + { + 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,29 +206,86 @@ 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 ) + { + ulUIP_Events &= ~uipARP_TIMER_EVENT; + uip_arp_timer(); + } + + if( ulUIP_Events == pdFALSE ) { - /* 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 ); + 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( "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( "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; + } +} +/*-----------------------------------------------------------*/ + static void prvSetMACAddress( void ) { struct uip_eth_addr xAddr; diff --git a/Demo/RX600_RX62N-RDK_IAR/webserver/EMAC.c b/Demo/RX600_RX62N-RDK_IAR/webserver/EMAC.c index f1eb1fe69..01ce33ecc 100644 --- a/Demo/RX600_RX62N-RDK_IAR/webserver/EMAC.c +++ b/Demo/RX600_RX62N-RDK_IAR/webserver/EMAC.c @@ -152,7 +152,7 @@ static void prvResetEverything( void ); /*-----------------------------------------------------------*/ /* Points to the Rx descriptor currently in use. */ -static volatile ethfifo *pxCurrentDesc = NULL; +static volatile ethfifo *pxCurrentRxDesc = NULL; /* The buffer used by the uIP stack to both receive and send. This points to one of the Ethernet buffers when its actually in use. */ @@ -241,23 +241,29 @@ unsigned long ulBytesReceived; if( ulBytesReceived > 0 ) { - pxCurrentDesc->status &= ~( FP1 | FP0 ); - pxCurrentDesc->status |= ACT; - - 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 ); + + /* Point uip_buf to the data about ot be processed. */ + uip_buf = ( void * ) pxCurrentRxDesc->buf_p; - uip_buf = ( void * ) pxCurrentDesc->buf_p; + /* Allocate a new buffer to the descriptor, as uip_buf is now using it's + old descriptor. */ + pxCurrentRxDesc->buf_p = ( char * ) prvGetNextBuffer(); + + /* Prepare the descriptor to go again. */ + pxCurrentRxDesc->status &= ~( FP1 | FP0 ); + pxCurrentRxDesc->status |= ACT; /* Move onto the next buffer in the ring. */ - pxCurrentDesc = pxCurrentDesc->next; + pxCurrentRxDesc = pxCurrentRxDesc->next; + + if( EDMAC.EDRRR.LONG == 0x00000000L ) + { + /* Restart Ethernet if it has stopped */ + EDMAC.EDRRR.LONG = 0x00000001L; + } } return ulBytesReceived; @@ -367,7 +373,7 @@ long x; pxDescriptor->next = ( ethfifo * ) &( xTxDescriptors[ 0 ] ); /* Use the first Rx descriptor to start with. */ - pxCurrentDesc = &( xRxDescriptors[ 0 ] ); + pxCurrentRxDesc = &( xRxDescriptors[ 0 ] ); } /*-----------------------------------------------------------*/ @@ -439,17 +445,17 @@ static unsigned long prvCheckRxFifoStatus( void ) { unsigned long ulReturn = 0; - if( ( pxCurrentDesc->status & ACT ) != 0 ) + if( ( pxCurrentRxDesc->status & ACT ) != 0 ) { /* Current descriptor is still active. */ } - else if( ( pxCurrentDesc->status & FE ) != 0 ) + else if( ( pxCurrentRxDesc->status & FE ) != 0 ) { /* Frame error. Clear the error. */ - pxCurrentDesc->status &= ~( FP1 | FP0 | FE ); - pxCurrentDesc->status &= ~( RMAF | RRF | RTLF | RTSF | PRE | CERF ); - pxCurrentDesc->status |= ACT; - pxCurrentDesc = pxCurrentDesc->next; + pxCurrentRxDesc->status &= ~( FP1 | FP0 | FE ); + pxCurrentRxDesc->status &= ~( RMAF | RRF | RTLF | RTSF | PRE | CERF ); + pxCurrentRxDesc->status |= ACT; + pxCurrentRxDesc = pxCurrentRxDesc->next; if( EDMAC.EDRRR.LONG == 0x00000000UL ) { @@ -461,9 +467,9 @@ unsigned long ulReturn = 0; { /* The descriptor contains a frame. Because of the size of the buffers the frame should always be complete. */ - if( ( pxCurrentDesc->status & FP0 ) == FP0 ) + if( ( pxCurrentRxDesc->status & FP0 ) == FP0 ) { - ulReturn = pxCurrentDesc->size; + ulReturn = pxCurrentRxDesc->size; } else { @@ -510,12 +516,13 @@ static void prvConfigureEtherCAndEDMAC( void ) #if __LITTLE_ENDIAN__ == 1 EDMAC.EDMR.BIT.DE = 1; #endif - EDMAC.RDLAR = ( void * ) pxCurrentDesc; /* Initialaize Rx Descriptor List Address */ + EDMAC.RDLAR = ( void * ) pxCurrentRxDesc; /* Initialaize Rx Descriptor List Address */ EDMAC.TDLAR = ( void * ) &( xTxDescriptors[ 0 ] );/* Initialaize Tx Descriptor List Address */ EDMAC.TRSCER.LONG = 0x00000000; /* Copy-back status is RFE & TFE only */ 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; @@ -527,21 +534,16 @@ __interrupt 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; __enable_interrupt(); /* 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; } @@ -549,7 +551,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; } diff --git a/Demo/RX600_RX62N-RDK_Renesas/RTOSDemo.tws b/Demo/RX600_RX62N-RDK_Renesas/RTOSDemo.tws index b8156312c..4f6768707 100644 --- a/Demo/RX600_RX62N-RDK_Renesas/RTOSDemo.tws +++ b/Demo/RX600_RX62N-RDK_Renesas/RTOSDemo.tws @@ -10,8 +10,8 @@ "C:\E\Dev\FreeRTOS\WorkingCopy\Demo\RX600_RX62N-RDK_Renesas\RTOSDemo\main-blinky.c" "C:\E\Dev\FreeRTOS\WorkingCopy\Demo\RX600_RX62N-RDK_Renesas\RTOSDemo\main-full.c" [WORKSPACE_FILE_STATES] -"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\RX600_RX62N-RDK_Renesas\RTOSDemo\main-blinky.c" -4 -23 1312 686 1 1 -"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\RX600_RX62N-RDK_Renesas\RTOSDemo\main-full.c" 0 0 1312 668 0 0 +"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\RX600_RX62N-RDK_Renesas\RTOSDemo\main-blinky.c" 0 0 1312 686 0 1 +"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\RX600_RX62N-RDK_Renesas\RTOSDemo\main-full.c" -4 -23 1312 668 1 0 [LOADED_PROJECTS] "RTOSDemo" [END] diff --git a/Demo/RX600_RX62N-RDK_Renesas/RTOSDemo/RTOSDemo.nav b/Demo/RX600_RX62N-RDK_Renesas/RTOSDemo/RTOSDemo.nav index 69eba0c02b1c9cd315af060c4e6441c8f921e0f2..e2d42cc62c22499777c01db5966c872d95d3fe37 100644 GIT binary patch delta 1902 zcmZ8hYfO_@80J0pgI>AJVq2t86tRp1!CQ>74Jd^o*j8FZN3z1CZaAPo>oS>{Oy{C( z(YZIvr-Pw@h+NxRXh9R_65}!>Q#WHYGsEeU#mp@(W`8thJKy;L6MvoOJn!wiw{xvS zcCAAe@EhPq?5WmDqb*LG)nS~*+(BLFq2bti_*39xxF(}WpWyIZmlBF`b5Iw$*OdYgPnGr3?F}BU+nC8So4jrX zSSYQW25aB+7T(zPi@hy1G{5eX(UVeh%9P zl;mO*-Y{tKV5UK4UJx}F>@7dSvo1C)uYX>>E>kh&1;#n zOH`o6oG_=DWn8<~-J)DdOf!>@Gr4FX5V^(!!Vn2Q@a`EY9G|;UkAi%aar7l-wedST zfksFcdEsG9)3x2xyxaI(^#6iwto6QUY+$;V2i35ip(lfjAfKTnLuxoiZG`z#KpQKn z(5~G>3M?MeAuXe#)b2FdEv|C2^`KB{yfP$*15ER;AuT*(C}lVUE--XqScN-> zT8uTShE9gcMpa;E4Q?4dMBb0Wqn%n|kx)C94Tq_U9_z+;w3grKJcdK*8Q4j9shygT{KFF;mZy zFiddxW+;nXof~=y_J!7vk@>62>-IIdeQb(uvkwhZ$2ro)VK9)4h2z;ULW87(V?Kb_ z=V@-H-`cnkT&b)qwYwbKtgZ^v7ECymgips+u#qVnCLDNcKpZie4b`*I5&LXDDQD>> zGh1mJQ~zZm4^kP*3CBT#@O*_#@Gj_86_~5@_ z=JOB2B7T{MH1M^1AupmyBq4|#)es5C-%KIf`QHCv1%LiGknz*WBnhhd+8>~Zzy2x6 z`8^tPwnF)tMsG?zFJGN_%F_al%LTOY2;Qa$%=^{Z#tyM1m5rn nGWeSBVKv`)8)T84%gL|NFU!_M2D8cfMY7q4&qdBLlhpqKhf%{v delta 1896 zcmZ8hYfO`86z074gI*};1o^6fMG%W7j5;+&-9{-D>ZPqvrp_&eNw=Zg+a+k6qAqR{ z7j-Awr-PxuuyV641qyC+#vd+THZL){tKc@XxNK2lmTdB8?{^BC`0IPlbDrYlxpe6Y2;p?@WSPLM@#M!pb63LG^?s!d61xcFuw-LeHN_V8+)bU?RNE zE0LmEX|=i5o2*WkaTR6oARu7V2{o*KV)dWc1KZ@P;aH0z_AR%!yuPfwyxuStX;`UW z!0o@x(46iB_=Nu>PoD-F zsHk$gwsEV83Tt&Z&5lCX8jEe8Y~#glHQw~;@b7LB{v&;APbPdx=uD3mxAep_P*Pz& z>Y2_`Bk)X5GTb7~qaGdj3C-*t2do3iooXH=lG4}Q9s|C#OpE9FdXky!x7?B z`x5Y%ULCIP(}IoKTi3Urd86=fvnVeSil?&iy>1=4PPOnfCs)g6Sud|v3?I@=_>l&* z)ISY265{KK2mLBm6=`YEKb^fFf%3xr>dyuZP79<%7S)&cH@3E>vXa-ly4rB`sc?HB z7FN)ea)X-ad`q#@Uc@sH*u}|_S71kIG3$O}YCUdmwcATGbdw%4oIN10PX!DHk}+=}8@l-+8L;lj0UmEn zZ7qM&`sKspVoR(JSMf%htH}IHegTOd4``u~kbbZjcJZWBG&~!wE94`#|4C9#>skvf z^jZ@CG`Ip%2;~gLL%e)_jY^I#>x!0f551q*I1~eR(j6ai@CWDN&<=Jk(w}|dBz6lX zmRo^egf+04$}k#^gB@I%hVjEHJ}_y1U7Q@6S2Pknj{au5*}IV`zcG@?c1EBqiazaTjbw)2JDqHY zIpH=Hlmcia{uQNz3YZ$6uYm$B7>NltiSXjtm?O#ucdx@`scsb3hv)tPL(9YMiR?Z| zBCs6k&;>}8^oeXw_;3ON3QA11O`<-(|h-MVq#Md{GLut*venKFEHHd_!A-Ei{m!8?Ma{|hpu k(r>u0>U&Uyx6EU=qo4IH4tHg>|<>|<>|.text|0|0||1|0xFFF80000|0|0|0|.text|All-files|<>|0|.text.*|All-files|<>|0|P|All-files|<>|1|etext|<>|<>|<>|.rvectors|0|0||0||0|1|1|_rvectors_start|<>|0|.rvectors|All-files|<>|1|_rvectors_end|<>|<>|<>|.init|0|0||0||0|0|0|.init|All-files|<>|<>|<>|.fini|0|0||0||0|0|0|.fini|All-files|<>|<>|<>|.got|0|0||0||0|0|0|.got|All-files|<>|0|.got.plt|All-files|<>|<>|<>|.rodata|0|0||0||0|0|0|.rodata|All-files|<>|0|.rodata.*|All-files|<>|0|C_1|All-files|<>|0|C_2|All-files|<>|0|C|All-files|<>|1|_erodata|<>|<>|<>|.eh_frame_hdr|0|0||0||0|0|0|.eh_frame_hdr|All-files|<>|<>|<>|.eh_frame|0|0||0||0|0|0|.eh_frame|All-files|<>|<>|<>|.jcr|0|0||0||0|0|0|.jcr|All-files|<>|<>|<>|.tors|0|0||0||0|0|1|__CTOR_LIST__|<>|1|___ctors|<>|0|.ctors|All-files|<>|1|___ctors_end|<>|1|__CTOR_END__|<>|1|__DTOR_LIST__|<>|1|___dtors|<>|0|.dtors|All-files|<>|1|___dtors_end|<>|1|__DTOR_END__|<>|1|_mdata|<>|<>|<>|.istack|0|0||1|0x00017FFC|0|0|1|_istack|<>|<>|<>|.ustack|0|0||1|0x000179BC|0|0|1|_ustack|<>|<>|<>|.data|0|2|_mdata|1|0x00001000|0|0|1|_data|<>|0|.data|All-files|<>|0|.data.*|All-files|<>|0|D|All-files|<>|0|D_1|All-files|<>|0|D_2|All-files|<>|1|_edata|<>|<>|<>|.gcc_exc|0|0||0||0|0|0|.gcc_exc|All-files|<>|<>|<>|.bss|0|0||0||0|0|1|_bss|<>|0|.bss|All-files|<>|0|.bss.*|All-files|<>|0|COMMON|All-files|<>|0|B|All-files|<>|0|B_1|All-files|<>|0|B_2|All-files|<>|1|_ebss|<>|1|_end|<>|<>|<>|] [S|APPTXT|^"-e _start^"] [S|CPUTYPE|RX600] [S|ENDIAN|LITTLE] [S|CPU|Other] [I|RMINTREGVAL|0] [I|RMMAXCONSTVAL|0] [I|RMMAXVARSVAL|0] [S|PROJECTTYPE|CAPPPROJECT] [B|DOOPTLIB|1] [B|DOPROJBUILT|1] " 5 "[V|VERSION|2] [S|INCDIR|^"$(TCINSTALL)\rx-elf\rx-elf\optlibinc^"|^"$(TCINSTALL)\rx-elf\lib\gcc\rx-elf\4.5-GNURX_v10.03\optlibinc^"|^"$(PROJDIR)\include^"|^"$(PROJDIR)\..\..\..\Source\include^"|^"$(PROJDIR)\..\..\..\Source\portable\GCC\RX600^"|^"$(PROJDIR)^"|^"$(PROJDIR)\..\..\Common\include^"] [S|DEFINES|DEBUG] [S|OUTPUT|OBJECT] [S|OBJPATH|^"$(CONFIGDIR)\$(FILELEAF).o^"] [B|DEBUG|1] [S|DEBUGFT|Native] [I|DEBUGLV|2] [S|ALIGN4|ALL] [B|LINCSYM|1] [B|LOMITDD|1] [B|LOMITFP|1] [B|OPTIMIZE|0] [I|OPTLV|1] [B|NOSTDINC|1] [S|APPTXT|^"-Wa,-gdwarf2^"] [S|CPUTYPE|RX600] [S|ENDIAN|LITTLE] [S|CPU|Other] [I|RMINTREGVAL|0] [I|RMMAXCONSTVAL|0] [I|RMMAXVARSVAL|0] [S|PROJECTTYPE|CAPPPROJECT] [B|DOOPTLIB|1] -" 2 -"[V|VERSION|2] [S|INCDIR|^"$(TCINSTALL)\rx-elf\rx-elf\optlibinc^"|^"$(TCINSTALL)\rx-elf\lib\gcc\rx-elf\4.5-GNURX_v10.03\optlibinc^"|^"$(PROJDIR)\include^"|^"$(PROJDIR)\..\..\..\Source\include^"|^"$(PROJDIR)\..\..\..\Source\portable\GCC\RX600^"|^"$(PROJDIR)^"|^"$(PROJDIR)\..\..\Common\include^"] [S|DEFINES|DEBUG] [S|OUTPUT|OBJECT] [S|OBJPATH|^"$(CONFIGDIR)\$(FILELEAF).o^"] [B|DEBUG|1] [S|DEBUGFT|Native] [I|DEBUGLV|2] [S|ALIGN4|ALL] [B|LINCSYM|1] [B|LOMITDD|1] [B|LOMITFP|1] [B|OPTIMIZE|0] [I|OPTLV|1] [B|NOSTDINC|1] [S|CPUTYPE|RX600] [S|ENDIAN|LITTLE] [S|CPU|Other] [I|RMINTREGVAL|0] [I|RMMAXCONSTVAL|0] [I|RMMAXVARSVAL|0] [S|PROJECTTYPE|CAPPPROJECT] [B|DOOPTLIB|1] " 3 +"[V|VERSION|2] [S|INCDIR|^"$(TCINSTALL)\rx-elf\rx-elf\optlibinc^"|^"$(TCINSTALL)\rx-elf\lib\gcc\rx-elf\4.5-GNURX_v10.03\optlibinc^"|^"$(PROJDIR)\include^"|^"$(PROJDIR)\..\..\..\Source\include^"|^"$(PROJDIR)\..\..\..\Source\portable\GCC\RX600^"|^"$(PROJDIR)^"|^"$(PROJDIR)\..\..\Common\include^"] [S|DEFINES|DEBUG] [S|OUTPUT|OBJECT] [S|OBJPATH|^"$(CONFIGDIR)\$(FILELEAF).o^"] [B|DEBUG|1] [S|DEBUGFT|Native] [I|DEBUGLV|2] [S|ALIGN4|ALL] [B|LINCSYM|1] [B|LOMITDD|1] [B|LOMITFP|1] [B|OPTIMIZE|0] [I|OPTLV|1] [B|NOSTDINC|1] [S|CPUTYPE|RX600] [S|ENDIAN|LITTLE] [S|CPU|Other] [I|RMINTREGVAL|0] [I|RMMAXCONSTVAL|0] [I|RMMAXVARSVAL|0] [S|PROJECTTYPE|CAPPPROJECT] [B|DOOPTLIB|1] +" 2 "[V|VERSION|2] [S|OBJPATH|^"$(CONFIGDIR)\$(FILELEAF).o^"] [I|DEBUGLV|2] [B|LINCHLS|1] [B|LINCASS|1] [B|LINCSYM|1] [S|LFILE|^"$(CONFIGDIR)\$(FILELEAF).^"] [S|PROJECTTYPE|CAPPPROJECT] [S|INCDIR|^"$(PROJDIR)^"] [S|CPUTYPE|RX600] [S|ENDIAN|LITTLE] [S|CPU|Other] " 4 "[V|VERSION|2] [S|OUTPUTPATH|^"$(CONFIGDIR)\lib$(PROJECTNAME).a^"] [B|OPTIMIZE|1] [I|OPTTYPE|1] [S|MODE|BUILD/CHANGED] [S|CPUTYPE|RX600] [S|ENDIAN|LITTLE] [S|CPU|Other] [B|DOPROJBUILT|1] [B|DOOPTLIB|1] [B|MATH|1] [B|STDIO|1] [B|STDLIB|1] [B|STRING|1] " 1 [EXCLUDED_FILES_Blinky] @@ -311,11 +313,12 @@ "C:\E\Dev\FreeRTOS\WorkingCopy\Source\portable\MemMang\heap_2.c" "022e4ac89aa5bc10" 2 "C:\E\Dev\FreeRTOS\WorkingCopy\Source\queue.c" "022e4ac89aa5bc10" 2 "C:\E\Dev\FreeRTOS\WorkingCopy\Source\tasks.c" "022e4ac89aa5bc10" 2 +"C:\E\Dev\FreeRTOS\WorkingCopy\Source\timers.c" "08849e57f811cc10" 2 "Preprocess Assembly file" "022e4ac89aa5bc10" 2 [OPTIONS_Debug_GNU Library Generator] "Single Shot" "00c20b5b0aa5bc10" 1 [OPTIONS_Debug_GNU Linker] -"Single Shot" "00d92b5b0aa5bc10" 4 +"Single Shot" "04611067f811cc10" 4 [OPTIONS_Debug] "" 0 "[V|VERSION|2] [B|DOEXTF|1] [S|INCDIR|^"$(TCINSTALL)\rx-elf\lib\gcc\rx-elf\4.5-GNURX_v10.03^"|^"$(CONFIGDIR)^"] [B|RSARCH|1] [B|FIXUPLIBS|1] [S|ARCHIVE|libgcc.a*lib$(PROJECTNAME).a] [S|OUTFORM|BOTH] [B|MFILEGEN|1] [S|PLMFILE|^"$(CONFIGDIR)\$(PROJECTNAME).map^"] [S|OUTFILE|^"$(CONFIGDIR)\$(PROJECTNAME).x^"] [S|GROUPDET|.fvectors|0|0||1|0xFFFFFF80|0|1|0|.fvectors|All-files|<>|<>|<>|.text|0|0||1|0xFFF80000|0|0|0|.text|All-files|<>|0|.text.*|All-files|<>|0|P|All-files|<>|1|etext|<>|<>|<>|.rvectors|0|0||0||0|1|1|_rvectors_start|<>|0|.rvectors|All-files|<>|1|_rvectors_end|<>|<>|<>|.init|0|0||0||0|0|0|.init|All-files|<>|<>|<>|.fini|0|0||0||0|0|0|.fini|All-files|<>|<>|<>|.got|0|0||0||0|0|0|.got|All-files|<>|0|.got.plt|All-files|<>|<>|<>|.rodata|0|0||0||0|0|0|.rodata|All-files|<>|0|.rodata.*|All-files|<>|0|C_1|All-files|<>|0|C_2|All-files|<>|0|C|All-files|<>|1|_erodata|<>|<>|<>|.eh_frame_hdr|0|0||0||0|0|0|.eh_frame_hdr|All-files|<>|<>|<>|.eh_frame|0|0||0||0|0|0|.eh_frame|All-files|<>|<>|<>|.jcr|0|0||0||0|0|0|.jcr|All-files|<>|<>|<>|.tors|0|0||0||0|0|1|__CTOR_LIST__|<>|1|___ctors|<>|0|.ctors|All-files|<>|1|___ctors_end|<>|1|__CTOR_END__|<>|1|__DTOR_LIST__|<>|1|___dtors|<>|0|.dtors|All-files|<>|1|___dtors_end|<>|1|__DTOR_END__|<>|1|_mdata|<>|<>|<>|.istack|0|0||1|0x00017FFC|0|0|1|_istack|<>|<>|<>|.ustack|0|0||1|0x000179BC|0|0|1|_ustack|<>|<>|<>|.data|0|2|_mdata|1|0x00001000|0|0|1|_data|<>|0|.data|All-files|<>|0|.data.*|All-files|<>|0|D|All-files|<>|0|D_1|All-files|<>|0|D_2|All-files|<>|1|_edata|<>|<>|<>|.gcc_exc|0|0||0||0|0|0|.gcc_exc|All-files|<>|<>|<>|.bss|0|0||0||0|0|1|_bss|<>|0|.bss|All-files|<>|0|.bss.*|All-files|<>|0|COMMON|All-files|<>|0|B|All-files|<>|0|B_1|All-files|<>|0|B_2|All-files|<>|1|_ebss|<>|1|_end|<>|<>|<>|] [B|WONCEU|1] [B|OUTTRAD|1] [S|APPTXT|^"-e _start^"] [S|CPUTYPE|RX600] [S|ENDIAN|LITTLE] [S|CPU|Other] [I|RMINTREGVAL|0] [I|RMMAXCONSTVAL|0] [I|RMMAXVARSVAL|0] [S|PROJECTTYPE|CAPPPROJECT] [B|DOOPTLIB|1] [B|DOPROJBUILT|1] @@ -372,11 +375,12 @@ "C:\E\Dev\FreeRTOS\WorkingCopy\Source\portable\MemMang\heap_2.c" "00e05b5b0aa5bc10" 2 "C:\E\Dev\FreeRTOS\WorkingCopy\Source\queue.c" "00e05b5b0aa5bc10" 2 "C:\E\Dev\FreeRTOS\WorkingCopy\Source\tasks.c" "00e05b5b0aa5bc10" 2 +"C:\E\Dev\FreeRTOS\WorkingCopy\Source\timers.c" "08849e57f811cc10" 2 "Preprocess Assembly file" "00e05b5b0aa5bc10" 2 [OPTIONS_Debug_RX600_E1_E20_SYSTEM_GNU Library Generator] "Single Shot" "00e05b5b0aa5bc10" 1 [OPTIONS_Debug_RX600_E1_E20_SYSTEM_GNU Linker] -"Single Shot" "00e05b5b0aa5bc10" 4 +"Single Shot" "04611067f811cc10" 4 [OPTIONS_Debug_RX600_E1_E20_SYSTEM] "" 0 "[V|VERSION|2] [S|OBJPATH|^"$(CONFIGDIR)\$(FILELEAF).o^"] [I|DEBUGLV|2] [B|LINCHLS|1] [B|LINCASS|1] [B|LINCSYM|1] [S|LFILE|^"$(CONFIGDIR)\$(FILELEAF).^"] [S|PROJECTTYPE|CAPPPROJECT] [S|INCDIR|^"$(PROJDIR)^"] [S|CPUTYPE|RX600] [S|ENDIAN|LITTLE] [S|CPU|Other] " 3 @@ -389,59 +393,60 @@ [OPTIONS_Debug_with_optimisation_GNU Assembler] "Assembly source file" "00d92b5b0aa5bc10" 4 [OPTIONS_Debug_with_optimisation_GNU Compiler] -"C source file" "00d92b5b0aa5bc10" 3 -"C++ source file" "00d92b5b0aa5bc10" 3 -"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\Common\Minimal\BlockQ.c" "00d92b5b0aa5bc10" 3 -"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\Common\Minimal\GenQTest.c" "00d92b5b0aa5bc10" 3 -"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\Common\Minimal\IntQueue.c" "00d92b5b0aa5bc10" 3 -"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\Common\Minimal\PollQ.c" "00d92b5b0aa5bc10" 3 -"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\Common\Minimal\QPeek.c" "00d92b5b0aa5bc10" 3 -"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\Common\Minimal\blocktim.c" "00d92b5b0aa5bc10" 3 -"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\Common\Minimal\death.c" "00d92b5b0aa5bc10" 3 -"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\Common\Minimal\flash.c" "00d92b5b0aa5bc10" 3 -"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\Common\Minimal\flop.c" "00d92b5b0aa5bc10" 3 -"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\Common\Minimal\integer.c" "00d92b5b0aa5bc10" 3 -"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\Common\Minimal\recmutex.c" "00d92b5b0aa5bc10" 3 -"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\Common\Minimal\semtest.c" "00d92b5b0aa5bc10" 3 -"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\Common\ethernet\FreeTCPIP\apps\httpd\http-strings.c" "00d92b5b0aa5bc10" 3 -"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\Common\ethernet\FreeTCPIP\apps\httpd\httpd-fs.c" "00d92b5b0aa5bc10" 3 -"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\Common\ethernet\FreeTCPIP\apps\httpd\httpd.c" "00d92b5b0aa5bc10" 3 -"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\Common\ethernet\FreeTCPIP\psock.c" "00d92b5b0aa5bc10" 3 -"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\Common\ethernet\FreeTCPIP\timer.c" "00d92b5b0aa5bc10" 3 -"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\Common\ethernet\FreeTCPIP\uip.c" "00d92b5b0aa5bc10" 3 -"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\Common\ethernet\FreeTCPIP\uip_arp.c" "00d92b5b0aa5bc10" 3 -"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\RX600_RX62N-RSK_GNURX\RTOSDemo\GNU-Files\hwinit.c" "00d92b5b0aa5bc10" 3 -"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\RX600_RX62N-RSK_GNURX\RTOSDemo\GNU-Files\inthandler.c" "00d92b5b0aa5bc10" 3 -"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\RX600_RX62N-RSK_GNURX\RTOSDemo\GNU-Files\start.asm" "00d92b5b0aa5bc10" 2 -"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\RX600_RX62N-RSK_GNURX\RTOSDemo\HighFrequencyTimerTest.c" "00d92b5b0aa5bc10" 3 -"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\RX600_RX62N-RSK_GNURX\RTOSDemo\IntQueueTimer.c" "00d92b5b0aa5bc10" 3 -"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\RX600_RX62N-RSK_GNURX\RTOSDemo\ParTest.c" "00d92b5b0aa5bc10" 3 -"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\RX600_RX62N-RSK_GNURX\RTOSDemo\Renesas-Files\hwsetup.c" "00d92b5b0aa5bc10" 3 -"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\RX600_RX62N-RSK_GNURX\RTOSDemo\main-blinky.c" "00d92b5b0aa5bc10" 3 -"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\RX600_RX62N-RSK_GNURX\RTOSDemo\main-full.c" "00d92b5b0aa5bc10" 3 -"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\RX600_RX62N-RSK_GNURX\RTOSDemo\uIP_Task.c" "00d92b5b0aa5bc10" 3 -"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\RX600_RX62N-RSK_GNURX\RTOSDemo\vects.c" "00d92b5b0aa5bc10" 3 -"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\RX600_RX62N-RSK_GNURX\RTOSDemo\webserver\EMAC.c" "00d92b5b0aa5bc10" 3 -"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\RX600_RX62N-RSK_GNURX\RTOSDemo\webserver\httpd-cgi.c" "00d92b5b0aa5bc10" 3 -"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\RX600_RX62N-RSK_GNURX\RTOSDemo\webserver\phy.c" "00d92b5b0aa5bc10" 3 -"C:\E\Dev\FreeRTOS\WorkingCopy\Source\list.c" "00d92b5b0aa5bc10" 3 -"C:\E\Dev\FreeRTOS\WorkingCopy\Source\portable\GCC\RX600\port.c" "00d92b5b0aa5bc10" 3 -"C:\E\Dev\FreeRTOS\WorkingCopy\Source\portable\MemMang\heap_2.c" "00d92b5b0aa5bc10" 3 -"C:\E\Dev\FreeRTOS\WorkingCopy\Source\queue.c" "00d92b5b0aa5bc10" 3 -"C:\E\Dev\FreeRTOS\WorkingCopy\Source\tasks.c" "00d92b5b0aa5bc10" 3 -"Preprocess Assembly file" "00d92b5b0aa5bc10" 2 +"C source file" "00d92b5b0aa5bc10" 2 +"C++ source file" "00d92b5b0aa5bc10" 2 +"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\Common\Minimal\BlockQ.c" "00d92b5b0aa5bc10" 2 +"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\Common\Minimal\GenQTest.c" "00d92b5b0aa5bc10" 2 +"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\Common\Minimal\IntQueue.c" "00d92b5b0aa5bc10" 2 +"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\Common\Minimal\PollQ.c" "00d92b5b0aa5bc10" 2 +"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\Common\Minimal\QPeek.c" "00d92b5b0aa5bc10" 2 +"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\Common\Minimal\blocktim.c" "00d92b5b0aa5bc10" 2 +"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\Common\Minimal\death.c" "00d92b5b0aa5bc10" 2 +"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\Common\Minimal\flash.c" "00d92b5b0aa5bc10" 2 +"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\Common\Minimal\flop.c" "00d92b5b0aa5bc10" 2 +"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\Common\Minimal\integer.c" "00d92b5b0aa5bc10" 2 +"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\Common\Minimal\recmutex.c" "00d92b5b0aa5bc10" 2 +"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\Common\Minimal\semtest.c" "00d92b5b0aa5bc10" 2 +"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\Common\ethernet\FreeTCPIP\apps\httpd\http-strings.c" "00d92b5b0aa5bc10" 2 +"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\Common\ethernet\FreeTCPIP\apps\httpd\httpd-fs.c" "00d92b5b0aa5bc10" 2 +"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\Common\ethernet\FreeTCPIP\apps\httpd\httpd.c" "00d92b5b0aa5bc10" 2 +"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\Common\ethernet\FreeTCPIP\psock.c" "00d92b5b0aa5bc10" 2 +"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\Common\ethernet\FreeTCPIP\timer.c" "00d92b5b0aa5bc10" 2 +"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\Common\ethernet\FreeTCPIP\uip.c" "00d92b5b0aa5bc10" 2 +"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\Common\ethernet\FreeTCPIP\uip_arp.c" "00d92b5b0aa5bc10" 2 +"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\RX600_RX62N-RSK_GNURX\RTOSDemo\GNU-Files\hwinit.c" "00d92b5b0aa5bc10" 2 +"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\RX600_RX62N-RSK_GNURX\RTOSDemo\GNU-Files\inthandler.c" "00d92b5b0aa5bc10" 2 +"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\RX600_RX62N-RSK_GNURX\RTOSDemo\GNU-Files\start.asm" "00d92b5b0aa5bc10" 3 +"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\RX600_RX62N-RSK_GNURX\RTOSDemo\HighFrequencyTimerTest.c" "00d92b5b0aa5bc10" 2 +"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\RX600_RX62N-RSK_GNURX\RTOSDemo\IntQueueTimer.c" "00d92b5b0aa5bc10" 2 +"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\RX600_RX62N-RSK_GNURX\RTOSDemo\ParTest.c" "00d92b5b0aa5bc10" 2 +"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\RX600_RX62N-RSK_GNURX\RTOSDemo\Renesas-Files\hwsetup.c" "00d92b5b0aa5bc10" 2 +"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\RX600_RX62N-RSK_GNURX\RTOSDemo\main-blinky.c" "00d92b5b0aa5bc10" 2 +"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\RX600_RX62N-RSK_GNURX\RTOSDemo\main-full.c" "00d92b5b0aa5bc10" 2 +"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\RX600_RX62N-RSK_GNURX\RTOSDemo\uIP_Task.c" "00d92b5b0aa5bc10" 2 +"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\RX600_RX62N-RSK_GNURX\RTOSDemo\vects.c" "00d92b5b0aa5bc10" 2 +"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\RX600_RX62N-RSK_GNURX\RTOSDemo\webserver\EMAC.c" "00d92b5b0aa5bc10" 2 +"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\RX600_RX62N-RSK_GNURX\RTOSDemo\webserver\httpd-cgi.c" "00d92b5b0aa5bc10" 2 +"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\RX600_RX62N-RSK_GNURX\RTOSDemo\webserver\phy.c" "00d92b5b0aa5bc10" 2 +"C:\E\Dev\FreeRTOS\WorkingCopy\Source\list.c" "00d92b5b0aa5bc10" 2 +"C:\E\Dev\FreeRTOS\WorkingCopy\Source\portable\GCC\RX600\port.c" "00d92b5b0aa5bc10" 2 +"C:\E\Dev\FreeRTOS\WorkingCopy\Source\portable\MemMang\heap_2.c" "00d92b5b0aa5bc10" 2 +"C:\E\Dev\FreeRTOS\WorkingCopy\Source\queue.c" "00d92b5b0aa5bc10" 2 +"C:\E\Dev\FreeRTOS\WorkingCopy\Source\tasks.c" "00d92b5b0aa5bc10" 2 +"C:\E\Dev\FreeRTOS\WorkingCopy\Source\timers.c" "08849e57f811cc10" 2 +"Preprocess Assembly file" "00d92b5b0aa5bc10" 3 [OPTIONS_Debug_with_optimisation_GNU Library Generator] "Single Shot" "00d92b5b0aa5bc10" 1 [OPTIONS_Debug_with_optimisation_GNU Linker] -"Single Shot" "00e05b5b0aa5bc10" 5 +"Single Shot" "04611067f811cc10" 5 [OPTIONS_Debug_with_optimisation] "" 0 "[V|VERSION|2] [B|DOEXTF|1] [S|INCDIR|^"$(TCINSTALL)\rx-elf\lib\gcc\rx-elf\4.5-GNURX_v10.03^"|^"$(CONFIGDIR)^"] [B|RSARCH|1] [B|FIXUPLIBS|1] [S|ARCHIVE|lib$(PROJECTNAME).a*libgcc.a] [S|OUTFORM|BOTH] [B|MFILEGEN|1] [S|PLMFILE|^"$(CONFIGDIR)\$(PROJECTNAME).map^"] [S|OUTFILE|^"$(CONFIGDIR)\$(PROJECTNAME).x^"] [S|GROUPDET|.fvectors|0|0||1|0xFFFFFF80|0|1|0|.fvectors|All-files|<>|<>|<>|.text|0|0||1|0xFFF80000|0|0|0|.text|All-files|<>|0|.text.*|All-files|<>|0|P|All-files|<>|1|etext|<>|<>|<>|.rvectors|0|0||0||0|1|1|_rvectors_start|<>|0|.rvectors|All-files|<>|1|_rvectors_end|<>|<>|<>|.init|0|0||0||0|0|0|.init|All-files|<>|<>|<>|.fini|0|0||0||0|0|0|.fini|All-files|<>|<>|<>|.got|0|0||0||0|0|0|.got|All-files|<>|0|.got.plt|All-files|<>|<>|<>|.rodata|0|0||0||0|0|0|.rodata|All-files|<>|0|.rodata.*|All-files|<>|0|C_1|All-files|<>|0|C_2|All-files|<>|0|C|All-files|<>|1|_erodata|<>|<>|<>|.eh_frame_hdr|0|0||0||0|0|0|.eh_frame_hdr|All-files|<>|<>|<>|.eh_frame|0|0||0||0|0|0|.eh_frame|All-files|<>|<>|<>|.jcr|0|0||0||0|0|0|.jcr|All-files|<>|<>|<>|.tors|0|0||0||0|0|1|__CTOR_LIST__|<>|1|___ctors|<>|0|.ctors|All-files|<>|1|___ctors_end|<>|1|__CTOR_END__|<>|1|__DTOR_LIST__|<>|1|___dtors|<>|0|.dtors|All-files|<>|1|___dtors_end|<>|1|__DTOR_END__|<>|1|_mdata|<>|<>|<>|.istack|0|0||1|0x00017FFC|0|0|1|_istack|<>|<>|<>|.ustack|0|0||1|0x000179BC|0|0|1|_ustack|<>|<>|<>|.data|0|2|_mdata|1|0x00001000|0|0|1|_data|<>|0|.data|All-files|<>|0|.data.*|All-files|<>|0|D|All-files|<>|0|D_1|All-files|<>|0|D_2|All-files|<>|1|_edata|<>|<>|<>|.gcc_exc|0|0||0||0|0|0|.gcc_exc|All-files|<>|<>|<>|.bss|0|0||0||0|0|1|_bss|<>|0|.bss|All-files|<>|0|.bss.*|All-files|<>|0|COMMON|All-files|<>|0|B|All-files|<>|0|B_1|All-files|<>|0|B_2|All-files|<>|1|_ebss|<>|1|_end|<>|<>|<>|] [S|APPTXT|^"-e _start^"] [S|CPUTYPE|RX600] [S|ENDIAN|LITTLE] [S|CPU|Other] [I|RMINTREGVAL|0] [I|RMMAXCONSTVAL|0] [I|RMMAXVARSVAL|0] [S|PROJECTTYPE|CAPPPROJECT] [B|DOOPTLIB|1] [B|DOPROJBUILT|1] " 5 "[V|VERSION|2] [S|INCDIR|^"$(TCINSTALL)\rx-elf\rx-elf\optlibinc^"|^"$(TCINSTALL)\rx-elf\lib\gcc\rx-elf\4.5-GNURX_v10.03\optlibinc^"|^"$(PROJDIR)\include^"|^"$(PROJDIR)\..\..\..\Source\include^"|^"$(PROJDIR)\..\..\..\Source\portable\GCC\RX600^"|^"$(PROJDIR)^"|^"$(PROJDIR)\..\..\Common\include^"|^"$(PROJDIR)\..\..\Common\Ethernet\FreeTCPIP^"|^"$(PROJDIR)\webserver^"] [S|DEFINES|DEBUG|INCLUDE_HIGH_FREQUENCY_TIMER_TEST] [S|OUTPUT|OBJECT] [S|OBJPATH|^"$(CONFIGDIR)\$(FILELEAF).o^"] [B|DEBUG|1] [S|DEBUGFT|Native] [I|DEBUGLV|2] [S|ALIGN4|ALL] [B|OPTIMIZE|1] [I|OPTLV|1] [B|NOSTDINC|1] [S|APPTXT|^"-Wa,-gdwarf2^"] [S|CPUTYPE|RX600] [S|ENDIAN|LITTLE] [S|CPU|Other] [I|RMINTREGVAL|0] [I|RMMAXCONSTVAL|0] [I|RMMAXVARSVAL|0] [S|PROJECTTYPE|CAPPPROJECT] [B|DOOPTLIB|1] -" 2 -"[V|VERSION|2] [S|INCDIR|^"$(TCINSTALL)\rx-elf\rx-elf\optlibinc^"|^"$(TCINSTALL)\rx-elf\lib\gcc\rx-elf\4.5-GNURX_v10.03\optlibinc^"|^"$(PROJDIR)\include^"|^"$(PROJDIR)\..\..\..\Source\include^"|^"$(PROJDIR)\..\..\..\Source\portable\GCC\RX600^"|^"$(PROJDIR)^"|^"$(PROJDIR)\..\..\Common\include^"|^"$(PROJDIR)\..\..\Common\Ethernet\FreeTCPIP^"|^"$(PROJDIR)\webserver^"] [S|DEFINES|DEBUG|INCLUDE_HIGH_FREQUENCY_TIMER_TEST] [S|OUTPUT|OBJECT] [S|OBJPATH|^"$(CONFIGDIR)\$(FILELEAF).o^"] [B|DEBUG|1] [S|DEBUGFT|Native] [I|DEBUGLV|2] [S|ALIGN4|ALL] [B|OPTIMIZE|1] [I|OPTLV|1] [B|NOSTDINC|1] [S|CPUTYPE|RX600] [S|ENDIAN|LITTLE] [S|CPU|Other] [I|RMINTREGVAL|0] [I|RMMAXCONSTVAL|0] [I|RMMAXVARSVAL|0] [S|PROJECTTYPE|CAPPPROJECT] [B|DOOPTLIB|1] " 3 +"[V|VERSION|2] [S|INCDIR|^"$(TCINSTALL)\rx-elf\rx-elf\optlibinc^"|^"$(TCINSTALL)\rx-elf\lib\gcc\rx-elf\4.5-GNURX_v10.03\optlibinc^"|^"$(PROJDIR)\include^"|^"$(PROJDIR)\..\..\..\Source\include^"|^"$(PROJDIR)\..\..\..\Source\portable\GCC\RX600^"|^"$(PROJDIR)^"|^"$(PROJDIR)\..\..\Common\include^"|^"$(PROJDIR)\..\..\Common\Ethernet\FreeTCPIP^"|^"$(PROJDIR)\webserver^"] [S|DEFINES|DEBUG|INCLUDE_HIGH_FREQUENCY_TIMER_TEST] [S|OUTPUT|OBJECT] [S|OBJPATH|^"$(CONFIGDIR)\$(FILELEAF).o^"] [B|DEBUG|1] [S|DEBUGFT|Native] [I|DEBUGLV|2] [S|ALIGN4|ALL] [B|OPTIMIZE|1] [I|OPTLV|1] [B|NOSTDINC|1] [S|CPUTYPE|RX600] [S|ENDIAN|LITTLE] [S|CPU|Other] [I|RMINTREGVAL|0] [I|RMMAXCONSTVAL|0] [I|RMMAXVARSVAL|0] [S|PROJECTTYPE|CAPPPROJECT] [B|DOOPTLIB|1] +" 2 "[V|VERSION|2] [S|OBJPATH|^"$(CONFIGDIR)\$(FILELEAF).o^"] [I|DEBUGLV|2] [B|LINCHLS|1] [B|LINCASS|1] [B|LINCSYM|1] [S|LFILE|^"$(CONFIGDIR)\$(FILELEAF).^"] [S|PROJECTTYPE|CAPPPROJECT] [S|INCDIR|^"$(PROJDIR)^"] [S|CPUTYPE|RX600] [S|ENDIAN|LITTLE] [S|CPU|Other] " 4 "[V|VERSION|2] [S|OUTPUTPATH|^"$(CONFIGDIR)\lib$(PROJECTNAME).a^"] [B|OPTIMIZE|1] [I|OPTTYPE|1] [S|MODE|BUILD/CHANGED] [S|CPUTYPE|RX600] [S|ENDIAN|LITTLE] [S|CPU|Other] [B|DOPROJBUILT|1] [B|DOOPTLIB|1] [B|MATH|1] [B|STDIO|1] [B|STDLIB|1] [B|STRING|1] " 1 [EXCLUDED_FILES_Debug_with_optimisation] diff --git a/Demo/RX600_RX62N-RSK_GNURX/RTOSDemo/RTOSDemo.nav b/Demo/RX600_RX62N-RSK_GNURX/RTOSDemo/RTOSDemo.nav index 41e59e1275a3bf4f2bc83d7f932ef738de45d504..f3f3596f919b9e62d0bfdd9afe588722993cf502 100644 GIT binary patch delta 15545 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 diff --git a/Demo/RX600_RX62N-RSK_GNURX/RTOSDemo/SessionRX600_E1_E20_SYSTEM.hsf b/Demo/RX600_RX62N-RSK_GNURX/RTOSDemo/SessionRX600_E1_E20_SYSTEM.hsf index 9bd809919..a59993835 100644 --- a/Demo/RX600_RX62N-RSK_GNURX/RTOSDemo/SessionRX600_E1_E20_SYSTEM.hsf +++ b/Demo/RX600_RX62N-RSK_GNURX/RTOSDemo/SessionRX600_E1_E20_SYSTEM.hsf @@ -50,29 +50,29 @@ "{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" "0000000000017EF4" -"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_1" "0000000000000004" -"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_10" "0000000000000002" -"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_11" "000000000000000A" +"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_0" "000000000000B678" +"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_1" "000000000000EB60" +"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_10" "000000000000EB60" +"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_11" "00000000FFFFDCDA" "{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" "0000000000000001" -"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_15" "00000000000000EA" -"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_16" "000000000000BB68" -"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_17" "0000000000017EF4" -"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_18" "0000000004010000" -"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_19" "00000000FFF851D9" -"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_2" "000000000000311C" -"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_20" "00000000FFF8D818" +"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_14" "00000000A5A5A5A5" +"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_15" "00000000A5A5A5A5" +"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_16" "000000000000B678" +"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_17" "0000000000017FA0" +"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_18" "0000000000030004" +"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_19" "00000000FFF8B4BD" +"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_2" "00000000A5A5A5A5" +"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_20" "00000000FFF8E6D8" "{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" "0000000000017F34" -"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_4" "0000000000000000" -"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_5" "0000000000003120" -"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_6" "0000000000017EF4" +"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_24" "0000000040000100" +"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_25" "00008A613AE30000" +"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_3" "00000000A5A5A5A5" +"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_4" "00000000A5A5A5A5" +"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_5" "00000000A5A5A5A5" +"{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_6" "000000000000B678" "{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_7" "0000000000000000" "{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_8" "00000000A5A5A5A5" "{64753FED-D387-4B8C-A91D-D3419C869C07}C_REGISTER_REG_9" "00000000A5A5A5A5" @@ -213,6 +213,7 @@ [WINDOW_POSITION_STATE_DATA_VD4] [WINDOW_Z_ORDER] "C:\E\Dev\FreeRTOS\WorkingCopy\Demo\RX600_RX62N-RSK_GNURX\RTOSDemo\main-full.c" +"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\RX600_RX62N-RSK_GNURX\RTOSDemo\main-blinky.c" [TARGET_NAME] "RX600 E1/E20 SYSTEM" "" 0 [STATUSBAR_STATEINFO_VD1] diff --git a/Demo/RX600_RX62N-RSK_GNURX/RTOSDemo/uIP_Task.c b/Demo/RX600_RX62N-RSK_GNURX/RTOSDemo/uIP_Task.c index a09782dec..847c9cbe3 100644 --- a/Demo/RX600_RX62N-RSK_GNURX/RTOSDemo/uIP_Task.c +++ b/Demo/RX600_RX62N-RSK_GNURX/RTOSDemo/uIP_Task.c @@ -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(); + } } - - xDoneSomething = pdTRUE; - } - 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 ) + else if( xHeader->type == htons( UIP_ETHTYPE_ARP ) ) { - vEMACWrite(); + 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 + { + 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,34 @@ 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 ); } } } + diff --git a/Demo/RX600_RX62N-RSK_GNURX/RTOSDemo/webserver/EMAC.c b/Demo/RX600_RX62N-RSK_GNURX/RTOSDemo/webserver/EMAC.c index bf63bb659..945796ab5 100644 --- a/Demo/RX600_RX62N-RSK_GNURX/RTOSDemo/webserver/EMAC.c +++ b/Demo/RX600_RX62N-RSK_GNURX/RTOSDemo/webserver/EMAC.c @@ -242,23 +242,29 @@ unsigned long ulBytesReceived; if( ulBytesReceived > 0 ) { - pxCurrentRxDesc->status &= ~( FP1 | FP0 ); - pxCurrentRxDesc->status |= ACT; - - 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 ); - + + /* 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 = ( char * ) 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; + } } return ulBytesReceived; @@ -517,6 +523,7 @@ 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; @@ -527,8 +534,8 @@ 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; /* Re-enabled interrupts. */ __asm volatile( "SETPSW I" ); @@ -536,13 +543,8 @@ static long ulTxEndInts = 0; /* 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; } @@ -550,7 +552,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; } diff --git a/Demo/RX600_RX62N-RSK_GNURX/RX600_RX62N_RSK_GNURX.tws b/Demo/RX600_RX62N-RSK_GNURX/RX600_RX62N_RSK_GNURX.tws index fc4b52099..3bb59c5a0 100644 --- a/Demo/RX600_RX62N-RSK_GNURX/RX600_RX62N_RSK_GNURX.tws +++ b/Demo/RX600_RX62N-RSK_GNURX/RX600_RX62N_RSK_GNURX.tws @@ -7,8 +7,10 @@ [GENERAL_DATA] [BREAKPOINTS] [OPEN_WORKSPACE_FILES] +"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\RX600_RX62N-RSK_GNURX\RTOSDemo\main-blinky.c" "C:\E\Dev\FreeRTOS\WorkingCopy\Demo\RX600_RX62N-RSK_GNURX\RTOSDemo\main-full.c" [WORKSPACE_FILE_STATES] +"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\RX600_RX62N-RSK_GNURX\RTOSDemo\main-blinky.c" 88 88 1130 405 0 1 "C:\E\Dev\FreeRTOS\WorkingCopy\Demo\RX600_RX62N-RSK_GNURX\RTOSDemo\main-full.c" -4 -23 1314 608 1 0 [LOADED_PROJECTS] "RTOSDemo" diff --git a/Demo/RX600_RX62N-RSK_IAR/FreeRTOSConfig.h b/Demo/RX600_RX62N-RSK_IAR/FreeRTOSConfig.h index 84e8b1b55..55181ca9c 100644 --- a/Demo/RX600_RX62N-RSK_IAR/FreeRTOSConfig.h +++ b/Demo/RX600_RX62N-RSK_IAR/FreeRTOSConfig.h @@ -93,13 +93,18 @@ #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 is set by configKERNEL_INTERRUPT_PRIORITY. This would -normally be the lowest priority (1 in this case). The maximum interrupt +the pended interrupt is set by configKERNEL_INTERRUPT_PRIORITY. This would +normally be the lowest priority (1 in this case). The maximum interrupt priority from which FreeRTOS API calls can be made is set by -configMAX_SYSCALL_INTERRUPT_PRIORITY. Interrupts that use a priority above this +configMAX_SYSCALL_INTERRUPT_PRIORITY. Interrupts that use a priority above this will not be effected by anything the kernel is doing. Interrupts at or below this priority can use FreeRTOS API functions - but *only* those that end in "FromISR". Both these constants are defined in 'PriorityDefinitions.h' so they @@ -126,6 +131,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() portNOP() /* Run time stats use the same timer as the high frequency timer test. */ #define portGET_RUN_TIME_COUNTER_VALUE() ulHighFrequencyTickCount diff --git a/Demo/RX600_RX62N-RSK_IAR/RTOSDemo.ewp b/Demo/RX600_RX62N-RSK_IAR/RTOSDemo.ewp index b8d0cbc26..6350bd8d7 100644 --- a/Demo/RX600_RX62N-RSK_IAR/RTOSDemo.ewp +++ b/Demo/RX600_RX62N-RSK_IAR/RTOSDemo.ewp @@ -12,7 +12,7 @@ General 2 - 3 + 4 1 1 + ICCRX 3 - 10 + 11 1 1 + + + ARX 2 - 3 + 5 1 1 + + @@ -581,7 +605,7 @@ ILINK 1 - 0 + 1 1 1 + @@ -846,7 +874,7 @@ General 2 - 3 + 4 1 1 + ICCRX 3 - 10 + 11 1 1 + + + ARX 2 - 3 + 5 1 1 + + @@ -1414,7 +1466,7 @@ ILINK 1 - 0 + 1 1 1 + @@ -1679,7 +1735,7 @@ General 2 - 3 + 4 1 1 + ICCRX 3 - 10 + 11 1 1 + + + ARX 2 - 3 + 5 1 1 + + @@ -2248,7 +2328,7 @@ ILINK 1 - 0 + 1 1 1 + @@ -2568,6 +2652,9 @@ $PROJ_DIR$\..\..\Source\tasks.c + + $PROJ_DIR$\..\..\Source\timers.c + FreeTCPIP (based on uIP) diff --git a/Demo/RX600_RX62N-RSK_IAR/settings/RTOSDemo.cspy.bat b/Demo/RX600_RX62N-RSK_IAR/settings/RTOSDemo.cspy.bat index 19c267973..c5731752e 100644 --- a/Demo/RX600_RX62N-RSK_IAR/settings/RTOSDemo.cspy.bat +++ b/Demo/RX600_RX62N-RSK_IAR/settings/RTOSDemo.cspy.bat @@ -1,33 +1,15 @@ -@REM This bat file has been generated by the IAR Embeddded Workbench -@REM C-SPY interactive debugger,as an aid to preparing a command -@REM line for running the cspybat command line utility with the -@REM appropriate settings. +@REM This batch file has been generated by the IAR Embedded Workbench +@REM C-SPY Debugger, as an aid to preparing a command line for running +@REM the cspybat command line utility using the appropriate settings. @REM -@REM After making some adjustments to this file, you can launch cspybat -@REM by typing the name of this file followed by the name of the debug -@REM file (usually an ubrof file). Note that this file is generated -@REM every time a new debug session is initialized, so you may want to -@REM move or rename the file before making changes. -@REM -@REM Note: some command line arguments cannot be properly generated -@REM by this process. Specifically, the plugin which is responsible -@REM for the Terminal I/O window (and other C runtime functionality) -@REM comes in a special version for cspybat, and the name of that -@REM plugin dll is not known when generating this file. It resides in -@REM the $TOOLKIT_DIR$\bin folder and is usually called XXXbat.dll or -@REM XXXlibsupportbat.dll, where XXX is the name of the corresponding -@REM tool chain. Replace the '' parameter -@REM below with the appropriate file name. Other plugins loaded by -@REM C-SPY are usually not needed by, or will not work in, cspybat -@REM but they are listed at the end of this file for reference. +@REM You can launch cspybat by typing the name of this batch file followed +@REM by the name of the debug file (usually an ELF/DWARF or UBROF file). +@REM Note that this file is generated every time a new debug session +@REM is initialized, so you may want to move or rename the file before +@REM making changes. +@REM -"C:\devtools\IAR Systems\Embedded Workbench 6.0\common\bin\cspybat" "C:\devtools\IAR Systems\Embedded Workbench 6.0\rx\bin\rxproc.dll" "C:\devtools\IAR Systems\Embedded Workbench 6.0\rx\bin\rxemue20.dll" %1 --plugin "C:\devtools\IAR Systems\Embedded Workbench 6.0\rx\bin\" --backend -B "--core" "RX600" "-p" "C:\devtools\IAR Systems\Embedded Workbench 6.0\rx\config\debugger\ior5f562n8.ddf" "--double" "32" "--endian" "l" "--int" "32" "-d" "emue20" "--emu" "e1e20" "--drv_communication" "USB" "--verify_download" "all" +"C:\devtools\IAR Systems\Embedded Workbench 6.0\common\bin\cspybat" "C:\devtools\IAR Systems\Embedded Workbench 6.0\rx\bin\rxproc.dll" "C:\devtools\IAR Systems\Embedded Workbench 6.0\rx\bin\rxemue20.dll" %1 --plugin "C:\devtools\IAR Systems\Embedded Workbench 6.0\rx\bin\rxbat.dll" --backend -B "--core" "RX600" "-p" "C:\devtools\IAR Systems\Embedded Workbench 6.0\rx\config\debugger\ior5f562n8.ddf" "--double" "32" "--endian" "l" "--int" "32" "-d" "emue20" "--emu" "e1e20" "--drv_communication" "USB" "--verify_download" "all" -@REM Loaded plugins: -@REM rxLibSupport.dll -@REM C:\devtools\IAR Systems\Embedded Workbench 6.0\common\plugins\CodeCoverage\CodeCoverage.dll -@REM C:\devtools\IAR Systems\Embedded Workbench 6.0\common\plugins\Profiling\Profiling.dll -@REM C:\devtools\IAR Systems\Embedded Workbench 6.0\common\plugins\stack\stack.dll -@REM C:\devtools\IAR Systems\Embedded Workbench 6.0\common\plugins\SymList\SymList.dll diff --git a/Demo/RX600_RX62N-RSK_IAR/settings/RTOSDemo.dbgdt b/Demo/RX600_RX62N-RSK_IAR/settings/RTOSDemo.dbgdt index 348ed9b1c..eb0814430 100644 --- a/Demo/RX600_RX62N-RSK_IAR/settings/RTOSDemo.dbgdt +++ b/Demo/RX600_RX62N-RSK_IAR/settings/RTOSDemo.dbgdt @@ -31,7 +31,7 @@ - + TabID-20000-3827 @@ -43,20 +43,20 @@ - 0TabID-2655-13188Debug LogDebug-Log0 + 0TabID-2655-13188Debug LogDebug-Log0 - TextEditor$WS_DIR$\main-full.c0245125071250700100000010000001 + TextEditor$WS_DIR$\main-full.c024512338123380TextEditor$WS_DIR$\FreeRTOSConfig.h07446864686TextEditor$WS_DIR$\webserver\EMAC.c001377613776TextEditor$WS_DIR$\main-blinky.c08647874787TextEditor$WS_DIR$\uIP_Task.c0226710671060100000010000001 - iaridepm.enu1debuggergui.enu1-2-2740238-2-212114172024143585142857755601-2-21981682-2-216842001002381203666119048203666 + iaridepm.enu1debuggergui.enu1-2-2740238-2-212114172024143585142857755601-2-21981682-2-216842001002381203666119048203666 diff --git a/Demo/RX600_RX62N-RSK_IAR/settings/RTOSDemo.dni b/Demo/RX600_RX62N-RSK_IAR/settings/RTOSDemo.dni index d7312a315..43d1a4018 100644 --- a/Demo/RX600_RX62N-RSK_IAR/settings/RTOSDemo.dni +++ b/Demo/RX600_RX62N-RSK_IAR/settings/RTOSDemo.dni @@ -1,7 +1,7 @@ [E20] -TimeConnected=1285249114 -ComuniDllSave=101515264 -FfwnsdDllSave=303235072 +TimeConnected=1305306678 +ComuniDllSave=82903040 +FfwnsdDllSave=303890432 ChipName=R5F562N8 CpuMode=0 InputClock=12.500000 @@ -10,8 +10,18 @@ JtagClock=10 DebugFlags=0,0 EmulatorMode=0 NeedInit=1 +BlockBits=0 +B0=0,0 +B1=0,0 +B2=0,0 +B3=0,0 +TraceMode=0 +TraceOutput=2 +TraceCapacity=0 +TraceRestart=0 +OperatingFrequency=12.500000 [DebugChecksum] -Checksum=1020766678 +Checksum=-127835808 [DisAssemblyWindow] NumStates=_ 1 State 1=_ 1 @@ -31,6 +41,18 @@ UseTrigger=1 TriggerName=main LimitSize=0 ByteLimit=50 +[Stack] +FillEnabled=0 +OverflowWarningsEnabled=1 +WarningThreshold=90 +SpWarningsEnabled=1 +WarnLogOnly=1 +UseTrigger=1 +TriggerName=main +LimitSize=0 +ByteLimit=50 +[CallStack] +ShowArgs=0 [Log file] LoggingEnabled=_ 0 LogFile=_ "" @@ -38,10 +60,13 @@ Category=_ 0 [TermIOLog] LoggingEnabled=_ 0 LogFile=_ "" +[CallStackLog] +Enabled=0 [DriverProfiling] Enabled=0 -Source=2 +Mode=3 Graph=0 +Symbiont=0 [Breakpoints] Count=0 [Monitor Execution] diff --git a/Demo/RX600_RX62N-RSK_IAR/settings/RTOSDemo.wsdt b/Demo/RX600_RX62N-RSK_IAR/settings/RTOSDemo.wsdt index f6a5bb44c..d9a205d53 100644 --- a/Demo/RX600_RX62N-RSK_IAR/settings/RTOSDemo.wsdt +++ b/Demo/RX600_RX62N-RSK_IAR/settings/RTOSDemo.wsdt @@ -25,7 +25,7 @@ - + TabID-10758-3386 @@ -37,7 +37,7 @@ - 0 + 0 TabID-16801-3477 @@ -47,20 +47,20 @@ TabID-414-15843BreakpointsBreakpointsTabID-3320-15993Debug LogDebug-Log - 0 + 0 - TextEditor$WS_DIR$\main-full.c051125071250700100000010000001 + TextEditor$WS_DIR$\main-full.c024512338123380TextEditor$WS_DIR$\main-blinky.c086478747870100000010000001 - iaridepm.enu1-2-2706351-2-2331284197024289206210119720978-2-22321682-2-216842341002381238289197024289206 + iaridepm.enu1-2-2706351-2-2331284197024289206210119720978-2-22321682-2-216842341002381238289197024289206 diff --git a/Demo/RX600_RX62N-RSK_IAR/uIP_Task.c b/Demo/RX600_RX62N-RSK_IAR/uIP_Task.c index a09782dec..17a5925a1 100644 --- a/Demo/RX600_RX62N-RSK_IAR/uIP_Task.c +++ b/Demo/RX600_RX62N-RSK_IAR/uIP_Task.c @@ -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(); + } } - - xDoneSomething = pdTRUE; - } - 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 ) + else if( xHeader->type == htons( UIP_ETHTYPE_ARP ) ) { - vEMACWrite(); + 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 + { + 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( "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( "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,34 @@ 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 ); } } } + diff --git a/Demo/RX600_RX62N-RSK_IAR/webserver/EMAC.c b/Demo/RX600_RX62N-RSK_IAR/webserver/EMAC.c index f1eb1fe69..01ce33ecc 100644 --- a/Demo/RX600_RX62N-RSK_IAR/webserver/EMAC.c +++ b/Demo/RX600_RX62N-RSK_IAR/webserver/EMAC.c @@ -152,7 +152,7 @@ static void prvResetEverything( void ); /*-----------------------------------------------------------*/ /* Points to the Rx descriptor currently in use. */ -static volatile ethfifo *pxCurrentDesc = NULL; +static volatile ethfifo *pxCurrentRxDesc = NULL; /* The buffer used by the uIP stack to both receive and send. This points to one of the Ethernet buffers when its actually in use. */ @@ -241,23 +241,29 @@ unsigned long ulBytesReceived; if( ulBytesReceived > 0 ) { - pxCurrentDesc->status &= ~( FP1 | FP0 ); - pxCurrentDesc->status |= ACT; - - 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 ); + + /* Point uip_buf to the data about ot be processed. */ + uip_buf = ( void * ) pxCurrentRxDesc->buf_p; - uip_buf = ( void * ) pxCurrentDesc->buf_p; + /* Allocate a new buffer to the descriptor, as uip_buf is now using it's + old descriptor. */ + pxCurrentRxDesc->buf_p = ( char * ) prvGetNextBuffer(); + + /* Prepare the descriptor to go again. */ + pxCurrentRxDesc->status &= ~( FP1 | FP0 ); + pxCurrentRxDesc->status |= ACT; /* Move onto the next buffer in the ring. */ - pxCurrentDesc = pxCurrentDesc->next; + pxCurrentRxDesc = pxCurrentRxDesc->next; + + if( EDMAC.EDRRR.LONG == 0x00000000L ) + { + /* Restart Ethernet if it has stopped */ + EDMAC.EDRRR.LONG = 0x00000001L; + } } return ulBytesReceived; @@ -367,7 +373,7 @@ long x; pxDescriptor->next = ( ethfifo * ) &( xTxDescriptors[ 0 ] ); /* Use the first Rx descriptor to start with. */ - pxCurrentDesc = &( xRxDescriptors[ 0 ] ); + pxCurrentRxDesc = &( xRxDescriptors[ 0 ] ); } /*-----------------------------------------------------------*/ @@ -439,17 +445,17 @@ static unsigned long prvCheckRxFifoStatus( void ) { unsigned long ulReturn = 0; - if( ( pxCurrentDesc->status & ACT ) != 0 ) + if( ( pxCurrentRxDesc->status & ACT ) != 0 ) { /* Current descriptor is still active. */ } - else if( ( pxCurrentDesc->status & FE ) != 0 ) + else if( ( pxCurrentRxDesc->status & FE ) != 0 ) { /* Frame error. Clear the error. */ - pxCurrentDesc->status &= ~( FP1 | FP0 | FE ); - pxCurrentDesc->status &= ~( RMAF | RRF | RTLF | RTSF | PRE | CERF ); - pxCurrentDesc->status |= ACT; - pxCurrentDesc = pxCurrentDesc->next; + pxCurrentRxDesc->status &= ~( FP1 | FP0 | FE ); + pxCurrentRxDesc->status &= ~( RMAF | RRF | RTLF | RTSF | PRE | CERF ); + pxCurrentRxDesc->status |= ACT; + pxCurrentRxDesc = pxCurrentRxDesc->next; if( EDMAC.EDRRR.LONG == 0x00000000UL ) { @@ -461,9 +467,9 @@ unsigned long ulReturn = 0; { /* The descriptor contains a frame. Because of the size of the buffers the frame should always be complete. */ - if( ( pxCurrentDesc->status & FP0 ) == FP0 ) + if( ( pxCurrentRxDesc->status & FP0 ) == FP0 ) { - ulReturn = pxCurrentDesc->size; + ulReturn = pxCurrentRxDesc->size; } else { @@ -510,12 +516,13 @@ static void prvConfigureEtherCAndEDMAC( void ) #if __LITTLE_ENDIAN__ == 1 EDMAC.EDMR.BIT.DE = 1; #endif - EDMAC.RDLAR = ( void * ) pxCurrentDesc; /* Initialaize Rx Descriptor List Address */ + EDMAC.RDLAR = ( void * ) pxCurrentRxDesc; /* Initialaize Rx Descriptor List Address */ EDMAC.TDLAR = ( void * ) &( xTxDescriptors[ 0 ] );/* Initialaize Tx Descriptor List Address */ EDMAC.TRSCER.LONG = 0x00000000; /* Copy-back status is RFE & TFE only */ 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; @@ -527,21 +534,16 @@ __interrupt 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; __enable_interrupt(); /* 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; } @@ -549,7 +551,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; } diff --git a/Demo/RX600_RX62N-RSK_Renesas/RTOSDemo.hws b/Demo/RX600_RX62N-RSK_Renesas/RTOSDemo.hws index 8eeee1069..f77d5e6e3 100644 --- a/Demo/RX600_RX62N-RSK_Renesas/RTOSDemo.hws +++ b/Demo/RX600_RX62N-RSK_Renesas/RTOSDemo.hws @@ -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] diff --git a/Demo/RX600_RX62N-RSK_Renesas/RTOSDemo.tws b/Demo/RX600_RX62N-RSK_Renesas/RTOSDemo.tws index dc29e21ab..6be12051e 100644 --- a/Demo/RX600_RX62N-RSK_Renesas/RTOSDemo.tws +++ b/Demo/RX600_RX62N-RSK_Renesas/RTOSDemo.tws @@ -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] diff --git a/Demo/RX600_RX62N-RSK_Renesas/RTOSDemo/Debug/Debug.hdp b/Demo/RX600_RX62N-RSK_Renesas/RTOSDemo/Debug/Debug.hdp index b2e5c779c3d2e8f1e013c742a8d3261e6799b09c..a8fcbebfd8c531b632912c316cf9c03e27784f73 100644 GIT binary patch delta 8345 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 U;}Mm;HpY?UJ)?<2R2FD0ssI2 delta 5862 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 delta 226 zcmcbn)~q(6fl+%hFTdmDRJNYUFIeIxJ8(5lKF?%4c>$CDWG3E}$sgHnPi*-&S&PMZ z@)s^0pj6W2vjR0>eh81wWKY4;$?rJTCin2_Oy0y?0b~bFzQbR>S%I68aq>RFM4$qd zNdjt?X8?^AQ8oYo diff --git a/Demo/RX600_RX62N-RSK_Renesas/RTOSDemo/FreeRTOSConfig.h b/Demo/RX600_RX62N-RSK_Renesas/RTOSDemo/FreeRTOSConfig.h index 7dc5d501f..4c7ee4ba4 100644 --- a/Demo/RX600_RX62N-RSK_Renesas/RTOSDemo/FreeRTOSConfig.h +++ b/Demo/RX600_RX62N-RSK_Renesas/RTOSDemo/FreeRTOSConfig.h @@ -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 diff --git a/Demo/RX600_RX62N-RSK_Renesas/RTOSDemo/RTOSDemo.hwp b/Demo/RX600_RX62N-RSK_Renesas/RTOSDemo/RTOSDemo.hwp index e5f78d3f8..2b55a9b3d 100644 --- a/Demo/RX600_RX62N-RSK_Renesas/RTOSDemo/RTOSDemo.hwp +++ b/Demo/RX600_RX62N-RSK_Renesas/RTOSDemo/RTOSDemo.hwp @@ -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 diff --git a/Demo/RX600_RX62N-RSK_Renesas/RTOSDemo/RTOSDemo.nav b/Demo/RX600_RX62N-RSK_Renesas/RTOSDemo/RTOSDemo.nav index 09bad3e2105169bd3b79739078b36bc803d47eff..955de740ebf5c83e3ace4d2f015b06649f02a4a0 100644 GIT binary patch delta 16254 zcmZ`<30zgh{%3}}vt2+0R1nM%T#$1?aVZ4_m1Mar?#d#Nq6nAGeL-!tQt&Fj+%a1$ zHx$dXmrM0}JvEot_Ig=j)_X52#Y(GZ>i;`)?!AEd_w#X>Gv}N+GvD9$x6Zx&mg&rg zCat>?J@~Wz+8YM8%6{G}$nI|}Vb923ok7#Q!Fbo5Ew?ZC>u!J3>tnWA-dN)8&6O>( z`=PfF+v*yO-6p#sK4EO8>@D;0;W6tRU9?y z<>1*7+U5}>(#@vfZf8yjkm&Xtj#R^0HGVCy#0l-x|-Dx$Tw0((pOhd&+?Uvo3-|@ zcZ_7`?BQF3?89E{#Xgd~r7w16-^t#A7lYV`_U-#Zv|@RK#PmL1V!K5J)di)+Wsy-U zDgH^jc`rDs`%e7FD0U09i;7tAeHvb+A}Ku}YBZcVe+e(Pl)?WnB8(YAIY z{@}Z~-|LmGtlVDlN?)$z;!i)8hv8s*%PU@7NfisRUwp-fr8#+DWnb{xG(_Jh0@XrzoxvyKspu+px)8pUEEreII8rIIpR4J0_iUi<2U>^%$z z*{yrE9woMc1w}=bc{PJRZF|%vh9VEjhnBqNp;00q2fJPkHHdLbuFCFaWRU%){E1YAC>?TQRKf6=w8ZEaih`cRl#;E<)Yo5GRV=vg-&HmsnA3j8V zK5bWLo*+lfj>)Ra^D1fziXxxKn?0dk0>U%9%+L^lTG(!#{mw1}d&+U;4cdz*M(++{ zw`6br?g(~N_Ja0!ndcM~=E+@8FQ@`r-R;}=1lfPs?a#twFKACU_PKmGZBH=UFMG@O zgtG|T9m)pEXKw8AW6#SwVS5AZ&+ZKdnm%l!Ip#i*50+*$R2TCnXFkEIT?B5lB{E0kC!xGX2--%VIK5Z z$rIC3ay)?KgDgaDVBf(Qb{bfQ*l!;kz;?@?^>q*SPl+$gfF7njClcmBnD2|PXziO{ zkH&MtmH~Z3c20)Xnw*r4DMRdDZy5MN4z}aoVU00+QhHw2$ni-jPRYrU?Bw*EMi~<8zwkdK|k!xDEv>}gv68_`=vv{YhTvdha8G$-Q}wS_ce!1%vWv# z%hXC|Wp9BM6U)lU&P#*e%5;6_?xC?TK0TlTa&_=Rdziu-1f2$ zx)KV98g?b9x%|o>I@Z~4z8lp1*!AxWgQKge3#v;B!{(Nk6ouI;=Z>6NTsV7FdFA+m z(vqUolB(*&vZBnI;+o<}@kG=F?&hY2GrYm1!oXaDyS`&CZ; z+^z2!Hi?_-hcQEn4c;)Pq;Pi50$Z{8$mrtg^y2x|$@6U`mBl$FbBZIy6C)C{lk;*W zS(AH*+2)H+PbjELo@1+C5VeRozS_L}b|Isy2Kd8;cTJkSniMOYHGm-B-08!{Hkl>4-n(Kf zy?kEVa5uTh`6J8c%qb`<61SsvJD1O1@6U4FhfcT$b8BUJVR2QJ3Wt29QUcDH1KCc|wLf>u zkkLT|kX?4c99yaU9QOWaw#WqwVOC8jt}M=;S5jR#v$!Z~z4P0YX<(1>aAps`5-8~N zFb(C*Y*8OA zN=v5~6wU_21nI_r52eLn>P3{Nx|lv1W$)tlrn)?bl2gws;d@Q2qdQ z_y3z?|NZ6|U0jBZ6gm{cCT<`588`i-J;E&zj=Cv?Px84{g(8 zRiA`K_|CON>fW1mAE}DEO8!wT)BP3_HQOcid(d&a`}HBehuHUly@x1qaq*%VB$~l! z2E>R)5sgJOvALp+TYRWj4$IXp8=}O=;)(cJJP{v@C*oscMH45Q0iqcw8q66Vi#g+C zF=u?7cq2}{5hvb=6K}+cH{!$_apDcJig>Y#c(ICjv5NQsN^UN;;Ictb94}mo6wS@e z2Y+dM5|5yS*H~BbE@Ga{oA&QwNz|IpG}`Eyixsbq*A`E*66--R`Do5eXGjJ-I*xd2 zOdY4qFXbLu#rUT|Pj0~1UuKc&*Xs(H!ClecGi220`*=&KQXZMUVSJce&$tM?3gGBYi|!Sbj%mrbDDTsEHEbD_tbh<(Z8C_(g&H!@$Y z1kkw^Yz!q-@Xp-Q*>w@f0_kpx`e--GxWs&^=TtVG1yh1+w62AD(yS?L8hK1%d8`|S zuEI>_smwsj`f+c{p3Ek(P%?kzoF@M(rsqm`bq%&>As62{ER((}WwFeUE|xMyr}$$p z{piHw>_M+mSl{Tv#gbD2iFR~TS%244;WT(2n?hITvJBcLn(VnO zmGq){y#|03iYB0jrPJT4(NtBl9O{mS^`W}i%+gSe#V@MDGci?cEPY#vroIx-BvoQD zia?|n9k1lQsilG$xW&?O#7F}wAlx{zEnESIBULn;3j%VrOWKUrGkVX;r>Yfk|~q}DR5{dE*gpTowp7z(Rq7CN_% zhf&FLmWsYo#Rihm$o=VTEv8>yi|H+*xx5SwEdwND(KIZ>9$#OIrf4Zx=P#PSE&(?4 z(6HfDzX8+arSJfjKzX^?e(NIETMGgzi4DK0mwo8WVy36?#cVPgDfT{r$`-N7b4`eI4% zIAWl6U@gnT%ws6#11RS8XE4V!dEN31^VLihu)tRCWSVmCkcnF+3w@nN z-Bz)DHc=>k7MWKuFYHP7o1SJ~b&;d^)=V+ZadNJ`|+v#G_&Hoc(^3-M}WW zGBI})*|zXLY>wKG(eXaKlo37>PA!{Zs#|Ar1D}1*2tJzcgxl<{Sns#?AkwS@p9<#zX~(? zoLFfVw>(Q_JF)uGozRg7cCtrM(V?(SDqXq=_+aRs62=XhKY(`^95t{fI}U(9PYA5A z@lfu|9(VQ4-13;pLRxh zgn`Y%OO2Ut4a=z#b50hsPb4nP9G?`N4Ba?F`Znft+!^(qZojv!1E!3JBW!XgKn zW`OcpO^||n6Ab#neP{~yL5!=3y$H{Kd^hV&$78rBgw{47q7(kC8x_0-LRjbWaMJ9B z|5(-T5p2hUvi87wK1J8R6<%dG>&2BPT^Es*wi}4t-i4-V7bsMShSj>TLHx8*jUSJH z!ZbX(kZiB94DA}AI)V1@fz}+G$bIOmx1p>n--gca5w~eK>eIF(tTPoH0YaUQz+&uh5zLz^4r8>( zVOW9lZ?a6j&5iPN0Z2kV<~(+pc?)r#f#WNG6U@JH2yX4jAy8)-8n#i~if)MD28ubv zV2n3(81Q7zlkIcxsqPFj(HcG1GipCz#z2D@7)Z7^m=Qvj{TR_-C*rVZYI+yJ;?>ug z2eWq^fPY#`cSNLK?$1qJsdrs?XzSYGz19ivCVl`39%>JyMn7}0h-Jd<_ZKwoBGkyNRkr_W(3dyf!vW+thiU6aV5{vo3*eR`u8Yp>EfMs> zqkafIYaPZ-RD6sTkoz$zG)B~<4q6oD+Kp(z(n!SMb~JOwnq zVO`hw2=Cp%GeWXHd{etPW%Bg$D4D6)X%s@&gfOq`6tB(-;1G4>#4WY7sA$jQkF9fOA zK1Z`pH05ZpHvl@&v!txLct&xhh+9wGJ7PKBCKyP{lbuyl%h~|mhkpAENzVCp@`gJy zv4369kvxpTN@{ z{TO2T7ajYU6>#MX!Mtg-`6H0(OBaZtB-Qb&b^}shFUo<2#aR2<|FCKNE4PMAFyght zd5C1cyYgkn5nq16jn1!dJ|m0=|DyefwAQWPf*hXnW8yn!m4DlcP}b1r!M(uZHe&;3KVj&WRRaW1_#S1wV( zC44IH5}QhQT99LZBUqMC!&<|E*@yefg%4-y8&rX_`g*d zHAV1f{;jLu&)xEkLo%550TC>sdUE-mAtO~^fg1XuVSw~MYzkLeMY?1ap$Z(ry=EkqJ}V@&i=wC@!zDOv{2X<-h=<@xMbnqwe;3qZcsQVAByeNVY`w3a&j_Z)j859^sDAc-^Ro#-g7xX?ZS}Z0Seo6S!f$ACD2- zfsm)b!3-?p{pA}{)xOjq_<-+q8BK%k;GNY!cD+f6w^GPm!($09rW3uek!OK})0Xjg z)&I%h?wVMaTvF}REJ6fPov3*@zSrW#BlJqQwMQ;%taN?`W$$;ebHsuuK^ALq=@~Sm}G364UsDqWFR8QW0p9b{FAM zy^TGB_eLN=3?s7#A1#-qzq-19Q9WK!9#&rorN%NW&656ZzvRsK>HI>jh}=6=V+r~# zoXU-S0%hERq`%Q4Lbz}npLo#7M`@G~7QI5}4ScLt8P@krJuNq&5~=*u`WM=l$l>@! z_TFOWL0Zcj|GuW97Cn!3Wv?d7g)UF%yWKp6x|FEcwKFG8x{>dMQOpvKlGZ35C0K9J zg}(VjLd{^x_u~4rB4kQ?N)`nceWAB#AOCOZs3`s>EBR~_-}~;Q$g5P zhj7eoW?c&Brl7rWYTY|>x&S`{5ea@5iV4IFD>}n8Z4co?bqcTe`p2%cKM|%tmdAyH z8dXu9VrtEn{uRK@R1m2#* zwI^7RL0MRGweZUuCuzAqpD5HWLP*9U3`tK}k)u$5M3hb-JCSAu{J#@H6MbO@91_8% zdl58g1c2ll%rkY0ThM#@ZnXcdTCwXxD9`DPire0_${VkoWOTlcjREET!;$*<@=5fK znOmiyazz(yD+Q58QR6h;nG(G4@wLUUfaX_NA6?uB%c7#Jg6~6R$%M9s;{K>?r@cG# zJM+}Vo&941Y~r>MKFR^2x3lm)exA>Xu$z<@z*9{Yw*^P@pYn16h)^X^!1ky#vD7qG zwXvSGaS)6+N|$O8l78%pfW--KFsF#OCAb6VVl-B1j=*$r223X@{MQGuIiNF*7CorKkxjA+vnv3X zt(%3Xn2fMbdM~TD_0WwBN*u{2ns6-P;0j%z4-D~Ch^Rq$(X}Mh^>6lb;3{Gq54{BT z6eD($WmEqLF!eXZKr8=o=Hb5fyJ8A|R9H3#+Au4Y6%%iLtvyZFFj#vh;vSR`Ch9ir z1>j+{@J$okg$Wj-$flJ&Kvv&;kfCW7swSR2Ffq{U51VahSjzmgieK#`dg{LfX75}S zA3zD=SWQ(7ua}V5^@5Re`nrY~9w0dnK>NYBeigyfWVlNi{Q)J6LaYGQw;i6Fqk$(# zB~dg<_bw)vD27lgDp_=`AMn{x1$+>uMA12ad>@7&naurQSfsnG{SIOkIhjFuf8RRT z<5Ohr3mJ_Zi3J>A1doKuxIyQZa#N$*Nhi8v8z^6R=q$ffS>3y}v#BCe)=Ge=v5L2y zP5Dqr6jmW|k`?H>K0J&D#6l)OtgFT{&^m$AZ9L8ao4;0|Ce6ioloq5Dr?U&;AAMqx zZ0zfeJseEL+ddmvh~|liI25HF2&3*hh!;@yI#3Q_kt`W{=^RvYIVRNj0t9YqAOvOf zqaHOv1J?nQXX9b;IwtlVjE`hrfCvXWQ;X2*y(?72d#g(R(L&55%9}U}@K>=uj^I#l z5kU$R-sT4*D=|+Wz^6*hp*wMy=c5_$Dk9*~IieO&Kf@&e@Klw+Nx@Tu3hywJ-a$vI zh=F3CYe9}U`~ZqZRUmjZe|TFccHo_Z0dA+8w;EgO*r>9=mg@$9ukZq_It&mJ%0y+MSN ziEbira7+UbJL%dmoCt+)or=eRqU6zFiphZKZytrQnB53G@*;RJSw}&z_{3QHAsMSm znyNbe5c)A5;d%dLeEWg1Je7V-!d*x_f<#HTA;FOvQ0p;=-_j{BoZfg@Dz7}N?XLCq zOGkiowF0C$n!*hx#qEowRl+&9L1&<;iI}&|Bpw?Bd_p>oiBg<4Vc%F-hRg)mQpQ?m-q-2MA9sTWIVI#VO#>GxOQ1k zn>Ue83}x_cRF@9loi+|uGBq8uKri~cAPu6{G>idKoW(lPG*sIvXNaTlcKMAccu#8VVpuBQLCpZI-uc{f|s_V5JJiG z5xjT30%;Cp;7jjz2SflFj^Bzfapf5P5CLDfrZIT#ozXl&jlD#16u-s7UEmoapqxl^ z#8lyP0kkx^&O^T-z4B?z5*=7C;!!oHl);VvLIw{E(f-=r+U6s-iXD0`8>Yd0e)}2?4h?jdvy8yUlU1L0)(6VxUbiv zvTEZt=jRc+oibP+0y%f4&@2EiMT`?Ae@bX#e!A-CSH$d^V&467lPK1o}GhrM)wj!8-7{=4NA|Q`c0b(#wMG?YBXQdAzRS`bf zUNk<`R0v??Dq0UCE)r*AI!CS@Rs#zmj~*c!Px^!7WyJQQWo3hYOva@ktq@57O_`2) zWJutYi(czFXSFCWzhC%H^(MYrVZ4RaiaL~4w=QH5O;h#Df{Xz zckb3O)$b_s07(sL;LMBF1V>g?WaN(oc9@hNdFSE)RJs&#MBgz1+h2l=3;H@l1W4Uv zA&X=kgUSRhO-P4Vi?YVgQ+OuAvuuH!|N8k5?z#Dp;nFDx;iRjTB5M5zIflc1@0$Px za}*9eoP)#bu}P=&y)>51XMZGfFhZYdIPbS7<3p$u45VvInXh}+sRq?|fFAx@i>_{y zUZh73Hw=yLAu{A-7diBlP>u;YFhQ?(Wa=U<&r|~zCjk&YIBEotmQSFDSy|4pX?aOb2b(aTarX?&qA*#1Lj@It3w?D@+zV?7N`NOlotS(Do)p@ zU|G+l36FUa%83eIXN{vWG(lFom}R{UF|8DwtUX1~#E06XXTy24Q&7mu6k1&Y1q^u< z56K^RIE0BRurpSQ6~FA!9O+fA)@tzE93G@ma^FgJ2~I<;OPP<>0%6`Gy;cl|1!{;8(vGKy=A|1%C2Kz9cHl`&;tYM& z9~Z!B$6_=S8)ZFxj%Y2bqV9e0;ocdRh08VxR^>)X{buH0n$I2tu#? z(ks9KBbK=U2|!2|CI_J%p$!VDp89q^OA#TCl&w)U^m32q{_5Bx-Cl{;|15N)%ZatF z!Cszw4o_t-Ku>6e&LIpL0=NqPs&R1ggW^{p?sAD-93#^o%fSL%G6$8Fb?Iwl-K4jWwWUqgxfEK9 zr)BZcDR6^3%oOb%4l;_wUxu?CB<-np2%1hTgUyx4ry>$m3&T|L5Q1YUeHThtiVeV$ zw{gL8FBf7Amg%cMD7c7vKx+jbi>xcW)YAhLtq=uFD{?o-kF<_SSVGlp8!6Qz2Iy|=wkDbyqX;qteDG>E3^BUe&m0QzlKA@evd_^@zx-<_p z7?9o{xT^&Lk|CF@3d)KXN{}X%N^PbaKgslUK`MVt>F=odiyDm#dM^!hl#XRs*&)Et z7@>|UM!&btY!&`xD6QF#RM}aS>>y1T;%Bh)nukDQ2va1~YH{BcrBTKL{JhG#3i$hZ zK*r7=R2uc~)wa$M60I*5wsIZsqEmVXa6>mbQO^fyl`Dyfr|Eb-sDqy}nS~>KNT-~< zGepf{29o%dfL?j_$|z)usCkW+wNpxe0w0nkYAJlNRh=WpuW;n!(oTEQ)^Zf)MZw9K zS5R3vQ9V>3%j!B8^3*H$91Qg(S$_+C5a6i%5kC!+!J&}7 z^LWTa-8N%A?T?3WrY_EhX!s_iq$mx?Qp_e;jcOxIMC;cqmZmPl8=w2Dc1ND4wFMor z5aQ&TE2xB%id5^XqTsCywQjmGF14N85I+H?B^xlUQ;#L-OcX7~cqgSVPkYr~t{qf}}yTx+`AXp2X$vv^><9 zv3MD17q*Hc2T|*l;shzeMMQ(aaxW7fa3~AdaQ`zVZ=-s|bPB)rMGYgGmh519O$Wy6 z>8*OK1+-08^Fi>{7qP0W@dsCI4J6&{|7q+1BL(q delta 14671 zcmZu&cR*Cf*5?dtp)X(o6vPgS$X&4{7C^-=-4YuhYN8PVu_ZBznwX+d%#EDb(O6QlSM_b+d8+)K}z)l@$a_=P?tI6{9iC`f3l)s(YA z!BnYwAnNtOk$O~cj6N$YLSGmhEE1QiM+<{(^n#-oEbJ>>-7YI#-J}Xvx9cj^jS9Bt zIkuYA?jpMA1AoZ(W~AnyGr{`b5(#^dfX~awyGJG%Y!t=BVDpX%BbGrD^fAIEjy<)tXuE<{P z{_z9+XukS=aj~g3?2&ff^rZS__M>~+*S6L*KfH4D&Tu_uvq_)1p%FGJN1HbIQJB8D zCOpW0_SBNRf{Dd5XT`=<3H?A!Q~mo5L1fai_C#4z`wi`%nw#n^X9gNG3m=_4DK_p~ zJ!Rt@O4D!ejLZ0t@H)UagX^y0F~v2m-7CF`n9mVU!Ba?<(_(6vKR`ob!! z_``TqRTV(PWv9unUq*U*TEE=1{^58Wq0inLEN&aW*|fo=Z`s<9 z&goY+hU9(7W|tb*y2XT-)WGM4&b zTM7-v<0yT|_T^NpetdI#Bt$?ieRF$+u$QXth#gI-MD;Qbn)IVPf=vUmQwPp)qlD3; zYV`e%W>lnWuf_{)9RBM><3Wzlt6mKxO>cQPLf`aiFb$PkLeHX~d$k;lzp^n(pT5(N z>J@)h?hK*h=*7}CHI{G;?l(MhP~Nb#^hJO@4ohY2i3pHKnmVIoHn^9fr|fD=r$7$Z zZTn6BQ%kxPOqw(^Z+4Fl8>W^>Qf!Ty)O)wTj~2VcM^D`qZIyI;EUSSYz1u8yH_($} zPx$DY4>b>%s(zkVSX2@lsU&gbPE(+hSX}a0>>p}jQ1zp`1H?2Rz2*Mq`nS7-sfU^# zxTlHeqlh-guVxkJmCi1h6kCZOwt+rL&{yoS(enzj`aNd-_#P`Qb&P^wTI3AN-f;S# z>h;*$j*h9`r+Wi!MFoX<>dX@h${?ns7wiky_v{U$Xx004Z*%%YO%B`_LHkuNd0$Iv zgQq5yme z_K1&OvHvN3=?3(xOuD@~ftEx34pJW+EXtamHcHB&r9lp7Or9%6F*fdVLk=Zo3l9W{ zht$xJ)so3Grxs6|S{PeoD8-orVd5F1TMik#dmw@Ql^892&15Mlo<2P`E>1B3?ANE) z_=z>H$$^;}!-nN$r)7;u%gOD9AH`BO&L*YOM-Q$wD`C!cqxeyl+sJH^(l-#4aD7az zjfQwUOV3D88=;=X95LzDwSknQMvz+li&|eA{Q zfV2_WX`_b^&h-VRZK;_$O7WpYIt?8F7Y=o$U8-k$&7VG2dI3XV$;nO4ja_R}W@FQ< zCVkv%31XMABv^sR8JU@Bu%WL<=>L2zP}B&>d${D7Z_Y#MdD;C&_8;ivp;c0H($aJF zf~p9;_>f6YKAcVqU5DL$*pHrb9>yNnn9RAseS+0Lot+58~;_~pr(!I6i=NL12<6kC@j>}S+Q~)_XuA}pm06) zdNj>Y-P(EA@0!V`-~1!I_JyDRW91h9WYypOBbJVW_A%X7PcGfPPV|K8_WLV`R)0Vp zDecf-lt70+5tQc5Equs!c!GsG`%sOX#@qcVn!Zupul%VSZBgCvffT}91E`R$s<(4Y zAob>bft0L&b=}H;TF82MRS<2a!*gv^;7>oPS%+^oqp>8ygnsLfriUj-(Gwvw>o5-T ze5kkAU$YKx=ttL^S|&WGB_(yA&nw1Klo|c5Ne>>b8A}sPyr6)Zn0_WNuNJJmNnJR9 zDn)VPVBts6TyTSuIA$6(=junv3VH*fq85baeEY0(MqQE!;z83WkFQUq@f5*X&ry3W znMQG3pDO|=oJ-FebE9~{RI*W1PXeN+CVb#S=W;hrP%t%iBh2^?ghsACHsbDYFu-gJ(72p6t zvuQXVpGBEGLpCjEVfbMg4Hq4VFIH1aE}t*ja%ve35wXN49|Og<0DxuA7gler{e2`~ zE|^I}MO$}r)JEY;Z4{7(fLwY;1anR)O~k$%IDg@F3c%tX1b<uwD986 zotRj?kZinSHnkS^XufzFYt@Yq(Og(e{kUB*^#QECSCPh%#W-cf3>wWnWb<7SWka4W z&LcaQtRX9(FT${(2;!U|o4eD=4pF%`of3sTlsgweLRL&CtI$GR178lCPFa*J#ic#l z@$*!Wp25E@A-RdtB~R`#aT_ zCp-?OcJ|`>j}7n=`S@crjAuPYL%G#sl+73Bp_xCAayeEupUhwyXQAZ7jO_!g1n%=JjiVtA=<%v& zXbcTvO=5%@9l5@}FmwGhy|gDSA{FDudPUWq;D%O-Rs4*m8DG>@+UI}&Ac^#$mEB^qGn#HcZiGIp82 z9ERRDRlqQg_M`;TLxz3Flnyk;)sGX}SPof6<2ZO3h-Sl|;H zrmXBCFlCyHINDqroc=u210cMMVy%I7+hEnO)gkZ z!$hHj0z1~)QZftLXP;=i_0~FS%LVHojM&Bspcpeq_;C6 zBe?4g8@|1uG$Qrx}aA$e7-b!PYyKlqoXr<7fos zd!k_B+pA&Kr^6)gz_}8~ibN`sA~A%k#|vM+^Ae4uVkzXg!d`3`xBSI0L+5tjz4Ld# znk4SPE5F%}9ZuuY?bL&dx5Fy6-3~eUd>fh-+wi=vY<}8`eQl9V)>g`@#6P(mcQis_ zR`XxMD@&zWi{lFsq9qsqmwaia8zC43F4#h&Xcm|3gm`9V!R;sZhGDGT4C)-Y-yy4G zgdYcQhBBS1qI7!9nEJ#g6v>UMAb9U>f?;?Hjd;?*wv=5`HO9fAE^w!m{08s%%0?P2 z7AlM6aIMnQiv?a>G7G@vuR&O_=>SEDC*3I-pz!%>8ca{{g=!keDb=t$clT2o&EriM z4c8LPKki3ZG1rq2#L4@qC(Y*6{nSI)XBj@{*gk@+mbnH2tnGt_e7YAFs>H>f7NXqY zWApb?J6dF5cWWoLmd3%ttM`C;DSK!HJtcXaBebVEWHW#)X(?>NzSK1csoV|x4(x)L zc#flY0kGz~Xecd{SdQQsJ83k%;95M&p}{LWDS=|8L%QmA!#b5*#R=>y`SLq7#@qgs zD}-pqncl+3ERE=r`-t4~D2)}1+^83hkj2}+*pp(Vr;RYE{0RBeQlp=UK3BX!W4S9D zoMO>oNFqW4e_s4LjS!_N54i*QOx5j2LbuzgOIzG2O;+_bHza*d#x6Fwbrp>Or4Ym zM6k4u|EhuJ+^d1yZs39%ScJS9s7-JU4DO|OVDwhJgJB;uq{|Sc8^=crf4tM#_cLj$ zy}Z2mDmqh^K)kqjOLy}h#GnZvC4(h)R%S}k4_91;LRS_Ai!s@ z$6CB#l(3rY`~F7s_1Q0Ji$;nEg}vGnAk>HtxM6Jg?ix=@Ak|7}9H<(Kf6$W>K!>Ck zS5rFBYp#AA>+gaque&h}KHEa)`Q#;VrS3Cm*jXh8l^;9Af*XAXb99EQg-GICokS~P zKP|Jnkp zY-{;GICeyeLjq^Mj}&slMG%h3-z5v}O=J2-8^r&((GR)^y*wfNslt9)B0q?4O@p~o zT69SQl`SoDAbsWPBfk1lGGGuVM!-9QB?0t>Cjp}Jxn%Vqu2>=>g!Y+h5XoDv0QOI$ zca2l9BexCUTlI*!KQe;Ll6vVub+QQihZ0H0dz7wyeHr1~qRUjkF|w(~A}VfwHhyDjml=P7*I@g&FU<53OAEB`O*A zFJY8_`T{{{jcm%k0B4hA^U>!}&~v=`55!nd-%!p>lgGa)!@~A_>n3%j8;(PMgCc~? z7&-JNMCJ#XDU9O08#tc00pZ;GBbu}y5$S#R1DfZ4K%Vfeu}sBv>cI6=;hw&c;^<&l zRiy|)xutFYOQNg_V-`IMef1~E}F(>~Uyjl7^ynC1Lp&Os^sy8sV`a5bb z<-$3L6<>I9>Tv`#E{PLgx>Jl#yHxMI97<~9JTpC+a1Yfp;5xa!z; z#T1k{WT+{=ai_>w6Wmh=k;}lC`18+qXd>%(fRtS}7k@%if`+b3{Gd5YhsB% zJSkSL`UB#9TgEVUzV$5_qH1S9xe-*TqyG+x{@LKOF%5D~|CN}I) zZ7geB0etZ{gxvq*RWlI1)PGCuxW20hrr+HN2<%D#2n_Q`-Y3LEFnO@JNn9aB3$_T6 z%Ueklaw-~_FPIHg?`z_4pcYR`Fqx&M$kJISGC8~P!tNstm8z&2set$kHvE-8VP*Qs z=8D9!UcT5-NRibNz7&8Yrwb|@T=6v`cp20CymaSN6X%7CE=H0zAy`E5&pkwES=I4j z8PfZ__T5c02gxb7nj%*|7lc*JMHo&C63u0=8%GD>L18$4c76`(j+X;5rIiH-c9xgg za7Cc7@>|iy%Bo%z?(r^{bFY!`_0_yeuGN?9I!zpM zoze_TE)#ll{`jkRoBhJ2ldusSCz_?*HG3_Z7j%3yXH|-UTwxdCd~KRYH$+q=QWN~J zi_j^sGAag>p)vS-uenHIWDF{(Z_FoO#G52KJlq%4?@R+?uF?YEu!`Xg`{1HNOsRPm zQ>r(L78ZN+9;2`LWby&T4AQi=g#|Rg7|UHA$6kXhh?b1rdf{)eSLIdzh;!V|6P=_h zwDMDCpy0hqBy!0*xuAL4?S6@ad6h{#!Xw*)EHx8#)KCr^hLKA)E%pKJswVxE#dT{$ zHlOhU(lVozI&2P)nQ}H+ZEB=Ni++7+%IpVtQM7n~Pc*^i8V|s}<~9)_oZSvRMAv@Y zQ$7GkGdVO|WXYzpWPd9c=fiyLed1qdDiS?;-(wVF{^t`rEX{x67z?skC)-`iX` zF3F2#W3Sg5x06Wv{m58#BBczSBQe2Q>@ZDTNmzKjG{ zUp#WvjjIV#x>Hp_+`Pil^P@4TTy2BGE50IbX(XTHl@TJ|qD`9_d++VxQX=wrNwi2& zc-y8-cjP1A4IAv;{FgJF)efN?un&{44>Z}|4*b>3SyInXK0)nuD}{Q$+dqRB1!3OV z9+0|yEs(}RrAG3S*$`k^qBTGNV7D_dN-f&C)c|L-kOwOS@CxAFQCN`bsGSOI0F1wB z$TNHHHsiXv;IK0_YrBk0^qPk@Y88C=Qc)jo}~|C4d#e%VKe8Ak&$PR}pf=7ymQ) z44;S=SrC)(x1~_lWkFWUr{f3bXHbOsx1NP&P+?LUu*>6{enE&~?pt#6eZZ=t<_5mMNn#(vGv*3a47Bp`C9tmN5{+{@+{FHQ6v#6Y zMN>YNg|(b~3Fpr`0~F8_`PQe@+E;saT@_6K8QhNijWxc~<1d3@!yQ_z`H`MOYVY=E zTav+02PbaC-_MBvUKx+AeA`#P0-=YzrQ(Zgv5Xuk3+mucOh=K!9}EW{q^)iU#@lrN zr-L8L9?NjrqRlxQ*X+G4X}L$pw2WtTaQY${E?EtB;TT}f5OdN$7skb9O5s!SMhoT7 zI5Q3m&`nMrDZ%s2CtiBmoxfQ~etM zFT)dF_zMT>kPzHs{emLw3!3O5!EFmc%6Jqzh52jD=aX@)-T+scPKxZil3>N2M9--?INSO)g8eJDL@d4j*C-SQuUWZ4?u1FK@3i5 z`-bA3p-ok9G1U`N8?Wi@CRmO5F$PcaH(}p(y%5foC5bV-pcl5XZLlHWNt|*Ph15rN z&}NRo>l1rInt-|yT*$~fluc348kiAB85LoVm0Rv20NO^xbN=rD3t$BDUk`xq$^prG zty#<77y(reNfu*aXAMIMo8Ox=2jBv;8>g;Qj|Ph+cnU-vq=H5FjQsM}q$78IHe9%&lX9sz-}i~gLGAKLnt@1|WwzX=ptpQjy#$`xdD9o+^YQE_%`Vg$ne9EE*$>NxL}WO^(JvO1 z{ddP{8ICEm+H;cT=Exg)AQWJ>-w%=6asx#9NjUmjbESwnE(8L&d@2s9jAY#e`c$})fhv4_JF>KSz4cthR!j?~DA>xE{d4T__ zLV*5D?w+~VQ)PNESUNb1=JnX|{AU9t2d2odz!B<?~;Y%PruTfj`td|#e@0e+X zO-?kxz-j+3dFrT&k5$<9fD4*x!9KzdKU7Xc8Vk>i*)BciM;fcB|S zRhCz*<;y<%**EG8RaR4qMf>xw*#s$AFb*Ca-bm@HDhCDe8(Cr;N5}`bD{jZf$6{5* zF5C|GaDivz1siZa*n{DGYK<7EoKw4IhJlPX5{1lv;Nk=~dJ{26eko&4e{=gYSF1-*y8NUBylxxfb7?hP*MS5)YKmMPVq6x0H!N*y`DASbcD&jm7R@4g6q+ye|si z=DlzX*HVVaszg}bI;*H05ueH@5}`Cjclw%NMGiL}4j252l-#m51XRZTsxp{R?vcFm zVW4?y3IwWroJjDsN3Jb986zV)NGnov$HzRrP9p*|M#*ef*$?Bc!KzK^I%vX}RG775 zIG6pCvEad{MHicKSAhEHpQT;@tQGHZ%W-(2VjoyP!NuIpobU|frhW??96<5s4Heii zINaZr!y}bZfi%hj@)H7;>8qp#Ua=FWG{^j_gPe$~DJLd^20<8Oh=Hmh{8<1&Qnlhu z|G-6Di#eDA2^%E?uFhOF7Zv~>qOXy?K%o@N5#qb^ytz?afloB?^+gnB)+QWHgKojC zp@2JGM4RkK+83MoN;g32XxArCR?X|g2LmjS zm;+0oj>_Z8lAJec6Wp>?O!5>2D@T=LTd=Cb_)H0UU1TK%cXdd5e(7wlhi-=qGwLl$ zI)XW|1Z4@_Hy~q-|L#{5Sd^R$@DvfdQ$$dD$mUxnumc%;OIDR49NEhMnF_;zdtyIT z=XaF>t_*@oE11D`OXUpgs1|>qz$G#SP^HCEhB{_0hKhpK=|1+K-de`xiAdML??|)# zLWfVB+(Vr$ninp@5~?hrOqeVvb8TDv8XrLTn|>Jj2)uPZzEF{ofRcblCPM(=v(k9Z zLiom23#qe=)?1nuFUywREEqeGA5p2#oZ=VaG)tBmtcec7cjEAl+Pqi4U3tay9v^rX zNwF5W_Jpjc-7XX3T#*}!7IxzUMHhRr+9F0$pD4;N&@9@7pFUoO%oPk!=DPzvyMlT4 z5QAWD-4x!!$^H=T>j*?!vl6gy0?WBlF8=v(9QGx% z!T$i0Vn44kV^8vW$s63}sP)h|+^dA~9S!_bA56&b&SZon1>xYa`ustC?2wWRXq?Fe zLgD6cdaCjR1#m=l$|A=1z273jXUMWZN-3IE%f!RnsT>(q#WEZQAviwnTPzZM>_4|} z%oD<~qm?f}e8KJ(=5{UOWcdN=;J=smv@^X zb~c<(ezRaMNxInXGxrSd`=@d0R_noKc|XRxpT@>jh@xKOR8VmFHg)8D>9j9w!oA|g zr!Y??1g_6p%*&52n)fT}b4$cnPd0~36W73DSqS#vu|M}HLvHHiaTu2{R$sFW?j%_D zruaekl)j=m7Qy|SxV#TkYx%VSMxCk{$&$Pp4U$)*+UY+Zlw|5^6&xoX6DYp^4vXQ}|! zNPcV;%E6MRyi7_@#L>N115-6cWt;n77R_W4rx*XYT-Yr34*9Rj>ep=z+JQ=e#w}h3 ztRJO1YzEAT@nNJ@d%OJB!e)Wd6BzYYr? za&s>DO4bT;>mGd}m$V8Q37kG+A`~8+@$bp?h>F)&AQ^QCWkLmTQSr3=mZnmM0g$}j z_{0zUY!Et?Aa?2t9llT0A$k3I(+d1dtUv~ZSZln=uI^P*nn(xm3YJH}*Reqi?DvU5 z&sXpbhC?L4ewz&G8VZ|cj@^bx1%i-h(bC`Ql$P}_YgVX+l1v$DTIJiMSb0i77~9rh z1MnF>jEkK{Chg0}rH=GbNlx%~@Y+K_tQ@?>DM(H!3ANbk$C{MEa>z!a$zIj_no2yo z@QJNR2{1QYegoXZM+^TAsa7hIN{91NQsc|VHv=GN$e6(6HY4P6rb*3=m@{mxj7JYq zJnyZ-WL4)>|32773|32774|<>|32820|<>|32801|32824" "0.0" +"{WK_00000001_CmdLine}" "WINDOW" 59422 0 1 "0.07" 228 0 0 100 100 17 0 "32771|32772|32778|<>|32773|32774|<>" "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|<>|32781|32782|<>|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" diff --git a/Demo/RX600_RX62N-RSK_Renesas/RTOSDemo/SessionRX600_E1_E20_SYSTEM.ini b/Demo/RX600_RX62N-RSK_Renesas/RTOSDemo/SessionRX600_E1_E20_SYSTEM.ini index ae83e6023..f742d4377 100644 --- a/Demo/RX600_RX62N-RSK_Renesas/RTOSDemo/SessionRX600_E1_E20_SYSTEM.ini +++ b/Demo/RX600_RX62N-RSK_Renesas/RTOSDemo/SessionRX600_E1_E20_SYSTEM.ini @@ -2,7 +2,7 @@ DebugMode=0 PowerOut=0 ResetRelease=0 -EmulatorSerial=E1:_9KM000237 +EmulatorSerial= McuGroup=RX62N Group Device=R5F562N8 McuFileDir=RX62NGr diff --git a/Demo/RX600_RX62N-RSK_Renesas/RTOSDemo/SimDebug_RX600/SimDebug_RX600.hdp b/Demo/RX600_RX62N-RSK_Renesas/RTOSDemo/SimDebug_RX600/SimDebug_RX600.hdp index 020f081fb1a28fee2485cb1677361e99369573f1..9b8c90ecf6f19817df3558c65c495563ae4186fe 100644 GIT binary patch delta 287 zcmaE>dO&SL7OM^e14G2*KxXC14>%Pk|7G4exsSVkvKMd8rIwqub9ls6A#43lV9@cOtxT*n;gI_KY0T?`{emdoReDwEGP2`R!+|0v75N2 zXYyU9+Ylr8^e12ADVf|Z*Z`Dvojjj|Yw|HZEk<3S<#Hg+tRvAW8<>qq; zOm5@S1v(=OXn)e=$L!^kH*-}@E@!O)s#BRffk$fc1U7S^dgIA`oO+Y@3IxKP$YyUp_g9 z(RH#v_nyfs1QUU3RDjwQCqL&kn4HA}5*L_!mQQ!Gtw0q}-gvSXpB_+sJC 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(); + } } - - xDoneSomething = pdTRUE; - } - 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 ) + else if( xHeader->type == htons( UIP_ETHTYPE_ARP ) ) { - vEMACWrite(); + 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 + { + 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 ); } } } diff --git a/Demo/RX600_RX62N-RSK_Renesas/RTOSDemo/webserver/EMAC.c b/Demo/RX600_RX62N-RSK_Renesas/RTOSDemo/webserver/EMAC.c index 88dd28094..8fe653326 100644 --- a/Demo/RX600_RX62N-RSK_Renesas/RTOSDemo/webserver/EMAC.c +++ b/Demo/RX600_RX62N-RSK_Renesas/RTOSDemo/webserver/EMAC.c @@ -246,23 +246,29 @@ unsigned long ulBytesReceived; if( ulBytesReceived > 0 ) { - pxCurrentRxDesc->status &= ~( FP1 | FP0 ); - pxCurrentRxDesc->status |= ACT; - - 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 ); - + + /* 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; + } } 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; } -- 2.39.5