• CC26X2 IAR程序启动流程


    1、向量表__vector_table位于startup_iar.c

    1. __root void (* const __vector_table[])(void) @ ".intvec" =
    2. {
    3. (void (*)(void))&STACK_TOP, // 0 The initial stack pointer
    4. ResetISR, // 1 The reset handler
    5. NmiSR, // 2 The NMI handler
    6. FaultISR, // 3 The hard fault handler
    7. MPUFaultIntHandler, // 4 Memory Management (MemManage) Fault
    8. BusFaultIntHandler, // 5 The bus fault handler
    9. UsageFaultIntHandler, // 6 The usage fault handler
    10. 0, // 7 Reserved
    11. 0, // 8 Reserved
    12. 0, // 9 Reserved
    13. 0, // 10 Reserved
    14. SVCallIntHandler, // 11 Supervisor Call (SVCall)
    15. DebugMonIntHandler, // 12 Debug monitor handler
    16. 0, // 13 Reserved
    17. PendSVIntHandler, // 14 The PendSV handler
    18. SysTickIntHandler, // 15 The SysTick handler
    19. //--- External interrupts ---
    20. GPIOIntHandler, // 16 AON edge detect
    21. I2CIntHandler, // 17 I2C
    22. RFCCPE1IntHandler, // 18 RF Core Command & Packet Engine 1
    23. PKAIntHandler, // 19 PKA Interrupt event
    24. AONRTCIntHandler, // 20 AON RTC
    25. UART0IntHandler, // 21 UART0 Rx and Tx
    26. AUXSWEvent0IntHandler, // 22 AUX software event 0
    27. SSI0IntHandler, // 23 SSI0 Rx and Tx
    28. SSI1IntHandler, // 24 SSI1 Rx and Tx
    29. RFCCPE0IntHandler, // 25 RF Core Command & Packet Engine 0
    30. RFCHardwareIntHandler, // 26 RF Core Hardware
    31. RFCCmdAckIntHandler, // 27 RF Core Command Acknowledge
    32. I2SIntHandler, // 28 I2S
    33. AUXSWEvent1IntHandler, // 29 AUX software event 1
    34. WatchdogIntHandler, // 30 Watchdog timer
    35. Timer0AIntHandler, // 31 Timer 0 subtimer A
    36. Timer0BIntHandler, // 32 Timer 0 subtimer B
    37. Timer1AIntHandler, // 33 Timer 1 subtimer A
    38. Timer1BIntHandler, // 34 Timer 1 subtimer B
    39. Timer2AIntHandler, // 35 Timer 2 subtimer A
    40. Timer2BIntHandler, // 36 Timer 2 subtimer B
    41. Timer3AIntHandler, // 37 Timer 3 subtimer A
    42. Timer3BIntHandler, // 38 Timer 3 subtimer B
    43. CryptoIntHandler, // 39 Crypto Core Result available
    44. uDMAIntHandler, // 40 uDMA Software
    45. uDMAErrIntHandler, // 41 uDMA Error
    46. FlashIntHandler, // 42 Flash controller
    47. SWEvent0IntHandler, // 43 Software Event 0
    48. AUXCombEventIntHandler, // 44 AUX combined event
    49. AONProgIntHandler, // 45 AON programmable 0
    50. DynProgIntHandler, // 46 Dynamic Programmable interrupt
    51. // source (Default: PRCM)
    52. AUXCompAIntHandler, // 47 AUX Comparator A
    53. AUXADCIntHandler, // 48 AUX ADC new sample or ADC DMA
    54. // done, ADC underflow, ADC overflow
    55. TRNGIntHandler, // 49 TRNG event
    56. OSCIntHandler, // 50 Combined event from Oscillator control
    57. AUXTimer2IntHandler, // 51 AUX Timer2 event 0
    58. UART1IntHandler, // 52 UART1 combined interrupt
    59. BatMonIntHandler // 53 Combined event from battery monitor
    60. };

    2、复位向量ResetISR

    1. void ResetISR(void)
    2. {
    3. //
    4. // Final trim of device
    5. //
    6. SetupTrimDevice();
    7. //
    8. // Jump to IAR initialization routine
    9. //
    10. __iar_program_start();
    11. //
    12. // If we ever return signal Error
    13. //
    14. FaultISR();
    15. }

    3、跳转到IAR初始化程序 __iar_program_start 位于boot.s文件

    1. PUBLIC __iar_program_start
    2. EXTERN CSTACK$$Limit
    3. EXTERN __iar_program_startC
    4. THUMB
    5. __iar_program_start:
    6. LDR R0, cstacklimit
    7. MOV SP, R0
    8. LDR R0, program_startc
    9. BLX R0
    10. DATA
    11. ALIGNROM 2
    12. cstacklimit:
    13. DC32 CSTACK$$Limit
    14. program_startc:
    15. DC32 __iar_program_startC

    通过下面两条汇编代码可以看出,程序跳转到program_startc

    1. LDR R0, program_startc;
    2. BLX R0

    program_startc对应的是__iar_program_startC,所以程序实际是跳转到__iar_program_startC

    1. program_startc:
    2. DC32 __iar_program_startC

    4、__iar_program_startC函数位于cstartup_M.c文件

    1. void __iar_program_startC( void )
    2. {
    3. /* XDC startup reset hook */
    4. iar_xdc_startup_reset();
    5. __iar_init_core();
    6. #if defined (__ARMVFP__)
    7. /*------------------------------------------------------
    8. * SETUP FULL ACCESS TO COPROCESSORS 10 AND 11,
    9. * REQUIRED FOR FP. COPROCESSOR ACCESS CONTROL REG
    10. * BITS [23:22] - CP11, [21:20] - CP10
    11. * SET TO 0b11 TO ENABLE FULL ACCESS
    12. *------------------------------------------------------
    13. */
    14. asm volatile(
    15. " MOVW r1, #0xE000ED88 & 0xFFFF\n"
    16. " MOVT r1, #0xE000ED88 >> 16\n"
    17. " LDR r0, [ r1 ]\n"
    18. " MOV r3, #0xf0\n"
    19. " ORR r0,r0,r3, LSL #16\n"
    20. " STR r0, [ r1 ]\n"
    21. );
    22. #endif
    23. __cmain();
    24. }

    程序最后调用汇编的__cmain,位于文件cmain.s

    1. PUBLIC __cmain
    2. ;; Keep ?main for legacy reasons, it is accessed in countless instances of cstartup.s around the world...
    3. PUBLIC ?main
    4. EXTWEAK __iar_data_init3
    5. EXTERN __low_level_init
    6. EXTERN iar_xdc_startup_exec
    7. EXTERN __call_ctors
    8. EXTERN main
    9. EXTERN xdc_runtime_System_exit__E
    10. THUMB
    11. __cmain:
    12. ?main:
    13. ; Initialize segments.
    14. ; __segment_init and __low_level_init are assumed to use the same
    15. ; instruction set and to be reachable by BL from the ICODE segment
    16. ; (it is safest to link them in segment ICODE).
    17. FUNCALL __cmain, __low_level_init
    18. bl __low_level_init
    19. cmp r0,#0
    20. beq ?l1
    21. FUNCALL __cmain, __iar_data_init3
    22. bl __iar_data_init3
    23. ; XDC startup exec hook
    24. FUNCALL __cmain, iar_xdc_startup_exec
    25. bl iar_xdc_startup_exec
    26. ?l1:
    27. REQUIRE ?l3
    28. SECTION .text:CODE:NOROOT(2)
    29. PUBLIC _main
    30. PUBLIC _call_main
    31. THUMB
    32. __iar_init$$done: ; Copy initialization is done
    33. ?l3:
    34. _call_main:
    35. MOVS r0,#0 ; No parameters
    36. FUNCALL __cmain, main
    37. BL main
    38. _main:
    39. FUNCALL __cmain, xdc_runtime_System_exit__E
    40. BL xdc_runtime_System_exit__E
    41. END


    a、程序调用__low_level_init函数

    1. int __low_level_init(void)
    2. {
    3. IntMasterDisable();
    4. //
    5. // Final trim of device
    6. //
    7. SetupTrimDevice();
    8. /*==================================*/
    9. /* Choose if segment initialization */
    10. /* should be done or not. */
    11. /* Return: 0 to omit seg_init */
    12. /* 1 to run seg_init */
    13. /*==================================*/
    14. return 1;
    15. }


    b、程序调用__iar_data_init3函数

    1. void __iar_data_init3(void)
    2. {
    3.   char const * p = __section_begin("Region$$Table");
    4.   uint32_t const * pe = __section_end("Region$$Table");
    5.   uint32_t const * pi = (uint32_t const *)(p);
    6.   while (pi != pe)
    7.   {
    8.     init_fun_t * fun = (init_fun_t *)((char *)pi + *(int32_t *)pi);
    9.     pi++;
    10.     pi = fun(pi);
    11.   }
    12. }


    c、程序调用iar_xdc_startup_exec函数

    1. void iar_xdc_startup_exec(void)
    2. {
    3.     /*------------------------------------------------------------------------*/
    4.     /* Process XDC Startup                                                    */
    5.     /*------------------------------------------------------------------------*/
    6.     if (&xdc_runtime_Startup__EXECFXN__C == (int*)1) {
    7.         xdc_runtime_Startup_exec__E();
    8.     }
    9. }


    d、最后程序执行下面语句,进入c的main函数
            BL      main
        

    1. int main()
    2. {
    3.   /* Register Application callback to trap asserts raised in the Stack */
    4.   RegisterAssertCback(AssertHandler); 
    5.   Board_initGeneral();
    6.   // Enable iCache prefetching
    7.   VIMSConfigure(VIMS_BASE, TRUE, TRUE);
    8.   // Enable cache
    9.   VIMSModeSet(VIMS_BASE, VIMS_MODE_ENABLED);
    10. #if !defined( POWER_SAVING )
    11.   /* Set constraints for Standby, powerdown and idle mode */
    12.   // PowerCC26XX_SB_DISALLOW may be redundant
    13.   Power_setConstraint(PowerCC26XX_SB_DISALLOW);
    14.   Power_setConstraint(PowerCC26XX_IDLE_PD_DISALLOW);
    15. #endif // POWER_SAVING
    16.   /* Update User Configuration of the stack */
    17.   user0Cfg.appServiceInfo->timerTickPeriod = Clock_tickPeriod;
    18.   user0Cfg.appServiceInfo->timerMaxMillisecond  = ICall_getMaxMSecs();
    19.   /* Initialize ICall module */
    20.   ICall_init();
    21. #if (!defined(STACK_LIBRARY) && (defined(SPLIT_APP_STACK_IMAGE)))
    22.   {
    23.     /* Find stack entry page */
    24.     uint32_t stackAddr = findStackBoundaryAddr();
    25.     if(stackAddr == 0xFFFFFFFF)
    26.     {
    27.       // If we cannot find the stack start address, exit
    28.       ICall_abort();
    29.     }
    30.     /* set the stack image header based on the stack addr */
    31.     stackImageHeader = (imgHdr_t *)stackAddr;
    32.     /* Start tasks of external images - Priority 5 */
    33.     const ICall_RemoteTask_t remoteTaskTbl[] =
    34.     {
    35.       (ICall_RemoteTaskEntry) (stackImageHeader->prgEntry),
    36.       5,
    37.       1000,
    38.       &user0Cfg
    39.     };
    40.     /* Start tasks of external images - Priority 5 */
    41.     ICall_createRemoteTasksAtRuntime((ICall_RemoteTask_t *) remoteTaskTbl,
    42.                                    (sizeof(remoteTaskTbl)/sizeof(ICall_RemoteTask_t)));
    43.   }
    44. #else
    45.   /* Start tasks of external images - Priority 5 */
    46.   ICall_createRemoteTasks();
    47. #endif
    48.   SimplePeripheral_createTask();
    49.   /* enable interrupts and start SYS/BIOS */
    50.   BIOS_start();
    51.   return (0);
    52. }

  • 相关阅读:
    有关 ThreadLocal 的一切
    基于SpringBoot的校园志愿者管理系统
    《定时执行专家》日志的解决方案 —— 关于wxLog的使用,附详细代码
    Unity-2D游戏-打击感与敌人AI
    promise async/await 顺序执行异步操作
    linux more,less,tail,cat,grep命令
    Spring之引入外部的属性配置文件
    Django测试环境搭建及ORM查询(创建外键|夸表查询|双下划线查询)
    UniPro提高集成能力 让客户专注于交付价值
    汽车疲劳测试试验平台技术要求(北重厂家)
  • 原文地址:https://blog.csdn.net/dear_Wally/article/details/126930709