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