📄 main.c
字号:
{
lReturn = pdFAIL;
}
if( xIsCreateTaskStillRunning() != pdTRUE )
{
lReturn = pdFAIL;
}
if( xAreBlockTimeTestTasksStillRunning() != pdTRUE )
{
lReturn = pdFAIL;
}
if ( xAreGenericQueueTasksStillRunning() != pdTRUE )
{
lReturn = pdFAIL;
}
if ( xAreQueuePeekTasksStillRunning() != pdTRUE )
{
lReturn = pdFAIL;
}
/* Have the register test tasks found any errors? */
if( ulRegTestError != pdFALSE )
{
lReturn = pdFAIL;
}
return lReturn;
}
/*-----------------------------------------------------------*/
static void prvSetupHardware( void )
{
/* Allow all interrupt levels. */
__set_il( mainINTERRUPT_LEVELS );
/* Initialise interrupts. */
InitIrqLevels();
/* Initialise the ports used by the LEDs. */
vParTestInitialise();
/* If we are going to use the watchdog, then initialise it now. */
#if WATCHDOG != WTC_NONE
InitWatchdog();
#endif
}
/*-----------------------------------------------------------*/
/* Idle hook function. */
#if configUSE_IDLE_HOOK == 1
void vApplicationIdleHook( void )
{
/* Are we using the idle task to kick the watchdog? See watchdog.h
for watchdog kicking options. Note this is for demonstration only
and is not a suggested method of servicing the watchdog in a real
application. */
#if WATCHDOG == WTC_IN_IDLE
Kick_Watchdog();
#endif
vCoRoutineSchedule();
}
#else
#if WATCHDOG == WTC_IN_IDLE
#error configUSE_IDLE_HOOK must be set to 1 in FreeRTOSConfig.h if the watchdog is being cleared in the idle task hook.
#endif
#endif
/*-----------------------------------------------------------*/
/* Tick hook function. */
#if configUSE_TICK_HOOK == 1
void vApplicationTickHook( void )
{
/* Are we using the tick to kick the watchdog? See watchdog.h
for watchdog kicking options. Note this is for demonstration
only and is not a suggested method of servicing the watchdog in
a real application. */
#if WATCHDOG == WTC_IN_TICK
Kick_Watchdog();
#endif
}
#else
#if WATCHDOG == WTC_IN_TICK
#error configUSE_TICK_HOOK must be set to 1 in FreeRTOSConfig.h if the watchdog is being cleared in the tick hook.
#endif
#endif
/*-----------------------------------------------------------*/
static void vFirstRegisterTestTask( void *pvParameters )
{
extern volatile unsigned portLONG ulCriticalNesting;
/* Fills the registers with known values (different to the values
used in vSecondRegisterTestTask()), then checks that the registers still
all contain the expected value. This is done to test the context save
and restore mechanism as this task is swapped onto and off of the CPU. */
for( ;; )
{
#pragma asm
;Load known values into each register.
LDI #0x11111111, R0
LDI #0x22222222, R1
LDI #0x33333333, R2
LDI #0x44444444, R3
LDI #0x55555555, R4
LDI #0x66666666, R5
LDI #0x77777777, R6
LDI #0x88888888, R7
LDI #0x99999999, R8
LDI #0xaaaaaaaa, R9
LDI #0xbbbbbbbb, R10
LDI #0xcccccccc, R11
LDI #0xdddddddd, R12
;Check each register still contains the expected value.
LDI #0x11111111, R13
CMP R13, R0
BNE First_Set_Error
LDI #0x22222222, R13
CMP R13, R1
BNE First_Set_Error
LDI #0x33333333, R13
CMP R13, R2
BNE First_Set_Error
LDI #0x44444444, R13
CMP R13, R3
BNE First_Set_Error
LDI #0x55555555, R13
CMP R13, R4
BNE First_Set_Error
LDI #0x66666666, R13
CMP R13, R5
BNE First_Set_Error
LDI #0x77777777, R13
CMP R13, R6
BNE First_Set_Error
LDI #0x88888888, R13
CMP R13, R7
BNE First_Set_Error
LDI #0x99999999, R13
CMP R13, R8
BNE First_Set_Error
LDI #0xaaaaaaaa, R13
CMP R13, R9
BNE First_Set_Error
LDI #0xbbbbbbbb, R13
CMP R13, R10
BNE First_Set_Error
LDI #0xcccccccc, R13
CMP R13, R11
BNE First_Set_Error
LDI #0xdddddddd, R13
CMP R13, R12
BNE First_Set_Error
BRA First_Start_Next_Loop
First_Set_Error:
; Latch that an error has occurred.
LDI #_ulRegTestError, R0
LDI #0x00000001, R1
ST R1, @R0
First_Start_Next_Loop:
#pragma endasm
}
}
/*-----------------------------------------------------------*/
static void vSecondRegisterTestTask( void *pvParameters )
{
extern volatile unsigned portLONG ulCriticalNesting;
/* Fills the registers with known values (different to the values
used in vFirstRegisterTestTask()), then checks that the registers still
all contain the expected value. This is done to test the context save
and restore mechanism as this task is swapped onto and off of the CPU. */
for( ;; )
{
#pragma asm
;Load known values into each register.
LDI #0x11111111, R1
LDI #0x22222222, R2
INT #40H
LDI #0x33333333, R3
LDI #0x44444444, R4
LDI #0x55555555, R5
LDI #0x66666666, R6
LDI #0x77777777, R7
LDI #0x88888888, R8
LDI #0x99999999, R9
INT #40H
LDI #0xaaaaaaaa, R10
LDI #0xbbbbbbbb, R11
LDI #0xcccccccc, R12
LDI #0xdddddddd, R0
;Check each register still contains the expected value.
LDI #0x11111111, R13
CMP R13, R1
BNE Second_Set_Error
LDI #0x22222222, R13
CMP R13, R2
BNE Second_Set_Error
LDI #0x33333333, R13
CMP R13, R3
BNE Second_Set_Error
LDI #0x44444444, R13
CMP R13, R4
BNE Second_Set_Error
LDI #0x55555555, R13
CMP R13, R5
BNE Second_Set_Error
INT #40H
LDI #0x66666666, R13
CMP R13, R6
BNE Second_Set_Error
LDI #0x77777777, R13
CMP R13, R7
BNE Second_Set_Error
LDI #0x88888888, R13
CMP R13, R8
BNE Second_Set_Error
LDI #0x99999999, R13
CMP R13, R9
BNE Second_Set_Error
INT #40H
LDI #0xaaaaaaaa, R13
CMP R13, R10
BNE Second_Set_Error
LDI #0xbbbbbbbb, R13
CMP R13, R11
BNE Second_Set_Error
LDI #0xcccccccc, R13
CMP R13, R12
BNE Second_Set_Error
LDI #0xdddddddd, R13
CMP R13, R0
BNE Second_Set_Error
BRA Second_Start_Next_Loop
Second_Set_Error:
; Latch that an error has occurred.
LDI #_ulRegTestError, R0
LDI #0x00000001, R1
ST R1, @R0
Second_Start_Next_Loop:
#pragma endasm
}
}
/*-----------------------------------------------------------*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -