This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

RM57L843, Halcogen 04.04.00, GCC from ARM (GNU ARM Tools Embedded) and -O0 optimization

Other Parts Discussed in Thread: RM48L952, HALCOGEN, RM57L843

Hello.

With -O0 optimization, data abort is generated just after return from getResetSource() (from HL_system.c) because of -O0 optimization lead to generate stack frames for getResetSource() and stack pointer is not initialized in _c_int00() before calling getResetSource().

There are two possible ways to workaround that problem:

1. never use -O0 option, and use -Og instead -O0. That workaround is not noted in any document.

2. refactor some Halcogen code (for example, in _c_int00() call _coreInitRegisters_() and _coreInitStackPointer_() before calling getResetSource(), this is done for RM48L952 chip).

Look at code:

void _c_int00(void)
{

/* USER CODE BEGIN (5) */
/* USER CODE END */

    /* Reset handler: the following instructions read from the system exception status register
     * to identify the cause of the CPU reset.
     */
    switch(getResetSource())
    {
        someHalcogencode();
    }
}

There is call to getResetSource() without initialization of any register or stack pointer.

Look at disassembly for getResetSource() with -O0 optimization:

 521              		.section	.text.getResetSource,"ax",%progbits
 522              		.align	2
 523              		.global	getResetSource
 525              	getResetSource:
 526              	.LFB7:
 416:../source/HL_system.c **** 
 417:../source/HL_system.c **** /* USER CODE BEGIN (25) */
 418:../source/HL_system.c **** /* USER CODE END */
 419:../source/HL_system.c **** 
 420:../source/HL_system.c **** resetSource_t getResetSource(void)
 421:../source/HL_system.c **** {
 527              		.loc 1 421 0
 528              		.cfi_startproc
 529              		@ args = 0, pretend = 0, frame = 0
 530              		@ frame_needed = 1, uses_anonymous_args = 0
 531              		@ link register save eliminated.
 532 0000 10082DE9 		stmfd	sp!, {r4, fp}
 533              		.cfi_def_cfa_offset 8
 534              		.cfi_offset 4, -8
 535              		.cfi_offset 11, -4
 536 0004 04B08DE2 		add	fp, sp, #4
 537              		.cfi_def_cfa 11, 4
 422:../source/HL_system.c ****     register resetSource_t rst_source;
 423:../source/HL_system.c **** 
 424:../source/HL_system.c ****     if ((SYS_EXCEPTION & (uint32)POWERON_RESET) != 0U)
 538              		.loc 1 424 0
 539 0008 1B30E0E3 		mvn	r3, #27
 540 000c 003093E5 		ldr	r3, [r3]
 541 0010 023903E2 		and	r3, r3, #32768
 542 0014 000053E3 		cmp	r3, #0
 543 0018 0400000A 		beq	.L14
 425:../source/HL_system.c ****     {
 426:../source/HL_system.c ****         /* power-on reset condition */
 427:../source/HL_system.c ****         rst_source = POWERON_RESET;
 544              		.loc 1 427 0
 545 001c 0249A0E3 		mov	r4, #32768
 428:../source/HL_system.c ****         
 429:../source/HL_system.c ****         /* Clear all exception status Flag and proceed since it's power up */
 430:../source/HL_system.c ****         SYS_EXCEPTION = 0x0000FFFFU;
 546              		.loc 1 430 0
 547 0020 1B30E0E3 		mvn	r3, #27
 548 0024 FF2F0FE3 		movw	r2, #65535
 549 0028 002083E5 		str	r2, [r3]
 550 002c 500000EA 		b	.L15
 551              	.L14:
 431:../source/HL_system.c ****     }
 432:../source/HL_system.c ****     else if ((SYS_EXCEPTION & (uint32)EXT_RESET) != 0U)
 552              		.loc 1 432 0
 553 0030 1B30E0E3 		mvn	r3, #27
 554 0034 003093E5 		ldr	r3, [r3]
 555 0038 083003E2 		and	r3, r3, #8
 556 003c 000053E3 		cmp	r3, #0
 557 0040 0400000A 		beq	.L16
 433:../source/HL_system.c ****     {
 434:../source/HL_system.c ****         /* Reset caused due to External reset. */
 435:../source/HL_system.c ****         rst_source = EXT_RESET;
 558              		.loc 1 435 0
 559 0044 0840A0E3 		mov	r4, #8
 436:../source/HL_system.c ****         SYS_EXCEPTION = (uint32)EXT_RESET;
 560              		.loc 1 436 0
 561 0048 1B30E0E3 		mvn	r3, #27
 562 004c 0820A0E3 		mov	r2, #8
 563 0050 002083E5 		str	r2, [r3]
 564 0054 460000EA 		b	.L15
 565              	.L16:
 437:../source/HL_system.c ****     }   
 438:../source/HL_system.c ****     else if ((SYS_EXCEPTION & (uint32)DEBUG_RESET) !=0U)
 566              		.loc 1 438 0
 567 0058 1B30E0E3 		mvn	r3, #27
 568 005c 003093E5 		ldr	r3, [r3]
 569 0060 023B03E2 		and	r3, r3, #2048
 570 0064 000053E3 		cmp	r3, #0
 571 0068 0400000A 		beq	.L17
 439:../source/HL_system.c ****     {
 440:../source/HL_system.c ****         /* Reset caused due Debug reset request */
 441:../source/HL_system.c ****         rst_source = DEBUG_RESET;
 572              		.loc 1 441 0
 573 006c 024BA0E3 		mov	r4, #2048
 442:../source/HL_system.c ****         SYS_EXCEPTION = (uint32)DEBUG_RESET;
 574              		.loc 1 442 0
 575 0070 1B30E0E3 		mvn	r3, #27
 576 0074 022BA0E3 		mov	r2, #2048
 577 0078 002083E5 		str	r2, [r3]
 578 007c 3C0000EA 		b	.L15
 579              	.L17:
 443:../source/HL_system.c ****     }   
 444:../source/HL_system.c ****     else if ((SYS_EXCEPTION & (uint32)OSC_FAILURE_RESET) != 0U)
 580              		.loc 1 444 0
 581 0080 1B30E0E3 		mvn	r3, #27
 582 0084 003093E5 		ldr	r3, [r3]
 583 0088 013903E2 		and	r3, r3, #16384
 584 008c 000053E3 		cmp	r3, #0
 585 0090 0400000A 		beq	.L18
 445:../source/HL_system.c ****     {
 446:../source/HL_system.c ****      /* Reset caused due to oscillator failure.
 447:../source/HL_system.c ****         Add user code here to handle oscillator failure */
 448:../source/HL_system.c ****         rst_source = OSC_FAILURE_RESET;
 586              		.loc 1 448 0
 587 0094 0149A0E3 		mov	r4, #16384
 449:../source/HL_system.c ****         SYS_EXCEPTION = (uint32)OSC_FAILURE_RESET;
 588              		.loc 1 449 0
 589 0098 1B30E0E3 		mvn	r3, #27
 590 009c 0129A0E3 		mov	r2, #16384
 591 00a0 002083E5 		str	r2, [r3]
 592 00a4 320000EA 		b	.L15
 593              	.L18:
 450:../source/HL_system.c ****     }
 451:../source/HL_system.c ****     else if ((SYS_EXCEPTION & (uint32)WATCHDOG_RESET) !=0U)
 594              		.loc 1 451 0
 595 00a8 1B30E0E3 		mvn	r3, #27
 596 00ac 003093E5 		ldr	r3, [r3]
 597 00b0 023A03E2 		and	r3, r3, #8192
 598 00b4 000053E3 		cmp	r3, #0
 599 00b8 0400000A 		beq	.L19
 452:../source/HL_system.c ****     {
 453:../source/HL_system.c ****         /* Reset caused due watchdog violation */
 454:../source/HL_system.c ****         rst_source = WATCHDOG_RESET;
 600              		.loc 1 454 0
 601 00bc 024AA0E3 		mov	r4, #8192
 455:../source/HL_system.c ****         SYS_EXCEPTION = (uint32)WATCHDOG_RESET;
 602              		.loc 1 455 0
 603 00c0 1B30E0E3 		mvn	r3, #27
 604 00c4 022AA0E3 		mov	r2, #8192
 605 00c8 002083E5 		str	r2, [r3]
 606 00cc 280000EA 		b	.L15
 607              	.L19:
 456:../source/HL_system.c ****     }
 457:../source/HL_system.c ****     else if ((SYS_EXCEPTION & (uint32)WATCHDOG2_RESET) !=0U)
 608              		.loc 1 457 0
 609 00d0 1B30E0E3 		mvn	r3, #27
 610 00d4 003093E5 		ldr	r3, [r3]
 611 00d8 013A03E2 		and	r3, r3, #4096
 612 00dc 000053E3 		cmp	r3, #0
 613 00e0 0400000A 		beq	.L20
 458:../source/HL_system.c ****     {
 459:../source/HL_system.c ****         /* Reset caused due watchdog violation */
 460:../source/HL_system.c ****         rst_source = WATCHDOG2_RESET;
 614              		.loc 1 460 0
 615 00e4 014AA0E3 		mov	r4, #4096
 461:../source/HL_system.c ****         SYS_EXCEPTION = (uint32)WATCHDOG2_RESET;
 616              		.loc 1 461 0
 617 00e8 1B30E0E3 		mvn	r3, #27
 618 00ec 012AA0E3 		mov	r2, #4096
 619 00f0 002083E5 		str	r2, [r3]
 620 00f4 1E0000EA 		b	.L15
 621              	.L20:
 462:../source/HL_system.c ****     }   
 463:../source/HL_system.c ****     else if ((SYS_EXCEPTION & (uint32)CPU1_RESET) !=0U)
 622              		.loc 1 463 0
 623 00f8 1B30E0E3 		mvn	r3, #27
 624 00fc 003093E5 		ldr	r3, [r3]
 625 0100 403003E2 		and	r3, r3, #64
 626 0104 000053E3 		cmp	r3, #0
 627 0108 0400000A 		beq	.L21
 464:../source/HL_system.c ****     {
 465:../source/HL_system.c ****         /* Reset caused due to CPU1 reset.
 466:../source/HL_system.c ****         CPU reset can be caused by CPU self-test completion, or
 467:../source/HL_system.c ****         by toggling the "CPU RESET" bit of the CPU Reset Control Register. */
 468:../source/HL_system.c ****         rst_source = CPU1_RESET;
 628              		.loc 1 468 0
 629 010c 4040A0E3 		mov	r4, #64
 469:../source/HL_system.c ****         SYS_EXCEPTION = (uint32)CPU1_RESET;
 630              		.loc 1 469 0
 631 0110 1B30E0E3 		mvn	r3, #27
 632 0114 4020A0E3 		mov	r2, #64
 633 0118 002083E5 		str	r2, [r3]
 634 011c 140000EA 		b	.L15
 635              	.L21:
 470:../source/HL_system.c ****     }
 471:../source/HL_system.c ****     else if ((SYS_EXCEPTION & (uint32)CPU0_RESET) !=0U)
 636              		.loc 1 471 0
 637 0120 1B30E0E3 		mvn	r3, #27
 638 0124 003093E5 		ldr	r3, [r3]
 639 0128 203003E2 		and	r3, r3, #32
 640 012c 000053E3 		cmp	r3, #0
 641 0130 0400000A 		beq	.L22
 472:../source/HL_system.c ****     {
 473:../source/HL_system.c ****         /* Reset caused due to CPU0 reset.
 474:../source/HL_system.c ****         CPU reset can be caused by CPU self-test completion, or
 475:../source/HL_system.c ****         by toggling the "CPU RESET" bit of the CPU Reset Control Register. */
 476:../source/HL_system.c ****         rst_source = CPU0_RESET;
 642              		.loc 1 476 0
 643 0134 2040A0E3 		mov	r4, #32
 477:../source/HL_system.c ****         SYS_EXCEPTION = (uint32)CPU0_RESET;
 644              		.loc 1 477 0
 645 0138 1B30E0E3 		mvn	r3, #27
 646 013c 2020A0E3 		mov	r2, #32
 647 0140 002083E5 		str	r2, [r3]
 648 0144 0A0000EA 		b	.L15
 649              	.L22:
 478:../source/HL_system.c ****     }
 479:../source/HL_system.c ****     else if ((SYS_EXCEPTION & (uint32)SW_RESET) != 0U)
 650              		.loc 1 479 0
 651 0148 1B30E0E3 		mvn	r3, #27
 652 014c 003093E5 		ldr	r3, [r3]
 653 0150 103003E2 		and	r3, r3, #16
 654 0154 000053E3 		cmp	r3, #0
 655 0158 0400000A 		beq	.L23
 480:../source/HL_system.c ****     {
 481:../source/HL_system.c ****         /* Reset caused due to software reset. */
 482:../source/HL_system.c ****         rst_source = SW_RESET;
 656              		.loc 1 482 0
 657 015c 1040A0E3 		mov	r4, #16
 483:../source/HL_system.c ****         SYS_EXCEPTION = (uint32)SW_RESET;
 658              		.loc 1 483 0
 659 0160 1B30E0E3 		mvn	r3, #27
 660 0164 1020A0E3 		mov	r2, #16
 661 0168 002083E5 		str	r2, [r3]
 662 016c 000000EA 		b	.L15
 663              	.L23:
 484:../source/HL_system.c ****     }   
 485:../source/HL_system.c ****     else
 486:../source/HL_system.c ****     {
 487:../source/HL_system.c ****         /* No_reset occured. */
 488:../source/HL_system.c ****         rst_source = NO_RESET;
 664              		.loc 1 488 0
 665 0170 0040A0E3 		mov	r4, #0
 666              	.L15:
 489:../source/HL_system.c ****     }
 490:../source/HL_system.c ****     
 491:../source/HL_system.c ****     return rst_source;
 667              		.loc 1 491 0
 668 0174 0430A0E1 		mov	r3, r4
 492:../source/HL_system.c **** }
 669              		.loc 1 492 0
 670 0178 0300A0E1 		mov	r0, r3
 671 017c 04D04BE2 		sub	sp, fp, #4
 672              		.cfi_def_cfa 13, 8
 673              		@ sp needed
 674 0180 1008BDE8 		ldmfd	sp!, {r4, fp}
 675              		.cfi_restore 11
 676              		.cfi_restore 4
 677              		.cfi_def_cfa_offset 0
 678 0184 1EFF2FE1 		bx	lr
 679              		.cfi_endproc

Instruction at line 674 lead to exception.

Please add note to never use -O0 optimization in Halcogen when generating code for GCC, RM57L843 or refactor Halcogen code (such as for RM4x chips).

  • Hi Vitaliy,

    Thanks for sharing this with the community.. it is a good tip.

    Just to confirm - are the -O0 and -Og options that you refer to and the listings above all 'gcc'.
    It may just be late in the day - but when I read this post I thought you might be compiling with CCS and trying to link with GCC.

    Another workaround to try may be to inline the call to getResetSource() as this would preserve the recommended startup sequence but avoid stack usage. Doesn't look like the body of getResetSource is actually that big (or would compile to very many instructions).