⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hal_startup.c

📁 eCos操作系统源码
💻 C
字号:
//==========================================================================//####ECOSGPLCOPYRIGHTBEGIN####// -------------------------------------------// This file is part of eCos, the Embedded Configurable Operating System.// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.//// eCos is free software; you can redistribute it and/or modify it under// the terms of the GNU General Public License as published by the Free// Software Foundation; either version 2 or (at your option) any later version.//// eCos is distributed in the hope that it will be useful, but WITHOUT ANY// WARRANTY; without even the implied warranty of MERCHANTABILITY or// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License// for more details.//// You should have received a copy of the GNU General Public License along// with eCos; if not, write to the Free Software Foundation, Inc.,// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.//// As a special exception, if other files instantiate templates or use macros// or inline functions from this file, or you compile this file and link it// with other works to produce a work based on this file, this file does not// by itself cause the resulting work to be covered by the GNU General Public// License. However the source code for this file must still be made available// in accordance with section (3) of the GNU General Public License.//// This exception does not invalidate any other reasons why a work based on// this file might be covered by the GNU General Public License.//// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.// at http://sources.redhat.com/ecos/ecos-license/// -------------------------------------------//####ECOSGPLCOPYRIGHTEND####//==========================================================================#include <pkgconf/hal.h>#include <cyg/hal/hal_startup.h>#include <cyg/hal/hal_memmap.h>#include <cyg/hal/hal_intr.h>#include <cyg/hal/hal_diag.h>           // hal_diag_init#include <cyg/infra/diag.h>             // diag_printf#include <string.h>                     // memcpy, memsetexternC void cyg_start(void);externC void hw_vsr_reset(void);#define CYG_HAL_RESET_DEBUG_ENABLE#ifdef CYG_HAL_RESET_DEBUG_ENABLE#define CYG_HAL_RESET_DEBUG diag_printf#else#define CYG_HAL_RESET_DEBUG()#endif // CYG_HAL_RESET_DEBUG_ENABLE/*****************************************************************************hal_vsr_init -- Initialize the vector tableINPUT:OUTPUT:RETURN VALUE:     None*****************************************************************************/static void hal_vsr_init(void){    /*   Initialize the HAL's vector table with the ROM vector table.       */    memcpy((void*)cyg_hal_vsr_table, __romvec_start,                (size_t)sizeof(cyg_hal_vsr_table));}/*****************************************************************************hal_vsr_init -- Initialize the ISRsINPUT:OUTPUT:RETURN VALUE:     None*****************************************************************************/static void hal_isr_init(void){    int_t i;    //   Initialize all ISR entries to default.    for (i = 0; i < CYGNUM_HAL_ISR_COUNT; i++)    {        cyg_hal_interrupt_handlers[i] = (CYG_ADDRESS) &hal_default_isr;        cyg_hal_interrupt_data[i] = (CYG_ADDRWORD)0;        cyg_hal_interrupt_objects[i] = (CYG_ADDRESS)0;    }}/*****************************************************************************hal_init_ram_sections -- Initialize the RAM sections     Initialize all RAM sections that  the C  code relies  on.  data,  bss,sbss.INPUT:OUTPUT:RETURN VALUE:     None*****************************************************************************/static void hal_init_ram_sections(void){    //   Initialize the RAM data section  from  the  ROM  image  of  the  data    // section.    memcpy(__ram_data_start, __rom_data_start, (size_t)__ram_data_size);    //   Initialize the bss and sbss sections to zero.    memset(__bss_start, 0, (size_t)__bss_size);    memset(__sbss_start, 0, (size_t)__sbss_size);}/*****************************************************************************cyg_hal_invoke_constructors -- Call static constructorsINPUT:OUTPUT:RETURN VALUE:     None*****************************************************************************/#ifdef CYGSEM_HAL_STOP_CONSTRUCTORS_ON_FLAGcyg_bool cyg_hal_stop_constructors;#endiftypedef void (*pfunc) (void);extern pfunc __CTOR_LIST__[];extern pfunc __CTOR_END__[];static void cyg_hal_invoke_constructors(void){#ifdef CYGSEM_HAL_STOP_CONSTRUCTORS_ON_FLAG    static pfunc *p = &__CTOR_END__[-1];    cyg_hal_stop_constructors = 0;    for (; p >= __CTOR_LIST__; p--) {        (*p) ();        if (cyg_hal_stop_constructors) {            p--;            break;        }    }#else    pfunc *p;    for (p = &__CTOR_END__[-1]; p >= __CTOR_LIST__; p--)        (*p) ();#endif}/*****************************************************************************hal_reset -- Reset vector routine     This routine must be  called with interrupts  disabled and will  neverreturn.     Only the assembly reset vector routine should call this routine.INPUT:OUTPUT:RETURN VALUE:     None*****************************************************************************/void hal_reset(void) CYGBLD_ATTRIB_NORET;void hal_reset(void){    const char * fname;    fname = __FUNCTION__;    //   Initialize the RAM sections that the rest of the C code requires.    hal_init_ram_sections();    //   It is now safe  to call  C functions  which may  rely on  initialized    // data.    //   Initialize the ISR and VSR tables.    hal_isr_init();    hal_vsr_init();    //   Do any variant-specific reset initialization.    var_reset();    //   Initialize the diagnostics IO.    HAL_DIAG_INIT();    CYG_HAL_RESET_DEBUG("%s: RESET\r\n", fname);    //   Call C++ constructors.    CYG_HAL_RESET_DEBUG("%s: calling cyg_hal_invoke_constructors\r\n", fname);    cyg_hal_invoke_constructors();    //   It should be safe to enable interrupts now.    CYG_HAL_RESET_DEBUG("%s: lowering interrupt mask\r\n", fname);    HAL_ENABLE_INTERRUPTS();    //   Call cyg_start.  This routine should not return.    CYG_HAL_RESET_DEBUG("%s: calling cyg_start\r\n", fname);    cyg_start();    //   If we return, loop and print out a message.    HAL_DIAG_INIT();    for (;;)    {        CYG_HAL_RESET_DEBUG("%s: cyg_start returned!\r\n", fname);    }}/*****************************************************************************hal_hw_reset -- Simulate a hardware reset     This routine will never return.INPUT:OUTPUT:RETURN VALUE:     None*****************************************************************************/void hal_hw_reset(void){    //   Give control to the reset vector handler.    hw_vsr_reset();}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -