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.
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).