Add register tests to H743ZI2 demo project (#977)

Add register tests to H743ZI2 demo project.

Signed-off-by: Gaurav Aggarwal <aggarg@amazon.com>
Co-authored-by: kar-rahul-aws <karahulx@amazon.com>
pull/982/head
Gaurav-Aggarwal-AWS 2 years ago committed by GitHub
parent 4408d7430e
commit aba448be9c
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -11,8 +11,11 @@ EventRecorderStub.scvd
# STM32CubeIDE autogenerated files.
.settings/
*.launch
# Build Artifacts
Debug/
Listings/
Objects/
BrowseInfo/
BuildLogs/

@ -139,4 +139,6 @@ See http://www.FreeRTOS.org/RTOS-Cortex-M3-M4.html. */
* used. TEX=0, S=0, C=1, B=1. */
#define configTEX_S_C_B_SRAM ( 0x03UL )
/* Do not allow critical sections from unprivileged tasks. */
#define configALLOW_UNPRIVILEGED_CRITICAL_SECTIONS 0
#endif /* FREERTOS_CONFIG_H */

@ -0,0 +1,988 @@
/*
* FreeRTOS V202212.00
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of
* this software and associated documentation files (the "Software"), to deal in
* the Software without restriction, including without limitation the rights to
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
* the Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
* https://www.FreeRTOS.org
* https://github.com/FreeRTOS
*
*/
/*
* "Reg test" tasks - These fill the registers with known values, then check
* that each register maintains its expected value for the lifetime of the
* task. Each task uses a different set of values. The reg test tasks execute
* with a very low priority, so get preempted very frequently. A register
* containing an unexpected value is indicative of an error in the context
* switching mechanism.
*/
/*-----------------------------------------------------------*/
/* Functions that implement reg tests. */
void vRegTest1Asm( void ) __attribute__( ( naked ) );
void vRegTest2Asm( void ) __attribute__( ( naked ) );
void vRegTest3Asm( void ) __attribute__( ( naked ) );
void vRegTest4Asm( void ) __attribute__( ( naked ) );
/*-----------------------------------------------------------*/
void vRegTest1Asm( void ) /* __attribute__( ( naked ) ) */
{
__asm volatile
(
".extern ulRegTest1LoopCounter \n"
".syntax unified \n"
" \n"
" /* Fill the core registers with known values. */ \n"
" movs r0, #100 \n"
" movs r1, #101 \n"
" movs r2, #102 \n"
" movs r3, #103 \n"
" movs r4, #104 \n"
" movs r5, #105 \n"
" movs r6, #106 \n"
" movs r7, #107 \n"
" mov r8, #108 \n"
" mov r9, #109 \n"
" mov r10, #110 \n"
" mov r11, #111 \n"
" mov r12, #112 \n"
" \n"
" /* Fill the FPU registers with known values. */ \n"
" vmov.f32 s1, #1.5 \n"
" vmov.f32 s2, #2.5 \n"
" vmov.f32 s3, #3.5 \n"
" vmov.f32 s4, #4.5 \n"
" vmov.f32 s5, #5.5 \n"
" vmov.f32 s6, #6.5 \n"
" vmov.f32 s7, #7.5 \n"
" vmov.f32 s8, #8.5 \n"
" vmov.f32 s9, #9.5 \n"
" vmov.f32 s10, #10.5 \n"
" vmov.f32 s11, #11.5 \n"
" vmov.f32 s12, #12.5 \n"
" vmov.f32 s13, #13.5 \n"
" vmov.f32 s14, #14.5 \n"
" vmov.f32 s15, #1.0 \n"
" vmov.f32 s16, #2.0 \n"
" vmov.f32 s17, #3.0 \n"
" vmov.f32 s18, #4.0 \n"
" vmov.f32 s19, #5.0 \n"
" vmov.f32 s20, #6.0 \n"
" vmov.f32 s21, #7.0 \n"
" vmov.f32 s22, #8.0 \n"
" vmov.f32 s23, #9.0 \n"
" vmov.f32 s24, #10.0 \n"
" vmov.f32 s25, #11.0 \n"
" vmov.f32 s26, #12.0 \n"
" vmov.f32 s27, #13.0 \n"
" vmov.f32 s28, #14.0 \n"
" vmov.f32 s29, #1.5 \n"
" vmov.f32 s30, #2.5 \n"
" vmov.f32 s31, #3.5 \n"
" \n"
"reg1_loop: \n"
" \n"
" /* Verify that core registers contain correct values. */ \n"
" cmp r0, #100 \n"
" bne reg1_error_loop \n"
" cmp r1, #101 \n"
" bne reg1_error_loop \n"
" cmp r2, #102 \n"
" bne reg1_error_loop \n"
" cmp r3, #103 \n"
" bne reg1_error_loop \n"
" cmp r4, #104 \n"
" bne reg1_error_loop \n"
" cmp r5, #105 \n"
" bne reg1_error_loop \n"
" cmp r6, #106 \n"
" bne reg1_error_loop \n"
" cmp r7, #107 \n"
" bne reg1_error_loop \n"
" cmp r8, #108 \n"
" bne reg1_error_loop \n"
" cmp r9, #109 \n"
" bne reg1_error_loop \n"
" cmp r10, #110 \n"
" bne reg1_error_loop \n"
" cmp r11, #111 \n"
" bne reg1_error_loop \n"
" cmp r12, #112 \n"
" bne reg1_error_loop \n"
" \n"
" /* Verify that FPU registers contain correct values. */ \n"
" vmov.f32 s0, #1.5 \n" /* s0 = 1.5. */
" vcmp.f32 s1, s0 \n" /* Compare s0 and s1. */
" vmrs APSR_nzcv, FPSCR \n" /* Copy floating point flags (FPSCR flags) to ASPR flags - needed for next bne to work. */
" bne reg1_error_loop \n"
" vmov.f32 s0, #2.5 \n"
" vcmp.f32 s2, s0 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg1_error_loop \n"
" vmov.f32 s0, #3.5 \n"
" vcmp.f32 s3, s0 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg1_error_loop \n"
" vmov.f32 s0, #4.5 \n"
" vcmp.f32 s4, s0 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg1_error_loop \n"
" vmov.f32 s0, #5.5 \n"
" vcmp.f32 s5, s0 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg1_error_loop \n"
" vmov.f32 s0, #6.5 \n"
" vcmp.f32 s6, s0 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg1_error_loop \n"
" vmov.f32 s0, #7.5 \n"
" vcmp.f32 s7, s0 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg1_error_loop \n"
" vmov.f32 s0, #8.5 \n"
" vcmp.f32 s8, s0 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg1_error_loop \n"
" vmov.f32 s0, #9.5 \n"
" vcmp.f32 s9, s0 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg1_error_loop \n"
" vmov.f32 s0, #10.5 \n"
" vcmp.f32 s10, s0 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg1_error_loop \n"
" vmov.f32 s0, #11.5 \n"
" vcmp.f32 s11, s0 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg1_error_loop \n"
" vmov.f32 s0, #12.5 \n"
" vcmp.f32 s12, s0 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg1_error_loop \n"
" vmov.f32 s0, #13.5 \n"
" vcmp.f32 s13, s0 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg1_error_loop \n"
" vmov.f32 s0, #14.5 \n"
" vcmp.f32 s14, s0 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg1_error_loop \n"
" vmov.f32 s0, #1.0 \n"
" vcmp.f32 s15, s0 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg1_error_loop \n"
" vmov.f32 s0, #2.0 \n"
" vcmp.f32 s16, s0 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg1_error_loop \n"
" vmov.f32 s0, #3.0 \n"
" vcmp.f32 s17, s0 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg1_error_loop \n"
" vmov.f32 s0, #4.0 \n"
" vcmp.f32 s18, s0 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg1_error_loop \n"
" vmov.f32 s0, #5.0 \n"
" vcmp.f32 s19, s0 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg1_error_loop \n"
" vmov.f32 s0, #6.0 \n"
" vcmp.f32 s20, s0 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg1_error_loop \n"
" vmov.f32 s0, #7.0 \n"
" vcmp.f32 s21, s0 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg1_error_loop \n"
" vmov.f32 s0, #8.0 \n"
" vcmp.f32 s22, s0 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg1_error_loop \n"
" vmov.f32 s0, #9.0 \n"
" vcmp.f32 s23, s0 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg1_error_loop \n"
" vmov.f32 s0, #10.0 \n"
" vcmp.f32 s24, s0 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg1_error_loop \n"
" vmov.f32 s0, #11.0 \n"
" vcmp.f32 s25, s0 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg1_error_loop \n"
" vmov.f32 s0, #12.0 \n"
" vcmp.f32 s26, s0 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg1_error_loop \n"
" vmov.f32 s0, #13.0 \n"
" vcmp.f32 s27, s0 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg1_error_loop \n"
" vmov.f32 s0, #14.0 \n"
" vcmp.f32 s28, s0 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg1_error_loop \n"
" vmov.f32 s0, #1.5 \n"
" vcmp.f32 s29, s0 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg1_error_loop \n"
" vmov.f32 s0, #2.5 \n"
" vcmp.f32 s30, s0 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg1_error_loop \n"
" vmov.f32 s0, #3.5 \n"
" vcmp.f32 s31, s0 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg1_error_loop \n"
" \n"
" /* Everything passed, inc the loop counter. */ \n"
" push { r0, r1 } \n"
" ldr r0, =ulRegTest1LoopCounter \n"
" ldr r1, [r0] \n"
" adds r1, r1, #1 \n"
" str r1, [r0] \n"
" \n"
" /* Yield to increase test coverage. */ \n"
" movs r0, #0x01 \n"
" ldr r1, =0xe000ed04 \n" /* NVIC_ICSR */
" lsls r0, #28 \n" /* Shift to PendSV bit */
" str r0, [r1] \n"
" dsb \n"
" pop { r0, r1 } \n"
" \n"
" /* Start again. */ \n"
" b reg1_loop \n"
" \n"
"reg1_error_loop: \n"
" /* If this line is hit then there was an error in \n"
" * a core register value. The loop ensures the \n"
" * loop counter stops incrementing. */ \n"
" b reg1_error_loop \n"
" nop \n"
".ltorg \n"
);
}
/*-----------------------------------------------------------*/
void vRegTest2Asm( void ) /* __attribute__( ( naked ) ) */
{
__asm volatile
(
".extern ulRegTest2LoopCounter \n"
".syntax unified \n"
" \n"
" /* Fill the core registers with known values. */ \n"
" movs r0, #0 \n"
" movs r1, #1 \n"
" movs r2, #2 \n"
" movs r3, #3 \n"
" movs r4, #4 \n"
" movs r5, #5 \n"
" movs r6, #6 \n"
" movs r7, #7 \n"
" mov r8, #8 \n"
" mov r9, #9 \n"
" movs r10, #10 \n"
" movs r11, #11 \n"
" movs r12, #12 \n"
" \n"
" /* Fill the FPU registers with known values. */ \n"
" vmov.f32 s1, #1.0 \n"
" vmov.f32 s2, #2.0 \n"
" vmov.f32 s3, #3.0 \n"
" vmov.f32 s4, #4.0 \n"
" vmov.f32 s5, #5.0 \n"
" vmov.f32 s6, #6.0 \n"
" vmov.f32 s7, #7.0 \n"
" vmov.f32 s8, #8.0 \n"
" vmov.f32 s9, #9.0 \n"
" vmov.f32 s10, #10.0 \n"
" vmov.f32 s11, #11.0 \n"
" vmov.f32 s12, #12.0 \n"
" vmov.f32 s13, #13.0 \n"
" vmov.f32 s14, #14.0 \n"
" vmov.f32 s15, #1.5 \n"
" vmov.f32 s16, #2.5 \n"
" vmov.f32 s17, #3.5 \n"
" vmov.f32 s18, #4.5 \n"
" vmov.f32 s19, #5.5 \n"
" vmov.f32 s20, #6.5 \n"
" vmov.f32 s21, #7.5 \n"
" vmov.f32 s22, #8.5 \n"
" vmov.f32 s23, #9.5 \n"
" vmov.f32 s24, #10.5 \n"
" vmov.f32 s25, #11.5 \n"
" vmov.f32 s26, #12.5 \n"
" vmov.f32 s27, #13.5 \n"
" vmov.f32 s28, #14.5 \n"
" vmov.f32 s29, #1.0 \n"
" vmov.f32 s30, #2.0 \n"
" vmov.f32 s31, #3.0 \n"
" \n"
"reg2_loop: \n"
" \n"
" /* Verify that core registers contain correct values. */ \n"
" cmp r0, #0 \n"
" bne reg2_error_loop \n"
" cmp r1, #1 \n"
" bne reg2_error_loop \n"
" cmp r2, #2 \n"
" bne reg2_error_loop \n"
" cmp r3, #3 \n"
" bne reg2_error_loop \n"
" cmp r4, #4 \n"
" bne reg2_error_loop \n"
" cmp r5, #5 \n"
" bne reg2_error_loop \n"
" cmp r6, #6 \n"
" bne reg2_error_loop \n"
" cmp r7, #7 \n"
" bne reg2_error_loop \n"
" cmp r8, #8 \n"
" bne reg2_error_loop \n"
" cmp r9, #9 \n"
" bne reg2_error_loop \n"
" cmp r10, #10 \n"
" bne reg2_error_loop \n"
" cmp r11, #11 \n"
" bne reg2_error_loop \n"
" cmp r12, #12 \n"
" bne reg2_error_loop \n"
" \n"
" /* Verify that FPU registers contain correct values. */ \n"
" vmov.f32 s0, #1.0 \n"
" vcmp.f32 s1, s0 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg2_error_loop \n"
" vmov.f32 s0, #2.0 \n"
" vcmp.f32 s2, s0 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg2_error_loop \n"
" vmov.f32 s0, #3.0 \n"
" vcmp.f32 s3, s0 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg2_error_loop \n"
" vmov.f32 s0, #4.0 \n"
" vcmp.f32 s4, s0 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg2_error_loop \n"
" vmov.f32 s0, #5.0 \n"
" vcmp.f32 s5, s0 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg2_error_loop \n"
" vmov.f32 s0, #6.0 \n"
" vcmp.f32 s6, s0 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg2_error_loop \n"
" vmov.f32 s0, #7.0 \n"
" vcmp.f32 s7, s0 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg2_error_loop \n"
" vmov.f32 s0, #8.0 \n"
" vcmp.f32 s8, s0 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg2_error_loop \n"
" vmov.f32 s0, #9.0 \n"
" vcmp.f32 s9, s0 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg2_error_loop \n"
" vmov.f32 s0, #10.0 \n"
" vcmp.f32 s10, s0 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg2_error_loop \n"
" vmov.f32 s0, #11.0 \n"
" vcmp.f32 s11, s0 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg2_error_loop \n"
" vmov.f32 s0, #12.0 \n"
" vcmp.f32 s12, s0 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg2_error_loop \n"
" vmov.f32 s0, #13.0 \n"
" vcmp.f32 s13, s0 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg2_error_loop \n"
" vmov.f32 s0, #14.0 \n"
" vcmp.f32 s14, s0 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg2_error_loop \n"
" vmov.f32 s0, #1.5 \n"
" vcmp.f32 s15, s0 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg2_error_loop \n"
" vmov.f32 s0, #2.5 \n"
" vcmp.f32 s16, s0 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg2_error_loop \n"
" vmov.f32 s0, #3.5 \n"
" vcmp.f32 s17, s0 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg2_error_loop \n"
" vmov.f32 s0, #4.5 \n"
" vcmp.f32 s18, s0 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg2_error_loop \n"
" vmov.f32 s0, #5.5 \n"
" vcmp.f32 s19, s0 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg2_error_loop \n"
" vmov.f32 s0, #6.5 \n"
" vcmp.f32 s20, s0 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg2_error_loop \n"
" vmov.f32 s0, #7.5 \n"
" vcmp.f32 s21, s0 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg2_error_loop \n"
" vmov.f32 s0, #8.5 \n"
" vcmp.f32 s22, s0 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg2_error_loop \n"
" vmov.f32 s0, #9.5 \n"
" vcmp.f32 s23, s0 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg2_error_loop \n"
" vmov.f32 s0, #10.5 \n"
" vcmp.f32 s24, s0 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg2_error_loop \n"
" vmov.f32 s0, #11.5 \n"
" vcmp.f32 s25, s0 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg2_error_loop \n"
" vmov.f32 s0, #12.5 \n"
" vcmp.f32 s26, s0 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg2_error_loop \n"
" vmov.f32 s0, #13.5 \n"
" vcmp.f32 s27, s0 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg2_error_loop \n"
" vmov.f32 s0, #14.5 \n"
" vcmp.f32 s28, s0 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg2_error_loop \n"
" vmov.f32 s0, #1.0 \n"
" vcmp.f32 s29, s0 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg2_error_loop \n"
" vmov.f32 s0, #2.0 \n"
" vcmp.f32 s30, s0 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg2_error_loop \n"
" vmov.f32 s0, #3.0 \n"
" vcmp.f32 s31, s0 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg2_error_loop \n"
" \n"
" /* Everything passed, inc the loop counter. */ \n"
" push { r0, r1 } \n"
" ldr r0, =ulRegTest2LoopCounter \n"
" ldr r1, [r0] \n"
" adds r1, r1, #1 \n"
" str r1, [r0] \n"
" pop { r0, r1 } \n"
" \n"
" /* Start again. */ \n"
" b reg2_loop \n"
" \n"
"reg2_error_loop: \n"
" /* If this line is hit then there was an error in \n"
" * a core register value. The loop ensures the \n"
" * loop counter stops incrementing. */ \n"
" b reg2_error_loop \n"
" nop \n"
".ltorg \n"
);
}
/*-----------------------------------------------------------*/
void vRegTest3Asm( void ) /* __attribute__( ( naked ) ) */
{
__asm volatile
(
".extern ulRegTest3LoopCounter \n"
".syntax unified \n"
" \n"
" /* Fill the core registers with known values. */ \n"
" movs r0, #100 \n"
" movs r1, #101 \n"
" movs r2, #102 \n"
" movs r3, #103 \n"
" movs r4, #104 \n"
" movs r5, #105 \n"
" movs r6, #106 \n"
" movs r7, #107 \n"
" mov r8, #108 \n"
" mov r9, #109 \n"
" mov r10, #110 \n"
" mov r11, #111 \n"
" mov r12, #112 \n"
" \n"
" /* Fill the FPU registers with known values. */ \n"
" vmov.f32 s0, #1.5 \n"
" vmov.f32 s2, #2.0 \n"
" vmov.f32 s3, #3.5 \n"
" vmov.f32 s4, #4.0 \n"
" vmov.f32 s5, #5.5 \n"
" vmov.f32 s6, #6.0 \n"
" vmov.f32 s7, #7.5 \n"
" vmov.f32 s8, #8.0 \n"
" vmov.f32 s9, #9.5 \n"
" vmov.f32 s10, #10.0 \n"
" vmov.f32 s11, #11.5 \n"
" vmov.f32 s12, #12.0 \n"
" vmov.f32 s13, #13.5 \n"
" vmov.f32 s14, #14.0 \n"
" vmov.f32 s15, #1.5 \n"
" vmov.f32 s16, #2.0 \n"
" vmov.f32 s17, #3.5 \n"
" vmov.f32 s18, #4.0 \n"
" vmov.f32 s19, #5.5 \n"
" vmov.f32 s20, #6.0 \n"
" vmov.f32 s21, #7.5 \n"
" vmov.f32 s22, #8.0 \n"
" vmov.f32 s23, #9.5 \n"
" vmov.f32 s24, #10.0 \n"
" vmov.f32 s25, #11.5 \n"
" vmov.f32 s26, #12.0 \n"
" vmov.f32 s27, #13.5 \n"
" vmov.f32 s28, #14.0 \n"
" vmov.f32 s29, #1.5 \n"
" vmov.f32 s30, #2.0 \n"
" vmov.f32 s31, #3.5 \n"
" \n"
"reg3_loop: \n"
" \n"
" /* Verify that core registers contain correct values. */ \n"
" cmp r0, #100 \n"
" bne reg3_error_loop \n"
" cmp r1, #101 \n"
" bne reg3_error_loop \n"
" cmp r2, #102 \n"
" bne reg3_error_loop \n"
" cmp r3, #103 \n"
" bne reg3_error_loop \n"
" cmp r4, #104 \n"
" bne reg3_error_loop \n"
" cmp r5, #105 \n"
" bne reg3_error_loop \n"
" cmp r6, #106 \n"
" bne reg3_error_loop \n"
" cmp r7, #107 \n"
" bne reg3_error_loop \n"
" cmp r8, #108 \n"
" bne reg3_error_loop \n"
" cmp r9, #109 \n"
" bne reg3_error_loop \n"
" cmp r10, #110 \n"
" bne reg3_error_loop \n"
" cmp r11, #111 \n"
" bne reg3_error_loop \n"
" cmp r12, #112 \n"
" bne reg3_error_loop \n"
" \n"
" /* Verify that FPU registers contain correct values. */ \n"
" vmov.f32 s1, #1.5 \n"
" vcmp.f32 s0, s1 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg3_error_loop \n"
" vmov.f32 s1, #2.0 \n"
" vcmp.f32 s2, s1 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg3_error_loop \n"
" vmov.f32 s1, #3.5 \n"
" vcmp.f32 s3, s1 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg3_error_loop \n"
" vmov.f32 s1, #4.0 \n"
" vcmp.f32 s4, s1 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg3_error_loop \n"
" vmov.f32 s1, #5.5 \n"
" vcmp.f32 s5, s1 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg3_error_loop \n"
" vmov.f32 s1, #6.0 \n"
" vcmp.f32 s6, s1 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg3_error_loop \n"
" vmov.f32 s1, #7.5 \n"
" vcmp.f32 s7, s1 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg3_error_loop \n"
" vmov.f32 s1, #8.0 \n"
" vcmp.f32 s8, s1 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg3_error_loop \n"
" vmov.f32 s1, #9.5 \n"
" vcmp.f32 s9, s1 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg3_error_loop \n"
" vmov.f32 s1, #10.0 \n"
" vcmp.f32 s10, s1 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg3_error_loop \n"
" vmov.f32 s1, #11.5 \n"
" vcmp.f32 s11, s1 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg3_error_loop \n"
" vmov.f32 s1, #12.0 \n"
" vcmp.f32 s12, s1 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg3_error_loop \n"
" vmov.f32 s1, #13.5 \n"
" vcmp.f32 s13, s1 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg3_error_loop \n"
" vmov.f32 s1, #14.0 \n"
" vcmp.f32 s14, s1 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg3_error_loop \n"
" vmov.f32 s1, #1.5 \n"
" vcmp.f32 s15, s1 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg3_error_loop \n"
" vmov.f32 s1, #2.0 \n"
" vcmp.f32 s16, s1 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg3_error_loop \n"
" vmov.f32 s1, #3.5 \n"
" vcmp.f32 s17, s1 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg3_error_loop \n"
" vmov.f32 s1, #4.0 \n"
" vcmp.f32 s18, s1 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg3_error_loop \n"
" vmov.f32 s1, #5.5 \n"
" vcmp.f32 s19, s1 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg3_error_loop \n"
" vmov.f32 s1, #6.0 \n"
" vcmp.f32 s20, s1 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg3_error_loop \n"
" vmov.f32 s1, #7.5 \n"
" vcmp.f32 s21, s1 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg3_error_loop \n"
" vmov.f32 s1, #8.0 \n"
" vcmp.f32 s22, s1 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg3_error_loop \n"
" vmov.f32 s1, #9.5 \n"
" vcmp.f32 s23, s1 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg3_error_loop \n"
" vmov.f32 s1, #10.0 \n"
" vcmp.f32 s24, s1 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg3_error_loop \n"
" vmov.f32 s1, #11.5 \n"
" vcmp.f32 s25, s1 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg3_error_loop \n"
" vmov.f32 s1, #12.0 \n"
" vcmp.f32 s26, s1 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg3_error_loop \n"
" vmov.f32 s1, #13.5 \n"
" vcmp.f32 s27, s1 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg3_error_loop \n"
" vmov.f32 s1, #14.0 \n"
" vcmp.f32 s28, s1 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg3_error_loop \n"
" vmov.f32 s1, #1.5 \n"
" vcmp.f32 s29, s1 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg3_error_loop \n"
" vmov.f32 s1, #2.0 \n"
" vcmp.f32 s30, s1 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg3_error_loop \n"
" vmov.f32 s1, #3.5 \n"
" vcmp.f32 s31, s1 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg3_error_loop \n"
" \n"
" /* Everything passed, inc the loop counter. */ \n"
" push { r0, r1 } \n"
" ldr r0, =ulRegTest3LoopCounter \n"
" ldr r1, [r0] \n"
" adds r1, r1, #1 \n"
" str r1, [r0] \n"
" \n"
" /* Yield to increase test coverage. */ \n"
" movs r0, #0x01 \n"
" ldr r1, =0xe000ed04 \n" /* NVIC_ICSR */
" lsls r0, #28 \n" /* Shift to PendSV bit */
" str r0, [r1] \n"
" dsb \n"
" pop { r0, r1 } \n"
" \n"
" /* Start again. */ \n"
" b reg3_loop \n"
" \n"
"reg3_error_loop: \n"
" /* If this line is hit then there was an error in \n"
" * a core register value. The loop ensures the \n"
" * loop counter stops incrementing. */ \n"
" b reg3_error_loop \n"
" nop \n"
".ltorg \n"
);
}
/*-----------------------------------------------------------*/
void vRegTest4Asm( void ) /* __attribute__( ( naked ) ) */
{
__asm volatile
(
".extern ulRegTest4LoopCounter \n"
".syntax unified \n"
" \n"
" /* Fill the core registers with known values. */ \n"
" movs r0, #0 \n"
" movs r1, #1 \n"
" movs r2, #2 \n"
" movs r3, #3 \n"
" movs r4, #4 \n"
" movs r5, #5 \n"
" movs r6, #6 \n"
" movs r7, #7 \n"
" mov r8, #8 \n"
" mov r9, #9 \n"
" movs r10, #10 \n"
" movs r11, #11 \n"
" movs r12, #12 \n"
" \n"
" /* Fill the FPU registers with known values. */ \n"
" vmov.f32 s0, #1.5 \n"
" vmov.f32 s2, #2.0 \n"
" vmov.f32 s3, #3.0 \n"
" vmov.f32 s4, #4.5 \n"
" vmov.f32 s5, #5.0 \n"
" vmov.f32 s6, #6.0 \n"
" vmov.f32 s7, #7.5 \n"
" vmov.f32 s8, #8.0 \n"
" vmov.f32 s9, #9.0 \n"
" vmov.f32 s10, #10.5 \n"
" vmov.f32 s11, #11.0 \n"
" vmov.f32 s12, #12.0 \n"
" vmov.f32 s13, #13.5 \n"
" vmov.f32 s14, #14.0 \n"
" vmov.f32 s15, #1.0 \n"
" vmov.f32 s16, #2.5 \n"
" vmov.f32 s17, #3.0 \n"
" vmov.f32 s18, #4.0 \n"
" vmov.f32 s19, #5.5 \n"
" vmov.f32 s20, #6.0 \n"
" vmov.f32 s21, #7.0 \n"
" vmov.f32 s22, #8.5 \n"
" vmov.f32 s23, #9.0 \n"
" vmov.f32 s24, #10.0 \n"
" vmov.f32 s25, #11.5 \n"
" vmov.f32 s26, #12.0 \n"
" vmov.f32 s27, #13.0 \n"
" vmov.f32 s28, #14.5 \n"
" vmov.f32 s29, #1.0 \n"
" vmov.f32 s30, #2.0 \n"
" vmov.f32 s31, #3.5 \n"
" \n"
"reg4_loop: \n"
" \n"
" /* Verify that core registers contain correct values. */ \n"
" cmp r0, #0 \n"
" bne reg4_error_loop \n"
" cmp r1, #1 \n"
" bne reg4_error_loop \n"
" cmp r2, #2 \n"
" bne reg4_error_loop \n"
" cmp r3, #3 \n"
" bne reg4_error_loop \n"
" cmp r4, #4 \n"
" bne reg4_error_loop \n"
" cmp r5, #5 \n"
" bne reg4_error_loop \n"
" cmp r6, #6 \n"
" bne reg4_error_loop \n"
" cmp r7, #7 \n"
" bne reg4_error_loop \n"
" cmp r8, #8 \n"
" bne reg4_error_loop \n"
" cmp r9, #9 \n"
" bne reg4_error_loop \n"
" cmp r10, #10 \n"
" bne reg4_error_loop \n"
" cmp r11, #11 \n"
" bne reg4_error_loop \n"
" cmp r12, #12 \n"
" bne reg4_error_loop \n"
" \n"
" /* Verify that FPU registers contain correct values. */ \n"
" vmov.f32 s1, #1.5 \n"
" vcmp.f32 s0, s1 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg4_error_loop \n"
" vmov.f32 s1, #2.0 \n"
" vcmp.f32 s2, s1 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg4_error_loop \n"
" vmov.f32 s1, #3.0 \n"
" vcmp.f32 s3, s1 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg4_error_loop \n"
" vmov.f32 s1, #4.5 \n"
" vcmp.f32 s4, s1 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg4_error_loop \n"
" vmov.f32 s1, #5.0 \n"
" vcmp.f32 s5, s1 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg4_error_loop \n"
" vmov.f32 s1, #6.0 \n"
" vcmp.f32 s6, s1 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg4_error_loop \n"
" vmov.f32 s1, #7.5 \n"
" vcmp.f32 s7, s1 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg4_error_loop \n"
" vmov.f32 s1, #8.0 \n"
" vcmp.f32 s8, s1 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg4_error_loop \n"
" vmov.f32 s1, #9.0 \n"
" vcmp.f32 s9, s1 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg4_error_loop \n"
" vmov.f32 s1, #10.5 \n"
" vcmp.f32 s10, s1 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg4_error_loop \n"
" vmov.f32 s1, #11.0 \n"
" vcmp.f32 s11, s1 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg4_error_loop \n"
" vmov.f32 s1, #12.0 \n"
" vcmp.f32 s12, s1 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg4_error_loop \n"
" vmov.f32 s1, #13.5 \n"
" vcmp.f32 s13, s1 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg4_error_loop \n"
" vmov.f32 s1, #14.0 \n"
" vcmp.f32 s14, s1 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg4_error_loop \n"
" vmov.f32 s1, #1.0 \n"
" vcmp.f32 s15, s1 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg4_error_loop \n"
" vmov.f32 s1, #2.5 \n"
" vcmp.f32 s16, s1 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg4_error_loop \n"
" vmov.f32 s1, #3.0 \n"
" vcmp.f32 s17, s1 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg4_error_loop \n"
" vmov.f32 s1, #4.0 \n"
" vcmp.f32 s18, s1 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg4_error_loop \n"
" vmov.f32 s1, #5.5 \n"
" vcmp.f32 s19, s1 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg4_error_loop \n"
" vmov.f32 s1, #6.0 \n"
" vcmp.f32 s20, s1 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg4_error_loop \n"
" vmov.f32 s1, #7.0 \n"
" vcmp.f32 s21, s1 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg4_error_loop \n"
" vmov.f32 s1, #8.5 \n"
" vcmp.f32 s22, s1 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg4_error_loop \n"
" vmov.f32 s1, #9.0 \n"
" vcmp.f32 s23, s1 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg4_error_loop \n"
" vmov.f32 s1, #10.0 \n"
" vcmp.f32 s24, s1 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg4_error_loop \n"
" vmov.f32 s1, #11.5 \n"
" vcmp.f32 s25, s1 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg4_error_loop \n"
" vmov.f32 s1, #12.0 \n"
" vcmp.f32 s26, s1 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg4_error_loop \n"
" vmov.f32 s1, #13.0 \n"
" vcmp.f32 s27, s1 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg4_error_loop \n"
" vmov.f32 s1, #14.5 \n"
" vcmp.f32 s28, s1 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg4_error_loop \n"
" vmov.f32 s1, #1.0 \n"
" vcmp.f32 s29, s1 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg4_error_loop \n"
" vmov.f32 s1, #2.0 \n"
" vcmp.f32 s30, s1 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg4_error_loop \n"
" vmov.f32 s1, #3.5 \n"
" vcmp.f32 s31, s1 \n"
" vmrs APSR_nzcv, FPSCR \n"
" bne reg4_error_loop \n"
" \n"
" /* Everything passed, inc the loop counter. */ \n"
" push { r0, r1 } \n"
" ldr r0, =ulRegTest4LoopCounter \n"
" ldr r1, [r0] \n"
" adds r1, r1, #1 \n"
" str r1, [r0] \n"
" pop { r0, r1 } \n"
" \n"
" /* Start again. */ \n"
" b reg4_loop \n"
" \n"
"reg4_error_loop: \n"
" /* If this line is hit then there was an error in \n"
" * a core register value. The loop ensures the \n"
" * loop counter stops incrementing. */ \n"
" b reg4_error_loop \n"
" nop \n"
".ltorg \n"
);
}
/*-----------------------------------------------------------*/

@ -0,0 +1,956 @@
/*
* FreeRTOS V202212.00
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of
* this software and associated documentation files (the "Software"), to deal in
* the Software without restriction, including without limitation the rights to
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
* the Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
* https://www.FreeRTOS.org
* https://github.com/FreeRTOS
*
*/
/*
* "Reg test" - These fill the registers with known values, then check
* that each register maintains its expected value for the lifetime of the
* task. Each task uses a different set of values. The reg test tasks execute
* with a very low priority, so get preempted very frequently. A register
* containing an unexpected value is indicative of an error in the context
* switching mechanism.
*/
/*-----------------------------------------------------------*/
SECTION .text:CODE:NOROOT(2)
THUMB
EXTERN ulRegTest1LoopCounter
EXTERN ulRegTest2LoopCounter
EXTERN ulRegTest3LoopCounter
EXTERN ulRegTest4LoopCounter
PUBLIC vRegTest1Asm
PUBLIC vRegTest2Asm
PUBLIC vRegTest3Asm
PUBLIC vRegTest4Asm
/*-----------------------------------------------------------*/
vRegTest1Asm:
/* Fill the core registers with known values. */
movs r0, #100
movs r1, #101
movs r2, #102
movs r3, #103
movs r4, #104
movs r5, #105
movs r6, #106
movs r7, #107
movs r8, #108
movs r9, #109
movs r10, #110
movs r11, #111
movs r12, #112
vmov.f32 s1, #1.5
vmov.f32 s2, #2.5
vmov.f32 s3, #3.5
vmov.f32 s4, #4.5
vmov.f32 s5, #5.5
vmov.f32 s6, #6.5
vmov.f32 s7, #7.5
vmov.f32 s8, #8.5
vmov.f32 s9, #9.5
vmov.f32 s10, #10.5
vmov.f32 s11, #11.5
vmov.f32 s12, #12.5
vmov.f32 s13, #13.5
vmov.f32 s14, #14.5
vmov.f32 s15, #1.0
vmov.f32 s16, #2.0
vmov.f32 s17, #3.0
vmov.f32 s18, #4.0
vmov.f32 s19, #5.0
vmov.f32 s20, #6.0
vmov.f32 s21, #7.0
vmov.f32 s22, #8.0
vmov.f32 s23, #9.0
vmov.f32 s24, #10.0
vmov.f32 s25, #11.0
vmov.f32 s26, #12.0
vmov.f32 s27, #13.0
vmov.f32 s28, #14.0
vmov.f32 s29, #1.5
vmov.f32 s30, #2.5
vmov.f32 s31, #3.5
reg1_loop:
cmp r0, #100
bne reg1_error_loop
cmp r1, #101
bne reg1_error_loop
cmp r2, #102
bne reg1_error_loop
cmp r3, #103
bne reg1_error_loop
cmp r4, #104
bne reg1_error_loop
cmp r5, #105
bne reg1_error_loop
cmp r6, #106
bne reg1_error_loop
cmp r7, #107
bne reg1_error_loop
cmp r8, #108
bne reg1_error_loop
cmp r9, #109
bne reg1_error_loop
cmp r10, #110
bne reg1_error_loop
cmp r11, #111
bne reg1_error_loop
cmp r12, #112
bne reg1_error_loop
/* Verify that FPU registers contain correct values. */
vmov.f32 s0, #1.5
vcmp.f32 s1, s0
vmrs APSR_nzcv, FPSCR
bne reg1_error_loop
vmov.f32 s0, #2.5
vcmp.f32 s2, s0
vmrs APSR_nzcv, FPSCR
bne reg1_error_loop
vmov.f32 s0, #3.5
vcmp.f32 s3, s0
vmrs APSR_nzcv, FPSCR
bne reg1_error_loop
vmov.f32 s0, #4.5
vcmp.f32 s4, s0
vmrs APSR_nzcv, FPSCR
bne reg1_error_loop
vmov.f32 s0, #5.5
vcmp.f32 s5, s0
vmrs APSR_nzcv, FPSCR
bne reg1_error_loop
vmov.f32 s0, #6.5
vcmp.f32 s6, s0
vmrs APSR_nzcv, FPSCR
bne reg1_error_loop
vmov.f32 s0, #7.5
vcmp.f32 s7, s0
vmrs APSR_nzcv, FPSCR
bne reg1_error_loop
vmov.f32 s0, #8.5
vcmp.f32 s8, s0
vmrs APSR_nzcv, FPSCR
bne reg1_error_loop
vmov.f32 s0, #9.5
vcmp.f32 s9, s0
vmrs APSR_nzcv, FPSCR
bne reg1_error_loop
vmov.f32 s0, #10.5
vcmp.f32 s10, s0
vmrs APSR_nzcv, FPSCR
bne reg1_error_loop
vmov.f32 s0, #11.5
vcmp.f32 s11, s0
vmrs APSR_nzcv, FPSCR
bne reg1_error_loop
vmov.f32 s0, #12.5
vcmp.f32 s12, s0
vmrs APSR_nzcv, FPSCR
bne reg1_error_loop
vmov.f32 s0, #13.5
vcmp.f32 s13, s0
vmrs APSR_nzcv, FPSCR
bne reg1_error_loop
vmov.f32 s0, #14.5
vcmp.f32 s14, s0
vmrs APSR_nzcv, FPSCR
bne reg1_error_loop
vmov.f32 s0, #1.0
vcmp.f32 s15, s0
vmrs APSR_nzcv, FPSCR
bne reg1_error_loop
vmov.f32 s0, #2.0
vcmp.f32 s16, s0
vmrs APSR_nzcv, FPSCR
bne reg1_error_loop
vmov.f32 s0, #3.0
vcmp.f32 s17, s0
vmrs APSR_nzcv, FPSCR
bne reg1_error_loop
vmov.f32 s0, #4.0
vcmp.f32 s18, s0
vmrs APSR_nzcv, FPSCR
bne reg1_error_loop
vmov.f32 s0, #5.0
vcmp.f32 s19, s0
vmrs APSR_nzcv, FPSCR
bne reg1_error_loop
vmov.f32 s0, #6.0
vcmp.f32 s20, s0
vmrs APSR_nzcv, FPSCR
bne reg1_error_loop
vmov.f32 s0, #7.0
vcmp.f32 s21, s0
vmrs APSR_nzcv, FPSCR
bne reg1_error_loop
vmov.f32 s0, #8.0
vcmp.f32 s22, s0
vmrs APSR_nzcv, FPSCR
bne reg1_error_loop
vmov.f32 s0, #9.0
vcmp.f32 s23, s0
vmrs APSR_nzcv, FPSCR
bne reg1_error_loop
vmov.f32 s0, #10.0
vcmp.f32 s24, s0
vmrs APSR_nzcv, FPSCR
bne reg1_error_loop
vmov.f32 s0, #11.0
vcmp.f32 s25, s0
vmrs APSR_nzcv, FPSCR
bne reg1_error_loop
vmov.f32 s0, #12.0
vcmp.f32 s26, s0
vmrs APSR_nzcv, FPSCR
bne reg1_error_loop
vmov.f32 s0, #13.0
vcmp.f32 s27, s0
vmrs APSR_nzcv, FPSCR
bne reg1_error_loop
vmov.f32 s0, #14.0
vcmp.f32 s28, s0
vmrs APSR_nzcv, FPSCR
bne reg1_error_loop
vmov.f32 s0, #1.5
vcmp.f32 s29, s0
vmrs APSR_nzcv, FPSCR
bne reg1_error_loop
vmov.f32 s0, #2.5
vcmp.f32 s30, s0
vmrs APSR_nzcv, FPSCR
bne reg1_error_loop
vmov.f32 s0, #3.5
vcmp.f32 s31, s0
vmrs APSR_nzcv, FPSCR
bne reg1_error_loop
/* Everything passed, inc the loop counter. */
push { r0, r1 }
ldr r0, =ulRegTest1LoopCounter
ldr r1, [r0]
adds r1, r1, #1
str r1, [r0]
/* Yield to increase test coverage. */
movs r0, #0x01
ldr r1, =0xe000ed04 /* NVIC_ICSR. */
lsls r0, r0, #28 /* Shift to PendSV bit. */
str r0, [r1]
dsb
pop { r0, r1 }
/* Start again. */
b reg1_loop
reg1_error_loop:
b reg1_error_loop
nop
ltorg /* Create a literal pool to ensure that the constants accessed in the above
* code are not out of range. */
/*-----------------------------------------------------------*/
vRegTest2Asm:
/* Fill the core registers with known values. */
movs r0, #0
movs r1, #1
movs r2, #2
movs r3, #3
movs r4, #4
movs r5, #5
movs r6, #6
movs r7, #7
mov r8, #8
mov r9, #9
movs r10, #10
movs r11, #11
movs r12, #12
/* Fill the FPU registers with known values. */
vmov.f32 s1, #1.0
vmov.f32 s2, #2.0
vmov.f32 s3, #3.0
vmov.f32 s4, #4.0
vmov.f32 s5, #5.0
vmov.f32 s6, #6.0
vmov.f32 s7, #7.0
vmov.f32 s8, #8.0
vmov.f32 s9, #9.0
vmov.f32 s10, #10.0
vmov.f32 s11, #11.0
vmov.f32 s12, #12.0
vmov.f32 s13, #13.0
vmov.f32 s14, #14.0
vmov.f32 s15, #1.5
vmov.f32 s16, #2.5
vmov.f32 s17, #3.5
vmov.f32 s18, #4.5
vmov.f32 s19, #5.5
vmov.f32 s20, #6.5
vmov.f32 s21, #7.5
vmov.f32 s22, #8.5
vmov.f32 s23, #9.5
vmov.f32 s24, #10.5
vmov.f32 s25, #11.5
vmov.f32 s26, #12.5
vmov.f32 s27, #13.5
vmov.f32 s28, #14.5
vmov.f32 s29, #1.0
vmov.f32 s30, #2.0
vmov.f32 s31, #3.0
reg2_loop:
/* Verify that core registers contain correct values. */
cmp r0, #0
bne reg2_error_loop
cmp r1, #1
bne reg2_error_loop
cmp r2, #2
bne reg2_error_loop
cmp r3, #3
bne reg2_error_loop
cmp r4, #4
bne reg2_error_loop
cmp r5, #5
bne reg2_error_loop
cmp r6, #6
bne reg2_error_loop
cmp r7, #7
bne reg2_error_loop
cmp r8, #8
bne reg2_error_loop
cmp r9, #9
bne reg2_error_loop
cmp r10, #10
bne reg2_error_loop
cmp r11, #11
bne reg2_error_loop
cmp r12, #12
bne reg2_error_loop
/* Verify that FPU registers contain correct values. */
vmov.f32 s0, #1.0
vcmp.f32 s1, s0
vmrs APSR_nzcv, FPSCR
bne reg2_error_loop
vmov.f32 s0, #2.0
vcmp.f32 s2, s0
vmrs APSR_nzcv, FPSCR
bne reg2_error_loop
vmov.f32 s0, #3.0
vcmp.f32 s3, s0
vmrs APSR_nzcv, FPSCR
bne reg2_error_loop
vmov.f32 s0, #4.0
vcmp.f32 s4, s0
vmrs APSR_nzcv, FPSCR
bne reg2_error_loop
vmov.f32 s0, #5.0
vcmp.f32 s5, s0
vmrs APSR_nzcv, FPSCR
bne reg2_error_loop
vmov.f32 s0, #6.0
vcmp.f32 s6, s0
vmrs APSR_nzcv, FPSCR
bne reg2_error_loop
vmov.f32 s0, #7.0
vcmp.f32 s7, s0
vmrs APSR_nzcv, FPSCR
bne reg2_error_loop
vmov.f32 s0, #8.0
vcmp.f32 s8, s0
vmrs APSR_nzcv, FPSCR
bne reg2_error_loop
vmov.f32 s0, #9.0
vcmp.f32 s9, s0
vmrs APSR_nzcv, FPSCR
bne reg2_error_loop
vmov.f32 s0, #10.0
vcmp.f32 s10, s0
vmrs APSR_nzcv, FPSCR
bne reg2_error_loop
vmov.f32 s0, #11.0
vcmp.f32 s11, s0
vmrs APSR_nzcv, FPSCR
bne reg2_error_loop
vmov.f32 s0, #12.0
vcmp.f32 s12, s0
vmrs APSR_nzcv, FPSCR
bne reg2_error_loop
vmov.f32 s0, #13.0
vcmp.f32 s13, s0
vmrs APSR_nzcv, FPSCR
bne reg2_error_loop
vmov.f32 s0, #14.0
vcmp.f32 s14, s0
vmrs APSR_nzcv, FPSCR
bne reg2_error_loop
vmov.f32 s0, #1.5
vcmp.f32 s15, s0
vmrs APSR_nzcv, FPSCR
bne reg2_error_loop
vmov.f32 s0, #2.5
vcmp.f32 s16, s0
vmrs APSR_nzcv, FPSCR
bne reg2_error_loop
vmov.f32 s0, #3.5
vcmp.f32 s17, s0
vmrs APSR_nzcv, FPSCR
bne reg2_error_loop
vmov.f32 s0, #4.5
vcmp.f32 s18, s0
vmrs APSR_nzcv, FPSCR
bne reg2_error_loop
vmov.f32 s0, #5.5
vcmp.f32 s19, s0
vmrs APSR_nzcv, FPSCR
bne reg2_error_loop
vmov.f32 s0, #6.5
vcmp.f32 s20, s0
vmrs APSR_nzcv, FPSCR
bne reg2_error_loop
vmov.f32 s0, #7.5
vcmp.f32 s21, s0
vmrs APSR_nzcv, FPSCR
bne reg2_error_loop
vmov.f32 s0, #8.5
vcmp.f32 s22, s0
vmrs APSR_nzcv, FPSCR
bne reg2_error_loop
vmov.f32 s0, #9.5
vcmp.f32 s23, s0
vmrs APSR_nzcv, FPSCR
bne reg2_error_loop
vmov.f32 s0, #10.5
vcmp.f32 s24, s0
vmrs APSR_nzcv, FPSCR
bne reg2_error_loop
vmov.f32 s0, #11.5
vcmp.f32 s25, s0
vmrs APSR_nzcv, FPSCR
bne reg2_error_loop
vmov.f32 s0, #12.5
vcmp.f32 s26, s0
vmrs APSR_nzcv, FPSCR
bne reg2_error_loop
vmov.f32 s0, #13.5
vcmp.f32 s27, s0
vmrs APSR_nzcv, FPSCR
bne reg2_error_loop
vmov.f32 s0, #14.5
vcmp.f32 s28, s0
vmrs APSR_nzcv, FPSCR
bne reg2_error_loop
vmov.f32 s0, #1.0
vcmp.f32 s29, s0
vmrs APSR_nzcv, FPSCR
bne reg2_error_loop
vmov.f32 s0, #2.0
vcmp.f32 s30, s0
vmrs APSR_nzcv, FPSCR
bne reg2_error_loop
vmov.f32 s0, #3.0
vcmp.f32 s31, s0
vmrs APSR_nzcv, FPSCR
bne reg2_error_loop
/* Everything passed, inc the loop counter. */
push { r0, r1 }
ldr r0, =ulRegTest2LoopCounter
ldr r1, [r0]
adds r1, r1, #1
str r1, [r0]
pop { r0, r1 }
/* Start again. */
b reg2_loop
reg2_error_loop:
b reg2_error_loop
nop
ltorg /* Create a literal pool to ensure that the constants accessed in the above
* code are not out of range. */
/*-----------------------------------------------------------*/
vRegTest3Asm:
/* Fill the core registers with known values. */
movs r0, #100
movs r1, #101
movs r2, #102
movs r3, #103
movs r4, #104
movs r5, #105
movs r6, #106
movs r7, #107
mov r8, #108
mov r9, #109
mov r10, #110
mov r11, #111
mov r12, #112
/* Fill the FPU registers with known values. */
vmov.f32 s0, #1.5
vmov.f32 s2, #2.0
vmov.f32 s3, #3.5
vmov.f32 s4, #4.0
vmov.f32 s5, #5.5
vmov.f32 s6, #6.0
vmov.f32 s7, #7.5
vmov.f32 s8, #8.0
vmov.f32 s9, #9.5
vmov.f32 s10, #10.0
vmov.f32 s11, #11.5
vmov.f32 s12, #12.0
vmov.f32 s13, #13.5
vmov.f32 s14, #14.0
vmov.f32 s15, #1.5
vmov.f32 s16, #2.0
vmov.f32 s17, #3.5
vmov.f32 s18, #4.0
vmov.f32 s19, #5.5
vmov.f32 s20, #6.0
vmov.f32 s21, #7.5
vmov.f32 s22, #8.0
vmov.f32 s23, #9.5
vmov.f32 s24, #10.0
vmov.f32 s25, #11.5
vmov.f32 s26, #12.0
vmov.f32 s27, #13.5
vmov.f32 s28, #14.0
vmov.f32 s29, #1.5
vmov.f32 s30, #2.0
vmov.f32 s31, #3.5
reg3_loop:
/* Verify that core registers contain correct values. */
cmp r0, #100
bne reg3_error_loop
cmp r1, #101
bne reg3_error_loop
cmp r2, #102
bne reg3_error_loop
cmp r3, #103
bne reg3_error_loop
cmp r4, #104
bne reg3_error_loop
cmp r5, #105
bne reg3_error_loop
cmp r6, #106
bne reg3_error_loop
cmp r7, #107
bne reg3_error_loop
cmp r8, #108
bne reg3_error_loop
cmp r9, #109
bne reg3_error_loop
cmp r10, #110
bne reg3_error_loop
cmp r11, #111
bne reg3_error_loop
cmp r12, #112
bne reg3_error_loop
/* Verify that FPU registers contain correct values. */
vmov.f32 s1, #1.5
vcmp.f32 s0, s1
vmrs APSR_nzcv, FPSCR
bne reg3_error_loop
vmov.f32 s1, #2.0
vcmp.f32 s2, s1
vmrs APSR_nzcv, FPSCR
bne reg3_error_loop
vmov.f32 s1, #3.5
vcmp.f32 s3, s1
vmrs APSR_nzcv, FPSCR
bne reg3_error_loop
vmov.f32 s1, #4.0
vcmp.f32 s4, s1
vmrs APSR_nzcv, FPSCR
bne reg3_error_loop
vmov.f32 s1, #5.5
vcmp.f32 s5, s1
vmrs APSR_nzcv, FPSCR
bne reg3_error_loop
vmov.f32 s1, #6.0
vcmp.f32 s6, s1
vmrs APSR_nzcv, FPSCR
bne reg3_error_loop
vmov.f32 s1, #7.5
vcmp.f32 s7, s1
vmrs APSR_nzcv, FPSCR
bne reg3_error_loop
vmov.f32 s1, #8.0
vcmp.f32 s8, s1
vmrs APSR_nzcv, FPSCR
bne reg3_error_loop
vmov.f32 s1, #9.5
vcmp.f32 s9, s1
vmrs APSR_nzcv, FPSCR
bne reg3_error_loop
vmov.f32 s1, #10.0
vcmp.f32 s10, s1
vmrs APSR_nzcv, FPSCR
bne reg3_error_loop
vmov.f32 s1, #11.5
vcmp.f32 s11, s1
vmrs APSR_nzcv, FPSCR
bne reg3_error_loop
vmov.f32 s1, #12.0
vcmp.f32 s12, s1
vmrs APSR_nzcv, FPSCR
bne reg3_error_loop
vmov.f32 s1, #13.5
vcmp.f32 s13, s1
vmrs APSR_nzcv, FPSCR
bne reg3_error_loop
vmov.f32 s1, #14.0
vcmp.f32 s14, s1
vmrs APSR_nzcv, FPSCR
bne reg3_error_loop
vmov.f32 s1, #1.5
vcmp.f32 s15, s1
vmrs APSR_nzcv, FPSCR
bne reg3_error_loop
vmov.f32 s1, #2.0
vcmp.f32 s16, s1
vmrs APSR_nzcv, FPSCR
bne reg3_error_loop
vmov.f32 s1, #3.5
vcmp.f32 s17, s1
vmrs APSR_nzcv, FPSCR
bne reg3_error_loop
vmov.f32 s1, #4.0
vcmp.f32 s18, s1
vmrs APSR_nzcv, FPSCR
bne reg3_error_loop
vmov.f32 s1, #5.5
vcmp.f32 s19, s1
vmrs APSR_nzcv, FPSCR
bne reg3_error_loop
vmov.f32 s1, #6.0
vcmp.f32 s20, s1
vmrs APSR_nzcv, FPSCR
bne reg3_error_loop
vmov.f32 s1, #7.5
vcmp.f32 s21, s1
vmrs APSR_nzcv, FPSCR
bne reg3_error_loop
vmov.f32 s1, #8.0
vcmp.f32 s22, s1
vmrs APSR_nzcv, FPSCR
bne reg3_error_loop
vmov.f32 s1, #9.5
vcmp.f32 s23, s1
vmrs APSR_nzcv, FPSCR
bne reg3_error_loop
vmov.f32 s1, #10.0
vcmp.f32 s24, s1
vmrs APSR_nzcv, FPSCR
bne reg3_error_loop
vmov.f32 s1, #11.5
vcmp.f32 s25, s1
vmrs APSR_nzcv, FPSCR
bne reg3_error_loop
vmov.f32 s1, #12.0
vcmp.f32 s26, s1
vmrs APSR_nzcv, FPSCR
bne reg3_error_loop
vmov.f32 s1, #13.5
vcmp.f32 s27, s1
vmrs APSR_nzcv, FPSCR
bne reg3_error_loop
vmov.f32 s1, #14.0
vcmp.f32 s28, s1
vmrs APSR_nzcv, FPSCR
bne reg3_error_loop
vmov.f32 s1, #1.5
vcmp.f32 s29, s1
vmrs APSR_nzcv, FPSCR
bne reg3_error_loop
vmov.f32 s1, #2.0
vcmp.f32 s30, s1
vmrs APSR_nzcv, FPSCR
bne reg3_error_loop
vmov.f32 s1, #3.5
vcmp.f32 s31, s1
vmrs APSR_nzcv, FPSCR
bne reg3_error_loop
/* Everything passed, inc the loop counter. */
push { r0, r1 }
ldr r0, =ulRegTest3LoopCounter
ldr r1, [r0]
adds r1, r1, #1
str r1, [r0]
/* Yield to increase test coverage. */
movs r0, #0x01
ldr r1, =0xe000ed04 /* NVIC_ICSR. */
lsl r0, r0, #28 /* Shift to PendSV bit. */
str r0, [r1]
dsb
pop { r0, r1 }
/* Start again. */
b reg3_loop
reg3_error_loop:
b reg3_error_loop
nop
ltorg /* Create a literal pool to ensure that the constants accessed in the above
* code are not out of range. */
/*-----------------------------------------------------------*/
vRegTest4Asm:
/* Fill the core registers with known values. */
movs r0, #0
movs r1, #1
movs r2, #2
movs r3, #3
movs r4, #4
movs r5, #5
movs r6, #6
movs r7, #7
mov r8, #8
mov r9, #9
movs r10, #10
movs r11, #11
movs r12, #12
/* Fill the FPU registers with known values. */
vmov.f32 s0, #1.5
vmov.f32 s2, #2.0
vmov.f32 s3, #3.0
vmov.f32 s4, #4.5
vmov.f32 s5, #5.0
vmov.f32 s6, #6.0
vmov.f32 s7, #7.5
vmov.f32 s8, #8.0
vmov.f32 s9, #9.0
vmov.f32 s10, #10.5
vmov.f32 s11, #11.0
vmov.f32 s12, #12.0
vmov.f32 s13, #13.5
vmov.f32 s14, #14.0
vmov.f32 s15, #1.0
vmov.f32 s16, #2.5
vmov.f32 s17, #3.0
vmov.f32 s18, #4.0
vmov.f32 s19, #5.5
vmov.f32 s20, #6.0
vmov.f32 s21, #7.0
vmov.f32 s22, #8.5
vmov.f32 s23, #9.0
vmov.f32 s24, #10.0
vmov.f32 s25, #11.5
vmov.f32 s26, #12.0
vmov.f32 s27, #13.0
vmov.f32 s28, #14.5
vmov.f32 s29, #1.0
vmov.f32 s30, #2.0
vmov.f32 s31, #3.5
reg4_loop:
/* Verify that core registers contain correct values. */
cmp r0, #0
bne reg4_error_loop
cmp r1, #1
bne reg4_error_loop
cmp r2, #2
bne reg4_error_loop
cmp r3, #3
bne reg4_error_loop
cmp r4, #4
bne reg4_error_loop
cmp r5, #5
bne reg4_error_loop
cmp r6, #6
bne reg4_error_loop
cmp r7, #7
bne reg4_error_loop
cmp r8, #8
bne reg4_error_loop
cmp r9, #9
bne reg4_error_loop
cmp r10, #10
bne reg4_error_loop
cmp r11, #11
bne reg4_error_loop
cmp r12, #12
bne reg4_error_loop
/* Verify that FPU registers contain correct values. */
vmov.f32 s1, #1.5
vcmp.f32 s0, s1
vmrs APSR_nzcv, FPSCR
bne reg4_error_loop
vmov.f32 s1, #2.0
vcmp.f32 s2, s1
vmrs APSR_nzcv, FPSCR
bne reg4_error_loop
vmov.f32 s1, #3.0
vcmp.f32 s3, s1
vmrs APSR_nzcv, FPSCR
bne reg4_error_loop
vmov.f32 s1, #4.5
vcmp.f32 s4, s1
vmrs APSR_nzcv, FPSCR
bne reg4_error_loop
vmov.f32 s1, #5.0
vcmp.f32 s5, s1
vmrs APSR_nzcv, FPSCR
bne reg4_error_loop
vmov.f32 s1, #6.0
vcmp.f32 s6, s1
vmrs APSR_nzcv, FPSCR
bne reg4_error_loop
vmov.f32 s1, #7.5
vcmp.f32 s7, s1
vmrs APSR_nzcv, FPSCR
bne reg4_error_loop
vmov.f32 s1, #8.0
vcmp.f32 s8, s1
vmrs APSR_nzcv, FPSCR
bne reg4_error_loop
vmov.f32 s1, #9.0
vcmp.f32 s9, s1
vmrs APSR_nzcv, FPSCR
bne reg4_error_loop
vmov.f32 s1, #10.5
vcmp.f32 s10, s1
vmrs APSR_nzcv, FPSCR
bne reg4_error_loop
vmov.f32 s1, #11.0
vcmp.f32 s11, s1
vmrs APSR_nzcv, FPSCR
bne reg4_error_loop
vmov.f32 s1, #12.0
vcmp.f32 s12, s1
vmrs APSR_nzcv, FPSCR
bne reg4_error_loop
vmov.f32 s1, #13.5
vcmp.f32 s13, s1
vmrs APSR_nzcv, FPSCR
bne reg4_error_loop
vmov.f32 s1, #14.0
vcmp.f32 s14, s1
vmrs APSR_nzcv, FPSCR
bne reg4_error_loop
vmov.f32 s1, #1.0
vcmp.f32 s15, s1
vmrs APSR_nzcv, FPSCR
bne reg4_error_loop
vmov.f32 s1, #2.5
vcmp.f32 s16, s1
vmrs APSR_nzcv, FPSCR
bne reg4_error_loop
vmov.f32 s1, #3.0
vcmp.f32 s17, s1
vmrs APSR_nzcv, FPSCR
bne reg4_error_loop
vmov.f32 s1, #4.0
vcmp.f32 s18, s1
vmrs APSR_nzcv, FPSCR
bne reg4_error_loop
vmov.f32 s1, #5.5
vcmp.f32 s19, s1
vmrs APSR_nzcv, FPSCR
bne reg4_error_loop
vmov.f32 s1, #6.0
vcmp.f32 s20, s1
vmrs APSR_nzcv, FPSCR
bne reg4_error_loop
vmov.f32 s1, #7.0
vcmp.f32 s21, s1
vmrs APSR_nzcv, FPSCR
bne reg4_error_loop
vmov.f32 s1, #8.5
vcmp.f32 s22, s1
vmrs APSR_nzcv, FPSCR
bne reg4_error_loop
vmov.f32 s1, #9.0
vcmp.f32 s23, s1
vmrs APSR_nzcv, FPSCR
bne reg4_error_loop
vmov.f32 s1, #10.0
vcmp.f32 s24, s1
vmrs APSR_nzcv, FPSCR
bne reg4_error_loop
vmov.f32 s1, #11.5
vcmp.f32 s25, s1
vmrs APSR_nzcv, FPSCR
bne reg4_error_loop
vmov.f32 s1, #12.0
vcmp.f32 s26, s1
vmrs APSR_nzcv, FPSCR
bne reg4_error_loop
vmov.f32 s1, #13.0
vcmp.f32 s27, s1
vmrs APSR_nzcv, FPSCR
bne reg4_error_loop
vmov.f32 s1, #14.5
vcmp.f32 s28, s1
vmrs APSR_nzcv, FPSCR
bne reg4_error_loop
vmov.f32 s1, #1.0
vcmp.f32 s29, s1
vmrs APSR_nzcv, FPSCR
bne reg4_error_loop
vmov.f32 s1, #2.0
vcmp.f32 s30, s1
vmrs APSR_nzcv, FPSCR
bne reg4_error_loop
vmov.f32 s1, #3.5
vcmp.f32 s31, s1
vmrs APSR_nzcv, FPSCR
bne reg4_error_loop
/* Everything passed, inc the loop counter. */
push { r0, r1 }
ldr r0, =ulRegTest4LoopCounter
ldr r1, [r0]
adds r1, r1, #1
str r1, [r0]
pop { r0, r1 }
/* Start again. */
b reg4_loop
reg4_error_loop:
b reg4_error_loop
nop
ltorg /* Create a literal pool to ensure that the constants accessed in the above
* code are not out of range. */
/*-----------------------------------------------------------*/
END

@ -0,0 +1,956 @@
;/*
; * FreeRTOS V202212.00
; * Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
; *
; * Permission is hereby granted, free of charge, to any person obtaining a copy of
; * this software and associated documentation files (the "Software"), to deal in
; * the Software without restriction, including without limitation the rights to
; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
; * the Software, and to permit persons to whom the Software is furnished to do so,
; * subject to the following conditions:
; *
; * The above copyright notice and this permission notice shall be included in all
; * copies or substantial portions of the Software.
; *
; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
; *
; * https://www.FreeRTOS.org
; * https://github.com/FreeRTOS
; *
; */
;/*
; * "Reg test" tasks - These fill the registers with known values, then check
; * that each register maintains its expected value for the lifetime of the
; * task. Each task uses a different set of values. The reg test tasks execute
; * with a very low priority, so get preempted very frequently. A register
; * containing an unexpected value is indicative of an error in the context
; * switching mechanism.
; */
;/*-----------------------------------------------------------*/
IMPORT ulRegTest1LoopCounter
IMPORT ulRegTest2LoopCounter
IMPORT ulRegTest3LoopCounter
IMPORT ulRegTest4LoopCounter
EXPORT vRegTest1Asm
EXPORT vRegTest2Asm
EXPORT vRegTest3Asm
EXPORT vRegTest4Asm
AREA REG_TESTS_ASM, CODE, READONLY
;/*-----------------------------------------------------------*/
vRegTest1Asm
PRESERVE8
;/* Fill the core registers with known values. */
movs r0, #100
movs r1, #101
movs r2, #102
movs r3, #103
movs r4, #104
movs r5, #105
movs r6, #106
movs r7, #107
mov r8, #108
mov r9, #109
mov r10, #110
mov r11, #111
mov r12, #112
;/* Fill the FPU registers with known values. */
vmov.f32 s1, #1.5
vmov.f32 s2, #2.5
vmov.f32 s3, #3.5
vmov.f32 s4, #4.5
vmov.f32 s5, #5.5
vmov.f32 s6, #6.5
vmov.f32 s7, #7.5
vmov.f32 s8, #8.5
vmov.f32 s9, #9.5
vmov.f32 s10, #10.5
vmov.f32 s11, #11.5
vmov.f32 s12, #12.5
vmov.f32 s13, #13.5
vmov.f32 s14, #14.5
vmov.f32 s15, #1.0
vmov.f32 s16, #2.0
vmov.f32 s17, #3.0
vmov.f32 s18, #4.0
vmov.f32 s19, #5.0
vmov.f32 s20, #6.0
vmov.f32 s21, #7.0
vmov.f32 s22, #8.0
vmov.f32 s23, #9.0
vmov.f32 s24, #10.0
vmov.f32 s25, #11.0
vmov.f32 s26, #12.0
vmov.f32 s27, #13.0
vmov.f32 s28, #14.0
vmov.f32 s29, #1.5
vmov.f32 s30, #2.5
vmov.f32 s31, #3.5
reg1_loop
;/* Verify that core registers contain correct values. */
cmp r0, #100
bne.w reg1_error_loop
cmp r1, #101
bne.w reg1_error_loop
cmp r2, #102
bne.w reg1_error_loop
cmp r3, #103
bne.w reg1_error_loop
cmp r4, #104
bne.w reg1_error_loop
cmp r5, #105
bne.w reg1_error_loop
cmp r6, #106
bne.w reg1_error_loop
cmp r7, #107
bne.w reg1_error_loop
cmp r8, #108
bne.w reg1_error_loop
cmp r9, #109
bne.w reg1_error_loop
cmp r10, #110
bne.w reg1_error_loop
cmp r11, #111
bne.w reg1_error_loop
cmp r12, #112
bne.w reg1_error_loop
;/* Verify that FPU registers contain correct values. */
vmov.f32 s0, #1.5 ;/* s0 = 1.5. */
vcmp.f32 s1, s0 ;/* Compare s0 and s1. */
vmrs APSR_nzcv, FPSCR ;/* Copy floating point flags (FPSCR flags) to ASPR flags - needed for next bne.w to work. */
bne.w reg1_error_loop
vmov.f32 s0, #2.5
vcmp.f32 s2, s0
vmrs APSR_nzcv, FPSCR
bne.w reg1_error_loop
vmov.f32 s0, #3.5
vcmp.f32 s3, s0
vmrs APSR_nzcv, FPSCR
bne.w reg1_error_loop
vmov.f32 s0, #4.5
vcmp.f32 s4, s0
vmrs APSR_nzcv, FPSCR
bne.w reg1_error_loop
vmov.f32 s0, #5.5
vcmp.f32 s5, s0
vmrs APSR_nzcv, FPSCR
bne.w reg1_error_loop
vmov.f32 s0, #6.5
vcmp.f32 s6, s0
vmrs APSR_nzcv, FPSCR
bne.w reg1_error_loop
vmov.f32 s0, #7.5
vcmp.f32 s7, s0
vmrs APSR_nzcv, FPSCR
bne.w reg1_error_loop
vmov.f32 s0, #8.5
vcmp.f32 s8, s0
vmrs APSR_nzcv, FPSCR
bne.w reg1_error_loop
vmov.f32 s0, #9.5
vcmp.f32 s9, s0
vmrs APSR_nzcv, FPSCR
bne.w reg1_error_loop
vmov.f32 s0, #10.5
vcmp.f32 s10, s0
vmrs APSR_nzcv, FPSCR
bne.w reg1_error_loop
vmov.f32 s0, #11.5
vcmp.f32 s11, s0
vmrs APSR_nzcv, FPSCR
bne.w reg1_error_loop
vmov.f32 s0, #12.5
vcmp.f32 s12, s0
vmrs APSR_nzcv, FPSCR
bne.w reg1_error_loop
vmov.f32 s0, #13.5
vcmp.f32 s13, s0
vmrs APSR_nzcv, FPSCR
bne.w reg1_error_loop
vmov.f32 s0, #14.5
vcmp.f32 s14, s0
vmrs APSR_nzcv, FPSCR
bne.w reg1_error_loop
vmov.f32 s0, #1.0
vcmp.f32 s15, s0
vmrs APSR_nzcv, FPSCR
bne.w reg1_error_loop
vmov.f32 s0, #2.0
vcmp.f32 s16, s0
vmrs APSR_nzcv, FPSCR
bne.w reg1_error_loop
vmov.f32 s0, #3.0
vcmp.f32 s17, s0
vmrs APSR_nzcv, FPSCR
bne.w reg1_error_loop
vmov.f32 s0, #4.0
vcmp.f32 s18, s0
vmrs APSR_nzcv, FPSCR
bne.w reg1_error_loop
vmov.f32 s0, #5.0
vcmp.f32 s19, s0
vmrs APSR_nzcv, FPSCR
bne.w reg1_error_loop
vmov.f32 s0, #6.0
vcmp.f32 s20, s0
vmrs APSR_nzcv, FPSCR
bne.w reg1_error_loop
vmov.f32 s0, #7.0
vcmp.f32 s21, s0
vmrs APSR_nzcv, FPSCR
bne.w reg1_error_loop
vmov.f32 s0, #8.0
vcmp.f32 s22, s0
vmrs APSR_nzcv, FPSCR
bne.w reg1_error_loop
vmov.f32 s0, #9.0
vcmp.f32 s23, s0
vmrs APSR_nzcv, FPSCR
bne.w reg1_error_loop
vmov.f32 s0, #10.0
vcmp.f32 s24, s0
vmrs APSR_nzcv, FPSCR
bne.w reg1_error_loop
vmov.f32 s0, #11.0
vcmp.f32 s25, s0
vmrs APSR_nzcv, FPSCR
bne.w reg1_error_loop
vmov.f32 s0, #12.0
vcmp.f32 s26, s0
vmrs APSR_nzcv, FPSCR
bne.w reg1_error_loop
vmov.f32 s0, #13.0
vcmp.f32 s27, s0
vmrs APSR_nzcv, FPSCR
bne.w reg1_error_loop
vmov.f32 s0, #14.0
vcmp.f32 s28, s0
vmrs APSR_nzcv, FPSCR
bne.w reg1_error_loop
vmov.f32 s0, #1.5
vcmp.f32 s29, s0
vmrs APSR_nzcv, FPSCR
bne.w reg1_error_loop
vmov.f32 s0, #2.5
vcmp.f32 s30, s0
vmrs APSR_nzcv, FPSCR
bne.w reg1_error_loop
vmov.f32 s0, #3.5
vcmp.f32 s31, s0
vmrs APSR_nzcv, FPSCR
bne.w reg1_error_loop
;/* Everything passed, inc the loop counter. */
push { r0, r1 }
ldr r0, =ulRegTest1LoopCounter
ldr r1, [r0]
adds r1, r1, #1
str r1, [r0]
;/* Yield to increase test coverage. */
movs r0, #0x01
ldr r1, =0xe000ed04 ;/* NVIC_ICSR. */
lsls r0, #28 ;/* Shift to PendSV bit. */
str r0, [r1]
dsb
pop { r0, r1 }
;/* Start again. */
b reg1_loop
reg1_error_loop
b reg1_error_loop
LTORG
;/*-----------------------------------------------------------*/
vRegTest2Asm
PRESERVE8
;/* Fill the core registers with known values. */
movs r0, #0
movs r1, #1
movs r2, #2
movs r3, #3
movs r4, #4
movs r5, #5
movs r6, #6
movs r7, #7
mov r8, #8
mov r9, #9
movs r10, #10
movs r11, #11
movs r12, #12
;/* Fill the FPU registers with known values. */
vmov.f32 s1, #1.0
vmov.f32 s2, #2.0
vmov.f32 s3, #3.0
vmov.f32 s4, #4.0
vmov.f32 s5, #5.0
vmov.f32 s6, #6.0
vmov.f32 s7, #7.0
vmov.f32 s8, #8.0
vmov.f32 s9, #9.0
vmov.f32 s10, #10.0
vmov.f32 s11, #11.0
vmov.f32 s12, #12.0
vmov.f32 s13, #13.0
vmov.f32 s14, #14.0
vmov.f32 s15, #1.5
vmov.f32 s16, #2.5
vmov.f32 s17, #3.5
vmov.f32 s18, #4.5
vmov.f32 s19, #5.5
vmov.f32 s20, #6.5
vmov.f32 s21, #7.5
vmov.f32 s22, #8.5
vmov.f32 s23, #9.5
vmov.f32 s24, #10.5
vmov.f32 s25, #11.5
vmov.f32 s26, #12.5
vmov.f32 s27, #13.5
vmov.f32 s28, #14.5
vmov.f32 s29, #1.0
vmov.f32 s30, #2.0
vmov.f32 s31, #3.0
reg2_loop
;/* Verify that core registers contain correct values. */
cmp r0, #0
bne.w reg2_error_loop
cmp r1, #1
bne.w reg2_error_loop
cmp r2, #2
bne.w reg2_error_loop
cmp r3, #3
bne.w reg2_error_loop
cmp r4, #4
bne.w reg2_error_loop
cmp r5, #5
bne.w reg2_error_loop
cmp r6, #6
bne.w reg2_error_loop
cmp r7, #7
bne.w reg2_error_loop
cmp r8, #8
bne.w reg2_error_loop
cmp r9, #9
bne.w reg2_error_loop
cmp r10, #10
bne.w reg2_error_loop
cmp r11, #11
bne.w reg2_error_loop
cmp r12, #12
bne.w reg2_error_loop
;/* Verify that FPU registers contain correct values. */
vmov.f32 s0, #1.0
vcmp.f32 s1, s0
vmrs APSR_nzcv, FPSCR
bne.w reg2_error_loop
vmov.f32 s0, #2.0
vcmp.f32 s2, s0
vmrs APSR_nzcv, FPSCR
bne.w reg2_error_loop
vmov.f32 s0, #3.0
vcmp.f32 s3, s0
vmrs APSR_nzcv, FPSCR
bne.w reg2_error_loop
vmov.f32 s0, #4.0
vcmp.f32 s4, s0
vmrs APSR_nzcv, FPSCR
bne.w reg2_error_loop
vmov.f32 s0, #5.0
vcmp.f32 s5, s0
vmrs APSR_nzcv, FPSCR
bne.w reg2_error_loop
vmov.f32 s0, #6.0
vcmp.f32 s6, s0
vmrs APSR_nzcv, FPSCR
bne.w reg2_error_loop
vmov.f32 s0, #7.0
vcmp.f32 s7, s0
vmrs APSR_nzcv, FPSCR
bne.w reg2_error_loop
vmov.f32 s0, #8.0
vcmp.f32 s8, s0
vmrs APSR_nzcv, FPSCR
bne.w reg2_error_loop
vmov.f32 s0, #9.0
vcmp.f32 s9, s0
vmrs APSR_nzcv, FPSCR
bne.w reg2_error_loop
vmov.f32 s0, #10.0
vcmp.f32 s10, s0
vmrs APSR_nzcv, FPSCR
bne.w reg2_error_loop
vmov.f32 s0, #11.0
vcmp.f32 s11, s0
vmrs APSR_nzcv, FPSCR
bne.w reg2_error_loop
vmov.f32 s0, #12.0
vcmp.f32 s12, s0
vmrs APSR_nzcv, FPSCR
bne.w reg2_error_loop
vmov.f32 s0, #13.0
vcmp.f32 s13, s0
vmrs APSR_nzcv, FPSCR
bne.w reg2_error_loop
vmov.f32 s0, #14.0
vcmp.f32 s14, s0
vmrs APSR_nzcv, FPSCR
bne.w reg2_error_loop
vmov.f32 s0, #1.5
vcmp.f32 s15, s0
vmrs APSR_nzcv, FPSCR
bne.w reg2_error_loop
vmov.f32 s0, #2.5
vcmp.f32 s16, s0
vmrs APSR_nzcv, FPSCR
bne.w reg2_error_loop
vmov.f32 s0, #3.5
vcmp.f32 s17, s0
vmrs APSR_nzcv, FPSCR
bne.w reg2_error_loop
vmov.f32 s0, #4.5
vcmp.f32 s18, s0
vmrs APSR_nzcv, FPSCR
bne.w reg2_error_loop
vmov.f32 s0, #5.5
vcmp.f32 s19, s0
vmrs APSR_nzcv, FPSCR
bne.w reg2_error_loop
vmov.f32 s0, #6.5
vcmp.f32 s20, s0
vmrs APSR_nzcv, FPSCR
bne.w reg2_error_loop
vmov.f32 s0, #7.5
vcmp.f32 s21, s0
vmrs APSR_nzcv, FPSCR
bne.w reg2_error_loop
vmov.f32 s0, #8.5
vcmp.f32 s22, s0
vmrs APSR_nzcv, FPSCR
bne.w reg2_error_loop
vmov.f32 s0, #9.5
vcmp.f32 s23, s0
vmrs APSR_nzcv, FPSCR
bne.w reg2_error_loop
vmov.f32 s0, #10.5
vcmp.f32 s24, s0
vmrs APSR_nzcv, FPSCR
bne.w reg2_error_loop
vmov.f32 s0, #11.5
vcmp.f32 s25, s0
vmrs APSR_nzcv, FPSCR
bne.w reg2_error_loop
vmov.f32 s0, #12.5
vcmp.f32 s26, s0
vmrs APSR_nzcv, FPSCR
bne.w reg2_error_loop
vmov.f32 s0, #13.5
vcmp.f32 s27, s0
vmrs APSR_nzcv, FPSCR
bne.w reg2_error_loop
vmov.f32 s0, #14.5
vcmp.f32 s28, s0
vmrs APSR_nzcv, FPSCR
bne.w reg2_error_loop
vmov.f32 s0, #1.0
vcmp.f32 s29, s0
vmrs APSR_nzcv, FPSCR
bne.w reg2_error_loop
vmov.f32 s0, #2.0
vcmp.f32 s30, s0
vmrs APSR_nzcv, FPSCR
bne.w reg2_error_loop
vmov.f32 s0, #3.0
vcmp.f32 s31, s0
vmrs APSR_nzcv, FPSCR
bne.w reg2_error_loop
;/* Everything passed, inc the loop counter. */
push { r0, r1 }
ldr r0, =ulRegTest2LoopCounter
ldr r1, [r0]
adds r1, r1, #1
str r1, [r0]
pop { r0, r1 }
;/* Start again. */
b reg2_loop
reg2_error_loop
b reg2_error_loop
LTORG
;/*-----------------------------------------------------------*/
vRegTest3Asm
PRESERVE8
;/* Fill the core registers with known values. */
movs r0, #100
movs r1, #101
movs r2, #102
movs r3, #103
movs r4, #104
movs r5, #105
movs r6, #106
movs r7, #107
mov r8, #108
mov r9, #109
mov r10, #110
mov r11, #111
mov r12, #112
;/* Fill the FPU registers with known values. */
vmov.f32 s0, #1.5
vmov.f32 s2, #2.0
vmov.f32 s3, #3.5
vmov.f32 s4, #4.0
vmov.f32 s5, #5.5
vmov.f32 s6, #6.0
vmov.f32 s7, #7.5
vmov.f32 s8, #8.0
vmov.f32 s9, #9.5
vmov.f32 s10, #10.0
vmov.f32 s11, #11.5
vmov.f32 s12, #12.0
vmov.f32 s13, #13.5
vmov.f32 s14, #14.0
vmov.f32 s15, #1.5
vmov.f32 s16, #2.0
vmov.f32 s17, #3.5
vmov.f32 s18, #4.0
vmov.f32 s19, #5.5
vmov.f32 s20, #6.0
vmov.f32 s21, #7.5
vmov.f32 s22, #8.0
vmov.f32 s23, #9.5
vmov.f32 s24, #10.0
vmov.f32 s25, #11.5
vmov.f32 s26, #12.0
vmov.f32 s27, #13.5
vmov.f32 s28, #14.0
vmov.f32 s29, #1.5
vmov.f32 s30, #2.0
vmov.f32 s31, #3.5
reg3_loop
;/* Verify that core registers contain correct values. */
cmp r0, #100
bne.w reg3_error_loop
cmp r1, #101
bne.w reg3_error_loop
cmp r2, #102
bne.w reg3_error_loop
cmp r3, #103
bne.w reg3_error_loop
cmp r4, #104
bne.w reg3_error_loop
cmp r5, #105
bne.w reg3_error_loop
cmp r6, #106
bne.w reg3_error_loop
cmp r7, #107
bne.w reg3_error_loop
cmp r8, #108
bne.w reg3_error_loop
cmp r9, #109
bne.w reg3_error_loop
cmp r10, #110
bne.w reg3_error_loop
cmp r11, #111
bne.w reg3_error_loop
cmp r12, #112
bne.w reg3_error_loop
;/* Verify that FPU registers contain correct values. */
vmov.f32 s1, #1.5
vcmp.f32 s0, s1
vmrs APSR_nzcv, FPSCR
bne.w reg3_error_loop
vmov.f32 s1, #2.0
vcmp.f32 s2, s1
vmrs APSR_nzcv, FPSCR
bne.w reg3_error_loop
vmov.f32 s1, #3.5
vcmp.f32 s3, s1
vmrs APSR_nzcv, FPSCR
bne.w reg3_error_loop
vmov.f32 s1, #4.0
vcmp.f32 s4, s1
vmrs APSR_nzcv, FPSCR
bne.w reg3_error_loop
vmov.f32 s1, #5.5
vcmp.f32 s5, s1
vmrs APSR_nzcv, FPSCR
bne.w reg3_error_loop
vmov.f32 s1, #6.0
vcmp.f32 s6, s1
vmrs APSR_nzcv, FPSCR
bne.w reg3_error_loop
vmov.f32 s1, #7.5
vcmp.f32 s7, s1
vmrs APSR_nzcv, FPSCR
bne.w reg3_error_loop
vmov.f32 s1, #8.0
vcmp.f32 s8, s1
vmrs APSR_nzcv, FPSCR
bne.w reg3_error_loop
vmov.f32 s1, #9.5
vcmp.f32 s9, s1
vmrs APSR_nzcv, FPSCR
bne.w reg3_error_loop
vmov.f32 s1, #10.0
vcmp.f32 s10, s1
vmrs APSR_nzcv, FPSCR
bne.w reg3_error_loop
vmov.f32 s1, #11.5
vcmp.f32 s11, s1
vmrs APSR_nzcv, FPSCR
bne.w reg3_error_loop
vmov.f32 s1, #12.0
vcmp.f32 s12, s1
vmrs APSR_nzcv, FPSCR
bne.w reg3_error_loop
vmov.f32 s1, #13.5
vcmp.f32 s13, s1
vmrs APSR_nzcv, FPSCR
bne.w reg3_error_loop
vmov.f32 s1, #14.0
vcmp.f32 s14, s1
vmrs APSR_nzcv, FPSCR
bne.w reg3_error_loop
vmov.f32 s1, #1.5
vcmp.f32 s15, s1
vmrs APSR_nzcv, FPSCR
bne.w reg3_error_loop
vmov.f32 s1, #2.0
vcmp.f32 s16, s1
vmrs APSR_nzcv, FPSCR
bne.w reg3_error_loop
vmov.f32 s1, #3.5
vcmp.f32 s17, s1
vmrs APSR_nzcv, FPSCR
bne.w reg3_error_loop
vmov.f32 s1, #4.0
vcmp.f32 s18, s1
vmrs APSR_nzcv, FPSCR
bne.w reg3_error_loop
vmov.f32 s1, #5.5
vcmp.f32 s19, s1
vmrs APSR_nzcv, FPSCR
bne.w reg3_error_loop
vmov.f32 s1, #6.0
vcmp.f32 s20, s1
vmrs APSR_nzcv, FPSCR
bne.w reg3_error_loop
vmov.f32 s1, #7.5
vcmp.f32 s21, s1
vmrs APSR_nzcv, FPSCR
bne.w reg3_error_loop
vmov.f32 s1, #8.0
vcmp.f32 s22, s1
vmrs APSR_nzcv, FPSCR
bne.w reg3_error_loop
vmov.f32 s1, #9.5
vcmp.f32 s23, s1
vmrs APSR_nzcv, FPSCR
bne.w reg3_error_loop
vmov.f32 s1, #10.0
vcmp.f32 s24, s1
vmrs APSR_nzcv, FPSCR
bne.w reg3_error_loop
vmov.f32 s1, #11.5
vcmp.f32 s25, s1
vmrs APSR_nzcv, FPSCR
bne.w reg3_error_loop
vmov.f32 s1, #12.0
vcmp.f32 s26, s1
vmrs APSR_nzcv, FPSCR
bne.w reg3_error_loop
vmov.f32 s1, #13.5
vcmp.f32 s27, s1
vmrs APSR_nzcv, FPSCR
bne.w reg3_error_loop
vmov.f32 s1, #14.0
vcmp.f32 s28, s1
vmrs APSR_nzcv, FPSCR
bne.w reg3_error_loop
vmov.f32 s1, #1.5
vcmp.f32 s29, s1
vmrs APSR_nzcv, FPSCR
bne.w reg3_error_loop
vmov.f32 s1, #2.0
vcmp.f32 s30, s1
vmrs APSR_nzcv, FPSCR
bne.w reg3_error_loop
vmov.f32 s1, #3.5
vcmp.f32 s31, s1
vmrs APSR_nzcv, FPSCR
bne.w reg3_error_loop
;/* Everything passed, inc the loop counter. */
push { r0, r1 }
ldr r0, =ulRegTest3LoopCounter
ldr r1, [r0]
adds r1, r1, #1
str r1, [r0]
;/* Yield to increase test coverage. */
movs r0, #0x01
ldr r1, =0xe000ed04 ;/* NVIC_ICSR. */
lsls r0, #28 ;/* Shift to PendSV bit. */
str r0, [r1]
dsb
pop { r0, r1 }
;/* Start again. */
b reg3_loop
reg3_error_loop
b reg3_error_loop
LTORG
;/*-----------------------------------------------------------*/
vRegTest4Asm
PRESERVE8
;/* Fill the core registers with known values. */
movs r0, #0
movs r1, #1
movs r2, #2
movs r3, #3
movs r4, #4
movs r5, #5
movs r6, #6
movs r7, #7
mov r8, #8
mov r9, #9
movs r10, #10
movs r11, #11
movs r12, #12
;/* Fill the FPU registers with known values. */
vmov.f32 s0, #1.5
vmov.f32 s2, #2.0
vmov.f32 s3, #3.0
vmov.f32 s4, #4.5
vmov.f32 s5, #5.0
vmov.f32 s6, #6.0
vmov.f32 s7, #7.5
vmov.f32 s8, #8.0
vmov.f32 s9, #9.0
vmov.f32 s10, #10.5
vmov.f32 s11, #11.0
vmov.f32 s12, #12.0
vmov.f32 s13, #13.5
vmov.f32 s14, #14.0
vmov.f32 s15, #1.0
vmov.f32 s16, #2.5
vmov.f32 s17, #3.0
vmov.f32 s18, #4.0
vmov.f32 s19, #5.5
vmov.f32 s20, #6.0
vmov.f32 s21, #7.0
vmov.f32 s22, #8.5
vmov.f32 s23, #9.0
vmov.f32 s24, #10.0
vmov.f32 s25, #11.5
vmov.f32 s26, #12.0
vmov.f32 s27, #13.0
vmov.f32 s28, #14.5
vmov.f32 s29, #1.0
vmov.f32 s30, #2.0
vmov.f32 s31, #3.5
reg4_loop
;/* Verify that core registers contain correct values. */
cmp r0, #0
bne.w reg4_error_loop
cmp r1, #1
bne.w reg4_error_loop
cmp r2, #2
bne.w reg4_error_loop
cmp r3, #3
bne.w reg4_error_loop
cmp r4, #4
bne.w reg4_error_loop
cmp r5, #5
bne.w reg4_error_loop
cmp r6, #6
bne.w reg4_error_loop
cmp r7, #7
bne.w reg4_error_loop
cmp r8, #8
bne.w reg4_error_loop
cmp r9, #9
bne.w reg4_error_loop
cmp r10, #10
bne.w reg4_error_loop
cmp r11, #11
bne.w reg4_error_loop
cmp r12, #12
bne.w reg4_error_loop
;/* Verify that FPU registers contain correct values. */
vmov.f32 s1, #1.5
vcmp.f32 s0, s1
vmrs APSR_nzcv, FPSCR
bne.w reg4_error_loop
vmov.f32 s1, #2.0
vcmp.f32 s2, s1
vmrs APSR_nzcv, FPSCR
bne.w reg4_error_loop
vmov.f32 s1, #3.0
vcmp.f32 s3, s1
vmrs APSR_nzcv, FPSCR
bne.w reg4_error_loop
vmov.f32 s1, #4.5
vcmp.f32 s4, s1
vmrs APSR_nzcv, FPSCR
bne.w reg4_error_loop
vmov.f32 s1, #5.0
vcmp.f32 s5, s1
vmrs APSR_nzcv, FPSCR
bne.w reg4_error_loop
vmov.f32 s1, #6.0
vcmp.f32 s6, s1
vmrs APSR_nzcv, FPSCR
bne.w reg4_error_loop
vmov.f32 s1, #7.5
vcmp.f32 s7, s1
vmrs APSR_nzcv, FPSCR
bne.w reg4_error_loop
vmov.f32 s1, #8.0
vcmp.f32 s8, s1
vmrs APSR_nzcv, FPSCR
bne.w reg4_error_loop
vmov.f32 s1, #9.0
vcmp.f32 s9, s1
vmrs APSR_nzcv, FPSCR
bne.w reg4_error_loop
vmov.f32 s1, #10.5
vcmp.f32 s10, s1
vmrs APSR_nzcv, FPSCR
bne.w reg4_error_loop
vmov.f32 s1, #11.0
vcmp.f32 s11, s1
vmrs APSR_nzcv, FPSCR
bne.w reg4_error_loop
vmov.f32 s1, #12.0
vcmp.f32 s12, s1
vmrs APSR_nzcv, FPSCR
bne.w reg4_error_loop
vmov.f32 s1, #13.5
vcmp.f32 s13, s1
vmrs APSR_nzcv, FPSCR
bne.w reg4_error_loop
vmov.f32 s1, #14.0
vcmp.f32 s14, s1
vmrs APSR_nzcv, FPSCR
bne.w reg4_error_loop
vmov.f32 s1, #1.0
vcmp.f32 s15, s1
vmrs APSR_nzcv, FPSCR
bne.w reg4_error_loop
vmov.f32 s1, #2.5
vcmp.f32 s16, s1
vmrs APSR_nzcv, FPSCR
bne.w reg4_error_loop
vmov.f32 s1, #3.0
vcmp.f32 s17, s1
vmrs APSR_nzcv, FPSCR
bne.w reg4_error_loop
vmov.f32 s1, #4.0
vcmp.f32 s18, s1
vmrs APSR_nzcv, FPSCR
bne.w reg4_error_loop
vmov.f32 s1, #5.5
vcmp.f32 s19, s1
vmrs APSR_nzcv, FPSCR
bne.w reg4_error_loop
vmov.f32 s1, #6.0
vcmp.f32 s20, s1
vmrs APSR_nzcv, FPSCR
bne.w reg4_error_loop
vmov.f32 s1, #7.0
vcmp.f32 s21, s1
vmrs APSR_nzcv, FPSCR
bne.w reg4_error_loop
vmov.f32 s1, #8.5
vcmp.f32 s22, s1
vmrs APSR_nzcv, FPSCR
bne.w reg4_error_loop
vmov.f32 s1, #9.0
vcmp.f32 s23, s1
vmrs APSR_nzcv, FPSCR
bne.w reg4_error_loop
vmov.f32 s1, #10.0
vcmp.f32 s24, s1
vmrs APSR_nzcv, FPSCR
bne.w reg4_error_loop
vmov.f32 s1, #11.5
vcmp.f32 s25, s1
vmrs APSR_nzcv, FPSCR
bne.w reg4_error_loop
vmov.f32 s1, #12.0
vcmp.f32 s26, s1
vmrs APSR_nzcv, FPSCR
bne.w reg4_error_loop
vmov.f32 s1, #13.0
vcmp.f32 s27, s1
vmrs APSR_nzcv, FPSCR
bne.w reg4_error_loop
vmov.f32 s1, #14.5
vcmp.f32 s28, s1
vmrs APSR_nzcv, FPSCR
bne.w reg4_error_loop
vmov.f32 s1, #1.0
vcmp.f32 s29, s1
vmrs APSR_nzcv, FPSCR
bne.w reg4_error_loop
vmov.f32 s1, #2.0
vcmp.f32 s30, s1
vmrs APSR_nzcv, FPSCR
bne.w reg4_error_loop
vmov.f32 s1, #3.5
vcmp.f32 s31, s1
vmrs APSR_nzcv, FPSCR
bne.w reg4_error_loop
;/* Everything passed, inc the loop counter. */
push { r0, r1 }
ldr r0, =ulRegTest4LoopCounter
ldr r1, [r0]
adds r1, r1, #1
str r1, [r0]
pop { r0, r1 }
;/* Start again. */
b reg4_loop
reg4_error_loop
b reg4_error_loop
LTORG
;/*-----------------------------------------------------------*/
END

@ -32,12 +32,16 @@
/* Demo includes. */
#include "mpu_demo.h"
#include "reg_tests.h"
void app_main( void )
{
/* Start the MPU demo. */
vStartMPUDemo();
/* Start register tests. */
vStartRegTests();
/* Start the scheduler. */
vTaskStartScheduler();

@ -0,0 +1,376 @@
/*
* FreeRTOS V202212.00
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of
* this software and associated documentation files (the "Software"), to deal in
* the Software without restriction, including without limitation the rights to
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
* the Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
* https://www.FreeRTOS.org
* https://github.com/FreeRTOS
*
*/
/* Scheduler includes. */
#include "FreeRTOS.h"
#include "task.h"
/* Reg test includes. */
#include "reg_tests.h"
/* Hardware includes. */
#include "main.h"
/*
* Functions that implement reg test tasks.
*/
static void prvRegTest1Task( void * pvParameters );
static void prvRegTest2Task( void * pvParameters );
static void prvRegTest3Task( void * pvParameters );
static void prvRegTest4Task( void * pvParameters );
/*
* Check task periodically checks that reg tests tasks
* are running fine.
*/
static void prvCheckTask( void * pvParameters );
/*
* Functions implemented in assembly.
*/
extern void vRegTest1Asm( void );
extern void vRegTest2Asm( void );
extern void vRegTest3Asm( void );
extern void vRegTest4Asm( void );
/*-----------------------------------------------------------*/
/*
* Priority of the check task.
*/
#define CHECK_TASK_PRIORITY ( configMAX_PRIORITIES - 1 )
/*
* Frequency of check task.
*/
#define NO_ERROR_CHECK_TASK_PERIOD ( pdMS_TO_TICKS( 5000UL ) )
#define ERROR_CHECK_TASK_PERIOD ( pdMS_TO_TICKS( 200UL ) )
/*
* Parameters passed to reg test tasks.
*/
#define REG_TEST_TASK_1_PARAMETER ( ( void * ) 0x12345678 )
#define REG_TEST_TASK_2_PARAMETER ( ( void * ) 0x87654321 )
#define REG_TEST_TASK_3_PARAMETER ( ( void * ) 0x12348765 )
#define REG_TEST_TASK_4_PARAMETER ( ( void * ) 0x43215678 )
/*-----------------------------------------------------------*/
/*
* The following variables are used to communicate the status of the register
* test tasks to the check task. If the variables keep incrementing, then the
* register test tasks have not discovered any errors. If a variable stops
* incrementing, then an error has been found.
*/
volatile unsigned long ulRegTest1LoopCounter = 0UL, ulRegTest2LoopCounter = 0UL;
volatile unsigned long ulRegTest3LoopCounter = 0UL, ulRegTest4LoopCounter = 0UL;
/**
* Counter to keep a count of how may times the check task loop has detected
* error.
*/
volatile unsigned long ulCheckTaskLoops = 0UL;
/*-----------------------------------------------------------*/
void vStartRegTests( void )
{
static StackType_t xRegTest1TaskStack[ configMINIMAL_STACK_SIZE ] __attribute__( ( aligned( configMINIMAL_STACK_SIZE * sizeof( StackType_t ) ) ) );
static StackType_t xRegTest2TaskStack[ configMINIMAL_STACK_SIZE ] __attribute__( ( aligned( configMINIMAL_STACK_SIZE * sizeof( StackType_t ) ) ) );
static StackType_t xRegTest3TaskStack[ configMINIMAL_STACK_SIZE ] __attribute__( ( aligned( configMINIMAL_STACK_SIZE * sizeof( StackType_t ) ) ) );
static StackType_t xRegTest4TaskStack[ configMINIMAL_STACK_SIZE ] __attribute__( ( aligned( configMINIMAL_STACK_SIZE * sizeof( StackType_t ) ) ) );
static StackType_t xCheckTaskStack[ configMINIMAL_STACK_SIZE ] __attribute__( ( aligned( configMINIMAL_STACK_SIZE * sizeof( StackType_t ) ) ) );
TaskParameters_t xRegTest1TaskParameters =
{
.pvTaskCode = prvRegTest1Task,
.pcName = "RegTest1",
.usStackDepth = configMINIMAL_STACK_SIZE,
.pvParameters = REG_TEST_TASK_1_PARAMETER,
.uxPriority = tskIDLE_PRIORITY | portPRIVILEGE_BIT,
.puxStackBuffer = xRegTest1TaskStack,
.xRegions = {
{ 0, 0, 0 },
{ 0, 0, 0 },
{ 0, 0, 0 },
{ 0, 0, 0 },
{ 0, 0, 0 },
{ 0, 0, 0 },
{ 0, 0, 0 },
{ 0, 0, 0 },
{ 0, 0, 0 },
{ 0, 0, 0 },
{ 0, 0, 0 }
}
};
TaskParameters_t xRegTest2TaskParameters =
{
.pvTaskCode = prvRegTest2Task,
.pcName = "RegTest2",
.usStackDepth = configMINIMAL_STACK_SIZE,
.pvParameters = REG_TEST_TASK_2_PARAMETER,
.uxPriority = tskIDLE_PRIORITY | portPRIVILEGE_BIT,
.puxStackBuffer = xRegTest2TaskStack,
.xRegions = {
{ 0, 0, 0 },
{ 0, 0, 0 },
{ 0, 0, 0 },
{ 0, 0, 0 },
{ 0, 0, 0 },
{ 0, 0, 0 },
{ 0, 0, 0 },
{ 0, 0, 0 },
{ 0, 0, 0 },
{ 0, 0, 0 },
{ 0, 0, 0 }
}
};
TaskParameters_t xRegTest3TaskParameters =
{
.pvTaskCode = prvRegTest3Task,
.pcName = "RegTest3",
.usStackDepth = configMINIMAL_STACK_SIZE,
.pvParameters = REG_TEST_TASK_3_PARAMETER,
.uxPriority = tskIDLE_PRIORITY | portPRIVILEGE_BIT,
.puxStackBuffer = xRegTest3TaskStack,
.xRegions = {
{ 0, 0, 0 },
{ 0, 0, 0 },
{ 0, 0, 0 },
{ 0, 0, 0 },
{ 0, 0, 0 },
{ 0, 0, 0 },
{ 0, 0, 0 },
{ 0, 0, 0 },
{ 0, 0, 0 },
{ 0, 0, 0 },
{ 0, 0, 0 }
}
};
TaskParameters_t xRegTest4TaskParameters =
{
.pvTaskCode = prvRegTest4Task,
.pcName = "RegTest4",
.usStackDepth = configMINIMAL_STACK_SIZE,
.pvParameters = REG_TEST_TASK_4_PARAMETER,
.uxPriority = tskIDLE_PRIORITY | portPRIVILEGE_BIT,
.puxStackBuffer = xRegTest4TaskStack,
.xRegions = {
{ 0, 0, 0 },
{ 0, 0, 0 },
{ 0, 0, 0 },
{ 0, 0, 0 },
{ 0, 0, 0 },
{ 0, 0, 0 },
{ 0, 0, 0 },
{ 0, 0, 0 },
{ 0, 0, 0 },
{ 0, 0, 0 },
{ 0, 0, 0 }
}
};
TaskParameters_t xCheckTaskParameters =
{
.pvTaskCode = prvCheckTask,
.pcName = "Check",
.usStackDepth = configMINIMAL_STACK_SIZE,
.pvParameters = NULL,
.uxPriority = ( CHECK_TASK_PRIORITY | portPRIVILEGE_BIT ),
.puxStackBuffer = xCheckTaskStack,
.xRegions = {
{ 0, 0, 0 },
{ 0, 0, 0 },
{ 0, 0, 0 },
{ 0, 0, 0 },
{ 0, 0, 0 },
{ 0, 0, 0 },
{ 0, 0, 0 },
{ 0, 0, 0 },
{ 0, 0, 0 },
{ 0, 0, 0 },
{ 0, 0, 0 }
}
};
xTaskCreateRestricted( &( xRegTest1TaskParameters ), NULL );
xTaskCreateRestricted( &( xRegTest2TaskParameters ), NULL );
xTaskCreateRestricted( &( xRegTest3TaskParameters ), NULL );
xTaskCreateRestricted( &( xRegTest4TaskParameters ), NULL );
xTaskCreateRestricted( &( xCheckTaskParameters ), NULL );
}
/*-----------------------------------------------------------*/
static void prvRegTest1Task( void * pvParameters )
{
/* Although the reg tests are written in assembly, its entry
* point is written in C for convenience of checking that the
* task parameter is being passed in correctly. */
if( pvParameters == REG_TEST_TASK_1_PARAMETER )
{
/* Start the part of the test that is written in assembler. */
vRegTest1Asm();
}
/* The following line will only execute if the task parameter
* is found to be incorrect. The check task will detect that
* the reg test loop counter is not being incremented and flag
* an error. */
vTaskDelete( NULL );
}
/*-----------------------------------------------------------*/
static void prvRegTest2Task( void * pvParameters )
{
/* Although the reg tests are written in assembly, its entry
* point is written in C for convenience of checking that the
* task parameter is being passed in correctly. */
if( pvParameters == REG_TEST_TASK_2_PARAMETER )
{
/* Start the part of the test that is written in assembler. */
vRegTest2Asm();
}
/* The following line will only execute if the task parameter
* is found to be incorrect. The check task will detect that
* the reg test loop counter is not being incremented and flag
* an error. */
vTaskDelete( NULL );
}
/*-----------------------------------------------------------*/
static void prvRegTest3Task( void * pvParameters )
{
/* Although the reg tests are written in assembly, its entry
* point is written in C for convenience of checking that the
* task parameter is being passed in correctly. */
if( pvParameters == REG_TEST_TASK_3_PARAMETER )
{
/* Start the part of the test that is written in assembler. */
vRegTest3Asm();
}
/* The following line will only execute if the task parameter
* is found to be incorrect. The check task will detect that
* the reg test loop counter is not being incremented and flag
* an error. */
vTaskDelete( NULL );
}
/*-----------------------------------------------------------*/
static void prvRegTest4Task( void * pvParameters )
{
/* Although the reg tests are written in assembly, its entry
* point is written in C for convenience of checking that the
* task parameter is being passed in correctly. */
if( pvParameters == REG_TEST_TASK_4_PARAMETER )
{
/* Start the part of the test that is written in assembler. */
vRegTest4Asm();
}
/* The following line will only execute if the task parameter
* is found to be incorrect. The check task will detect that
* the reg test loop counter is not being incremented and flag
* an error. */
vTaskDelete( NULL );
}
/*-----------------------------------------------------------*/
static void prvCheckTask( void * pvParameters )
{
TickType_t xDelayPeriod = NO_ERROR_CHECK_TASK_PERIOD;
TickType_t xLastExecutionTime;
unsigned long ulErrorFound = pdFALSE;
static unsigned long ulLastRegTest1Value = 0, ulLastRegTest2Value = 0;
static unsigned long ulLastRegTest3Value = 0, ulLastRegTest4Value = 0;
/* Just to stop compiler warnings. */
( void ) pvParameters;
/* Initialize xLastExecutionTime so the first call to vTaskDelayUntil()
* works correctly. */
xLastExecutionTime = xTaskGetTickCount();
/* Cycle for ever, delaying then checking all the other tasks are still
* operating without error. The onboard LED is toggled on each iteration.
* If an error is detected then the delay period is decreased from
* mainNO_ERROR_CHECK_TASK_PERIOD to mainERROR_CHECK_TASK_PERIOD. This has
* the effect of increasing the rate at which the onboard LED toggles, and
* in so doing gives visual feedback of the system status. */
for( ;; )
{
/* Delay until it is time to execute again. */
vTaskDelayUntil( &xLastExecutionTime, xDelayPeriod );
/* Check that the register test 1 task is still running. */
if( ulLastRegTest1Value == ulRegTest1LoopCounter )
{
ulErrorFound |= 1UL << 0UL;
}
ulLastRegTest1Value = ulRegTest1LoopCounter;
/* Check that the register test 2 task is still running. */
if( ulLastRegTest2Value == ulRegTest2LoopCounter )
{
ulErrorFound |= 1UL << 1UL;
}
ulLastRegTest2Value = ulRegTest2LoopCounter;
/* Check that the register test 3 task is still running. */
if( ulLastRegTest3Value == ulRegTest3LoopCounter )
{
ulErrorFound |= 1UL << 2UL;
}
ulLastRegTest3Value = ulRegTest3LoopCounter;
/* Check that the register test 4 task is still running. */
if( ulLastRegTest4Value == ulRegTest4LoopCounter )
{
ulErrorFound |= 1UL << 3UL;
}
ulLastRegTest4Value = ulRegTest4LoopCounter;
/* Toggle the green LED to give an indication of the system status.
* If the LED toggles every NO_ERROR_CHECK_TASK_PERIOD milliseconds
* then everything is ok. A faster toggle indicates an error. */
HAL_GPIO_TogglePin( LD1_GPIO_Port, LD1_Pin );
if( ulErrorFound != pdFALSE )
{
/* An error has been detected in one of the tasks - flash the LED
* at a higher frequency to give visible feedback that something has
* gone wrong (it might just be that the loop back connector required
* by the comtest tasks has not been fitted). */
xDelayPeriod = ERROR_CHECK_TASK_PERIOD;
/* Turn on Red LED to indicate error. */
HAL_GPIO_WritePin( LD3_GPIO_Port, LD3_Pin, GPIO_PIN_SET );
/* Increment error detection count. */
ulCheckTaskLoops++;
}
}
}
/*-----------------------------------------------------------*/

@ -0,0 +1,35 @@
/*
* FreeRTOS V202212.00
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of
* this software and associated documentation files (the "Software"), to deal in
* the Software without restriction, including without limitation the rights to
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
* the Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
* https://www.FreeRTOS.org
* https://github.com/FreeRTOS
*
*/
#ifndef REG_TESTS_H
#define REG_TESTS_H
/**
* @brief Creates all the tasks for reg tests.
*/
void vStartRegTests( void );
#endif /* REG_TESTS_H */

@ -10,6 +10,7 @@
<extension id="org.eclipse.cdt.core.GmakeErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.CWDLocator" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.GCCErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
<extension id="org.eclipse.cdt.core.GLDErrorParser" point="org.eclipse.cdt.core.ErrorParser"/>
</extensions>
</storageModule>
<storageModule moduleId="cdtBuildSystem" version="4.0.0">
@ -18,9 +19,9 @@
<toolChain id="com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.exe.debug.373300876" name="MCU ARM GCC" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.exe.debug">
<option id="com.st.stm32cube.ide.mcu.option.internal.toolchain.type.1979309715" name="Internal Toolchain Type" superClass="com.st.stm32cube.ide.mcu.option.internal.toolchain.type" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.base.gnu-tools-for-stm32" valueType="string"/>
<option id="com.st.stm32cube.ide.mcu.option.internal.toolchain.version.852833658" name="Internal Toolchain Version" superClass="com.st.stm32cube.ide.mcu.option.internal.toolchain.version" useByScannerDiscovery="false" value="7-2018-q2-update" valueType="string"/>
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_mcu.224158199" name="Mcu" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_mcu" useByScannerDiscovery="false" value="STM32H743ZITx" valueType="string"/>
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_cpuid.2132016085" name="CpuId" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_cpuid" useByScannerDiscovery="false" value="0" valueType="string"/>
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_coreid.366850404" name="CpuCoreId" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_coreid" useByScannerDiscovery="false" value="0" valueType="string"/>
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_mcu.224158199" name="MCU" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_mcu" useByScannerDiscovery="false" value="STM32H743ZITx" valueType="string"/>
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_cpuid.2132016085" name="CPU" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_cpuid" useByScannerDiscovery="false" value="0" valueType="string"/>
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_coreid.366850404" name="Core" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_coreid" useByScannerDiscovery="false" value="0" valueType="string"/>
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.fpu.127530825" name="Floating-point unit" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.fpu" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.fpu.value.fpv5-d16" valueType="enumerated"/>
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi.321463520" name="Floating-point ABI" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi" useByScannerDiscovery="false" value="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi.value.hard" valueType="enumerated"/>
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_board.398433331" name="Board" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_board" useByScannerDiscovery="false" value="NUCLEO-H743ZI2" valueType="string"/>
@ -76,6 +77,32 @@
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.symbolsrec.938552426" name="MCU Output Converter Motorola S-rec with symbols" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.symbolsrec"/>
</toolChain>
</folderInfo>
<folderInfo id="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.debug.512177861.5456747" name="/" resourcePath="RegTests">
<toolChain id="com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.exe.debug.882613797" name="MCU ARM GCC" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.exe.debug" unusedChildren="">
<option id="com.st.stm32cube.ide.mcu.option.internal.toolchain.type.1979309715.477777469" name="Internal Toolchain Type" superClass="com.st.stm32cube.ide.mcu.option.internal.toolchain.type.1979309715"/>
<option id="com.st.stm32cube.ide.mcu.option.internal.toolchain.version.852833658.2023416248" name="Internal Toolchain Version" superClass="com.st.stm32cube.ide.mcu.option.internal.toolchain.version.852833658"/>
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_mcu.224158199.2023514785" name="MCU" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_mcu.224158199"/>
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_cpuid.2132016085.983314287" name="CPU" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_cpuid.2132016085"/>
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_coreid.366850404.397377324" name="Core" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_coreid.366850404"/>
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.fpu.127530825.1987011199" name="Floating-point unit" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.fpu.127530825"/>
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi.321463520.615974971" name="Floating-point ABI" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.floatabi.321463520"/>
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_board.398433331.894958652" name="Board" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.target_board.398433331"/>
<option id="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.defaults.545503947.337061049" name="Defaults" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.option.defaults.545503947"/>
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.1841606747" name="MCU GCC Assembler" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.assembler.2058018690"/>
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.8289877" name="MCU GCC Compiler" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.compiler.1084842619"/>
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.1914051445" name="MCU G++ Compiler" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.compiler.712955031"/>
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.1955218641" name="MCU GCC Linker" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.c.linker.689453407"/>
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.linker.1646615531" name="MCU G++ Linker" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.cpp.linker.382504185"/>
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.archiver.1548188264" name="MCU GCC Archiver" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.archiver.308108641"/>
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.size.1219355605" name="MCU Size" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.size.1585200233"/>
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objdump.listfile.1416777385" name="MCU Output Converter list file" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objdump.listfile.1603763392"/>
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.hex.1217029087" name="MCU Output Converter Hex" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.hex.368361293"/>
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.binary.24856726" name="MCU Output Converter Binary" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.binary.1936272902"/>
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.verilog.1540430584" name="MCU Output Converter Verilog" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.verilog.244662906"/>
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.srec.682816493" name="MCU Output Converter Motorola S-rec" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.srec.1305239222"/>
<tool id="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.symbolsrec.890016239" name="MCU Output Converter Motorola S-rec with symbols" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.tool.objcopy.symbolsrec.938552426"/>
</toolChain>
</folderInfo>
<folderInfo id="com.st.stm32cube.ide.mcu.gnu.managedbuild.config.exe.debug.512177861.1706837772" name="/" resourcePath="ST_Code/Drivers/STM32H7xx_HAL_Driver/Src">
<toolChain id="com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.exe.debug.1089770149" name="MCU ARM GCC" superClass="com.st.stm32cube.ide.mcu.gnu.managedbuild.toolchain.exe.debug" unusedChildren="">
<option id="com.st.stm32cube.ide.mcu.option.internal.toolchain.type.1979309715.1796819406" name="Internal Toolchain Type" superClass="com.st.stm32cube.ide.mcu.option.internal.toolchain.type.1979309715"/>
@ -122,6 +149,7 @@
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="Config"/>
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="Demo"/>
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="FreeRTOS"/>
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="RegTests"/>
<entry excluding="Drivers/STM32H7xx_HAL_Driver/Src/stm32h7xx_ll_utils.c" flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="ST_Code"/>
<entry flags="VALUE_WORKSPACE_PATH|RESOLVED" kind="sourcePath" name="Startup"/>
</sourceEntries>
@ -152,4 +180,4 @@
<resource resourceType="PROJECT" workspacePath="/FreeRTOSDemo"/>
</configuration>
</storageModule>
</cproject>
</cproject>

@ -53,6 +53,15 @@
</link>
</linkedResources>
<filteredResources>
<filter>
<id>1680067487361</id>
<name>Demo</name>
<type>9</type>
<matcher>
<id>org.eclipse.ui.ide.multiFilter</id>
<arguments>1.0-name-matches-false-false-GCC</arguments>
</matcher>
</filter>
<filter>
<id>1594591511105</id>
<name>FreeRTOS</name>

@ -11,9 +11,13 @@
<name>General</name>
<archiveVersion>3</archiveVersion>
<data>
<version>31</version>
<version>34</version>
<wantNonLocal>1</wantNonLocal>
<debug>1</debug>
<option>
<name>BrowseInfoPath</name>
<state>BrowseInfo</state>
</option>
<option>
<name>ExePath</name>
<state>Debug</state>
@ -66,15 +70,7 @@
</option>
<option>
<name>OGLastSavedByProductVersion</name>
<state>8.50.4.26131</state>
</option>
<option>
<name>GeneralEnableMisra</name>
<state>0</state>
</option>
<option>
<name>GeneralMisraVerbose</name>
<state>0</state>
<state>9.20.4.46976</state>
</option>
<option>
<name>OGChipSelectEditMenu</name>
@ -96,27 +92,13 @@
<name>GenStdoutInterface</name>
<state>0</state>
</option>
<option>
<name>GeneralMisraRules98</name>
<version>0</version>
<state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>
</option>
<option>
<name>GeneralMisraVer</name>
<state>0</state>
</option>
<option>
<name>GeneralMisraRules04</name>
<version>0</version>
<state>011111111111111110111111111111011111111111111011110100111111111111111111111111111111111111111111101111111111111011111111111111111111111111111</state>
</option>
<option>
<name>RTConfigPath2</name>
<state>$TOOLKIT_DIR$\inc\c\DLib_Config_Full.h</state>
</option>
<option>
<name>GBECoreSlave</name>
<version>28</version>
<version>31</version>
<state>41</state>
</option>
<option>
@ -133,7 +115,7 @@
</option>
<option>
<name>CoreVariant</name>
<version>28</version>
<version>31</version>
<state>41</state>
</option>
<option>
@ -156,7 +138,7 @@
</option>
<option>
<name>GFPUCoreSlave2</name>
<version>28</version>
<version>31</version>
<state>41</state>
</option>
<option>
@ -209,13 +191,25 @@
<version>0</version>
<state>0</state>
</option>
<option>
<name>OGAarch64Abi</name>
<state>0</state>
</option>
<option>
<name>OG_32_64Device</name>
<state>0</state>
</option>
<option>
<name>BuildFilesPath</name>
<state>BuildLogs</state>
</option>
</data>
</settings>
<settings>
<name>ICCARM</name>
<archiveVersion>2</archiveVersion>
<data>
<version>36</version>
<version>37</version>
<wantNonLocal>1</wantNonLocal>
<debug>1</debug>
<option>
@ -344,10 +338,6 @@
<name>PreInclude</name>
<state></state>
</option>
<option>
<name>CompilerMisraOverride</name>
<state>0</state>
</option>
<option>
<name>CCIncludePath2</name>
<state>$PROJ_DIR$\..\..\ST_Code\Core\Inc</state>
@ -385,16 +375,6 @@
<name>CCOptLevelSlave</name>
<state>0</state>
</option>
<option>
<name>CompilerMisraRules98</name>
<version>0</version>
<state>1000111110110101101110011100111111101110011011000101110111101101100111111111111100110011111001110111001111111111111111111111111</state>
</option>
<option>
<name>CompilerMisraRules04</name>
<version>0</version>
<state>111101110010111111111000110111111111111111111111111110010111101111010101111111111111111111111111101111111011111001111011111011111111111111111</state>
</option>
<option>
<name>CCPosIndRopi</name>
<state>0</state>
@ -486,7 +466,7 @@
<name>AARM</name>
<archiveVersion>2</archiveVersion>
<data>
<version>10</version>
<version>11</version>
<wantNonLocal>1</wantNonLocal>
<debug>1</debug>
<option>
@ -643,6 +623,10 @@
<name>AsmNoLiteralPool</name>
<state>0</state>
</option>
<option>
<name>PreInclude</name>
<state></state>
</option>
</data>
</settings>
<settings>
@ -682,13 +666,9 @@
<extensions></extensions>
<cmdline></cmdline>
<hasPrio>0</hasPrio>
<buildSequence>inputOutputBased</buildSequence>
</data>
</settings>
<settings>
<name>BICOMP</name>
<archiveVersion>0</archiveVersion>
<data />
</settings>
<settings>
<name>BUILDACTION</name>
<archiveVersion>1</archiveVersion>
@ -701,17 +681,13 @@
<name>ILINK</name>
<archiveVersion>0</archiveVersion>
<data>
<version>23</version>
<version>26</version>
<wantNonLocal>1</wantNonLocal>
<debug>1</debug>
<option>
<name>IlinkLibIOConfig</name>
<state>1</state>
</option>
<option>
<name>XLinkMisraHandler</name>
<state>0</state>
</option>
<option>
<name>IlinkInputFileSlave</name>
<state>0</state>
@ -1037,6 +1013,34 @@
<name>IlinkRawBinaryAlign2</name>
<state></state>
</option>
<option>
<name>IlinkLogCrtRoutineSelection</name>
<state>0</state>
</option>
<option>
<name>IlinkLogFragmentInfo</name>
<state>0</state>
</option>
<option>
<name>IlinkLogInlining</name>
<state>0</state>
</option>
<option>
<name>IlinkLogMerging</name>
<state>0</state>
</option>
<option>
<name>IlinkDemangle</name>
<state>0</state>
</option>
<option>
<name>IlinkWrapperFileEnable</name>
<state>0</state>
</option>
<option>
<name>IlinkWrapperFile</name>
<state></state>
</option>
</data>
</settings>
<settings>
@ -1060,11 +1064,6 @@
</option>
</data>
</settings>
<settings>
<name>BILINK</name>
<archiveVersion>0</archiveVersion>
<data />
</settings>
</configuration>
<group>
<name>Config</name>
@ -1074,6 +1073,12 @@
</group>
<group>
<name>Demo</name>
<group>
<name>IAR</name>
<file>
<name>$PROJ_DIR$\..\..\Demo\IAR\reg_tests_asm.s</name>
</file>
</group>
<file>
<name>$PROJ_DIR$\..\..\Demo\app_main.c</name>
</file>
@ -1086,6 +1091,12 @@
<file>
<name>$PROJ_DIR$\..\..\Demo\mpu_demo.h</name>
</file>
<file>
<name>$PROJ_DIR$\..\..\Demo\reg_tests.c</name>
</file>
<file>
<name>$PROJ_DIR$\..\..\Demo\reg_tests.h</name>
</file>
</group>
<group>
<name>FreeRTOS</name>

@ -10,14 +10,14 @@
<TargetName>FreeRTOSDemo</TargetName>
<ToolsetNumber>0x4</ToolsetNumber>
<ToolsetName>ARM-ADS</ToolsetName>
<pCCUsed>6130001::V6.13.1::.\ARMCLANG</pCCUsed>
<pCCUsed>6180000::V6.18::ARMCLANG</pCCUsed>
<uAC6>1</uAC6>
<TargetOption>
<TargetCommonOption>
<Device>STM32H743ZITx</Device>
<Vendor>STMicroelectronics</Vendor>
<PackID>Keil.STM32H7xx_DFP.2.4.0</PackID>
<PackURL>https://www.keil.com/pack/</PackURL>
<PackID>Keil.STM32H7xx_DFP.3.0.0</PackID>
<PackURL>http://www.keil.com/pack/</PackURL>
<Cpu>IRAM(0x20000000-0x2001FFFF) IRAM2(0x24000000-0x2407FFFF) IROM(0x8000000-0x81FFFFF) CLOCK(12000000) FPU3(DFPU) CPUTYPE("Cortex-M7") ELITTLE</Cpu>
<FlashUtilSpec></FlashUtilSpec>
<StartupFile></StartupFile>
@ -185,6 +185,8 @@
<uocXRam>0</uocXRam>
<RvdsVP>3</RvdsVP>
<RvdsMve>0</RvdsMve>
<RvdsCdeCp>0</RvdsCdeCp>
<nBranchProt>0</nBranchProt>
<hadIRAM2>1</hadIRAM2>
<hadIROM2>0</hadIROM2>
<StupSel>8</StupSel>
@ -351,7 +353,7 @@
<NoWarn>0</NoWarn>
<uSurpInc>0</uSurpInc>
<useXO>0</useXO>
<uClangAs>0</uClangAs>
<ClangAsOpt>4</ClangAsOpt>
<VariousControls>
<MiscControls></MiscControls>
<Define></Define>
@ -412,6 +414,21 @@
<FileType>5</FileType>
<FilePath>..\..\Demo\mpu_demo.h</FilePath>
</File>
<File>
<FileName>reg_tests_asm.c</FileName>
<FileType>1</FileType>
<FilePath>..\..\Demo\GCC\reg_tests_asm.c</FilePath>
</File>
<File>
<FileName>reg_tests.c</FileName>
<FileType>1</FileType>
<FilePath>..\..\Demo\reg_tests.c</FilePath>
</File>
<File>
<FileName>reg_tests.h</FileName>
<FileType>5</FileType>
<FilePath>..\..\Demo\reg_tests.h</FilePath>
</File>
</Files>
</Group>
<Group>

@ -0,0 +1,45 @@
; Flash Layout
;
; ---------------------
; | Privileged Code |
; ---------------------
; | Unprivileged Code |
; ---------------------
;
; RAM Layout
;
; ---------------------
; | Privileged Data |
; ---------------------
; | Unprivileged Data |
; ---------------------
LR_APP 0x08000000 0x00200000 ; load region size_region
{
ER_IROM_PRIVILEGED 0x08000000
{
*.o (RESET, +First)
*(InRoot$$Sections)
*(privileged_functions)
}
ER_IROM_FREERTOS_SYSTEM_CALLS 0x08008000 FIXED
{
*(freertos_system_calls)
}
ER_IROM_UNPRIVILEGED +0
{
.ANY (+RO)
}
RW_IRAM_PRIVILEGED 0x20000000
{
*(privileged_data)
}
RW_IRAM_UNPRIVILEGED 0x20008000
{
.ANY (+RW +ZI)
}
}

@ -0,0 +1,66 @@
/*
* FreeRTOS V202212.00
* Copyright (C) 2020 Amazon.com, Inc. or its affiliates. All Rights Reserved.
*
* Permission is hereby granted, free of charge, to any person obtaining a copy of
* this software and associated documentation files (the "Software"), to deal in
* the Software without restriction, including without limitation the rights to
* use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
* the Software, and to permit persons to whom the Software is furnished to do so,
* subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
* FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
* COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
* IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
* https://www.FreeRTOS.org
* https://github.com/FreeRTOS
*
*/
#include <stdint.h>
extern uint32_t Image$$ER_IROM_FREERTOS_SYSTEM_CALLS$$Base;
extern uint32_t Image$$ER_IROM_FREERTOS_SYSTEM_CALLS$$Limit;
/* Memory map needed for MPU setup. Must must match the one defined in
* the scatter-loading file (FreeRTOSDemo.sct). */
const uint32_t * __FLASH_segment_start__ = ( uint32_t * ) 0x08000000;
const uint32_t * __FLASH_segment_end__ = ( uint32_t * ) 0x08200000;
const uint32_t * __SRAM_segment_start__ = ( uint32_t * ) 0x20000000;
const uint32_t * __SRAM_segment_end__ = ( uint32_t * ) 0x20020000;
const uint32_t * __privileged_functions_start__ = ( uint32_t * ) 0x08000000;
const uint32_t * __privileged_functions_end__ = ( uint32_t * ) 0x08008000;
const uint32_t * __privileged_data_start__ = ( uint32_t * ) 0x20000000;
const uint32_t * __privileged_data_end__ = ( uint32_t * ) 0x20008000;
const uint32_t * __syscalls_flash_start__ = ( uint32_t * ) &( Image$$ER_IROM_FREERTOS_SYSTEM_CALLS$$Base );
const uint32_t * __syscalls_flash_end__ = ( uint32_t * ) &( Image$$ER_IROM_FREERTOS_SYSTEM_CALLS$$Limit );
/*-----------------------------------------------------------*/
/**
* @brief Mem fault handler.
*/
void MemManage_Handler( void );
/*-----------------------------------------------------------*/
__asm void MemManage_Handler( void )
{
extern vHandleMemoryFault;
PRESERVE8
tst lr, #4
ite eq
mrseq r0, msp
mrsne r0, psp
b vHandleMemoryFault
}
/*-----------------------------------------------------------*/

@ -0,0 +1,611 @@
;******************** (C) COPYRIGHT 2017 STMicroelectronics ********************
;* File Name : startup_stm32h743xx.s
;* @author MCD Application Team
;* Description : STM32H7xx devices vector table for MDK-ARM toolchain.
;* This module performs:
;* - Set the initial SP
;* - Set the initial PC == Reset_Handler
;* - Set the vector table entries with the exceptions ISR address
;* - Branches to __main in the C library (which eventually
;* calls main()).
;* After Reset the Cortex-M processor is in Thread mode,
;* priority is Privileged, and the Stack is set to Main.
;* <<< Use Configuration Wizard in Context Menu >>>
;******************************************************************************
;* @attention
;*
;* Copyright (c) 2017 STMicroelectronics.
;* All rights reserved.
;*
;* This software component is licensed by ST under BSD 3-Clause license,
;* the "License"; You may not use this file except in compliance with the
;* License. You may obtain a copy of the License at:
;* opensource.org/licenses/BSD-3-Clause
;*
;******************************************************************************
; Amount of memory (in bytes) allocated for Stack
; Tailor this value to your application needs
; <h> Stack Configuration
; <o> Stack Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>
Stack_Size EQU 0x400
AREA STACK, NOINIT, READWRITE, ALIGN=3
Stack_Mem SPACE Stack_Size
__initial_sp
; <h> Heap Configuration
; <o> Heap Size (in Bytes) <0x0-0xFFFFFFFF:8>
; </h>
Heap_Size EQU 0x200
AREA HEAP, NOINIT, READWRITE, ALIGN=3
__heap_base
Heap_Mem SPACE Heap_Size
__heap_limit
PRESERVE8
THUMB
; Vector Table Mapped to Address 0 at Reset
AREA RESET, DATA, READONLY
EXPORT __Vectors
EXPORT __Vectors_End
EXPORT __Vectors_Size
__Vectors DCD __initial_sp ; Top of Stack
DCD Reset_Handler ; Reset Handler
DCD NMI_Handler ; NMI Handler
DCD HardFault_Handler ; Hard Fault Handler
DCD MemManage_Handler ; MPU Fault Handler
DCD BusFault_Handler ; Bus Fault Handler
DCD UsageFault_Handler ; Usage Fault Handler
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD SVC_Handler ; SVCall Handler
DCD DebugMon_Handler ; Debug Monitor Handler
DCD 0 ; Reserved
DCD PendSV_Handler ; PendSV Handler
DCD SysTick_Handler ; SysTick Handler
; External Interrupts
DCD WWDG_IRQHandler ; Window WatchDog interrupt ( wwdg1_it)
DCD PVD_AVD_IRQHandler ; PVD/AVD through EXTI Line detection
DCD TAMP_STAMP_IRQHandler ; Tamper and TimeStamps through the EXTI line
DCD RTC_WKUP_IRQHandler ; RTC Wakeup through the EXTI line
DCD FLASH_IRQHandler ; FLASH
DCD RCC_IRQHandler ; RCC
DCD EXTI0_IRQHandler ; EXTI Line0
DCD EXTI1_IRQHandler ; EXTI Line1
DCD EXTI2_IRQHandler ; EXTI Line2
DCD EXTI3_IRQHandler ; EXTI Line3
DCD EXTI4_IRQHandler ; EXTI Line4
DCD DMA1_Stream0_IRQHandler ; DMA1 Stream 0
DCD DMA1_Stream1_IRQHandler ; DMA1 Stream 1
DCD DMA1_Stream2_IRQHandler ; DMA1 Stream 2
DCD DMA1_Stream3_IRQHandler ; DMA1 Stream 3
DCD DMA1_Stream4_IRQHandler ; DMA1 Stream 4
DCD DMA1_Stream5_IRQHandler ; DMA1 Stream 5
DCD DMA1_Stream6_IRQHandler ; DMA1 Stream 6
DCD ADC_IRQHandler ; ADC1, ADC2
DCD FDCAN1_IT0_IRQHandler ; FDCAN1 interrupt line 0
DCD FDCAN2_IT0_IRQHandler ; FDCAN2 interrupt line 0
DCD FDCAN1_IT1_IRQHandler ; FDCAN1 interrupt line 1
DCD FDCAN2_IT1_IRQHandler ; FDCAN2 interrupt line 1
DCD EXTI9_5_IRQHandler ; External Line[9:5]s
DCD TIM1_BRK_IRQHandler ; TIM1 Break interrupt
DCD TIM1_UP_IRQHandler ; TIM1 Update Interrupt
DCD TIM1_TRG_COM_IRQHandler ; TIM1 Trigger and Commutation Interrupt
DCD TIM1_CC_IRQHandler ; TIM1 Capture Compare
DCD TIM2_IRQHandler ; TIM2
DCD TIM3_IRQHandler ; TIM3
DCD TIM4_IRQHandler ; TIM4
DCD I2C1_EV_IRQHandler ; I2C1 Event
DCD I2C1_ER_IRQHandler ; I2C1 Error
DCD I2C2_EV_IRQHandler ; I2C2 Event
DCD I2C2_ER_IRQHandler ; I2C2 Error
DCD SPI1_IRQHandler ; SPI1
DCD SPI2_IRQHandler ; SPI2
DCD USART1_IRQHandler ; USART1
DCD USART2_IRQHandler ; USART2
DCD USART3_IRQHandler ; USART3
DCD EXTI15_10_IRQHandler ; External Line[15:10]
DCD RTC_Alarm_IRQHandler ; RTC Alarm (A and B) through EXTI Line
DCD 0 ; Reserved
DCD TIM8_BRK_TIM12_IRQHandler ; TIM8 Break Interrupt and TIM12 global interrupt
DCD TIM8_UP_TIM13_IRQHandler ; TIM8 Update Interrupt and TIM13 global interrupt
DCD TIM8_TRG_COM_TIM14_IRQHandler ; TIM8 Trigger and Commutation Interrupt and TIM14 global interrupt
DCD TIM8_CC_IRQHandler ; TIM8 Capture Compare Interrupt
DCD DMA1_Stream7_IRQHandler ; DMA1 Stream7
DCD FMC_IRQHandler ; FMC
DCD SDMMC1_IRQHandler ; SDMMC1
DCD TIM5_IRQHandler ; TIM5
DCD SPI3_IRQHandler ; SPI3
DCD UART4_IRQHandler ; UART4
DCD UART5_IRQHandler ; UART5
DCD TIM6_DAC_IRQHandler ; TIM6 and DAC1&2 underrun errors
DCD TIM7_IRQHandler ; TIM7
DCD DMA2_Stream0_IRQHandler ; DMA2 Stream 0
DCD DMA2_Stream1_IRQHandler ; DMA2 Stream 1
DCD DMA2_Stream2_IRQHandler ; DMA2 Stream 2
DCD DMA2_Stream3_IRQHandler ; DMA2 Stream 3
DCD DMA2_Stream4_IRQHandler ; DMA2 Stream 4
DCD ETH_IRQHandler ; Ethernet
DCD ETH_WKUP_IRQHandler ; Ethernet Wakeup through EXTI line
DCD FDCAN_CAL_IRQHandler ; FDCAN calibration unit interrupt
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD DMA2_Stream5_IRQHandler ; DMA2 Stream 5
DCD DMA2_Stream6_IRQHandler ; DMA2 Stream 6
DCD DMA2_Stream7_IRQHandler ; DMA2 Stream 7
DCD USART6_IRQHandler ; USART6
DCD I2C3_EV_IRQHandler ; I2C3 event
DCD I2C3_ER_IRQHandler ; I2C3 error
DCD OTG_HS_EP1_OUT_IRQHandler ; USB OTG HS End Point 1 Out
DCD OTG_HS_EP1_IN_IRQHandler ; USB OTG HS End Point 1 In
DCD OTG_HS_WKUP_IRQHandler ; USB OTG HS Wakeup through EXTI
DCD OTG_HS_IRQHandler ; USB OTG HS
DCD DCMI_IRQHandler ; DCMI
DCD 0 ; Reserved
DCD RNG_IRQHandler ; Rng
DCD FPU_IRQHandler ; FPU
DCD UART7_IRQHandler ; UART7
DCD UART8_IRQHandler ; UART8
DCD SPI4_IRQHandler ; SPI4
DCD SPI5_IRQHandler ; SPI5
DCD SPI6_IRQHandler ; SPI6
DCD SAI1_IRQHandler ; SAI1
DCD LTDC_IRQHandler ; LTDC
DCD LTDC_ER_IRQHandler ; LTDC error
DCD DMA2D_IRQHandler ; DMA2D
DCD SAI2_IRQHandler ; SAI2
DCD QUADSPI_IRQHandler ; QUADSPI
DCD LPTIM1_IRQHandler ; LPTIM1
DCD CEC_IRQHandler ; HDMI_CEC
DCD I2C4_EV_IRQHandler ; I2C4 Event
DCD I2C4_ER_IRQHandler ; I2C4 Error
DCD SPDIF_RX_IRQHandler ; SPDIF_RX
DCD OTG_FS_EP1_OUT_IRQHandler ; USB OTG FS End Point 1 Out
DCD OTG_FS_EP1_IN_IRQHandler ; USB OTG FS End Point 1 In
DCD OTG_FS_WKUP_IRQHandler ; USB OTG FS Wakeup through EXTI
DCD OTG_FS_IRQHandler ; USB OTG FS
DCD DMAMUX1_OVR_IRQHandler ; DMAMUX1 Overrun interrupt
DCD HRTIM1_Master_IRQHandler ; HRTIM Master Timer global Interrupts
DCD HRTIM1_TIMA_IRQHandler ; HRTIM Timer A global Interrupt
DCD HRTIM1_TIMB_IRQHandler ; HRTIM Timer B global Interrupt
DCD HRTIM1_TIMC_IRQHandler ; HRTIM Timer C global Interrupt
DCD HRTIM1_TIMD_IRQHandler ; HRTIM Timer D global Interrupt
DCD HRTIM1_TIME_IRQHandler ; HRTIM Timer E global Interrupt
DCD HRTIM1_FLT_IRQHandler ; HRTIM Fault global Interrupt
DCD DFSDM1_FLT0_IRQHandler ; DFSDM Filter0 Interrupt
DCD DFSDM1_FLT1_IRQHandler ; DFSDM Filter1 Interrupt
DCD DFSDM1_FLT2_IRQHandler ; DFSDM Filter2 Interrupt
DCD DFSDM1_FLT3_IRQHandler ; DFSDM Filter3 Interrupt
DCD SAI3_IRQHandler ; SAI3 global Interrupt
DCD SWPMI1_IRQHandler ; Serial Wire Interface 1 global interrupt
DCD TIM15_IRQHandler ; TIM15 global Interrupt
DCD TIM16_IRQHandler ; TIM16 global Interrupt
DCD TIM17_IRQHandler ; TIM17 global Interrupt
DCD MDIOS_WKUP_IRQHandler ; MDIOS Wakeup Interrupt
DCD MDIOS_IRQHandler ; MDIOS global Interrupt
DCD JPEG_IRQHandler ; JPEG global Interrupt
DCD MDMA_IRQHandler ; MDMA global Interrupt
DCD 0 ; Reserved
DCD SDMMC2_IRQHandler ; SDMMC2 global Interrupt
DCD HSEM1_IRQHandler ; HSEM1 global Interrupt
DCD 0 ; Reserved
DCD ADC3_IRQHandler ; ADC3 global Interrupt
DCD DMAMUX2_OVR_IRQHandler ; DMAMUX Overrun interrupt
DCD BDMA_Channel0_IRQHandler ; BDMA Channel 0 global Interrupt
DCD BDMA_Channel1_IRQHandler ; BDMA Channel 1 global Interrupt
DCD BDMA_Channel2_IRQHandler ; BDMA Channel 2 global Interrupt
DCD BDMA_Channel3_IRQHandler ; BDMA Channel 3 global Interrupt
DCD BDMA_Channel4_IRQHandler ; BDMA Channel 4 global Interrupt
DCD BDMA_Channel5_IRQHandler ; BDMA Channel 5 global Interrupt
DCD BDMA_Channel6_IRQHandler ; BDMA Channel 6 global Interrupt
DCD BDMA_Channel7_IRQHandler ; BDMA Channel 7 global Interrupt
DCD COMP1_IRQHandler ; COMP1 global Interrupt
DCD LPTIM2_IRQHandler ; LP TIM2 global interrupt
DCD LPTIM3_IRQHandler ; LP TIM3 global interrupt
DCD LPTIM4_IRQHandler ; LP TIM4 global interrupt
DCD LPTIM5_IRQHandler ; LP TIM5 global interrupt
DCD LPUART1_IRQHandler ; LP UART1 interrupt
DCD 0 ; Reserved
DCD CRS_IRQHandler ; Clock Recovery Global Interrupt
DCD ECC_IRQHandler ; ECC diagnostic Global Interrupt
DCD SAI4_IRQHandler ; SAI4 global interrupt
DCD 0 ; Reserved
DCD 0 ; Reserved
DCD WAKEUP_PIN_IRQHandler ; Interrupt for all 6 wake-up pins
__Vectors_End
__Vectors_Size EQU __Vectors_End - __Vectors
AREA |.text|, CODE, READONLY
; Reset handler
Reset_Handler PROC
EXPORT Reset_Handler [WEAK]
IMPORT SystemInit
IMPORT __main
LDR R0, =SystemInit
BLX R0
LDR R0, =__main
BX R0
ENDP
; Dummy Exception Handlers (infinite loops which can be modified)
NMI_Handler PROC
EXPORT NMI_Handler [WEAK]
B .
ENDP
HardFault_Handler\
PROC
EXPORT HardFault_Handler [WEAK]
B .
ENDP
MemManage_Handler\
PROC
EXPORT MemManage_Handler [WEAK]
B .
ENDP
BusFault_Handler\
PROC
EXPORT BusFault_Handler [WEAK]
B .
ENDP
UsageFault_Handler\
PROC
EXPORT UsageFault_Handler [WEAK]
B .
ENDP
SVC_Handler PROC
EXPORT SVC_Handler [WEAK]
B .
ENDP
DebugMon_Handler\
PROC
EXPORT DebugMon_Handler [WEAK]
B .
ENDP
PendSV_Handler PROC
EXPORT PendSV_Handler [WEAK]
B .
ENDP
SysTick_Handler PROC
EXPORT SysTick_Handler [WEAK]
B .
ENDP
Default_Handler PROC
EXPORT WWDG_IRQHandler [WEAK]
EXPORT PVD_AVD_IRQHandler [WEAK]
EXPORT TAMP_STAMP_IRQHandler [WEAK]
EXPORT RTC_WKUP_IRQHandler [WEAK]
EXPORT FLASH_IRQHandler [WEAK]
EXPORT RCC_IRQHandler [WEAK]
EXPORT EXTI0_IRQHandler [WEAK]
EXPORT EXTI1_IRQHandler [WEAK]
EXPORT EXTI2_IRQHandler [WEAK]
EXPORT EXTI3_IRQHandler [WEAK]
EXPORT EXTI4_IRQHandler [WEAK]
EXPORT DMA1_Stream0_IRQHandler [WEAK]
EXPORT DMA1_Stream1_IRQHandler [WEAK]
EXPORT DMA1_Stream2_IRQHandler [WEAK]
EXPORT DMA1_Stream3_IRQHandler [WEAK]
EXPORT DMA1_Stream4_IRQHandler [WEAK]
EXPORT DMA1_Stream5_IRQHandler [WEAK]
EXPORT DMA1_Stream6_IRQHandler [WEAK]
EXPORT DMA1_Stream7_IRQHandler [WEAK]
EXPORT ADC_IRQHandler [WEAK]
EXPORT FDCAN1_IT0_IRQHandler [WEAK]
EXPORT FDCAN2_IT0_IRQHandler [WEAK]
EXPORT FDCAN1_IT1_IRQHandler [WEAK]
EXPORT FDCAN2_IT1_IRQHandler [WEAK]
EXPORT EXTI9_5_IRQHandler [WEAK]
EXPORT TIM1_BRK_IRQHandler [WEAK]
EXPORT TIM1_UP_IRQHandler [WEAK]
EXPORT TIM1_TRG_COM_IRQHandler [WEAK]
EXPORT TIM1_CC_IRQHandler [WEAK]
EXPORT TIM2_IRQHandler [WEAK]
EXPORT TIM3_IRQHandler [WEAK]
EXPORT TIM4_IRQHandler [WEAK]
EXPORT I2C1_EV_IRQHandler [WEAK]
EXPORT I2C1_ER_IRQHandler [WEAK]
EXPORT I2C2_EV_IRQHandler [WEAK]
EXPORT I2C2_ER_IRQHandler [WEAK]
EXPORT SPI1_IRQHandler [WEAK]
EXPORT SPI2_IRQHandler [WEAK]
EXPORT USART1_IRQHandler [WEAK]
EXPORT USART2_IRQHandler [WEAK]
EXPORT USART3_IRQHandler [WEAK]
EXPORT EXTI15_10_IRQHandler [WEAK]
EXPORT RTC_Alarm_IRQHandler [WEAK]
EXPORT TIM8_BRK_TIM12_IRQHandler [WEAK]
EXPORT TIM8_UP_TIM13_IRQHandler [WEAK]
EXPORT TIM8_TRG_COM_TIM14_IRQHandler [WEAK]
EXPORT TIM8_CC_IRQHandler [WEAK]
EXPORT DMA1_Stream7_IRQHandler [WEAK]
EXPORT FMC_IRQHandler [WEAK]
EXPORT SDMMC1_IRQHandler [WEAK]
EXPORT TIM5_IRQHandler [WEAK]
EXPORT SPI3_IRQHandler [WEAK]
EXPORT UART4_IRQHandler [WEAK]
EXPORT UART5_IRQHandler [WEAK]
EXPORT TIM6_DAC_IRQHandler [WEAK]
EXPORT TIM7_IRQHandler [WEAK]
EXPORT DMA2_Stream0_IRQHandler [WEAK]
EXPORT DMA2_Stream1_IRQHandler [WEAK]
EXPORT DMA2_Stream2_IRQHandler [WEAK]
EXPORT DMA2_Stream3_IRQHandler [WEAK]
EXPORT DMA2_Stream4_IRQHandler [WEAK]
EXPORT ETH_IRQHandler [WEAK]
EXPORT ETH_WKUP_IRQHandler [WEAK]
EXPORT FDCAN_CAL_IRQHandler [WEAK]
EXPORT DMA2_Stream5_IRQHandler [WEAK]
EXPORT DMA2_Stream6_IRQHandler [WEAK]
EXPORT DMA2_Stream7_IRQHandler [WEAK]
EXPORT USART6_IRQHandler [WEAK]
EXPORT I2C3_EV_IRQHandler [WEAK]
EXPORT I2C3_ER_IRQHandler [WEAK]
EXPORT OTG_HS_EP1_OUT_IRQHandler [WEAK]
EXPORT OTG_HS_EP1_IN_IRQHandler [WEAK]
EXPORT OTG_HS_WKUP_IRQHandler [WEAK]
EXPORT OTG_HS_IRQHandler [WEAK]
EXPORT DCMI_IRQHandler [WEAK]
EXPORT RNG_IRQHandler [WEAK]
EXPORT FPU_IRQHandler [WEAK]
EXPORT UART7_IRQHandler [WEAK]
EXPORT UART8_IRQHandler [WEAK]
EXPORT SPI4_IRQHandler [WEAK]
EXPORT SPI5_IRQHandler [WEAK]
EXPORT SPI6_IRQHandler [WEAK]
EXPORT SAI1_IRQHandler [WEAK]
EXPORT LTDC_IRQHandler [WEAK]
EXPORT LTDC_ER_IRQHandler [WEAK]
EXPORT DMA2D_IRQHandler [WEAK]
EXPORT SAI2_IRQHandler [WEAK]
EXPORT QUADSPI_IRQHandler [WEAK]
EXPORT LPTIM1_IRQHandler [WEAK]
EXPORT CEC_IRQHandler [WEAK]
EXPORT I2C4_EV_IRQHandler [WEAK]
EXPORT I2C4_ER_IRQHandler [WEAK]
EXPORT SPDIF_RX_IRQHandler [WEAK]
EXPORT OTG_FS_EP1_OUT_IRQHandler [WEAK]
EXPORT OTG_FS_EP1_IN_IRQHandler [WEAK]
EXPORT OTG_FS_WKUP_IRQHandler [WEAK]
EXPORT OTG_FS_IRQHandler [WEAK]
EXPORT DMAMUX1_OVR_IRQHandler [WEAK]
EXPORT HRTIM1_Master_IRQHandler [WEAK]
EXPORT HRTIM1_TIMA_IRQHandler [WEAK]
EXPORT HRTIM1_TIMB_IRQHandler [WEAK]
EXPORT HRTIM1_TIMC_IRQHandler [WEAK]
EXPORT HRTIM1_TIMD_IRQHandler [WEAK]
EXPORT HRTIM1_TIME_IRQHandler [WEAK]
EXPORT HRTIM1_FLT_IRQHandler [WEAK]
EXPORT DFSDM1_FLT0_IRQHandler [WEAK]
EXPORT DFSDM1_FLT1_IRQHandler [WEAK]
EXPORT DFSDM1_FLT2_IRQHandler [WEAK]
EXPORT DFSDM1_FLT3_IRQHandler [WEAK]
EXPORT SAI3_IRQHandler [WEAK]
EXPORT SWPMI1_IRQHandler [WEAK]
EXPORT TIM15_IRQHandler [WEAK]
EXPORT TIM16_IRQHandler [WEAK]
EXPORT TIM17_IRQHandler [WEAK]
EXPORT MDIOS_WKUP_IRQHandler [WEAK]
EXPORT MDIOS_IRQHandler [WEAK]
EXPORT JPEG_IRQHandler [WEAK]
EXPORT MDMA_IRQHandler [WEAK]
EXPORT SDMMC2_IRQHandler [WEAK]
EXPORT HSEM1_IRQHandler [WEAK]
EXPORT ADC3_IRQHandler [WEAK]
EXPORT DMAMUX2_OVR_IRQHandler [WEAK]
EXPORT BDMA_Channel0_IRQHandler [WEAK]
EXPORT BDMA_Channel1_IRQHandler [WEAK]
EXPORT BDMA_Channel2_IRQHandler [WEAK]
EXPORT BDMA_Channel3_IRQHandler [WEAK]
EXPORT BDMA_Channel4_IRQHandler [WEAK]
EXPORT BDMA_Channel5_IRQHandler [WEAK]
EXPORT BDMA_Channel6_IRQHandler [WEAK]
EXPORT BDMA_Channel7_IRQHandler [WEAK]
EXPORT COMP1_IRQHandler [WEAK]
EXPORT LPTIM2_IRQHandler [WEAK]
EXPORT LPTIM3_IRQHandler [WEAK]
EXPORT LPTIM4_IRQHandler [WEAK]
EXPORT LPTIM5_IRQHandler [WEAK]
EXPORT LPUART1_IRQHandler [WEAK]
EXPORT CRS_IRQHandler [WEAK]
EXPORT ECC_IRQHandler [WEAK]
EXPORT SAI4_IRQHandler [WEAK]
EXPORT WAKEUP_PIN_IRQHandler [WEAK]
WWDG_IRQHandler
PVD_AVD_IRQHandler
TAMP_STAMP_IRQHandler
RTC_WKUP_IRQHandler
FLASH_IRQHandler
RCC_IRQHandler
EXTI0_IRQHandler
EXTI1_IRQHandler
EXTI2_IRQHandler
EXTI3_IRQHandler
EXTI4_IRQHandler
DMA1_Stream0_IRQHandler
DMA1_Stream1_IRQHandler
DMA1_Stream2_IRQHandler
DMA1_Stream3_IRQHandler
DMA1_Stream4_IRQHandler
DMA1_Stream5_IRQHandler
DMA1_Stream6_IRQHandler
ADC_IRQHandler
FDCAN1_IT0_IRQHandler
FDCAN2_IT0_IRQHandler
FDCAN1_IT1_IRQHandler
FDCAN2_IT1_IRQHandler
EXTI9_5_IRQHandler
TIM1_BRK_IRQHandler
TIM1_UP_IRQHandler
TIM1_TRG_COM_IRQHandler
TIM1_CC_IRQHandler
TIM2_IRQHandler
TIM3_IRQHandler
TIM4_IRQHandler
I2C1_EV_IRQHandler
I2C1_ER_IRQHandler
I2C2_EV_IRQHandler
I2C2_ER_IRQHandler
SPI1_IRQHandler
SPI2_IRQHandler
USART1_IRQHandler
USART2_IRQHandler
USART3_IRQHandler
EXTI15_10_IRQHandler
RTC_Alarm_IRQHandler
TIM8_BRK_TIM12_IRQHandler
TIM8_UP_TIM13_IRQHandler
TIM8_TRG_COM_TIM14_IRQHandler
TIM8_CC_IRQHandler
DMA1_Stream7_IRQHandler
FMC_IRQHandler
SDMMC1_IRQHandler
TIM5_IRQHandler
SPI3_IRQHandler
UART4_IRQHandler
UART5_IRQHandler
TIM6_DAC_IRQHandler
TIM7_IRQHandler
DMA2_Stream0_IRQHandler
DMA2_Stream1_IRQHandler
DMA2_Stream2_IRQHandler
DMA2_Stream3_IRQHandler
DMA2_Stream4_IRQHandler
ETH_IRQHandler
ETH_WKUP_IRQHandler
FDCAN_CAL_IRQHandler
DMA2_Stream5_IRQHandler
DMA2_Stream6_IRQHandler
DMA2_Stream7_IRQHandler
USART6_IRQHandler
I2C3_EV_IRQHandler
I2C3_ER_IRQHandler
OTG_HS_EP1_OUT_IRQHandler
OTG_HS_EP1_IN_IRQHandler
OTG_HS_WKUP_IRQHandler
OTG_HS_IRQHandler
DCMI_IRQHandler
RNG_IRQHandler
FPU_IRQHandler
UART7_IRQHandler
UART8_IRQHandler
SPI4_IRQHandler
SPI5_IRQHandler
SPI6_IRQHandler
SAI1_IRQHandler
LTDC_IRQHandler
LTDC_ER_IRQHandler
DMA2D_IRQHandler
SAI2_IRQHandler
QUADSPI_IRQHandler
LPTIM1_IRQHandler
CEC_IRQHandler
I2C4_EV_IRQHandler
I2C4_ER_IRQHandler
SPDIF_RX_IRQHandler
OTG_FS_EP1_OUT_IRQHandler
OTG_FS_EP1_IN_IRQHandler
OTG_FS_WKUP_IRQHandler
OTG_FS_IRQHandler
DMAMUX1_OVR_IRQHandler
HRTIM1_Master_IRQHandler
HRTIM1_TIMA_IRQHandler
HRTIM1_TIMB_IRQHandler
HRTIM1_TIMC_IRQHandler
HRTIM1_TIMD_IRQHandler
HRTIM1_TIME_IRQHandler
HRTIM1_FLT_IRQHandler
DFSDM1_FLT0_IRQHandler
DFSDM1_FLT1_IRQHandler
DFSDM1_FLT2_IRQHandler
DFSDM1_FLT3_IRQHandler
SAI3_IRQHandler
SWPMI1_IRQHandler
TIM15_IRQHandler
TIM16_IRQHandler
TIM17_IRQHandler
MDIOS_WKUP_IRQHandler
MDIOS_IRQHandler
JPEG_IRQHandler
MDMA_IRQHandler
SDMMC2_IRQHandler
HSEM1_IRQHandler
ADC3_IRQHandler
DMAMUX2_OVR_IRQHandler
BDMA_Channel0_IRQHandler
BDMA_Channel1_IRQHandler
BDMA_Channel2_IRQHandler
BDMA_Channel3_IRQHandler
BDMA_Channel4_IRQHandler
BDMA_Channel5_IRQHandler
BDMA_Channel6_IRQHandler
BDMA_Channel7_IRQHandler
COMP1_IRQHandler
LPTIM2_IRQHandler
LPTIM3_IRQHandler
LPTIM4_IRQHandler
LPTIM5_IRQHandler
LPUART1_IRQHandler
CRS_IRQHandler
ECC_IRQHandler
SAI4_IRQHandler
WAKEUP_PIN_IRQHandler
B .
ENDP
ALIGN
;*******************************************************************************
; User Stack and Heap initialization
;*******************************************************************************
IF :DEF:__MICROLIB
EXPORT __initial_sp
EXPORT __heap_base
EXPORT __heap_limit
ELSE
IMPORT __use_two_region_memory
EXPORT __user_initial_stackheap
__user_initial_stackheap
LDR R0, = Heap_Mem
LDR R1, =(Stack_Mem + Stack_Size)
LDR R2, = (Heap_Mem + Heap_Size)
LDR R3, = Stack_Mem
BX LR
ALIGN
ENDIF
END
;************************ (C) COPYRIGHT STMicroelectronics *****END OF FILE*****

@ -64,6 +64,7 @@ ascii
asf
asm
asn
aspr
ast
async
atmega
@ -818,6 +819,7 @@ fpga
fpidiv
fprintf
fpu
fpscr
fr
framming
france
@ -1235,6 +1237,7 @@ lsb
lserialputstring
lsize
lsl
lsls
lsr
lstringlength
ltd
@ -3130,6 +3133,7 @@ vbuttonisrhandler
vcellularconnecttask
vcellulardemotask
vclearemactxbuffer
vcmp
vconfiguretimerforruntimestats
vcore
vcreatesuicidaltask
@ -3183,6 +3187,7 @@ vmaindeleteme
vmainpoststopprocessing
vmemchecktask
vmov
vmrs
vodafone
votademotask
vpartestinitialise

Loading…
Cancel
Save