eCos初探之redboot重启命令:reset

环境参数:
eCos模版:redboot
硬件平台: STM32F103ZET6

1、reset实现的函数调用流程

reset命令对应的函数是:

packages/redboot/current/src/main.c

void do_reset(int argc, char *argv[])
{
    diag_printf("... Resetting.");
    CYGACC_CALL_IF_DELAY_US(2*100000);
    diag_printf("\n");
    CYGACC_CALL_IF_RESET();
    diag_printf("!! oops, RESET not working on this platform\n");
}

CYGACC_CALL_IF_RESET();宏定义在:

packages/hal/common/current/include/hal_if.h

#define CYGACC_CALL_IF_RESET()    CYGACC_CALL_VV0(__call_if_reset_t*, CYGNUM_CALL_IF_RESET)()
   __call_voidVV0(CYGNUM_CALL_IF_RESET, __call_if_reset_t, void)

并最终调用了static void reset(void)函数:

packages/hal/common/current/include/hal_if.c

static __call_if_reset_t reset;
static void reset(void)
{
    CYGARC_HAL_SAVE_GP();
    // With luck, the platform defines some magic that will cause a hardware
    // reset.
#ifdef HAL_PLATFORM_RESET
    HAL_PLATFORM_RESET();
#endif
#ifdef HAL_PLATFORM_RESET_ENTRY
    // If that's not the case (above is an empty statement) there may
    // be defined an address we can jump to - and effectively
    // reinitialize the system. Not quite as good as a reset, but it
    // is often enough.
    goto *HAL_PLATFORM_RESET_ENTRY;
#else
#error " no RESET_ENTRY"
#endif
    CYG_FAIL("Reset failed");
    CYGARC_HAL_RESTORE_GP();
}

由此函数可知,reset的实现有两种方式:

(1)调用平台提供的HAL_PLATFORM_RESET()函数

(2)直接goto到程序入口地址HAL_PLATFORM_RESET_ENTRY处:

#define HAL_PLATFORM_RESET_ENTRY &hal_reset_vsr

hal_reset_vsr指向程序的主入口函数void hal_reset_vsr( void ),关于该函数,注释说明如下:

//==========================================================================
// Main entry point
//
// Enter here from reset via slot 1 of VSR table. The stack pointer is
// already set to the value in VSR slot 0, usually the top of internal
// SRAM.

下面着重讲下第一种(1)复位方式,它涉及到芯片的具体操作。

2、reset实现涉及到的硬件操作

参考以下内容时对照该图:

AIRCR:应用程序中断及复位控制寄存器

由AIRCR寄存器定义可知,在Cortex-M3中,有两种方式可以执行软件复位:

(1)通过置位AIRCR的VECTRESET(AIRCR[0]):

该方式下,复位的作用范围覆盖整个CM3,但不影响内核以外的所有其他电路,所以片上外设和其他电路不受影响。

(2)通过置位AIRCR的SYSRESETREQ(AIRCR[2]):

该方式下,复位操作波及整个芯片上的电路。

3、reset在redboot上的实现

HAL_PLATFORM_RESET()宏实现如下:

#define HAL_PLATFORM_RESET()                                            {                                                                           HAL_WRITE_UINT32(CYGARC_REG_NVIC_BASE+CYGARC_REG_NVIC_AIRCR,                             CYGARC_REG_NVIC_AIRCR_KEY|                                              CYGARC_REG_NVIC_AIRCR_SYSRESETREQ );                   for(;;);                                                            }

HAL_WRITE_UINT32( _register_, _value_ )作用是往制定的寄存器@ _register_赋值@ _value_

在此:

_register_ = CYGARC_REG_NVIC_BASE+CYGARC_REG_NVIC_AIRCR = 0xE000E000 + 0xD0C = 0xE000ED0C
_value_ = CYGARC_REG_NVIC_AIRCR_KEY | CYGARC_REG_NVIC_AIRCR_SYSRESETREQ = (0x5FA<<16) + (1<<2)

0x5FA是访问该寄存器的钥匙。

for(;;);死循环保证后面的指令不被执行到。

时间: 2024-10-16 03:16:22

eCos初探之redboot重启命令:reset的相关文章

第3章 Linux常用命令(6)_关机重启命令

8. 关机重启命令 8.1 关机重启命令 (1)shutdown [选项] 时间     ①选项 -c:取消前一个关机命令 -h:关机 -r:重启 ②应用举例:#shutdown –h now.shutdown –h 20:30 (2)其它关机命令 ①halt ②poweroff ③init 0 (3)其它重启命令:①reboot ②init 6 8.2 系统运行级别 (1)运行级别(可通过cat /etc/inittab查看) 级别 含义 备注 0 关机 如init 0.不能设为默认级别. 1

Linux常用命令-关机重启命令

关机重启命令 shutdown命令 语法:shutdown [选项] 时间 -c:取消前一个关机命令:-h:关机:-r:重启: 例:shutdown -h now shutdown -h 20:30(八点半关机) 关机命令:halt;   poweroff; init 0; 重启命令:reboot; init 6 系统运行级别(init) init进程配置文件路径:/etc/inittab 0:关机 1:单用户 2:不完全多用户,不含NFS服务(NFS:network file system 网

Linux学习笔记--关机和重启命令

1. 关机命令: 1) "shutdown -h now" 立刻关机(h为halt的意思): 2) "shutdown -h 10" 10分钟之后关机: 3) "shutdown -h 05:30" 在05:30(五点半)关机: 4) "poweroff" 立刻关机: 5) "halt" 立刻关机: 6) "init 0" 立刻关机: 7) "shutdown -c"

Linux之关机重启命令

shutdown shutdown [选项] 时间 选项:-c  取消前一个关机命令 -h  关机 -r  重启 其它关机命令: halt poweroff init 0 其它重启命令: reboot init 6 系统的运行级别: 0  关机 1  单用户 2  不完全多用户,不含NFS服务 3  完全多用户 4  未分配 5  图形界面 6  重启 退出登录命令: logout

Linux学习笔记 (五)关机和重启命令

一.关机命令 1.shutdown命令: shutdown [选项] [时间] 选项: -c:取消前一个关机命令 -h:关机 -r:重启 例:shutdown -r 05:30 &   //表示到凌晨05:30分重启电脑,&表示让关机命令进入后台运行,不影响用户操作. shutdown:会关闭计算机正在运行的程序,更安全,有保证. 2.其他关机命令: halt poweroff init 0 //以上为非安全关机,慎用.   3.其他重启命令 reboot init 6 4.init nu

Linux学习---(文件的压缩和解压缩命令zip unzip tar、关机和重启命令shutdown reboot……)

1.压缩和解压缩命令    常用压缩格式:.zip..gz..bz2..tar.gz..tar.bz2..rar    .zip格式压缩和解压缩命令        zip 压缩文件名 源文件:压缩文件        zip -r 压缩文件名 源目录:压缩目录        unzip 压缩文件名:解压缩 .zip文件    .gz格式压缩和解压缩        gzip 源文件:压缩为.gz 格式的压缩文件,源文件会消失        gzip -c 源文件 > 压缩文件:压缩为.gz 格式,源

linux&nbsp;下&nbsp;apache启动、停止、重启命令

原文:linux 下 apache启动.停止.重启命令 基本的操作方法: 本文假设你的apahce安装目录为/usr/local/apache2,这些方法适合任何情况 apahce启动命令: 推荐/usr/local/apache2/bin/apachectl start apaceh启动 apache停止命令 /usr/local/apache2/bin/apachectl stop   停止 apache重新启动命令: /usr/local/apache2/bin/apachectl res

hpux操作系统的关机与重启命令

关机 shutdown -hy 0 重启: shutdown -ry 0 hpux操作系统的关机与重启命令,布布扣,bubuko.com

Ubuntu 关机和重启命令

重启命令(root用户使用) :     1.reboot     2.shutdown -r now 立刻重启    3.shutdown -r 10 过10分钟自动重启    4.shutdown -r 20:35 在时间为20:35时候重启 如果是通过shutdown命令设置重启的话,可以用shutdown -c命令取消重启 关机命令(root用户使用) : 1.halt   立刻关机     2.poweroff 立刻关机     3.shutdown -h now 立刻关机    4.