stm32f4 __wfi
Jython
googcheng at gmail.com
Wed Apr 24 08:25:06 UTC 2019
arm-rtems4.11-objdump -dS hello.exe | grep idle --color=auto -n -B 5 -A 12
there is no idle function which calls wfi command
// log
508-
509-
510-
511- }
512-
513: if((*USART2_SR) & (1<<4)) // idle
514- 3aa: 4b13 ldr r3, [pc, #76] ; (3f8
<USART2_handler+0x94>)
515- 3ac: 681b ldr r3, [r3, #0]
516- 3ae: 681b ldr r3, [r3, #0]
517- 3b0: f003 0310 and.w r3, r3, #16
518- 3b4: 2b00 cmp r3, #0
519- 3b6: d00a beq.n 3ce <USART2_handler+0x6a>
520- {
521: //printk("idle ");
522-
523- temp = (*USART2_SR);
524- 3b8: 4b0f ldr r3, [pc, #60] ; (3f8
<USART2_handler+0x94>)
525- 3ba: 681b ldr r3, [r3, #0]
526- 3bc: 681b ldr r3, [r3, #0]
527- 3be: 60fb str r3, [r7, #12]
528- temp = (*USART2_DR);
529- 3c0: 4b0f ldr r3, [pc, #60] ; (400
<USART2_handler+0x9c>)
530- 3c2: 681b ldr r3, [r3, #0]
531- 3c4: 681b ldr r3, [r3, #0]
532- 3c6: 60fb str r3, [r7, #12]
533- //temp = temp;
--
627-
628-
629-
630- }
631-
632: if((*USART3_SR) & (1<<4)) // idle
633- 44c: 4b12 ldr r3, [pc, #72] ; (498
<USART3_handler+0x8c>)
634- 44e: 681b ldr r3, [r3, #0]
635- 450: 681b ldr r3, [r3, #0]
636- 452: f003 0310 and.w r3, r3, #16
637- 456: 2b00 cmp r3, #0
638- 458: d00a beq.n 470 <USART3_handler+0x64>
639- {
640: //printk("idle ");
641-
642- temp = (*USART3_SR);
643- 45a: 4b0f ldr r3, [pc, #60] ; (498
<USART3_handler+0x8c>)
644- 45c: 681b ldr r3, [r3, #0]
645- 45e: 681b ldr r3, [r3, #0]
646- 460: 60fb str r3, [r7, #12]
647- temp = (*USART3_DR);
648- 462: 4b0f ldr r3, [pc, #60] ; (4a0
<USART3_handler+0x94>)
649- 464: 681b ldr r3, [r3, #0]
650- 466: 681b ldr r3, [r3, #0]
651- 468: 60fb str r3, [r7, #12]
652-
--
26329-
26330- if (newTail == tty->rawOutBuf.Head) {
26331- /*
26332- * Buffer has become empty
26333- */
26334: tty->rawOutBufState = rob_idle;
26335- 69a0: f880 5094 strb.w r5, [r0, #148] ; 0x94
26336- (*tty->handler.write) (ctx, NULL, 0);
26337- 69a4: f8d4 30c4 ldr.w r3, [r4, #196] ; 0xc4
26338- 69a8: 4670 mov r0, lr
26339- 69aa: 4629 mov r1, r5
26340- 69ac: 462a mov r2, r5
26341- 69ae: 4798 blx r3
26342- nToSend = 0;
26343-
26344- /*
26345- * check to see if snd wakeup callback was set
26346- */
--
26443- 6a12: 2600 movs r6, #0
26444- 6a14: e7ac b.n 6970
<rtems_termios_refill_transmitter+0x7c>
26445- /*
26446- * Buffer has become empty
26447- */
26448: tty->rawOutBufState = rob_idle;
26449- (*tty->handler.write) (ctx, NULL, 0);
26450- nToSend = 0;
26451- 6a16: 461d mov r5, r3
26452- 6a18: e7aa b.n 6970
<rtems_termios_refill_transmitter+0x7c>
26453- 6a1a: bf00 nop
26454-
26455-00006a1c <rtems_termios_txdaemon>:
26456-
26457-/*
26458- * this task actually processes any transmit events
26459- */
26460-static rtems_task rtems_termios_txdaemon(rtems_task_argument argument)
--
27083- RTEMS_NO_PRIORITY,
27084- &tty->rawOutBuf.Semaphore);
27085- if (sc != RTEMS_SUCCESSFUL)
27086- 6cc0: 2800 cmp r0, #0
27087- 6cc2: f040 80d6 bne.w 6e72
<rtems_termios_open_tty+0x2de>
27088: tty->rawOutBufState = rob_idle;
27089-
27090- /*
27091- * Set callbacks
27092- */
27093- if (device_node != NULL) {
27094- 6cc6: 9b0e ldr r3, [sp, #56] ; 0x38
27095- RTEMS_SIMPLE_BINARY_SEMAPHORE | RTEMS_FIFO,
27096- RTEMS_NO_PRIORITY,
27097- &tty->rawOutBuf.Semaphore);
27098- if (sc != RTEMS_SUCCESSFUL)
27099- rtems_fatal_error_occurred (sc);
27100: tty->rawOutBufState = rob_idle;
27101- 6cc8: f884 0094 strb.w r0, [r4, #148] ; 0x94
27102-
27103- /*
27104- * Set callbacks
27105- */
27106- if (device_node != NULL) {
27107- 6ccc: 2b00 cmp r3, #0
27108- 6cce: f000 80e9 beq.w 6ea4
<rtems_termios_open_tty+0x310>
27109- device_node->tty = tty;
27110- tty->handler = *device_node->handler;
27111- 6cd2: f104 0cb8 add.w ip, r4, #184 ; 0xb8
27112- 6cd6: 4666 mov r6, ip
--
29226- /* disable interrupts */
29227- rtems_termios_device_lock_acquire (ctx, &lock_context);
29228- tty->flow_ctrl &= ~FL_OSTOP;
29229- 7442: f8d4 30d8 ldr.w r3, [r4, #216] ; 0xd8
29230- /* check for chars in output buffer (or rob_state?) */
29231: if (tty->rawOutBufState != rob_idle) {
29232- 7446: f894 2094 ldrb.w r2, [r4, #148] ; 0x94
29233-
29234- /* has output been stopped due to received XOFF? */
29235- if (tty->flow_ctrl & FL_OSTOP) {
29236- /* disable interrupts */
29237- rtems_termios_device_lock_acquire (ctx, &lock_context);
29238- tty->flow_ctrl &= ~FL_OSTOP;
29239- 744a: f023 0320 bic.w r3, r3, #32
29240- 744e: f8c4 30d8 str.w r3, [r4, #216] ; 0xd8
29241- /* check for chars in output buffer (or rob_state?) */
29242: if (tty->rawOutBufState != rob_idle) {
29243- 7452: 2a00 cmp r2, #0
29244- 7454: f040 80cf bne.w 75f6 <rtems_termios_ioctl+0x306>
29245- ARM_SWITCH_BACK
29246- : ARM_SWITCH_OUTPUT
29247- : [level] "r" (level)
29248- );
29249-#elif defined(ARM_MULTILIB_ARCH_V7M)
29250- __asm__ volatile (
29251- 7458: f387 8811 msr BASEPRI, r7
29252- /* reenable interrupts */
29253- rtems_termios_device_lock_release (ctx, &lock_context);
29254- }
--
29492-
29493- rtems_termios_device_lock_acquire (ctx, &lock_context);
29494- tty->rawOutBuf.Tail = 0;
29495- 7572: f8c4 0084 str.w r0, [r4, #132] ; 0x84
29496- tty->rawOutBuf.Head = 0;
29497: tty->rawOutBufState = rob_idle;
29498- 7576: f884 0094 strb.w r0, [r4, #148] ; 0x94
29499- rtems_termios_device_context *ctx = tty->device_context;
29500- rtems_interrupt_lock_context lock_context;
29501-
29502- rtems_termios_device_lock_acquire (ctx, &lock_context);
29503- tty->rawOutBuf.Tail = 0;
29504- tty->rawOutBuf.Head = 0;
29505- 757a: f8c4 0080 str.w r0, [r4, #128] ; 0x80
29506- ARM_SWITCH_BACK
29507- : ARM_SWITCH_OUTPUT
29508- : [level] "r" (level)
29509- );
--
29562-
29563- rtems_termios_device_lock_acquire (ctx, &lock_context);
29564- tty->rawOutBuf.Tail = 0;
29565- 75b0: f8c4 0084 str.w r0, [r4, #132] ; 0x84
29566- tty->rawOutBuf.Head = 0;
29567: tty->rawOutBufState = rob_idle;
29568- 75b4: f884 0094 strb.w r0, [r4, #148] ; 0x94
29569- rtems_termios_device_context *ctx = tty->device_context;
29570- rtems_interrupt_lock_context lock_context;
29571-
29572- rtems_termios_device_lock_acquire (ctx, &lock_context);
29573- tty->rawOutBuf.Tail = 0;
29574- tty->rawOutBuf.Head = 0;
29575- 75b8: f8c4 0080 str.w r0, [r4, #128] ; 0x80
29576- ARM_SWITCH_BACK
29577- : ARM_SWITCH_OUTPUT
29578- : [level] "r" (level)
29579- );
--
29629- 75f0: 2301 movs r3, #1
29630- 75f2: 66e3 str r3, [r4, #108] ; 0x6c
29631- 75f4: e77e b.n 74f4 <rtems_termios_ioctl+0x204>
29632- tty->flow_ctrl &= ~FL_OSTOP;
29633- /* check for chars in output buffer (or rob_state?) */
29634: if (tty->rawOutBufState != rob_idle) {
29635- /* if chars available, call write function... */
29636- (*tty->handler.write)(
29637- ctx, &tty->rawOutBuf.theBuf[tty->rawOutBuf.Tail],1);
29638- 75f6: f8d4 2084 ldr.w r2, [r4, #132] ; 0x84
29639- rtems_termios_device_lock_acquire (ctx, &lock_context);
29640- tty->flow_ctrl &= ~FL_OSTOP;
29641- /* check for chars in output buffer (or rob_state?) */
29642: if (tty->rawOutBufState != rob_idle) {
29643- /* if chars available, call write function... */
29644- (*tty->handler.write)(
29645- 75fa: 6fe1 ldr r1, [r4, #124] ; 0x7c
29646- 75fc: f8d4 30c4 ldr.w r3, [r4, #196] ; 0xc4
29647- 7600: 4411 add r1, r2
29648- 7602: 4628 mov r0, r5
29649- 7604: 2201 movs r2, #1
29650- 7606: 4798 blx r3
29651- 7608: e726 b.n 7458 <rtems_termios_ioctl+0x168>
29652- 760a: bf00 nop
29653-
29654-0000760c <rtems_termios_puts>:
--
29815- 76b2: bf24 itt cs
29816- 76b4: f8d4 2088 ldrcs.w r2, [r4, #136] ; 0x88
29817- 76b8: 1a9b subcs r3, r3, r2
29818- tty->rawOutBuf.Head = newHead;
29819-
29820: if (tty->rawOutBufState == rob_idle) {
29821- 76ba: f894 2094 ldrb.w r2, [r4, #148] ; 0x94
29822- memcpy(&tty->rawOutBuf.theBuf[tty->rawOutBuf.Head], buf, nToCopy);
29823-
29824- newHead = tty->rawOutBuf.Head + nToCopy;
29825- if (newHead >= tty->rawOutBuf.Size)
29826- newHead -= tty->rawOutBuf.Size;
29827- tty->rawOutBuf.Head = newHead;
29828- 76be: f8c4 3080 str.w r3, [r4, #128] ; 0x80
29829-
29830: if (tty->rawOutBufState == rob_idle) {
29831- 76c2: b192 cbz r2, 76ea <rtems_termios_puts+0xde>
29832- ARM_SWITCH_BACK
29833- : ARM_SWITCH_OUTPUT
29834- : [level] "r" (level)
29835- );
29836-#elif defined(ARM_MULTILIB_ARCH_V7M)
29837- __asm__ volatile (
29838- 76c4: f385 8811 msr BASEPRI, r5
29839- if (tty->handler.mode == TERMIOS_POLLED) {
29840- (*tty->handler.write)(ctx, buf, len);
29841- return;
29842- }
--
29885- 76e8: e7d2 b.n 7690 <rtems_termios_puts+0x84>
29886- if (newHead >= tty->rawOutBuf.Size)
29887- newHead -= tty->rawOutBuf.Size;
29888- tty->rawOutBuf.Head = newHead;
29889-
29890: if (tty->rawOutBufState == rob_idle) {
29891- startXmit (tty, tty->rawOutBuf.Tail, false);
29892- 76ea: f8d4 1084 ldr.w r1, [r4, #132] ; 0x84
29893- 76ee: 4620 mov r0, r4
29894- 76f0: f7ff f8ca bl 6888 <startXmit>
29895- 76f4: e7e6 b.n 76c4 <rtems_termios_puts+0xb8>
29896- rtems_termios_device_context *ctx = tty->device_context;
29897- rtems_interrupt_lock_context lock_context;
29898- rtems_status_code sc;
29899-
29900- if (tty->handler.mode == TERMIOS_POLLED) {
29901- (*tty->handler.write)(ctx, buf, len);
29902- 76f6: f8d2 30c4 ldr.w r3, [r2, #196] ; 0xc4
--
31283- while ((tty->rawInBuf.Head != tty->rawInBuf.Tail) &&
31284- 7be4: 428a cmp r2, r1
31285- 7be6: f04f 0501 mov.w r5, #1
31286- 7bea: d968 bls.n 7cbe <rtems_termios_read+0x1a6>
31287- == (FL_MDXON | FL_ISNTXOF))
31288: && ((tty->rawOutBufState == rob_idle)
31289- || (tty->flow_ctrl & FL_OSTOP))) {
31290- /* XON should be sent now... */
31291- (*tty->handler.write)(
31292- tty->device_context, (void
*)&(tty->termios.c_cc[VSTART]), 1);
31293- 7bec: f104 0849 add.w r8, r4, #73 ; 0x49
31294- 7bf0: e012 b.n 7c18 <rtems_termios_read+0x100>
31295-
31296- rtems_termios_device_lock_release (ctx, &lock_context);
31297-
31298- /* continue processing new character */
31299- if (tty->termios.c_lflag & ICANON) {
31300- if (siproc (c, tty))
--
31401- if (((tty->flow_ctrl & (FL_MDXON | FL_ISNTXOF))
31402- 7c56: f8d4 20d8 ldr.w r2, [r4, #216] ; 0xd8
31403- 7c5a: 4013 ands r3, r2
31404- 7c5c: 4553 cmp r3, sl
31405- 7c5e: d01e beq.n 7c9e <rtems_termios_read+0x186>
31406: && ((tty->rawOutBufState == rob_idle)
31407- || (tty->flow_ctrl & FL_OSTOP))) {
31408- /* XON should be sent now... */
31409- (*tty->handler.write)(
31410- tty->device_context, (void
*)&(tty->termios.c_cc[VSTART]), 1);
31411- } else if (tty->flow_ctrl & FL_MDRTS) {
31412- 7c60: f8d4 30d8 ldr.w r3, [r4, #216] ; 0xd8
31413- 7c64: 05da lsls r2, r3, #23
31414- 7c66: d50b bpl.n 7c80 <rtems_termios_read+0x168>
31415- tty->flow_ctrl &= ~FL_IRTSOFF;
31416- 7c68: f8d4 30d8 ldr.w r3, [r4, #216] ; 0xd8
31417- /* activate RTS line */
31418- if (tty->flow.start_remote_tx != NULL) {
--
31477- < tty->lowwater) {
31478- tty->flow_ctrl &= ~FL_IREQXOF;
31479- /* if tx stopped and XON should be sent... */
31480- if (((tty->flow_ctrl & (FL_MDXON | FL_ISNTXOF))
31481- == (FL_MDXON | FL_ISNTXOF))
31482: && ((tty->rawOutBufState == rob_idle)
31483- 7c9e: f894 3094 ldrb.w r3, [r4, #148] ; 0x94
31484- 7ca2: b11b cbz r3, 7cac <rtems_termios_read+0x194>
31485- || (tty->flow_ctrl & FL_OSTOP))) {
31486- 7ca4: f8d4 30d8 ldr.w r3, [r4, #216] ; 0xd8
31487- 7ca8: 0699 lsls r1, r3, #26
31488- 7caa: d5d9 bpl.n 7c60 <rtems_termios_read+0x148>
31489- /* XON should be sent now... */
31490- (*tty->handler.write)(
31491- 7cac: f8d4 30c4 ldr.w r3, [r4, #196] ; 0xc4
31492- 7cb0: f8d4 010c ldr.w r0, [r4, #268] ; 0x10c
31493- 7cb4: 4641 mov r1, r8
31494- 7cb6: 2201 movs r2, #1
--
32101- /* disable interrupts */
32102- rtems_termios_device_lock_acquire (ctx, &lock_context);
32103- tty->flow_ctrl &= ~FL_OSTOP;
32104- 7f34: f8d4 30d8 ldr.w r3, [r4, #216] ; 0xd8
32105- /* check for chars in output buffer (or rob_state?) */
32106: if (tty->rawOutBufState != rob_idle) {
32107- 7f38: f894 2094 ldrb.w r2, [r4, #148] ; 0x94
32108- if (flow_rcv) {
32109- /* restart output according to FL_ORCVXOF flag */
32110- if ((tty->flow_ctrl & (FL_ORCVXOF | FL_OSTOP)) == FL_OSTOP) {
32111- /* disable interrupts */
32112- rtems_termios_device_lock_acquire (ctx, &lock_context);
32113- tty->flow_ctrl &= ~FL_OSTOP;
32114- 7f3c: f023 0320 bic.w r3, r3, #32
32115- 7f40: f8c4 30d8 str.w r3, [r4, #216] ; 0xd8
32116- /* check for chars in output buffer (or rob_state?) */
32117: if (tty->rawOutBufState != rob_idle) {
32118- 7f44: b94a cbnz r2, 7f5a
<rtems_termios_enqueue_raw_characters+0x1ca>
32119- ARM_SWITCH_BACK
32120- : ARM_SWITCH_OUTPUT
32121- : [level] "r" (level)
32122- );
32123-#elif defined(ARM_MULTILIB_ARCH_V7M)
32124- __asm__ volatile (
32125- 7f46: f386 8811 msr BASEPRI, r6
32126- 7f4a: 2601 movs r6, #1
32127- 7f4c: e760 b.n 7e10
<rtems_termios_enqueue_raw_characters+0x80>
32128- if (( !tty->tty_rcvwakeup ) && ( tty->tty_rcv.sw_pfn != NULL
)) {
32129- (*tty->tty_rcv.sw_pfn)(&tty->termios, tty->tty_rcv.sw_arg);
--
32136- 7f52: 9300 str r3, [sp, #0]
32137- 7f54: f38a 8811 msr BASEPRI, sl
32138- 7f58: e75a b.n 7e10
<rtems_termios_enqueue_raw_characters+0x80>
32139- tty->flow_ctrl &= ~FL_OSTOP;
32140- /* check for chars in output buffer (or rob_state?) */
32141: if (tty->rawOutBufState != rob_idle) {
32142- /* if chars available, call write function... */
32143- (*tty->handler.write)(
32144- ctx, &tty->rawOutBuf.theBuf[tty->rawOutBuf.Tail], 1);
32145- 7f5a: f8d4 2084 ldr.w r2, [r4, #132] ; 0x84
32146- rtems_termios_device_lock_acquire (ctx, &lock_context);
32147- tty->flow_ctrl &= ~FL_OSTOP;
32148- /* check for chars in output buffer (or rob_state?) */
32149: if (tty->rawOutBufState != rob_idle) {
32150- /* if chars available, call write function... */
32151- (*tty->handler.write)(
32152- 7f5e: 6fe1 ldr r1, [r4, #124] ; 0x7c
32153- 7f60: f8d4 30c4 ldr.w r3, [r4, #196] ; 0xc4
32154- 7f64: 4411 add r1, r2
32155- 7f66: 4658 mov r0, fp
32156- 7f68: 2201 movs r2, #1
32157- 7f6a: f8cd c004 str.w ip, [sp, #4]
32158- 7f6e: 4798 blx r3
32159- 7f70: f8dd c004 ldr.w ip, [sp, #4]
32160- 7f74: e7e7 b.n 7f46
<rtems_termios_enqueue_raw_characters+0x1b6>
32161- + tty->rawInBuf.Size) % tty->rawInBuf.Size) >
tty->highwater)) {
--
32167- 7f76: 0692 lsls r2, r2, #26
32168- 7f78: d403 bmi.n 7f82
<rtems_termios_enqueue_raw_characters+0x1f2>
32169- 7f7a: f894 2094 ldrb.w r2, [r4, #148] ; 0x94
32170- 7f7e: 2a00 cmp r2, #0
32171- 7f80: d18c bne.n 7e9c
<rtems_termios_enqueue_raw_characters+0x10c>
32172: (tty->rawOutBufState == rob_idle)) {
32173- /* if tx is stopped due to XOFF or out of data */
32174- /* call write function here */
32175- tty->flow_ctrl |= FL_ISNTXOF;
32176- 7f82: f8d4 20d8 ldr.w r2, [r4, #216] ; 0xd8
32177- 7f86: 9301 str r3, [sp, #4]
32178- 7f88: f042 0202 orr.w r2, r2, #2
32179- 7f8c: f8c4 20d8 str.w r2, [r4, #216] ; 0xd8
32180- (*tty->handler.write)(ctx,
32181- 7f90: f8d4 30c4 ldr.w r3, [r4, #196] ; 0xc4
32182- 7f94: 4658 mov r0, fp
32183- 7f96: f104 014a add.w r1, r4, #74 ; 0x4a
32184- 7f9a: 2201 movs r2, #1
--
38521- 9512: f000 f825 bl 9560
<_Extension_Manager_initialization>
38522-
38523- _POSIX_API_Initialize();
38524- 9516: f000 f863 bl 95e0 <_POSIX_API_Initialize>
38525- 951a: 7025 strb r5, [r4, #0]
38526: _Thread_Create_idle();
38527-
38528- /*
38529- * Scheduling can properly occur now as long as we avoid
dispatching.
38530- */
38531-}
38532- 951c: e8bd 4038 ldmia.w sp!, {r3, r4, r5, lr}
38533- * _Thread_Executing and _Thread_Heir are not set.
38534- *
38535- * At this point all API extensions are in place. After the call
to
38536: * _Thread_Create_idle() _Thread_Executing and _Thread_Heir will
be set.
38537- */
38538: _Thread_Create_idle();
38539: 9520: f002 ba3a b.w b998 <_Thread_Create_idle>
38540- 9524: 20004618 .word 0x20004618
38541- 9528: 20004640 .word 0x20004640
38542- 952c: 200041d0 .word 0x200041d0
38543- 9530: 200041e0 .word 0x200041e0
38544- 9534: 2000429c .word 0x2000429c
38545- 9538: 20004298 .word 0x20004298
38546-
38547-0000953c <rtems_initialize_before_drivers>:
38548- * Scheduling can properly occur now as long as we avoid
dispatching.
38549- */
38550-}
38551-
--
48137-)
48138-{
48139- b3c4: 4770 bx lr
48140- b3c6: bf00 nop
48141-
48142:0000b3c8 <_Scheduler_default_Start_idle>:
48143-#if defined(RTEMS_SMP)
48144- Thread_Control *needs_help;
48145-
48146- needs_help =
48147-#endif
48148- ( *scheduler->Operations.unblock )( scheduler, the_thread );
48149: b3c8: 4801 ldr r0, [pc, #4] ; (b3d0
<_Scheduler_default_Start_idle+0x8>)
48150- b3ca: 6943 ldr r3, [r0, #20]
48151- b3cc: 4718 bx r3
48152- b3ce: bf00 nop
48153- b3d0: 0001847c .word 0x0001847c
48154-
48155-0000b3d4 <_Scheduler_default_Tick>:
48156- /*
48157- * If the thread is not preemptible or is not ready, then
48158- * just return.
48159- */
48160-
48161- if ( !executing->is_preemptible )
--
49735- b988: 0001847c .word 0x0001847c
49736- b98c: 0001d828 .word 0x0001d828
49737- b990: 0001d814 .word 0x0001d814
49738- b994: 0001d878 .word 0x0001d878
49739-
49740:0000b998 <_Thread_Create_idle>:
49741- cpu
49742- );
49743-}
49744-
49745:void _Thread_Create_idle( void )
49746-{
49747- b998: b5f0 push {r4, r5, r6, r7, lr}
49748- return maximum_internal_threads;
49749-}
49750-
49751-RTEMS_INLINE_ROUTINE Thread_Control *_Thread_Internal_allocate( void )
49752-{
49753- return (Thread_Control *)
49754: b99a: 4f17 ldr r7, [pc, #92] ; (b9f8
<_Thread_Create_idle+0x60>)
49755- b99c: b089 sub sp, #36 ; 0x24
49756- b99e: 4638 mov r0, r7
49757- b9a0: f7fe ff74 bl a88c <_Objects_Allocate_unprotected>
49758- _Thread_Initialize(
49759- &_Thread_Internal_information,
49760: idle,
49761- _Scheduler_Get_by_CPU( cpu ),
49762- NULL, /* allocate the stack */
49763: _Stack_Ensure_minimum(
rtems_configuration_get_idle_task_stack_size() ),
49764: b9a4: 4e15 ldr r6, [pc, #84] ; (b9fc
<_Thread_Create_idle+0x64>)
49765- *
49766- * @return This method returns the minimum stack size;
49767- */
49768-RTEMS_INLINE_ROUTINE uint32_t _Stack_Minimum (void)
49769-{
49770- return rtems_minimum_stack_size;
49771: b9a6: 4a16 ldr r2, [pc, #88] ; (ba00
<_Thread_Create_idle+0x68>)
49772- b9a8: 6a73 ldr r3, [r6, #36] ; 0x24
49773- b9aa: 6811 ldr r1, [r2, #0]
49774- b9ac: 4605 mov r5, r0
49775- b9ae: 428b cmp r3, r1
49776- b9b0: bf38 it cc
49777- b9b2: 460b movcc r3, r1
49778- * fields not explicitly assigned were explicitly zeroed by
49779- * _Workspace_Initialization.
49780- */
49781: idle = _Thread_Internal_allocate();
49782-
49783- _Thread_Initialize(
49784: b9b4: 4a13 ldr r2, [pc, #76] ; (ba04
<_Thread_Create_idle+0x6c>)
49785:static void _Thread_Create_idle_for_cpu( Per_CPU_Control *cpu )
49786-{
49787- Objects_Name name;
49788: Thread_Control *idle;
49789-
49790- name.name_u32 = _Objects_Build_name( 'I', 'D', 'L', 'E' );
49791: b9b6: f8df e058 ldr.w lr, [pc, #88] ; ba10
<_Thread_Create_idle+0x78>
49792- * fields not explicitly assigned were explicitly zeroed by
49793- * _Workspace_Initialization.
49794- */
49795: idle = _Thread_Internal_allocate();
49796-
49797- _Thread_Initialize(
49798- b9ba: 7811 ldrb r1, [r2, #0]
49799- b9bc: 2400 movs r4, #0
49800- b9be: 2201 movs r2, #1
49801- b9c0: 9300 str r3, [sp, #0]
49802- b9c2: 9102 str r1, [sp, #8]
49803- b9c4: f8cd e01c str.w lr, [sp, #28]
49804- b9c8: 4629 mov r1, r5
49805- b9ca: 4623 mov r3, r4
49806- b9cc: 9203 str r2, [sp, #12]
49807- b9ce: 4638 mov r0, r7
49808- b9d0: 9401 str r4, [sp, #4]
49809- b9d2: 9404 str r4, [sp, #16]
49810- b9d4: 9405 str r4, [sp, #20]
49811- b9d6: 9406 str r4, [sp, #24]
49812: b9d8: 4a0b ldr r2, [pc, #44] ; (ba08
<_Thread_Create_idle+0x70>)
49813- b9da: f000 f96d bl bcb8 <_Thread_Initialize>
49814- * MUST be done before _Thread_Start is invoked.
49815- */
49816- cpu->heir =
49817: cpu->executing = idle;
49818-
49819- _Thread_Start(
49820- b9de: 6a32 ldr r2, [r6, #32]
49821- /*
49822- * WARNING!!! This is necessary to "kick" start the system and
49823- * MUST be done before _Thread_Start is invoked.
49824- */
49825- cpu->heir =
49826: cpu->executing = idle;
49827: b9e0: 4e0a ldr r6, [pc, #40] ; (ba0c
<_Thread_Create_idle+0x74>)
49828-
49829- _Thread_Start(
49830- b9e2: 9400 str r4, [sp, #0]
49831- b9e4: 9601 str r6, [sp, #4]
49832- b9e6: 4628 mov r0, r5
49833- b9e8: 4621 mov r1, r4
49834- b9ea: 4623 mov r3, r4
49835- /*
49836- * WARNING!!! This is necessary to "kick" start the system and
49837- * MUST be done before _Thread_Start is invoked.
49838- */
49839- cpu->heir =
49840: cpu->executing = idle;
49841- b9ec: 60b5 str r5, [r6, #8]
49842-
49843- /*
49844- * WARNING!!! This is necessary to "kick" start the system and
49845- * MUST be done before _Thread_Start is invoked.
49846- */
49847- cpu->heir =
49848- b9ee: 60f5 str r5, [r6, #12]
49849: cpu->executing = idle;
49850-
49851- _Thread_Start(
49852- b9f0: f000 fee0 bl c7b4 <_Thread_Start>
49853-
49854- if ( _Per_CPU_Is_processor_started( cpu ) ) {
49855: _Thread_Create_idle_for_cpu( cpu );
49856- }
49857- }
49858-}
49859- b9f4: b009 add sp, #36 ; 0x24
49860- b9f6: bdf0 pop {r4, r5, r6, r7, pc}
49861- b9f8: 200042c0 .word 0x200042c0
49862- b9fc: 000183c0 .word 0x000183c0
49863- ba00: 200011c0 .word 0x200011c0
49864- ba04: 200011bc .word 0x200011bc
49865- ba08: 0001847c .word 0x0001847c
49866- ba0c: 20004640 .word 0x20004640
49867- ba10: 49444c45 .word 0x49444c45
--
54093- const Scheduler_Control *scheduler,
54094- Thread_Control *the_thread,
54095- Per_CPU_Control *cpu
54096-)
54097-{
54098: ( *scheduler->Operations.start_idle )( scheduler, the_thread, cpu );
54099- c7de: 4809 ldr r0, [pc, #36] ; (c804
<_Thread_Start+0x50>)
54100- _Thread_Ready( the_thread );
54101- } else {
54102- const Scheduler_Control *scheduler = _Scheduler_Get_by_CPU( cpu
);
54103-
54104- if ( scheduler != NULL ) {
54105- the_thread->current_state = STATES_READY;
54106- c7e0: 2200 movs r2, #0
54107- c7e2: 612a str r2, [r5, #16]
54108- c7e4: 6b43 ldr r3, [r0, #52] ; 0x34
54109- c7e6: 4629 mov r1, r5
54110- c7e8: 9a05 ldr r2, [sp, #20]
On Wed, Apr 24, 2019 at 2:59 PM Christian Mauderer <
christian.mauderer at embedded-brains.de> wrote:
> Am 24.04.19 um 02:35 schrieb Jython:
> > yes, I need to do low power for stm32f4
> > will this line work __asm__ volatile ("wfi");?
>
> That line should be correct. Please note that the instruction is already
> used in the armv7 idle thread:
>
>
> https://git.rtems.org/rtems/tree/cpukit/score/cpu/arm/armv7-thread-idle.c#n32
>
> The stm32f4 is a Cortex-M4 so it's quite likely that this routine is
> used. You can check by doing an "arm-rtems5-objdump -dS" on your file
> and search for the idle body.
>
> With kind regards
>
> Christian
>
> >
> >
> > On Tue, Apr 23, 2019 at 10:28 PM Christian Mauderer
> > <christian.mauderer at embedded-brains.de
> > <mailto:christian.mauderer at embedded-brains.de>> wrote:
> >
> > Am 22.04.19 um 09:47 schrieb Jython:
> > > HI, ALL!
> > > wfi
> >
> http://www.keil.com/support/man/docs/armcc/armcc_chr1359125004400.htm
> > > how can i call the arm __wfi?
> > >
> > > _______________________________________________
> > > users mailing list
> > > users at rtems.org <mailto:users at rtems.org>
> > > http://lists.rtems.org/mailman/listinfo/users
> > >
> >
> > Hello Jython,
> >
> > WFI is an assembler instruction. The Keil wrapper isn't available in
> > gcc. I know of no direct replacement. Most likely you need a gcc
> inline
> > assembly for that.
> >
> > May I ask why you would need "wfi"? If you use a operating system,
> the
> > system typically handles such low level stuff for you. The only
> > application that springs to mind for that instruction is overwriting
> the
> > idle loop to save energy.
> >
> > Best regards
> >
> > Christian
> >
> > --
> > --------------------------------------------
> > embedded brains GmbH
> > Herr Christian Mauderer
> > Dornierstr. 4
> > D-82178 Puchheim
> > Germany
> > email: christian.mauderer at embedded-brains.de
> > <mailto:christian.mauderer at embedded-brains.de>
> > Phone: +49-89-18 94 741 - 18
> > Fax: +49-89-18 94 741 - 08
> > PGP: Public key available on request.
> >
> > Diese Nachricht ist keine geschäftliche Mitteilung im Sinne des EHUG.
> >
>
> --
> --------------------------------------------
> embedded brains GmbH
> Herr Christian Mauderer
> Dornierstr. 4
> D-82178 Puchheim
> Germany
> email: christian.mauderer at embedded-brains.de
> Phone: +49-89-18 94 741 - 18
> Fax: +49-89-18 94 741 - 08
> PGP: Public key available on request.
>
> Diese Nachricht ist keine geschäftliche Mitteilung im Sinne des EHUG.
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.rtems.org/pipermail/users/attachments/20190424/636c0f9a/attachment-0002.html>
More information about the users
mailing list