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 + -
显示快捷键?