From d67a283734945e40a17d56c2525e798a247c79a8 Mon Sep 17 00:00:00 2001 From: richardbarry Date: Fri, 15 Jan 2010 17:20:09 +0000 Subject: [PATCH] Still a work in progress. Need to add flop support. git-svn-id: https://svn.code.sf.net/p/freertos/code/trunk@957 1d2547de-c912-0410-9cb9-b8ca96c0e9e2 --- Demo/SuperH_SH7216_Renesas/RTOSDemo.tws | 20 +- .../RTOSDemo/FreeRTOSConfig.h | 113 +++++++++++ .../RTOSDemo/ParTest/ParTest.c | 2 +- .../RTOSDemo/RTOSDemo.hwp | 25 ++- .../RTOSDemo/RTOSDemo.nav | Bin 50027 -> 64575 bytes .../SessionSH7216_E10A-USB_SYSTEM__SH.hsf | 80 ++++---- Demo/SuperH_SH7216_Renesas/RTOSDemo/intprg.c | 9 +- Demo/SuperH_SH7216_Renesas/RTOSDemo/main.c | 171 ++++++++++++++--- .../RTOSDemo/regtest.src | 178 +++++++++++++++--- Demo/SuperH_SH7216_Renesas/RTOSDemo/vecttbl.c | 4 +- 10 files changed, 505 insertions(+), 97 deletions(-) create mode 100644 Demo/SuperH_SH7216_Renesas/RTOSDemo/FreeRTOSConfig.h diff --git a/Demo/SuperH_SH7216_Renesas/RTOSDemo.tws b/Demo/SuperH_SH7216_Renesas/RTOSDemo.tws index 2303b819b..3ae1526c6 100644 --- a/Demo/SuperH_SH7216_Renesas/RTOSDemo.tws +++ b/Demo/SuperH_SH7216_Renesas/RTOSDemo.tws @@ -7,17 +7,23 @@ [GENERAL_DATA] [BREAKPOINTS] [OPEN_WORKSPACE_FILES] +"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\Common\Minimal\PollQ.c" +"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\SuperH_SH7216_Renesas\RTOSDemo\FreeRTOSConfig.h" +"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\SuperH_SH7216_Renesas\RTOSDemo\intprg.c" "C:\E\Dev\FreeRTOS\WorkingCopy\Demo\SuperH_SH7216_Renesas\RTOSDemo\main.c" -"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\SuperH_SH7216_Renesas\RTOSDemo\regtest.src" -"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\SuperH_SH7216_Renesas\RTOSDemo\vecttbl.c" "C:\E\Dev\FreeRTOS\WorkingCopy\Source\portable\Renesas\SH2A_FPU\port.c" "C:\E\Dev\FreeRTOS\WorkingCopy\Source\portable\Renesas\SH2A_FPU\portasm.src" +"C:\E\Dev\FreeRTOS\WorkingCopy\Source\queue.c" +"C:\E\Dev\FreeRTOS\WorkingCopy\Source\tasks.c" [WORKSPACE_FILE_STATES] -"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\SuperH_SH7216_Renesas\RTOSDemo\main.c" 0 0 918 659 0 0 -"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\SuperH_SH7216_Renesas\RTOSDemo\regtest.src" -4 -23 1016 659 1 4 -"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\SuperH_SH7216_Renesas\RTOSDemo\vecttbl.c" 0 0 712 434 0 3 -"C:\E\Dev\FreeRTOS\WorkingCopy\Source\portable\Renesas\SH2A_FPU\port.c" 0 0 1400 586 0 1 -"C:\E\Dev\FreeRTOS\WorkingCopy\Source\portable\Renesas\SH2A_FPU\portasm.src" 0 0 805 659 0 2 +"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\Common\Minimal\PollQ.c" 44 44 838 434 0 2 +"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\SuperH_SH7216_Renesas\RTOSDemo\FreeRTOSConfig.h" 132 132 838 434 0 6 +"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\SuperH_SH7216_Renesas\RTOSDemo\intprg.c" 22 22 838 434 0 1 +"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\SuperH_SH7216_Renesas\RTOSDemo\main.c" 0 0 1075 659 0 0 +"C:\E\Dev\FreeRTOS\WorkingCopy\Source\portable\Renesas\SH2A_FPU\port.c" 66 66 838 434 0 3 +"C:\E\Dev\FreeRTOS\WorkingCopy\Source\portable\Renesas\SH2A_FPU\portasm.src" 88 88 838 434 0 4 +"C:\E\Dev\FreeRTOS\WorkingCopy\Source\queue.c" -4 -23 1044 659 1 7 +"C:\E\Dev\FreeRTOS\WorkingCopy\Source\tasks.c" 110 110 838 434 0 5 [LOADED_PROJECTS] "RTOSDemo" [END] diff --git a/Demo/SuperH_SH7216_Renesas/RTOSDemo/FreeRTOSConfig.h b/Demo/SuperH_SH7216_Renesas/RTOSDemo/FreeRTOSConfig.h new file mode 100644 index 000000000..9ef7ca73e --- /dev/null +++ b/Demo/SuperH_SH7216_Renesas/RTOSDemo/FreeRTOSConfig.h @@ -0,0 +1,113 @@ +/* + FreeRTOS V6.0.2 - Copyright (C) 2009 Real Time Engineers Ltd. + + *************************************************************************** + * * + * If you are: * + * * + * + New to FreeRTOS, * + * + Wanting to learn FreeRTOS or multitasking in general quickly * + * + Looking for basic training, * + * + Wanting to improve your FreeRTOS skills and productivity * + * * + * then take a look at the FreeRTOS eBook * + * * + * "Using the FreeRTOS Real Time Kernel - a Practical Guide" * + * http://www.FreeRTOS.org/Documentation * + * * + * A pdf reference manual is also available. Both are usually delivered * + * to your inbox within 20 minutes to two hours when purchased between 8am * + * and 8pm GMT (although please allow up to 24 hours in case of * + * exceptional circumstances). Thank you for your support! * + * * + *************************************************************************** + + This file is part of the FreeRTOS distribution. + + FreeRTOS is free software; you can redistribute it and/or modify it under + the terms of the GNU General Public License (version 2) as published by the + Free Software Foundation AND MODIFIED BY the FreeRTOS exception. + ***NOTE*** The exception to the GPL is included to allow you to distribute + a combined work that includes FreeRTOS without being obliged to provide the + source code for proprietary components outside of the FreeRTOS kernel. + FreeRTOS is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + more details. You should have received a copy of the GNU General Public + License and the FreeRTOS license exception along with FreeRTOS; if not it + can be viewed here: http://www.freertos.org/a00114.html and also obtained + by writing to Richard Barry, contact details for whom are available on the + FreeRTOS WEB site. + + 1 tab == 4 spaces! + + http://www.FreeRTOS.org - Documentation, latest information, license and + contact details. + + http://www.SafeRTOS.com - A version that is certified for use in safety + critical systems. + + http://www.OpenRTOS.com - Commercial support, development, porting, + licensing and training services. +*/ + +#include "iodefine.h" + +#ifndef FREERTOS_CONFIG_H +#define FREERTOS_CONFIG_H + +/*----------------------------------------------------------- + * Application specific definitions. + * + * These definitions should be adjusted for your particular hardware and + * application requirements. + * + * THESE PARAMETERS ARE DESCRIBED WITHIN THE 'CONFIGURATION' SECTION OF THE + * FreeRTOS API DOCUMENTATION AVAILABLE ON THE FreeRTOS.org WEB SITE. + * + * See http://www.freertos.org/a00110.html. + *----------------------------------------------------------*/ + +#define configUSE_PREEMPTION 1 +#define configUSE_IDLE_HOOK 1 +#define configUSE_TICK_HOOK 1 +#define configCPU_CLOCK_HZ ( 200000000UL ) +#define configPERIPHERAL_CLOCK_HZ ( 50000000UL ) +#define configTICK_RATE_HZ ( ( portTickType ) 1000 ) +#define configMINIMAL_STACK_SIZE ( ( unsigned short ) 140 ) +#define configTOTAL_HEAP_SIZE ( ( size_t ) ( 32 * 1024 ) ) +#define configMAX_TASK_NAME_LEN ( 12 ) +#define configUSE_TRACE_FACILITY 0 +#define configUSE_16_BIT_TICKS 0 +#define configIDLE_SHOULD_YIELD 0 +#define configUSE_CO_ROUTINES 0 +#define configUSE_MUTEXES 1 +#define configCHECK_FOR_STACK_OVERFLOW 0 +#define configUSE_RECURSIVE_MUTEXES 1 +#define configQUEUE_REGISTRY_SIZE 0 +#define configGENERATE_RUN_TIME_STATS 0 +#define configUSE_MALLOC_FAILED_HOOK 1 + +#define configMAX_PRIORITIES ( ( unsigned portBASE_TYPE ) 5 ) +#define configMAX_CO_ROUTINE_PRIORITIES ( 2 ) + +/* Set the following definitions to 1 to include the API function, or zero +to exclude the API function. */ + +#define INCLUDE_vTaskPrioritySet 1 +#define INCLUDE_uxTaskPriorityGet 1 +#define INCLUDE_vTaskDelete 1 +#define INCLUDE_vTaskCleanUpResources 0 +#define INCLUDE_vTaskSuspend 1 +#define INCLUDE_vTaskDelayUntil 1 +#define INCLUDE_vTaskDelay 1 +#define INCLUDE_uxTaskGetStackHighWaterMark 1 + + +#define configKERNEL_INTERRUPT_PRIORITY ( 1 ) +#define configMAX_SYSCALL_INTERRUPT_PRIORITY ( 0xff ) + +#define pvPortMallocAligned( x, puxStackBuffer ) ( ( puxStackBuffer == NULL ) ? ( pvPortMalloc( x ) ) : ( puxStackBuffer ) ) +#define vPortFreeAligned( x ) ( void ) x + +#endif /* FREERTOS_CONFIG_H */ diff --git a/Demo/SuperH_SH7216_Renesas/RTOSDemo/ParTest/ParTest.c b/Demo/SuperH_SH7216_Renesas/RTOSDemo/ParTest/ParTest.c index 9f785f215..6d3d74097 100644 --- a/Demo/SuperH_SH7216_Renesas/RTOSDemo/ParTest/ParTest.c +++ b/Demo/SuperH_SH7216_Renesas/RTOSDemo/ParTest/ParTest.c @@ -1,5 +1,5 @@ /* - FreeRTOS V6.0.1 - Copyright (C) 2009 Real Time Engineers Ltd. + FreeRTOS V6.0.2 - Copyright (C) 2009 Real Time Engineers Ltd. *************************************************************************** * * diff --git a/Demo/SuperH_SH7216_Renesas/RTOSDemo/RTOSDemo.hwp b/Demo/SuperH_SH7216_Renesas/RTOSDemo/RTOSDemo.hwp index d3ddb2e16..a503edb08 100644 --- a/Demo/SuperH_SH7216_Renesas/RTOSDemo/RTOSDemo.hwp +++ b/Demo/SuperH_SH7216_Renesas/RTOSDemo/RTOSDemo.hwp @@ -117,6 +117,16 @@ "Object file" "Renesas OptLinker" "Renesas SH Assembler" "Object file" "Renesas OptLinker" "Renesas SH C/C++ Compiler" [PROJECT_FILES] +"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\Common\Minimal\BlockQ.c" "User" "C source file|Standard Demo Tasks" 2 +"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\Common\Minimal\GenQTest.c" "User" "C source file|Standard Demo Tasks" 2 +"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\Common\Minimal\PollQ.c" "User" "C source file|Standard Demo Tasks" 2 +"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\Common\Minimal\QPeek.c" "User" "C source file|Standard Demo Tasks" 2 +"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\Common\Minimal\blocktim.c" "User" "C source file|Standard Demo Tasks" 2 +"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\Common\Minimal\death.c" "User" "C source file|Standard Demo Tasks" 2 +"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\Common\Minimal\flash.c" "User" "C source file|Standard Demo Tasks" 2 +"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\Common\Minimal\integer.c" "User" "C source file|Standard Demo Tasks" 2 +"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\Common\Minimal\recmutex.c" "User" "C source file|Standard Demo Tasks" 2 +"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\Common\Minimal\semtest.c" "User" "C source file|Standard Demo Tasks" 2 "C:\E\Dev\FreeRTOS\WorkingCopy\Demo\SuperH_SH7216_Renesas\RTOSDemo\ParTest\ParTest.c" "User" "C source file" 2 "C:\E\Dev\FreeRTOS\WorkingCopy\Demo\SuperH_SH7216_Renesas\RTOSDemo\dbsct.c" "User" "C source file" 2 "C:\E\Dev\FreeRTOS\WorkingCopy\Demo\SuperH_SH7216_Renesas\RTOSDemo\intprg.c" "User" "C source file" 2 @@ -127,13 +137,14 @@ "C:\E\Dev\FreeRTOS\WorkingCopy\Source\list.c" "User" "C source file|FreeRTOS" 2 "C:\E\Dev\FreeRTOS\WorkingCopy\Source\portable\MemMang\heap_2.c" "User" "C source file|FreeRTOS" 2 "C:\E\Dev\FreeRTOS\WorkingCopy\Source\portable\Renesas\SH2A_FPU\port.c" "User" "C source file|FreeRTOS" 2 -"C:\E\Dev\FreeRTOS\WorkingCopy\Source\portable\Renesas\SH2A_FPU\portasm.src" "User" "Assembly source file" 2 +"C:\E\Dev\FreeRTOS\WorkingCopy\Source\portable\Renesas\SH2A_FPU\portasm.src" "User" "C source file|FreeRTOS" 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 [FOLDER] "Assembly source file" "Assembly source file" "C source file" "C source file" "C source file|FreeRTOS" "" +"C source file|Standard Demo Tasks" "" [GENERAL_DATA_PROJECT] "USE_CUSTOM_LINKAGE_ORDER" "0" [ON_DEMAND_COMPONENTS_LOADED] @@ -142,7 +153,7 @@ "SessionSH7216_E10A-USB_SYSTEM__SH" "C:\E\Dev\FreeRTOS\WorkingCopy\Demo\SuperH_SH7216_Renesas\RTOSDemo\SessionSH7216_E10A-USB_SYSTEM__SH.hsf" 0 [GENERAL_DATA_SESSION_SessionSH7216_E10A-USB_SYSTEM__SH] [OPTIONS_Debug_SH7216_E10A-USB_SYSTEM__SH_Renesas OptLinker] -"Single Shot" "0d47a4b27059ac10" 4 +"Single Shot" "08cd3a35ef59ac10" 4 [OPTIONS_Debug_SH7216_E10A-USB_SYSTEM__SH_Renesas SH Assembler] "Assembly source file" "05db08d6f178ac10" 3 "C:\E\Dev\FreeRTOS\WorkingCopy\Demo\SuperH_SH7216_Renesas\RTOSDemo\regtest.src" "0fd8e3b27059ac10" 3 @@ -151,6 +162,16 @@ [OPTIONS_Debug_SH7216_E10A-USB_SYSTEM__SH_Renesas SH C/C++ Compiler] "C source file" "0deaf32ba059ac10" 2 "C++ source file" "0deaf32ba059ac10" 2 +"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\Common\Minimal\BlockQ.c" "0b5de7fadf59ac10" 2 +"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\Common\Minimal\GenQTest.c" "0b5de7fadf59ac10" 2 +"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\Common\Minimal\PollQ.c" "0b5de7fadf59ac10" 2 +"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\Common\Minimal\QPeek.c" "0b5de7fadf59ac10" 2 +"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\Common\Minimal\blocktim.c" "0b5de7fadf59ac10" 2 +"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\Common\Minimal\death.c" "0cf7e835ef59ac10" 2 +"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\Common\Minimal\flash.c" "00a9f52d4f59ac10" 2 +"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\Common\Minimal\integer.c" "0b5de7fadf59ac10" 2 +"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\Common\Minimal\recmutex.c" "0b5de7fadf59ac10" 2 +"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\Common\Minimal\semtest.c" "0b5de7fadf59ac10" 2 "C:\E\Dev\FreeRTOS\WorkingCopy\Demo\SuperH_SH7216_Renesas\RTOSDemo\ParTest\ParTest.c" "0deaf32ba059ac10" 2 "C:\E\Dev\FreeRTOS\WorkingCopy\Demo\SuperH_SH7216_Renesas\RTOSDemo\dbsct.c" "0deaf32ba059ac10" 2 "C:\E\Dev\FreeRTOS\WorkingCopy\Demo\SuperH_SH7216_Renesas\RTOSDemo\intprg.c" "0deaf32ba059ac10" 2 diff --git a/Demo/SuperH_SH7216_Renesas/RTOSDemo/RTOSDemo.nav b/Demo/SuperH_SH7216_Renesas/RTOSDemo/RTOSDemo.nav index ac41d6529f2532a9ac4155c1e18868731d7b3a51..7f4fbf13b6b843fedbd4c9c2d5c979247322bc09 100644 GIT binary patch literal 64575 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 OIH~*TTSD1VDF1)ew=|jn delta 4621 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 diff --git a/Demo/SuperH_SH7216_Renesas/RTOSDemo/SessionSH7216_E10A-USB_SYSTEM__SH.hsf b/Demo/SuperH_SH7216_Renesas/RTOSDemo/SessionSH7216_E10A-USB_SYSTEM__SH.hsf index 8138c0362..b4a52a0f1 100644 --- a/Demo/SuperH_SH7216_Renesas/RTOSDemo/SessionSH7216_E10A-USB_SYSTEM__SH.hsf +++ b/Demo/SuperH_SH7216_Renesas/RTOSDemo/SessionSH7216_E10A-USB_SYSTEM__SH.hsf @@ -8,6 +8,7 @@ "" [GENERAL_DATA] "FIRST_CONNECTION_TAG" "NO" +"MRULABELS_DATAMANAGER_KEY" "FFFFFFFF|00000000|fff80688" "RESET_CPU_AFTER_DOWNLOAD_TAG" "VARIANT_FALSE_STORE_TAG" "{08009853-4189-4ADA-848F-0F1A84AFE443}MonitorCtrlLabelAddress" "" "{08009853-4189-4ADA-848F-0F1A84AFE443}MonitorCtrlMonitorLastSaveLogDirectory" "" @@ -41,14 +42,14 @@ "{313F4FC1-6566-11D5-8BBE-0004E2013C71}CmdLineCtrlLogFileName" "" "{313F4FC1-6566-11D5-8BBE-0004E2013C71}CmdLineCtrlSplitterPosition" "242" "{313F4FC1-6566-11D5-8BBE-0004E2013C71}CmdLineCtrlViews" "1" -"{313F4FC1-6566-11D5-8BBE-0004E2013C71}CmdLineCtrlWindowProperties" "18" +"{313F4FC1-6566-11D5-8BBE-0004E2013C71}CmdLineCtrlWindowProperties" "17" "{313F4FC1-6566-11D5-8BBE-0004E2013C71}CmdLineWndInstanceKey0" "{WK_00000001_CmdLine}RTOSDemoSessionSH7216_E10A-USB_SYSTEM__SH" "{313F4FC1-6566-11D5-8BBE-0004E2013C71}TclTkCtrlLogFileName" "" "{313F4FC2-6566-11D5-8BBE-0004E2013C71}ECX_MEMORY_COMPARE_END_ADDRESS" "" "{313F4FC2-6566-11D5-8BBE-0004E2013C71}ECX_MEMORY_COMPARE_START_ADDRESS" "" -"{313F4FC2-6566-11D5-8BBE-0004E2013C71}ECX_MEMORY_DISPLAY_DEST_ADDRESS" "" -"{313F4FC2-6566-11D5-8BBE-0004E2013C71}ECX_MEMORY_DISPLAY_END_ADDRESS" "" -"{313F4FC2-6566-11D5-8BBE-0004E2013C71}ECX_MEMORY_DISPLAY_START_ADDRESS" "" +"{313F4FC2-6566-11D5-8BBE-0004E2013C71}ECX_MEMORY_DISPLAY_DEST_ADDRESS" "fff80688" +"{313F4FC2-6566-11D5-8BBE-0004E2013C71}ECX_MEMORY_DISPLAY_END_ADDRESS" "FFFFFFFF" +"{313F4FC2-6566-11D5-8BBE-0004E2013C71}ECX_MEMORY_DISPLAY_START_ADDRESS" "00000000" "{313F4FC2-6566-11D5-8BBE-0004E2013C71}ECX_MEMORY_FILL_END_ADDRESS" "" "{313F4FC2-6566-11D5-8BBE-0004E2013C71}ECX_MEMORY_FILL_START_ADDRESS" "" "{313F4FC2-6566-11D5-8BBE-0004E2013C71}ECX_MEMORY_MOVE_END_ADDRESS" "" @@ -80,7 +81,7 @@ "{8A898260-6F1D-11D5-8EB6-00004CC34E9D}ECX_WAVE_SAMPLING_RATE" "1000" "{8A898260-6F1D-11D5-8EB6-00004CC34E9D}WaveformCtrlViews" "0" "{95A081A1-7001-11D5-B1FD-00A0C9E23A58}RegistersCtrlViews" "1" -"{95A081A1-7001-11D5-B1FD-00A0C9E23A58}RegistersWnd0ColumnWidth" "50,307,118" +"{95A081A1-7001-11D5-B1FD-00A0C9E23A58}RegistersWnd0ColumnWidth" "50,396,118" "{95A081A1-7001-11D5-B1FD-00A0C9E23A58}RegistersWnd0ECX_REGISTER_COUNT" "82" "{95A081A1-7001-11D5-B1FD-00A0C9E23A58}RegistersWnd0ECX_REGISTER_DISPLAYED" "1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1" "{95A081A1-7001-11D5-B1FD-00A0C9E23A58}RegistersWnd0HideFLAGs" "1" @@ -114,7 +115,8 @@ "{B266D880-6FA1-11D5-8613-00A024591A38}WatchWnd0ColWidth3" "200" "{B266D880-6FA1-11D5-8613-00A024591A38}WatchWnd0ECX_WATCH_ITEM0000" "pxCurrentTCB, 4, 0, P, Col, Hex, MN" "{B266D880-6FA1-11D5-8613-00A024591A38}WatchWnd0ECX_WATCH_ITEM0000_SCOPE" "Current Scope," -"{B266D880-6FA1-11D5-8613-00A024591A38}WatchWnd0ECX_WATCH_ITEM0001" "*, 11, 0, C0000, Exp, Hex, N" +"{B266D880-6FA1-11D5-8613-00A024591A38}WatchWnd0ECX_WATCH_ITEM0001" "i, 10, 0, P, Col, Hex, N" +"{B266D880-6FA1-11D5-8613-00A024591A38}WatchWnd0ECX_WATCH_ITEM0001_SCOPE" "Current Scope," "{B266D880-6FA1-11D5-8613-00A024591A38}WatchWnd0ECX_WATCH_ITEM0002" "pxTopOfStack, 4, 0, C0001, Col, Hex, N" "{B266D880-6FA1-11D5-8613-00A024591A38}WatchWnd0ECX_WATCH_ITEM0003" "xGenericListItem, 11, 0, C0001, Col, Hex, N" "{B266D880-6FA1-11D5-8613-00A024591A38}WatchWnd0ECX_WATCH_ITEM0004" "xEventListItem, 11, 0, C0001, Col, Hex, N" @@ -122,7 +124,7 @@ "{B266D880-6FA1-11D5-8613-00A024591A38}WatchWnd0ECX_WATCH_ITEM0006" "pxStack, 4, 0, C0001, Col, Hex, N" "{B266D880-6FA1-11D5-8613-00A024591A38}WatchWnd0ECX_WATCH_ITEM0007" "pcTaskName, 6, 0, C0001, Col, Hex, N" "{B266D880-6FA1-11D5-8613-00A024591A38}WatchWnd0ECX_WATCH_ITEM0008" "uxCriticalNesting, 2, 0, C0001, Col, Hex, N" -"{B266D880-6FA1-11D5-8613-00A024591A38}WatchWnd0ECX_WATCH_ITEMCnt" "1" +"{B266D880-6FA1-11D5-8613-00A024591A38}WatchWnd0ECX_WATCH_ITEMCnt" "2" "{B266D880-6FA1-11D5-8613-00A024591A38}WatchWnd1ColWidth0" "120" "{B266D880-6FA1-11D5-8613-00A024591A38}WatchWnd1ColWidth1" "150" "{B266D880-6FA1-11D5-8613-00A024591A38}WatchWnd1ColWidth12" "150" @@ -239,30 +241,30 @@ "{D293FA15-461F-4D9F-B9C9-64724B3409F9}T_TRACE_TRACE_ACQUISITION2" "1,0,1,1,1,1,1,0,0,0,0,0,0" "{D34C8080-5A99-11D5-B1FD-00A0C9E23A58}C_EVAL_DENORMAL_MODE" "16777216" "{D34C8080-5A99-11D5-B1FD-00A0C9E23A58}C_EVAL_ROUND_MODE" "768" -"{D34C8080-5A99-11D5-B1FD-00A0C9E23A58}C_REGISTER_REG_0" "00000000FFF80AD4" -"{D34C8080-5A99-11D5-B1FD-00A0C9E23A58}C_REGISTER_REG_1" "0000000000000001" -"{D34C8080-5A99-11D5-B1FD-00A0C9E23A58}C_REGISTER_REG_10" "000000000000000B" -"{D34C8080-5A99-11D5-B1FD-00A0C9E23A58}C_REGISTER_REG_11" "000000000000000C" -"{D34C8080-5A99-11D5-B1FD-00A0C9E23A58}C_REGISTER_REG_12" "000000000000000D" -"{D34C8080-5A99-11D5-B1FD-00A0C9E23A58}C_REGISTER_REG_13" "000000000000000E" -"{D34C8080-5A99-11D5-B1FD-00A0C9E23A58}C_REGISTER_REG_14" "0000000000000022" -"{D34C8080-5A99-11D5-B1FD-00A0C9E23A58}C_REGISTER_REG_15" "00000000FFF801E0" -"{D34C8080-5A99-11D5-B1FD-00A0C9E23A58}C_REGISTER_REG_16" "0000000000001EF0" +"{D34C8080-5A99-11D5-B1FD-00A0C9E23A58}C_REGISTER_REG_0" "00000000FFF83504" +"{D34C8080-5A99-11D5-B1FD-00A0C9E23A58}C_REGISTER_REG_1" "00000000FFFFFF0F" +"{D34C8080-5A99-11D5-B1FD-00A0C9E23A58}C_REGISTER_REG_10" "00000000FFFFFFFE" +"{D34C8080-5A99-11D5-B1FD-00A0C9E23A58}C_REGISTER_REG_11" "00000000FFE7FFFF" +"{D34C8080-5A99-11D5-B1FD-00A0C9E23A58}C_REGISTER_REG_12" "00000000FFE7FFFF" +"{D34C8080-5A99-11D5-B1FD-00A0C9E23A58}C_REGISTER_REG_13" "00000000FFE7FFFF" +"{D34C8080-5A99-11D5-B1FD-00A0C9E23A58}C_REGISTER_REG_14" "00000000FFF83230" +"{D34C8080-5A99-11D5-B1FD-00A0C9E23A58}C_REGISTER_REG_15" "00000000FFF83500" +"{D34C8080-5A99-11D5-B1FD-00A0C9E23A58}C_REGISTER_REG_16" "0000000000003B0C" "{D34C8080-5A99-11D5-B1FD-00A0C9E23A58}C_REGISTER_REG_17" "0000000000000001" -"{D34C8080-5A99-11D5-B1FD-00A0C9E23A58}C_REGISTER_REG_18" "0000000000000011" +"{D34C8080-5A99-11D5-B1FD-00A0C9E23A58}C_REGISTER_REG_18" "0000000000000075" "{D34C8080-5A99-11D5-B1FD-00A0C9E23A58}C_REGISTER_REG_19" "0000000000000000" -"{D34C8080-5A99-11D5-B1FD-00A0C9E23A58}C_REGISTER_REG_2" "0000000000000003" +"{D34C8080-5A99-11D5-B1FD-00A0C9E23A58}C_REGISTER_REG_2" "0000000000000001" "{D34C8080-5A99-11D5-B1FD-00A0C9E23A58}C_REGISTER_REG_20" "0000000000000000" -"{D34C8080-5A99-11D5-B1FD-00A0C9E23A58}C_REGISTER_REG_21" "0000000000000010" -"{D34C8080-5A99-11D5-B1FD-00A0C9E23A58}C_REGISTER_REG_22" "000000000000000F" -"{D34C8080-5A99-11D5-B1FD-00A0C9E23A58}C_REGISTER_REG_23" "0000000000000011" +"{D34C8080-5A99-11D5-B1FD-00A0C9E23A58}C_REGISTER_REG_21" "0000000000000011" +"{D34C8080-5A99-11D5-B1FD-00A0C9E23A58}C_REGISTER_REG_22" "0000000000000010" +"{D34C8080-5A99-11D5-B1FD-00A0C9E23A58}C_REGISTER_REG_23" "0000000000001EBE" "{D34C8080-5A99-11D5-B1FD-00A0C9E23A58}C_REGISTER_REG_24" "0000000000000000" "{D34C8080-5A99-11D5-B1FD-00A0C9E23A58}C_REGISTER_REG_25" "0000000000040001" "{D34C8080-5A99-11D5-B1FD-00A0C9E23A58}C_REGISTER_REG_26" "0000000000000000" "{D34C8080-5A99-11D5-B1FD-00A0C9E23A58}C_REGISTER_REG_27" "0000000000000000" "{D34C8080-5A99-11D5-B1FD-00A0C9E23A58}C_REGISTER_REG_28" "0000000000000000" "{D34C8080-5A99-11D5-B1FD-00A0C9E23A58}C_REGISTER_REG_29" "0000000000000000" -"{D34C8080-5A99-11D5-B1FD-00A0C9E23A58}C_REGISTER_REG_3" "0000000000000004" +"{D34C8080-5A99-11D5-B1FD-00A0C9E23A58}C_REGISTER_REG_3" "000000000000566C" "{D34C8080-5A99-11D5-B1FD-00A0C9E23A58}C_REGISTER_REG_30" "0000000000000000" "{D34C8080-5A99-11D5-B1FD-00A0C9E23A58}C_REGISTER_REG_31" "0000000000000000" "{D34C8080-5A99-11D5-B1FD-00A0C9E23A58}C_REGISTER_REG_32" "0000000000000000" @@ -273,7 +275,7 @@ "{D34C8080-5A99-11D5-B1FD-00A0C9E23A58}C_REGISTER_REG_37" "0000000000000000" "{D34C8080-5A99-11D5-B1FD-00A0C9E23A58}C_REGISTER_REG_38" "0000000000000000" "{D34C8080-5A99-11D5-B1FD-00A0C9E23A58}C_REGISTER_REG_39" "0000000000000000" -"{D34C8080-5A99-11D5-B1FD-00A0C9E23A58}C_REGISTER_REG_4" "0000000000000005" +"{D34C8080-5A99-11D5-B1FD-00A0C9E23A58}C_REGISTER_REG_4" "00000000FFF83504" "{D34C8080-5A99-11D5-B1FD-00A0C9E23A58}C_REGISTER_REG_40" "0000000000000000" "{D34C8080-5A99-11D5-B1FD-00A0C9E23A58}C_REGISTER_REG_41" "0000000000000000" "{D34C8080-5A99-11D5-B1FD-00A0C9E23A58}C_REGISTER_REG_42" "0000000000000000" @@ -284,11 +286,11 @@ "{D34C8080-5A99-11D5-B1FD-00A0C9E23A58}C_REGISTER_REG_47" "0000000000000000" "{D34C8080-5A99-11D5-B1FD-00A0C9E23A58}C_REGISTER_REG_48" "0000000000000000" "{D34C8080-5A99-11D5-B1FD-00A0C9E23A58}C_REGISTER_REG_49" "0000000000000000" -"{D34C8080-5A99-11D5-B1FD-00A0C9E23A58}C_REGISTER_REG_5" "0000000000000006" -"{D34C8080-5A99-11D5-B1FD-00A0C9E23A58}C_REGISTER_REG_6" "0000000000000007" -"{D34C8080-5A99-11D5-B1FD-00A0C9E23A58}C_REGISTER_REG_7" "0000000000000008" -"{D34C8080-5A99-11D5-B1FD-00A0C9E23A58}C_REGISTER_REG_8" "0000000000000009" -"{D34C8080-5A99-11D5-B1FD-00A0C9E23A58}C_REGISTER_REG_9" "000000000000000A" +"{D34C8080-5A99-11D5-B1FD-00A0C9E23A58}C_REGISTER_REG_5" "00000000FFF8328C" +"{D34C8080-5A99-11D5-B1FD-00A0C9E23A58}C_REGISTER_REG_6" "00000000FFF83288" +"{D34C8080-5A99-11D5-B1FD-00A0C9E23A58}C_REGISTER_REG_7" "00000000FFF832AC" +"{D34C8080-5A99-11D5-B1FD-00A0C9E23A58}C_REGISTER_REG_8" "0000000000000008" +"{D34C8080-5A99-11D5-B1FD-00A0C9E23A58}C_REGISTER_REG_9" "0000000000000009" "{D34C8080-5A99-11D5-B1FD-00A0C9E23A58}C_REGISTER_REG_COUNT" "50" "{D595F9C0-EF22-11D5-B7DB-0000E10B3DA9}EventCtrlViews" "0" "{EEDC9300-6FBE-11D5-8613-00A024591A38}LocalsCtrlViews" "0" @@ -400,14 +402,16 @@ 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}RTOSDemoSessionSH7216_E10A-USB_SYSTEM__SH" "WINDOW" 59422 0 1 "0.08" 219 0 0 350 200 18 0 "32771|32772|32778|<>|32773|32774|<>|32820|<>|32801|32824" "0.0" -"{WK_00000001_DISASSEMBLY}" "WINDOW" 0 0 0 "0.00" 0 -4 -23 1400 586 9 0 "" "0.0" +"{WK_00000001_CmdLine}RTOSDemoSessionSH7216_E10A-USB_SYSTEM__SH" "WINDOW" 59422 0 1 "0.23" 219 0 0 350 200 17 0 "32771|32772|32778|<>|32773|32774|<>|32820|<>|32801|32824" "0.0" +"{WK_00000001_DISASSEMBLY}" "WINDOW" 0 0 0 "0.00" 0 -4 -23 892 659 9 0 "" "0.0" "{WK_00000001_EVENT}RTOSDemoSessionSH7216_E10A-USB_SYSTEM__SH" "WINDOW" 59422 0 0 "0.50" 292 0 0 350 200 2065 0 "32774|32775|32777|<>|32780|<>" "0.0" "{WK_00000001_IO}RTOSDemoSessionSH7216_E10A-USB_SYSTEM__SH" "WINDOW" 59422 0 3 "0.31" 219 0 0 350 200 17 0 "32817|32826|32819|32820|32821" "0.0" -"{WK_00000001_OUTPUT}" "WINDOW" 59422 0 2 "0.92" 219 560 340 350 200 18 0 "36756|36757|36758|36759|<>|36746|36747|<>|39531|<>|39500|39534|<>|36687" "0.0" -"{WK_00000001_REGISTERS}RTOSDemoSessionSH7216_E10A-USB_SYSTEM__SH" "WINDOW" 59421 0 0 "1.00" 293 0 0 350 200 18 0 "" "0.0" +"{WK_00000001_MEMORY}RTOSDemoSessionSH7216_E10A-USB_SYSTEM__SH" "WINDOW" 59422 0 0 "0.60" 219 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 2 "0.73" 219 560 340 350 200 18 0 "36756|36757|36758|36759|<>|36746|36747|<>|39531|<>|39500|39534|<>|36687" "0.0" +"{WK_00000001_REGISTERS}RTOSDemoSessionSH7216_E10A-USB_SYSTEM__SH" "WINDOW" 59421 0 0 "1.00" 265 0 0 350 200 18 0 "" "0.0" +"{WK_00000001_STACKTRACE}RTOSDemoSessionSH7216_E10A-USB_SYSTEM__SH" "WINDOW" 59422 0 0 "0.50" 219 0 0 350 200 2065 0 "" "0.0" "{WK_00000001_STATUS}RTOSDemoSessionSH7216_E10A-USB_SYSTEM__SH" "WINDOW" 59422 0 4 "0.50" 219 0 0 350 200 17 0 "" "0.0" -"{WK_00000001_WATCH}RTOSDemoSessionSH7216_E10A-USB_SYSTEM__SH" "WINDOW" 59422 0 0 "0.50" 219 0 0 350 200 17 0 "32781|32783|<>|32771|32829|32772|32827|32773|<>|32786|<>|32810|32811|32831" "0.0" +"{WK_00000001_WATCH}RTOSDemoSessionSH7216_E10A-USB_SYSTEM__SH" "WINDOW" 59422 0 0 "0.27" 219 0 0 350 200 18 0 "32781|32783|<>|32771|32829|32772|32827|32773|<>|32786|<>|32810|32811|32831" "0.0" "{WK_00000002_WORKSPACE}" "WINDOW" 59420 0 0 "1.00" 340 560 340 350 200 18 0 "" "0.0" "{WK_TB00000001_STANDARD}" "TOOLBAR 0" 59419 0 2 "0.00" 0 0 0 0 0 18 0 "" "0.0" "{WK_TB00000002_EDITOR}" "TOOLBAR 0" 59419 0 0 "0.00" 0 0 0 0 0 18 0 "" "0.0" @@ -432,11 +436,14 @@ [WINDOW_POSITION_STATE_DATA_VD3] [WINDOW_POSITION_STATE_DATA_VD4] [WINDOW_Z_ORDER] -"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\SuperH_SH7216_Renesas\RTOSDemo\regtest.src" -"C:\E\Dev\FreeRTOS\WorkingCopy\Source\portable\Renesas\SH2A_FPU\portasm.src" +"C:\E\Dev\FreeRTOS\WorkingCopy\Source\queue.c" "C:\E\Dev\FreeRTOS\WorkingCopy\Demo\SuperH_SH7216_Renesas\RTOSDemo\main.c" +"C:\E\Dev\FreeRTOS\WorkingCopy\Source\tasks.c" +"C:\E\Dev\FreeRTOS\WorkingCopy\Source\portable\Renesas\SH2A_FPU\portasm.src" +"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\SuperH_SH7216_Renesas\RTOSDemo\FreeRTOSConfig.h" +"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\Common\Minimal\PollQ.c" "C:\E\Dev\FreeRTOS\WorkingCopy\Source\portable\Renesas\SH2A_FPU\port.c" -"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\SuperH_SH7216_Renesas\RTOSDemo\vecttbl.c" +"C:\E\Dev\FreeRTOS\WorkingCopy\Demo\SuperH_SH7216_Renesas\RTOSDemo\intprg.c" [TARGET_NAME] "SH7216 E10A-USB SYSTEM (SH2A-FPU)" "" 0 [STATUSBAR_STATEINFO_VD1] @@ -483,5 +490,4 @@ [FLASH_DETAILS] "" 0 0 "" 0 "" 0 0 "" 0 0 0 0 0 0 0 "" "" "" "" "" [BREAKPOINTS] -"c:\e\dev\freertos\workingcopy\demo\superh_sh7216_renesas\rtosdemo\regtest.src" 89 7808 1 "{00000000-0000-0000-C000-000000000046}" "" [END] diff --git a/Demo/SuperH_SH7216_Renesas/RTOSDemo/intprg.c b/Demo/SuperH_SH7216_Renesas/RTOSDemo/intprg.c index e5fee0dce..e86918037 100644 --- a/Demo/SuperH_SH7216_Renesas/RTOSDemo/intprg.c +++ b/Demo/SuperH_SH7216_Renesas/RTOSDemo/intprg.c @@ -16,7 +16,14 @@ #pragma section IntPRG // 4 Illegal code -void INT_Illegal_code(void){for( ;; ); /* sleep(); */} +#pragma interrupt (INT_Illegal_code) +void INT_Illegal_code(void) +{ +volatile int i = 0; + + while( i == 0 ); +} + // 5 Reserved // 6 Illegal slot diff --git a/Demo/SuperH_SH7216_Renesas/RTOSDemo/main.c b/Demo/SuperH_SH7216_Renesas/RTOSDemo/main.c index 758a85cac..37049b364 100644 --- a/Demo/SuperH_SH7216_Renesas/RTOSDemo/main.c +++ b/Demo/SuperH_SH7216_Renesas/RTOSDemo/main.c @@ -1,5 +1,5 @@ /* - FreeRTOS V6.0.1 - Copyright (C) 2009 Real Time Engineers Ltd. + FreeRTOS V6.0.2 - Copyright (C) 2009 Real Time Engineers Ltd. *************************************************************************** * * @@ -51,21 +51,56 @@ licensing and training services. */ +/* Kernel includes. */ #include "FreeRTOS.h" #include "task.h" +/* Demo application includes. */ +#include "BlockQ.h" +#include "death.h" +#include "integer.h" +#include "blocktim.h" +#include "flash.h" #include "partest.h" +#include "semtest.h" +#include "PollQ.h" +#include "GenQTest.h" +#include "QPeek.h" +#include "recmutex.h" +/* Constants required to configure the hardware. */ #define mainFRQCR_VALUE ( 0x0303 ) /* Input = 12.5MHz, I Clock = 200MHz, B Clock = 50MHz, P Clock = 50MHz */ +/* Task priorities. */ +#define mainQUEUE_POLL_PRIORITY ( tskIDLE_PRIORITY + 1 ) +#define mainCHECK_TASK_PRIORITY ( tskIDLE_PRIORITY + 3 ) +#define mainSEM_TEST_PRIORITY ( tskIDLE_PRIORITY + 1 ) +#define mainBLOCK_Q_PRIORITY ( tskIDLE_PRIORITY + 2 ) +#define mainCREATOR_TASK_PRIORITY ( tskIDLE_PRIORITY + 3 ) +#define mainFLASH_TASK_PRIORITY ( tskIDLE_PRIORITY + 1 ) +#define mainINTEGER_TASK_PRIORITY ( tskIDLE_PRIORITY ) +#define mainGEN_QUEUE_TASK_PRIORITY ( tskIDLE_PRIORITY ) + +/* The LED toggle by the check task. */ +#define mainCHECK_LED ( 5 ) + +/* The rate at which mainCHECK_LED will toggle when all the tasks are running +without error. */ +#define mainNO_ERROR_CYCLE_TIME ( 5000 / portTICK_RATE_MS ) + +/* The rate at which mainCHECK_LED will toggle when an error has been reported +by at least one task. */ +#define mainERROR_CYCLE_TIME ( 200 / portTICK_RATE_MS ) + void vApplicationMallocFailedHook( void ); void vApplicationIdleHook( void ); static void prvSetupHardware( void ); +static void prvCheckTask( void *pvParameters ); extern void vRegTest1Task( void *pvParameters ); extern void vRegTest2Task( void *pvParameters ); -unsigned long ulRegTest1CycleCount = 0UL, ulRegTest2CycleCount = 0UL; +volatile unsigned long ulRegTest1CycleCount = 0UL, ulRegTest2CycleCount = 0UL; /*-----------------------------------------------------------*/ @@ -73,15 +108,116 @@ void main(void) { prvSetupHardware(); - xTaskCreate( vRegTest1Task, "RegTest1", configMINIMAL_STACK_SIZE, ( void * ) 0x12345678UL, 1, NULL ); - xTaskCreate( vRegTest2Task, "RegTest2", configMINIMAL_STACK_SIZE, ( void * ) 0x11223344UL, 1, NULL ); - + /* Start the reg test tasks which test the context switching mechanism. */ + xTaskCreate( vRegTest1Task, "RegTest1", configMINIMAL_STACK_SIZE, ( void * ) 0x12345678UL, tskIDLE_PRIORITY, NULL ); + xTaskCreate( vRegTest2Task, "RegTest2", configMINIMAL_STACK_SIZE, ( void * ) 0x11223344UL, tskIDLE_PRIORITY, NULL ); + + /* Start the check task as described at the top of this file. */ + xTaskCreate( prvCheckTask, "Check", configMINIMAL_STACK_SIZE, NULL, mainCHECK_TASK_PRIORITY, NULL ); + + /* Start the standard demo tasks. These don't perform any particular useful + functionality, other than to demonstrate the FreeRTOS API being used. */ + vStartBlockingQueueTasks( mainBLOCK_Q_PRIORITY ); + vCreateBlockTimeTasks(); + vStartSemaphoreTasks( mainSEM_TEST_PRIORITY ); + vStartPolledQueueTasks( mainQUEUE_POLL_PRIORITY ); + vStartIntegerMathTasks( mainINTEGER_TASK_PRIORITY ); + vStartGenericQueueTasks( mainGEN_QUEUE_TASK_PRIORITY ); + vStartLEDFlashTasks( mainFLASH_TASK_PRIORITY ); + vStartQueuePeekTasks(); + vStartRecursiveMutexTasks(); + + /* The suicide tasks must be created last as they need to know how many + tasks were running prior to their creation in order to ascertain whether + or not the correct/expected number of tasks are running at any given time. */ +// vCreateSuicidalTasks( mainCREATOR_TASK_PRIORITY ); + + /* Start the tasks running. */ vTaskStartScheduler(); + /* Will only get here if there was insufficient heap memory to create the idle + task. Increase the configTOTAL_HEAP_SIZE setting in FreeRTOSConfig.h. */ for( ;; ); } /*-----------------------------------------------------------*/ +static void prvCheckTask( void *pvParameter ) +{ +portTickType xNextWakeTime, xCycleFrequency = mainNO_ERROR_CYCLE_TIME; +unsigned long ulLastRegTest1CycleCount = 0UL, ulLastRegTest2CycleCount = 0UL; + + /* Initialise xNextWakeTime - this only needs to be done once. */ + xNextWakeTime = xTaskGetTickCount(); + + for( ;; ) + { + /* Place this task in the blocked state until it is time to run again. */ + vTaskDelayUntil( &xNextWakeTime, xCycleFrequency ); + + /* Inspect all the other tasks to esnure none have experienced any errors. */ + if( xAreGenericQueueTasksStillRunning() != pdTRUE ) + { + /* Increase the rate at which this task cycles, which will increase the + rate at which mainCHECK_LED flashes to give visual feedback that an error + has occurred. */ + xCycleFrequency = mainERROR_CYCLE_TIME; + } + else if( xAreQueuePeekTasksStillRunning() != pdTRUE ) + { + xCycleFrequency = mainERROR_CYCLE_TIME; + } + else if( xAreBlockingQueuesStillRunning() != pdTRUE ) + { + xCycleFrequency = mainERROR_CYCLE_TIME; + } + else if( xAreBlockTimeTestTasksStillRunning() != pdTRUE ) + { + xCycleFrequency = mainERROR_CYCLE_TIME; + } + else if( xAreSemaphoreTasksStillRunning() != pdTRUE ) + { + xCycleFrequency = mainERROR_CYCLE_TIME; + } + else if( xArePollingQueuesStillRunning() != pdTRUE ) + { + xCycleFrequency = mainERROR_CYCLE_TIME; + } +// else if( xIsCreateTaskStillRunning() != pdTRUE ) +// { +// xCycleFrequency = mainERROR_CYCLE_TIME; +// } + else if( xAreIntegerMathsTaskStillRunning() != pdTRUE ) + { + xCycleFrequency = mainERROR_CYCLE_TIME; + } + else if( xAreRecursiveMutexTasksStillRunning() != pdTRUE ) + { + xCycleFrequency = mainERROR_CYCLE_TIME; + } + + /* Check the reg test tasks are still cycling. They will stop incrementing + their loop counters if they encounter an error. */ + if( ulRegTest1CycleCount == ulLastRegTest1CycleCount ) + { + xCycleFrequency = mainERROR_CYCLE_TIME; + } + + if( ulRegTest2CycleCount == ulLastRegTest2CycleCount ) + { + xCycleFrequency = mainERROR_CYCLE_TIME; + } + + ulLastRegTest1CycleCount = ulRegTest1CycleCount; + ulLastRegTest2CycleCount = ulRegTest2CycleCount; + + /* Toggle the check LED to give an indication of the system status. If the + LED toggles every 5 seconds then everything is ok. A faster toggle indicates + an error. */ + vParTestToggleLED( mainCHECK_LED ); + } +} +/*-----------------------------------------------------------*/ + void vApplicationMallocFailedHook( void ) { /* A call to vPortMalloc() failed, probably during the creation of a task, @@ -100,6 +236,12 @@ void vApplicationIdleHook( void ) } /*-----------------------------------------------------------*/ +void vApplicationStackOverflowHook( xTaskHandle *pxTask, signed char *pcTaskName ) +{ + for( ;; ); +} +/*-----------------------------------------------------------*/ + static void prvSetupHardware( void ) { volatile unsigned long ul; @@ -154,25 +296,8 @@ unsigned long ulCompareMatch = ( configPERIPHERAL_CLOCK_HZ / ( configTICK_RATE_H } /*-----------------------------------------------------------*/ -void INT_CMT_CMI0( void ) +void vApplicationTickHook( void ) { -static unsigned long ul = 0; - - ul++; - if( ul >= 1000 ) - { - if( PE.DR.WORD & ( 0x01 << 9 ) ) - { - PE.DR.WORD &= ~( 0x01 << 9 ); - } - else - { - PE.DR.WORD |= ( 0x01 << 9 ); - } - - ul = 0; - } - CMT0.CMCSR.BIT.CMF = 0; } /*-----------------------------------------------------------*/ diff --git a/Demo/SuperH_SH7216_Renesas/RTOSDemo/regtest.src b/Demo/SuperH_SH7216_Renesas/RTOSDemo/regtest.src index 0cf566dbc..378484ea2 100644 --- a/Demo/SuperH_SH7216_Renesas/RTOSDemo/regtest.src +++ b/Demo/SuperH_SH7216_Renesas/RTOSDemo/regtest.src @@ -1,5 +1,5 @@ ;/* -; FreeRTOS V6.0.1 - Copyright (C) 2009 Real Time Engineers Ltd. +; FreeRTOS V6.0.2 - Copyright (C) 2009 Real Time Engineers Ltd. ; ; *************************************************************************** ; * * @@ -59,10 +59,18 @@ .export _vRegTest1Task .export _vRegTest2Task - .section P + .section P, code, align=4 + + +_vRegTest1Error: + bra _vRegTest1Error + nop + +;----------------------------------------------------------- _vRegTest1Task: + ; Fill the registers with known values. mov #3, r2 mov #4, r3 mov #5, r4 @@ -85,92 +93,212 @@ _vRegTest1Task: _vRegTest1Loop: + ; Perform a yield, just for extra test coverage. + trapa #33 + ; Reset r1 which was used in the tests. mov #2, r1 - + + ; Test that the registers still contain the expected values. If not, jump to + ; vRegTestError, which will stop this function looping and so cause it to stop + ; incrementing its loop counter. mov #2, r0 cmp/eq r0, r1 - bf _vRegTestError + bf _vRegTest1Error mov #3, r0 cmp/eq r0, r2 - bf _vRegTestError + bf _vRegTest1Error mov #4, r0 cmp/eq r0, r3 - bf _vRegTestError + bf _vRegTest1Error mov #5, r0 cmp/eq r0, r4 - bf _vRegTestError + bf _vRegTest1Error mov #6, r0 cmp/eq r0, r5 - bf _vRegTestError + bf _vRegTest1Error mov #7, r0 cmp/eq r0, r6 - bf _vRegTestError + bf _vRegTest1Error mov #8, r0 cmp/eq r0, r7 - bf _vRegTestError + bf _vRegTest1Error mov #9, r0 cmp/eq r0, r8 - bf _vRegTestError + bf _vRegTest1Error mov #10, r0 cmp/eq r0, r9 - bf _vRegTestError + bf _vRegTest1Error mov #11, r0 cmp/eq r0, r10 - bf _vRegTestError + bf _vRegTest1Error mov #12, r0 cmp/eq r0, r11 - bf _vRegTestError + bf _vRegTest1Error mov #13, r0 cmp/eq r0, r12 - bf _vRegTestError + bf _vRegTest1Error mov #14, r0 cmp/eq r0, r13 - bf _vRegTestError + bf _vRegTest1Error sts macl, r0 mov #15, r1 cmp/eq r0, r1 - bf _vRegTestError + bf _vRegTest1Error sts mach, r0 mov #16, r1 cmp/eq r0, r1 - bf _vRegTestError + bf _vRegTest1Error stc gbr, r0 mov #17, r1 cmp/eq r0, r1 - bf _vRegTestError + bf _vRegTest1Error + ; Increment the loop counter to indicate that this task is still running and + ; still healthy. mov.l #_ulRegTest1CycleCount, r0 mov.l @r0, r1 add #1, r1 mov.l r1, @r0 - bra _vRegTest1Task + ; Jump back to test all the registers again. + bra _vRegTest1Loop nop +;----------------------------------------------------------- + +_vRegTest2Error: + + bra _vRegTest2Error + nop + +;----------------------------------------------------------- + _vRegTest2Task: - trapa #33 - bra _vRegTest2Task - nop + ; Fill the registers with known values. + mov #13, r2 + mov #14, r3 + mov #15, r4 + mov #16, r5 + mov #17, r6 + mov #18, r7 + mov #19, r8 + mov #110, r9 + mov #111, r10 + mov #112, r11 + mov #113, r12 + mov #114, r13 + + mov #115, r0 + lds r0, macl + mov #116, r0 + lds r0, mach + mov #117, r0 + ldc r0, gbr -_vRegTestError: - bra _vRegTestError +_vRegTest2Loop: + + ; Reset r1 which was used in the tests. + mov #12, r1 + + ; Test that the registers still contain the expected values. If not, jump to + ; vRegTestError, which will stop this function looping and so cause it to stop + ; incrementing its loop counter. + mov #12, r0 + cmp/eq r0, r1 + bf _vRegTest2Error + + mov #13, r0 + cmp/eq r0, r2 + bf _vRegTest2Error + + mov #14, r0 + cmp/eq r0, r3 + bf _vRegTest2Error + + mov #15, r0 + cmp/eq r0, r4 + bf _vRegTest2Error + + mov #16, r0 + cmp/eq r0, r5 + bf _vRegTest2Error + + mov #17, r0 + cmp/eq r0, r6 + bf _vRegTest2Error + + mov #18, r0 + cmp/eq r0, r7 + bf _vRegTest2Error + + mov #19, r0 + cmp/eq r0, r8 + bf _vRegTest2Error + + mov #110, r0 + cmp/eq r0, r9 + bf _vRegTest2Error + + mov #111, r0 + cmp/eq r0, r10 + bf _vRegTest2Error + + mov #112, r0 + cmp/eq r0, r11 + bf _vRegTest2Error + + mov #113, r0 + cmp/eq r0, r12 + bf _vRegTest2Error + + mov #114, r0 + cmp/eq r0, r13 + bf _vRegTest2Error + + sts macl, r0 + mov #115, r1 + cmp/eq r0, r1 + bf _vRegTest2Error + + sts mach, r0 + mov #116, r1 + cmp/eq r0, r1 + bf _vRegTest2Error + + stc gbr, r0 + mov #117, r1 + cmp/eq r0, r1 + bf _vRegTest2Error + + ; Increment the loop counter to indicate that this task is still running and + ; still healthy. + mov.l #_ulRegTest2CycleCount, r0 + mov.l @r0, r1 + add #1, r1 + mov.l r1, @r0 + + ; Jump back to test all the registers again. + bra _vRegTest2Loop + nop + + .end diff --git a/Demo/SuperH_SH7216_Renesas/RTOSDemo/vecttbl.c b/Demo/SuperH_SH7216_Renesas/RTOSDemo/vecttbl.c index a0f18d465..dc8cb9d3a 100644 --- a/Demo/SuperH_SH7216_Renesas/RTOSDemo/vecttbl.c +++ b/Demo/SuperH_SH7216_Renesas/RTOSDemo/vecttbl.c @@ -15,6 +15,7 @@ extern void vPortStartFirstTask( void ); extern void vPortYield( void ); +extern void vPortPreemptiveTick( void ); #pragma section VECTTBL @@ -310,7 +311,8 @@ void *INT_Vectors[] = { // 139 Reserved (void*) Dummy, // 140 CMT CMI0 - (void*) INT_CMT_CMI0, +// (void*) INT_CMT_CMI0, + (void*) vPortPreemptiveTick, // 141 Reserved (void*) Dummy, // 142 Reserved -- 2.39.5