甚至在进入 main 之前,复位中断向量 SYSRSTIV 就设置为 001Eh(外设/配置区域获取 - PERF)。为什么会这样?
器件:MSP430F5418(RAM:16 K) 编译器:IAR MSP430 尝试过的数据模型:中型和大型 使用 FreeRTOS 版本 7 内存统计 48 444 字节的 CODE 内存(+ 342 绝对值) 14 678 字节的 DATA 内存(+ 102 绝对值) 14 150 字节的 CONST 内存
使用的 cstartup.s43 文件
#define DISABLE_WATCHDOG #include “宏.m43” #include “cfi.m43” #ifdef DISABLE_WATCHDOG #include "msp430.h" #万一 #define XRSEGCSTART RSEG CSTART:CODE:NOROOT(1) XCFI_NAMES 库名称 XCFI_COMMON libCommon, libNames //------------------------------------------------ --------- // cstartup 代码——调用__low_level_init,执行初始化, // 调用构造函数并调用 main. 如果 main 返回退出系统 // 开始。 // 模块 ?cstart // // 确保这是使用相同的“位置独立”构建的 // 代码”编译器使用的设置。 // XPICRT模型 // // 前向声明段。 // RSEG 堆:数据:NOROOT(1) RSEG CSTACK:数据:NOROOT RSEG DATA16_Z:DATA:NOROOT RSEG DATA16_I:DATA:NOROOT RSEG DATA16_ID:CONST:NOROOT RSEG CODE_I:DATA:NOROOT RSEG CODE_ID:CONST:NOROOT #if __CORE__==__430X_CORE__ RSEG DATA20_Z:DATA:NOROOT RSEG DATA20_I:DATA:NOROOT RSEG DATA20_ID:CONST:NOROOT #万一 //------------------------------------------------ --------- // 系统初始化。 // XRSEGCSTART 公共 __program_start_x 外部 ?reset_vector 需要 ?reset_vector __program_start_x: 公共 ?cstart_begin ?cstart_begin: // -------------------- // 关闭看门狗。 // // 注意:默认情况下不包括在内。请定义 // DISABLE_WATCHDOG 包括它。 // #ifdef DISABLE_WATCHDOG MOV #WDTPW + WDTHOLD, &WDTCTL #万一 // -------------------- // 初始化 SP 指向栈顶。 // 移动#SFE(CSTACK),SP // // 确保 main 被调用。 // 要求 ?cstart_call_main // ------------------------------------------------------------ // 初始化前调用__low_level_init进行初始化 // 分段和调用 main. 如果函数返回 0 无段 // 初始化应该发生。 // // 链接到您自己的 __low_level_init 版本以覆盖 // 默认操作:什么都不做,只返回 1。 // XRSEGCSTART 公共 ?cstart_call_low_level_init 外部 __low_level_init ?cstart_call_low_level_init: XCALL #__low_level_init CMP #0, W0 JEQ ?cstart_call_main // ------------------------------------------------------------ // 段初始化: // // xxx_Z -- 用零填充的未初始化数据。 // xxx_I -- 初始化数据,从对应的获取值 // xxx_ID 段。 // #ifndef IGNORE_SEG_INIT // -------------------- // 初始化 __ramfunc 函数的代码。 // XRSEGCSTART 公共 ?cstart_init_copy_ramfunc ?cstart_init_copy_ramfunc: #ifndef IGNORE_RAMFUNC_INIT #ifndef REGISTER_MODEL_REG20 MOV #SFB CODE_I, CW0 MOV #SFB CODE_ID,CW1 MOV #sizeof CODE_I, CW2 XCALL #__data16_memcpy #else // 带有 20 位指针的 MSP430X。 外部 __data20_memcpy MOVA #SFB CODE_I, CW0 MOVA #SFB CODE_ID,CW1 MOV.W #LWRD(CODE_I 的大小), L1L MOV.W #HWRD(CODE_I 的大小), L1H XCALL #__data20_memcpy #endif // REGISTER_MODEL_REG20 #endif // IGNORE_RAMFUNC_INIT // -------------------- //初始化数据16 // #ifndef IGNORE_DATA16_DATA // // 清除 DATA16_Z。 // XRSEGCSTART PUBLIC ?cstart_init_zero 外部 __data16_memzero ?cstart_init_zero: MOV #SFB DATA16_Z,CW0 MOV #sizeof DATA16_Z, CW1 XCALL #__data16_memzero // // 将 DATA16_ID 复制到 DATA16_I // XRSEGCSTART PUBLIC ?cstart_init_copy 外部 __data16_memcpy ?cstart_init_copy: MOV #SFB DATA16_I,CW0 MOV #SFB DATA16_ID,CW1 MOV #sizeof DATA16_I, CW2 XCALL #__data16_memcpy #endif // IGNORE_DATA16_DATA // -------------------- // 数据20 // #if __CORE__==__430X_CORE__ #ifndef IGNORE_DATA20_DATA // // 清除 DATA20_Z。 // XRSEGCSTART 公共 ?cstart_init_zero20 外部 __data20_memzero ?cstart_init_zero20: MOVA #SFB DATA20_Z,W0 MOV.W #LWRD(DATA20_Z 的大小), L1L MOV.W #HWRD(DATA20_Z 的大小), L1H XCALL #__data20_memzero // // 将 DATA20_ID 复制到 DATA20_I // XRSEGCSTART 公共 ?cstart_init_copy20 外部 __data20_memcpy ?cstart_init_copy20: MOVA #SFB DATA20_I,CW0 MOVA #SFB DATA20_ID,CW1 MOV.W #LWRD(DATA20_I 的大小), L1L MOV.W #HWRD(DATA20_I 的大小), L1H XCALL #__data20_memcpy #endif // IGNORE_DATA16_DATA #endif // MSP430X #endif // IGNORE_SEG_INIT // ------------------------------------------------------------ // 调用静态对象的构造函数。 // RSEG DIFUNCT:CONST:NOROOT(1) XRSEGCSTART PUBLIC ?cstart_call_ctors 外部 __call_ctors ?cstart_call_ctors: #ifdef REGISTER_MODEL_REG20 MOVA #SFB 困难,CW0 MOVA #SFE 困难,CW1 #else /* REGISTER_MODEL_REG20 */ MOV.W #SFB 困难,CW0 MOV.W #SFE 困难,CW1 #endif /* REGISTER_MODEL_REG20 */ XCALL #__call_ctors // ------------------------------------------------------------ // 不带参数调用 main(),然后使用返回值退出 // main 作为参数。 // XRSEGCSTART 公共 ?cstart_call_main 外部主要 外部出口 ?cstart_call_main: XCALL #main XCALL #退出 公共 ?cstart_end ?cstart_end: // 注意:“ENDMOD 标签”表示该模块的代码 // 应用程序的启动。 ENDMOD __program_start_x //------------------------------------------------ --------- // __low_level_init // // 这个默认版本的 __low_level_init 的唯一动作是 // 返回 1。这样做表明数据正常初始化 // 段应该完成。 // // 可以创建 __low_level_init 的自定义版本,以便 // 在初始化段和调用 main 之前执行初始化 // 和/或在某些情况下跳过数据段的初始化 // 情况。 // // 更多细节参见示例文件lowinit.c // 模块低初始化 公共 __low_level_init RSEG 代码:代码:NOROOT(1) __low_level_init: MOV #1, W0 // 通过返回 1 这个函数 XRET //表示正常 // 初始化应该发生 ENDMOD //------------------------------------------------ --------- // 定义复位向量。 // 模块 ?reset_vector RSEG 复位:常量:NOROOT(1) 公共 ?reset_vector 外部 __program_start_x ?reset_vector: DC16 __program_start_x ENDMOD 结尾