0

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

        结尾
4

1 回答 1

0

问题已解决。我们只是删除了 IAR 编译器的项目调试文件并重新构建了项目。SYSRSTIV 现在设置为零,我们的应用程序运行良好。

于 2011-06-24T10:03:45.067 回答