📄 init.c
字号:
/*********************************************************************
* Copyright (c) 2011-2012,李士伟
* All rights reserved.
*文 件 名:init.c
*描 述:系统初始化源文件
*当前版本:V1.00
*作 者:李士伟
*创建日期:2011.09.30
**********************************************************************/
#include <init\init.h>
#include <kernel\sched.h>
#include <kernel\task.h>
#include <kernel\kd.h>
#include <kernel\time.h>
#include <kernel\asm.h>
#include <kernel\flag.h>
#include <mm\memory.h>
#include <systask\idletask.h>
#define OS_CPUUSAGE_EN 0
#define KERNEL_DATA_INIT_EN 0
#define OS_VERISION 100U
extern void InitDriver(void);
extern void AppMain(void *pdata);
/*********************************************************************
*函 数 名:API_GetOSVersion
*描 述:获得系统版本号
*输入参数:无
*输出参数:无
*返 回 值:系统版本号
*注 意:
**********************************************************************/
INT32U API_GetOSVerision(void)
{
return OS_VERISION;
}
/*********************************************************************
*函 数 名:OS_InitKernelData
*描 述:初始化内核数据
*输入参数:无
*输出参数:无
*返 回 值:无
*注 意:如果在启动代码处已加载全局变量,系统初始化不需调用该函数
**********************************************************************/
#if KERNEL_DATA_INIT_EN > 0
void OS_InitKernelData(void)
{
OSEnterSum = 1; /* 防止系统初始化开中断 */
OSIntNesting = 0;
OSSchedLock = 0;
OSRunning = false;
OSTaskCounter = 0;
OSTicks = 0;
OSIdleCnt = 0;
OSMaxIdleCnt = 1; /* 防止除0错误 */
OSCPUUsage = 0;
OSTCBList = NULL;
OSTCBRunQ = NULL;
OSTimerList = NULL;
OSTCBCur = NULL;
OSTCBHighRdy = NULL;
}
#endif
/*********************************************************************
*函 数 名:OS_CPUUsageTimer
*描 述:定时器,该定时器每秒被系统执行一次
* 用于定时更新前一秒处理器使用率
* OSIdleCnt
* OSCPUUsage = (1 - -------------) * 100 (%)
* OSMaxIdleCnt
*输入参数:无
*输出参数:无
*返 回 值:无
*注 意:
**********************************************************************/
#if OS_CPUUSAGE_EN > 0
void OS_CPUUsageTimer(void)
{
OS_ENTER_CRITICAL();
/* OSMaxIdleCnt为最大的OSIdleCnt,防止OSCPUUsage > 100 */
if (OSMaxIdleCnt < OSIdleCnt)
{
OSMaxIdleCnt = OSIdleCnt;
}
/* 计算并更新处理器使用率 */
OSCPUUsage = ((OSMaxIdleCnt - OSIdleCnt) * 100) / OSMaxIdleCnt;
/* 重新空闲计数 */
OSIdleCnt = 0;
OS_EXIT_CRITICAL();
}
#endif
/*********************************************************************
*函 数 名:OS_InitTask
*描 述:系统初始化任务
*输入参数:pdata:不使用该参数
*输出参数:无
*返 回 值:无
*注 意:该任务只运行一次,便删除自己,并且以后不得再创建
* 运行期间它将启动定时更新处理器使用率的定时器,
* 并负责创建所有用户任务
**********************************************************************/
#if OS_CPUUSAGE_EN
void OS_InitTask(void *pdata)
{
/* 启动更新处理器使用率的定时器 */
API_StartTimer((OS_TIMER *)pdata);
/* 延时3秒+1节拍,让系统在最低负荷下运行,使OSMaxIdleCnt更新到最大值 */
API_TimeDly(3*OS_TICKS_PER_SECOND + 1);
/* 这里创建用户任务 */
OS_CreateTask(AppMain, (void *)0, 1000, 16, 0x10);
/* 任务删除自身 */
API_DeleteTask(OS_TASK_SELF_ID);
}
#endif
/*********************************************************************
*函 数 名:OS_Init
*描 述:系统初始化
* 初始化内核数据,内存,基本的驱动配置
* 创建一个用于更新处理器使用率的定时器
* 并创建系统任务
*输入参数:无
*输出参数:无
*返 回 值:无
*注 意:该函数必须在关中断下运行
**********************************************************************/
void OS_Init(void)
{
#if OS_CPUUSAGE_EN > 0
OS_TIMER *tm;
#endif
/* 初始化内核数据 */
#if KERNEL_DATA_INIT_EN > 0
OS_InitKernelData();
#endif
/* 初始化内存 */
OS_InitMem();
/* 初始化驱动 */
InitDriver();
#if OS_CPUUSAGE_EN > 0
/* 创建一个用于更新处理器使用率的定时器 */
tm = API_AddTimer(OS_CPUUsageTimer, OS_TICKS_PER_SECOND);
#endif
/* 创建系统空闲任务 */
OS_CreateTask(OS_IdleTask, (void *)0, 100, 0, 0x1f);
#if OS_CPUUSAGE_EN > 0
/* 创建系统初始化任务,该任务只运行一次,便删除自己 */
OS_CreateTask(OS_InitTask, (void *)tm, 200, 0xffffffffu, 0x1f);
#else
OS_CreateTask(AppMain, (void *)0, 1000, 16, 0x10);
#endif
}
/*********************************************************************
*函 数 名:OS_Start
*描 述:系统启动,使系统第一次运行一个高优先级任务
*输入参数:无
*输出参数:无
*返 回 值:无
*注 意:
**********************************************************************/
void OS_Start(void)
{
OS_ENTER_CRITICAL();
if (OSRunning == false)
{
OSTCBHighRdy = OS_FindNextRunTask();
OSRunning = 1;
OS_StartHighRdyTask();
}
OS_EXIT_CRITICAL();
}
/*********************************************************************
*函 数 名:kernelmain
*描 述:内核入口函数,初始化并启动系统
*输入参数:无
*输出参数:无
*返 回 值:无
*注 意:
**********************************************************************/
void kernelmain(void)
{
/* 系统进入main函数前,须关中断进行系统初始化 */
OS_Init();
OS_Start();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -