# FreeRTOS, idle hook and gcc

**URL:** <https://forums.freertos.org/t/freertos-idle-hook-and-gcc/5031>\
**Category:** Kernel\
**Created:** [September 2, 2006, 4:23pm UTC](https://forums.freertos.org/t/freertos-idle-hook-and-gcc/5031 "2006-09-02T16:23:17Z")\
**Posts on this page:** 4\
**Page:** 1

<div class="post-metadata">

**Author:** ![system](https://d2v6vdsk2p900z.cloudfront.net/original/1X/7fc8fdb729c645aab5b20282bbe34e57cb407be6.jpeg) [@system](https://forums.freertos.org/u/system)\
**Post date:** [September 2, 2006, 4:23pm UTC](https://forums.freertos.org/t/freertos-idle-hook-and-gcc/5031/1 "2006-09-02T16:23:17Z")

</div>

**nobody** wrote on [Saturday, September 02, 2006](https://sourceforge.net/p/freertos/discussion/382005/thread/de916333/#1007):

hello,

Subject: optimalization

Problem:  
OS works fine with -O1 -O2 -O3 and -Os but fails after 7-100 (during return from vApplicationIdleHook, when IDLE task is active, undefined instruction interrupt is generated) ticks with -O2 flag (without optimalization), when I set configUSE\_IDLE\_HOOK to 0 OS does not crash! why???

Hardware: AT91SAM7S256  
Compiler: GCC 4.1.1 (WinARM 2006.06.06)  
OS: FreeRTOS 4.1.0 (independent), configTOTAL\_HEAP\_SIZE = 24000

best rgs  
Janusz

---

<div class="post-metadata">

**Author:** ![system](https://d2v6vdsk2p900z.cloudfront.net/original/1X/7fc8fdb729c645aab5b20282bbe34e57cb407be6.jpeg) [@system](https://forums.freertos.org/u/system)\
**Post date:** [September 2, 2006, 4:43pm UTC](https://forums.freertos.org/t/freertos-idle-hook-and-gcc/5031/2 "2006-09-02T16:43:32Z")

</div>

**nobody** wrote on [Saturday, September 02, 2006](https://sourceforge.net/p/freertos/discussion/382005/thread/de916333/#1007/5432):

void vApplicationIdleHook( void )&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  
{  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AT91C\_BASE\_PIOA-\>PIO\_SODR = LED1;  
}

code with -O1:

00109024 \<vApplicationIdleHook\>:  
&nbsp; 109024:&nbsp;&nbsp;&nbsp; 2201&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; movs&nbsp;&nbsp;&nbsp; r2, #1  
&nbsp; 109026:&nbsp;&nbsp;&nbsp; 4b01&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ldr&nbsp;&nbsp;&nbsp; r3, [pc, #4]&nbsp;&nbsp;&nbsp; (10902c \<.text+0x102c\>)  
&nbsp; 109028:&nbsp;&nbsp;&nbsp; 631a&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; str&nbsp;&nbsp;&nbsp; r2, [r3, #48]  
&nbsp; 10902a:&nbsp;&nbsp;&nbsp; 4770&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bx&nbsp;&nbsp;&nbsp; lr

0010a850 \<prvIdleTask\>:  
&nbsp; 10a850:&nbsp;&nbsp;&nbsp; b5f0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp;&nbsp; {r4, r5, r6, r7, lr}  
&nbsp; 10a852:&nbsp;&nbsp;&nbsp; 4e18&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ldr&nbsp;&nbsp;&nbsp; r6, [pc, #96]&nbsp;&nbsp;&nbsp; (10a8b4 \<.text+0x28b4\>)  
&nbsp; 10a854:&nbsp;&nbsp;&nbsp; 4f18&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ldr&nbsp;&nbsp;&nbsp; r7, [pc, #96]&nbsp;&nbsp;&nbsp; (10a8b8 \<.text+0x28b8\>)  
&nbsp; 10a856:&nbsp;&nbsp;&nbsp; 6833&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ldr&nbsp;&nbsp;&nbsp; r3, [r6, #0]  
&nbsp; 10a858:&nbsp;&nbsp;&nbsp; 2b00&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cmp&nbsp;&nbsp;&nbsp; r3, #0  
&nbsp; 10a85a:&nbsp;&nbsp;&nbsp; d023&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; beq.n&nbsp;&nbsp;&nbsp; 10a8a4 \<prvIdleTask+0x54\>  
&nbsp; 10a85c:&nbsp;&nbsp;&nbsp; f7ff f9e8&nbsp;&nbsp;&nbsp;&nbsp; bl&nbsp;&nbsp;&nbsp; 109c30 \<vTaskSuspendAll\>  
&nbsp; 10a860:&nbsp;&nbsp;&nbsp; 683c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ldr&nbsp;&nbsp;&nbsp; r4, [r7, #0]  
&nbsp; 10a862:&nbsp;&nbsp;&nbsp; f7ff ff29&nbsp;&nbsp;&nbsp;&nbsp; bl&nbsp;&nbsp;&nbsp; 10a6b8 \<xTaskResumeAll\>  
&nbsp; 10a866:&nbsp;&nbsp;&nbsp; 2c00&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cmp&nbsp;&nbsp;&nbsp; r4, #0  
&nbsp; 10a868:&nbsp;&nbsp;&nbsp; d01c&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; beq.n&nbsp;&nbsp;&nbsp; 10a8a4 \<prvIdleTask+0x54\>  
&nbsp; 10a86a:&nbsp;&nbsp;&nbsp; f005 f989&nbsp;&nbsp;&nbsp;&nbsp; bl&nbsp;&nbsp;&nbsp; 10fb80 \<\_\_vPortEnterCritical\_from\_thumb\>  
&nbsp; 10a86e:&nbsp;&nbsp;&nbsp; 683b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ldr&nbsp;&nbsp;&nbsp; r3, [r7, #0]  
&nbsp; 10a870:&nbsp;&nbsp;&nbsp; 2b00&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cmp&nbsp;&nbsp;&nbsp; r3, #0  
&nbsp; 10a872:&nbsp;&nbsp;&nbsp; d101&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bne.n&nbsp;&nbsp;&nbsp; 10a878 \<prvIdleTask+0x28\>  
&nbsp; 10a874:&nbsp;&nbsp;&nbsp; 2400&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; movs&nbsp;&nbsp;&nbsp; r4, #0  
&nbsp; 10a876:&nbsp;&nbsp;&nbsp; e003&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b.n&nbsp;&nbsp;&nbsp; 10a880 \<prvIdleTask+0x30\>  
&nbsp; 10a878:&nbsp;&nbsp;&nbsp; 4b0f&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ldr&nbsp;&nbsp;&nbsp; r3, [pc, #60]&nbsp;&nbsp;&nbsp; (10a8b8 \<.text+0x28b8\>)  
&nbsp; 10a87a:&nbsp;&nbsp;&nbsp; 3308&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; adds&nbsp;&nbsp;&nbsp; r3, #8  
&nbsp; 10a87c:&nbsp;&nbsp;&nbsp; 685b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ldr&nbsp;&nbsp;&nbsp; r3, [r3, #4]  
&nbsp; 10a87e:&nbsp;&nbsp;&nbsp; 68dc&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ldr&nbsp;&nbsp;&nbsp; r4, [r3, #12]  
&nbsp; 10a880:&nbsp;&nbsp;&nbsp; 1d20&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; adds&nbsp;&nbsp;&nbsp; r0, r4, #4  
&nbsp; 10a882:&nbsp;&nbsp;&nbsp; f7ff f921&nbsp;&nbsp;&nbsp;&nbsp; bl&nbsp;&nbsp;&nbsp; 109ac8 \<vListRemove\>  
&nbsp; 10a886:&nbsp;&nbsp;&nbsp; 4a0d&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ldr&nbsp;&nbsp;&nbsp; r2, [pc, #52]&nbsp;&nbsp;&nbsp; (10a8bc \<.text+0x28bc\>)  
&nbsp; 10a888:&nbsp;&nbsp;&nbsp; 6813&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ldr&nbsp;&nbsp;&nbsp; r3, [r2, #0]  
&nbsp; 10a88a:&nbsp;&nbsp;&nbsp; 3b01&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; subs&nbsp;&nbsp;&nbsp; r3, #1  
&nbsp; 10a88c:&nbsp;&nbsp;&nbsp; 6013&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; str&nbsp;&nbsp;&nbsp; r3, [r2, #0]  
&nbsp; 10a88e:&nbsp;&nbsp;&nbsp; 6833&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ldr&nbsp;&nbsp;&nbsp; r3, [r6, #0]  
&nbsp; 10a890:&nbsp;&nbsp;&nbsp; 3b01&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; subs&nbsp;&nbsp;&nbsp; r3, #1  
&nbsp; 10a892:&nbsp;&nbsp;&nbsp; 6033&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; str&nbsp;&nbsp;&nbsp; r3, [r6, #0]  
&nbsp; 10a894:&nbsp;&nbsp;&nbsp; f005 f978&nbsp;&nbsp;&nbsp;&nbsp; bl&nbsp;&nbsp;&nbsp; 10fb88 \<\_\_vPortExitCritical\_from\_thumb\>  
&nbsp; 10a898:&nbsp;&nbsp;&nbsp; 6b20&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ldr&nbsp;&nbsp;&nbsp; r0, [r4, #48]  
&nbsp; 10a89a:&nbsp;&nbsp;&nbsp; f7fe fe15&nbsp;&nbsp;&nbsp;&nbsp; bl&nbsp;&nbsp;&nbsp; 1094c8 \<vPortFree\>  
&nbsp; 10a89e:&nbsp;&nbsp;&nbsp; 1c20&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; adds&nbsp;&nbsp;&nbsp; r0, r4, #0  
&nbsp; 10a8a0:&nbsp;&nbsp;&nbsp; f7fe fe12&nbsp;&nbsp;&nbsp;&nbsp; bl&nbsp;&nbsp;&nbsp; 1094c8 \<vPortFree\>  
&nbsp; 10a8a4:&nbsp;&nbsp;&nbsp; 4b06&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ldr&nbsp;&nbsp;&nbsp; r3, [pc, #24]&nbsp;&nbsp;&nbsp; (10a8c0 \<.text+0x28c0\>)  
&nbsp; 10a8a6:&nbsp;&nbsp;&nbsp; 681b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ldr&nbsp;&nbsp;&nbsp; r3, [r3, #0]  
&nbsp; 10a8a8:&nbsp;&nbsp;&nbsp; 2b01&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cmp&nbsp;&nbsp;&nbsp; r3, #1  
&nbsp; 10a8aa:&nbsp;&nbsp;&nbsp; d900&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bls.n&nbsp;&nbsp;&nbsp; 10a8ae \<prvIdleTask+0x5e\>  
&nbsp; 10a8ac:&nbsp;&nbsp;&nbsp; df00&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; svc&nbsp;&nbsp;&nbsp; 0  
&nbsp; 10a8ae:&nbsp;&nbsp;&nbsp; f7fe fbb9&nbsp;&nbsp;&nbsp;&nbsp; bl&nbsp;&nbsp;&nbsp; 109024 \<vApplicationIdleHook\>  
&nbsp; 10a8b2:&nbsp;&nbsp;&nbsp; e7d0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b.n&nbsp;&nbsp;&nbsp; 10a856 \<prvIdleTask+0x6\>

code with -O0:

0010954c \<vApplicationIdleHook\>:  
&nbsp; 10954c:&nbsp;&nbsp;&nbsp; b580&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp;&nbsp; {r7, lr}  
&nbsp; 10954e:&nbsp;&nbsp;&nbsp; af02&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; add&nbsp;&nbsp;&nbsp; r7, sp, #8  
&nbsp; 109550:&nbsp;&nbsp;&nbsp; 4a03&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ldr&nbsp;&nbsp;&nbsp; r2, [pc, #12]&nbsp;&nbsp;&nbsp; (109560 \<.text+0x1560\>)  
&nbsp; 109552:&nbsp;&nbsp;&nbsp; 2301&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; movs&nbsp;&nbsp;&nbsp; r3, #1  
&nbsp; 109554:&nbsp;&nbsp;&nbsp; 6313&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; str&nbsp;&nbsp;&nbsp; r3, [r2, #48]  
&nbsp; 109556:&nbsp;&nbsp;&nbsp; 46bd&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; mov&nbsp;&nbsp;&nbsp; sp, r7  
&nbsp; 109558:&nbsp;&nbsp;&nbsp; b082&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sub&nbsp;&nbsp;&nbsp; sp, #8  
&nbsp; 10955a:&nbsp;&nbsp;&nbsp; bc80&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pop&nbsp;&nbsp;&nbsp; {r7}  
&nbsp; 10955c:&nbsp;&nbsp;&nbsp; bc01&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pop&nbsp;&nbsp;&nbsp; {r0}  
&nbsp; 10955e:&nbsp;&nbsp;&nbsp; 4700&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bx&nbsp;&nbsp;&nbsp; r0

0010c2a4 \<prvIdleTask\>:

/\*  
\* -----------------------------------------------------------  
\* The Idle task.  
\* ----------------------------------------------------------  
\*  
\* The portTASK\_FUNCTION() macro is used to allow port/compiler specific  
\* language extensions.&nbsp; The equivalent prototype for this function is:  
\*  
\* void prvIdleTask( void \*pvParameters );  
\*  
\*/  
static portTASK\_FUNCTION( prvIdleTask, pvParameters )  
{  
&nbsp; 10c2a4:&nbsp;&nbsp;&nbsp; b580&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; push&nbsp;&nbsp;&nbsp; {r7, lr}  
&nbsp; 10c2a6:&nbsp;&nbsp;&nbsp; b081&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sub&nbsp;&nbsp;&nbsp; sp, #4  
&nbsp; 10c2a8:&nbsp;&nbsp;&nbsp; af00&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; add&nbsp;&nbsp;&nbsp; r7, sp, #0  
&nbsp; 10c2aa:&nbsp;&nbsp;&nbsp; 1c3b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; adds&nbsp;&nbsp;&nbsp; r3, r7, #0  
&nbsp; 10c2ac:&nbsp;&nbsp;&nbsp; 6018&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; str&nbsp;&nbsp;&nbsp; r0, [r3, #0]  
&nbsp;&nbsp;&nbsp; /\* Stop warnings. \*/  
&nbsp;&nbsp;&nbsp; ( void ) pvParameters;

&nbsp;&nbsp;&nbsp; for( ;; )  
&nbsp;&nbsp;&nbsp; {  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /\* See if any tasks have been deleted. \*/  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; prvCheckTasksWaitingTermination();  
&nbsp; 10c2ae:&nbsp;&nbsp;&nbsp; f000 f8b7&nbsp;&nbsp;&nbsp;&nbsp; bl&nbsp;&nbsp;&nbsp; 10c420 \<prvCheckTasksWaitingTermination\>

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #if ( configUSE\_PREEMPTION == 0 )  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /\* If we are not using preemption we keep forcing a task switch to  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; see if any other task has become available.&nbsp; If we are using  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; preemption we don’t need to do this as any task becoming available  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; will automatically get the processor anyway. \*/  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; taskYIELD();&nbsp;&nbsp;&nbsp;  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #endif

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #if ( ( configUSE\_PREEMPTION == 1 ) && ( configIDLE\_SHOULD\_YIELD == 1 ) )  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /\* When using preemption tasks of equal priority will be  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timesliced.&nbsp; If a task that is sharing the idle priority is ready  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; to run then the idle task should yield before the end of the  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; timeslice.  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A critical region is not required here as we are just reading from  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; the list, and an occasional incorrect value will not matter.&nbsp; If  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; the ready list at the idle priority contains more than one task  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; then a task other than the idle task is ready to execute. \*/  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if( listCURRENT\_LIST\_LENGTH( &( pxReadyTasksLists[tskIDLE\_PRIORITY] ) ) \> ( unsigned portBASE\_TYPE ) 1 )  
&nbsp; 10c2b2:&nbsp;&nbsp;&nbsp; 4b04&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ldr&nbsp;&nbsp;&nbsp; r3, [pc, #16]&nbsp;&nbsp;&nbsp; (10c2c4 \<.text+0x42c4\>)  
&nbsp; 10c2b4:&nbsp;&nbsp;&nbsp; 681b&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ldr&nbsp;&nbsp;&nbsp; r3, [r3, #0]  
&nbsp; 10c2b6:&nbsp;&nbsp;&nbsp; 2b01&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cmp&nbsp;&nbsp;&nbsp; r3, #1  
&nbsp; 10c2b8:&nbsp;&nbsp;&nbsp; d900&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bls.n&nbsp;&nbsp;&nbsp; 10c2bc \<prvIdleTask+0x18\>  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; taskYIELD();  
&nbsp; 10c2ba:&nbsp;&nbsp;&nbsp; df00&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; svc&nbsp;&nbsp;&nbsp; 0  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #endif

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #if ( configUSE\_IDLE\_HOOK == 1 )  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; extern void vApplicationIdleHook( void );

&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /\* Call the user defined function from within the idle task.&nbsp; This  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; allows the application designer to add background functionality  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; without the overhead of a separate task.  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NOTE: vApplicationIdleHook() MUST NOT, UNDER ANY CIRCUMSTANCES,  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; CALL A FUNCTION THAT MIGHT BLOCK. \*/  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vApplicationIdleHook();  
&nbsp; 10c2bc:&nbsp;&nbsp;&nbsp; f7fd f946&nbsp;&nbsp;&nbsp;&nbsp; bl&nbsp;&nbsp;&nbsp; 10954c \<vApplicationIdleHook\>  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; #endif  
&nbsp;&nbsp;&nbsp; }  
&nbsp; 10c2c0:&nbsp;&nbsp;&nbsp; e7f5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; b.n&nbsp;&nbsp;&nbsp; 10c2ae \<prvIdleTask+0xa\>

---

<div class="post-metadata">

**Author:** ![system](https://d2v6vdsk2p900z.cloudfront.net/original/1X/7fc8fdb729c645aab5b20282bbe34e57cb407be6.jpeg) [@system](https://forums.freertos.org/u/system)\
**Post date:** [September 2, 2006, 4:55pm UTC](https://forums.freertos.org/t/freertos-idle-hook-and-gcc/5031/3 "2006-09-02T16:55:46Z")

</div>

**nobody** wrote on [Saturday, September 02, 2006](https://sourceforge.net/p/freertos/discussion/382005/thread/de916333/#1007/675d):

for this code OS failed on:

Undef handler  
OS tick count: 102  
CurrentTCB: IDLE  
parameters on TCB stack:  
top of stack: 0x2014c4,  
start of stack: 0x20106x  
depth: 0x12c (x4)  
critical nesting = 0  
SPSR = 0x2000003f (main.c and tasks.c compiled in thumb mode)  
R0 = 0x0010c2b3  
R1 = 0x01010101  
R2 = 0xfffff400  
R3 = 0x00000001  
R4 = 0x04040404  
R5 = 0x05050505  
R6 = 0x06060606  
R7 = 0x0020150c  
R8 = 0x08080808  
R9 = 0x09090909  
R10 = 0x10101010  
R11 = 0x11111111  
R12 = 0x12121212  
R13 = 0x0020150c (SP)  
R14 = 0x0010c2c1 (LR) \<= it is wrong I think  
R15 = 0x0010955c+instr (PC)

---

<div class="post-metadata">

**Author:** ![system](https://d2v6vdsk2p900z.cloudfront.net/original/1X/7fc8fdb729c645aab5b20282bbe34e57cb407be6.jpeg) [@system](https://forums.freertos.org/u/system)\
**Post date:** [September 2, 2006, 5:00pm UTC](https://forums.freertos.org/t/freertos-idle-hook-and-gcc/5031/4 "2006-09-02T17:00:56Z")

</div>

**nobody** wrote on [Saturday, September 02, 2006](https://sourceforge.net/p/freertos/discussion/382005/thread/de916333/#1007/3530):

my second task:  
&nbsp;&nbsp;&nbsp; xTaskCreate( vxTask, "vxTask", /\*comSTACK\_SIZE\*/64+18+32, NULL, uxPriority + comRX\_RELATIVE\_PRIORITY, NULL );

static void vxTask( void \*pvParameters )  
{  
&nbsp;&nbsp;&nbsp; (void) pvParameters;

&nbsp;&nbsp;&nbsp; while (1) {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AT91C\_BASE\_PIOA-\>PIO\_CODR = LED4;  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vTaskDelay(( portTickType ) 500/\*ms\*/);  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; AT91C\_BASE\_PIOA-\>PIO\_SODR = LED4;  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; vTaskDelay(( portTickType ) 500/\*ms\*/);  
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //kprintf("abc\n");  
&nbsp;&nbsp;&nbsp; }  
}

when I comment vTaskDelay system does not crash with -O0 and idle hook turned on!!!

what is going on???!!!!!!!
