甚至在进入 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
结尾