load_sys.c

来自「新一代基于事件的嵌入式操作系统dyos在三星的s3c44b0的arm芯片上的完整」· C语言 代码 · 共 145 行

C
145
字号
//----------------------------------------------------
//Copyright (C), 2004-2009,  lst.
//版权所有 (C), 2004-2009,   lst.
//所属模块: 内核模块
//作者:lst
//版本:V1.0.0
//文件描述: 加载操作系统
//其他说明:
//修订历史:
//    2. ...
//    1. 日期:
//       作者:
//       新版本号:
//       修改说明:
//------------------------------------------------------
#include "inc_os.h"
#include <string.h>
#include "uart.h"


#ifndef debug
extern uint8_t init_start[];
extern uint8_t init_limit[];
extern uint8_t text_sysload_load_start[];
extern uint8_t text_sysload_run_start[];
extern uint8_t text_sysload_run_limit[];
extern uint8_t rodata_sysload_load_start[];
extern uint8_t rodata_sysload_run_start[];
extern uint8_t rodata_sysload_run_limit[];
extern uint8_t rw_sysload_load_start[];
extern uint8_t rw_sysload_run_start[];
extern uint8_t rw_sysload_run_limit[];
#endif
extern uint8_t zi_sysload_start[];
extern uint8_t zi_sysload_limit[];

#ifdef debug
void __asm_set_debug(void);
#endif

//----操作系统内核组件初始化---------------------------------------------------
//功能:初始化操作系统外围模块,包括所有内核设备
//参数:无
//返回:无
//---------------------------------------------------------------------------
void os_knl_module_init(void)
{
    module_init_rsc1();
    module_init_lock1();
    module_init_rsc2();
    module_init_memb();
    module_init_lock2();
    module_init_wdt();
    module_driver_init();
}

//----操作系统外围组件初始化---------------------------------------------------
//功能:外围组件属于可裁减的组件,在这里逐个调用组件的module_init_modulename函数
//      初始化独立模块,si模式在此初始化所有外围组件,dlsp模式和mp模式的外围组件
//      可能在这里,也可能从文件或者通信口加载和初始化。
//参数:无
//返回:无
//---------------------------------------------------------------------------
void os_ext_module_init(void)
{
    module_init_keyboard();
    module_init_uart0();
    module_init_uart1();
    module_init_djyfs();
    module_init_DFFSD();
    module_init_fs_samsung_flash();
}

//----dlsp模式加载程序--------------------------------------------------------
//功能:打开autoexec.bat文件逐行执行,如果命令文件里有main函数则是应用程序,执行
//      之,如果没有则搜索module_init_modulename函数,执行之,两个函数都没有则
//      只加载,不执行里面的代码。
//参数: 无。
//返回: 无。
//----------------------------------------------------------------------------
void dlsp_module_loader(void)
{
}

//----系统启动程序-----------------------------------------------------
//功能:执行操作系统加载,模块(设备)初始化、用户初始化以及启动操作系统
//参数:无
//返回:无
//---------------------------------------------------------------------------
void sys_start(void)
{
    struct  dev_handle *shell_lhdl;
#ifdef debug
    __asm_set_debug();
    load_sys();
#endif
    __int_init();
    critical();
#ifndef debug
    load_sys();
#endif
    //自此可以调用malloc族函数,用准静态堆分配算法,若要释放内存,要求严格配对
    //调用malloc-free函数,或者不调用
    module_init_heap_static();
    __y_set_delay();
    __y_init_sys();
    os_knl_module_init();
    //从这里开始,si、dlsp、mp模式有所不同,这里是si模式的代码
    os_ext_module_init();
    /*
    shell_lhdl = dev_open_left("uart1",0);
    dev_ctrl(shell_lhdl,enum_uart_start,0,0);
    dev_write(shell_lhdl,(ptu32_t)"欢迎使用都江堰操作系统\r\n",0,24);
    dev_close_left(shell_lhdl);
    */
    user_init();
    module_init_heap_dynamic();  //自此malloc函数执行块相联算法
    __y_start_os();
}

//----操作系统内核加载程序-----------------------------------------------------
//功能:加载所有操作系统内核代码,以及在si模式下全部应用程序代码。
//参数: 无。
//返回: 无。
//----------------------------------------------------------------------------
//备注: 本函数移植关键,与开发系统有关,也与目标硬件配置有关
void load_sys(void)
{
    uint8_t *src,*des;
#ifndef debug
    if(text_sysload_run_start != text_sysload_load_start)       //拷贝代码段
        for(src=text_sysload_load_start,des=text_sysload_run_start;des<text_sysload_run_limit;src++,des++)
            *des=*src;
    if(rodata_sysload_run_start != rodata_sysload_load_start)   //拷贝只读数据段
        for(src=rodata_sysload_load_start,des=rodata_sysload_run_start;des<rodata_sysload_run_limit;src++,des++)
            *des=*src;
    if(rw_sysload_run_start != rw_sysload_load_start)           //拷贝初始化数据段
        for(src=rw_sysload_load_start,des=rw_sysload_run_start;des<rw_sysload_run_limit;src++,des++)
            *des=*src;
#endif
    for(src=zi_sysload_start;src<zi_sysload_limit;src++)
        *src=0;
}

⌨️ 快捷键说明

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