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

📄 init.c

📁 Rabbit 32Bit RTOS源代码
💻 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 + -