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

📄 ext1.c

📁 一个小型的实时操作系统 对理解操作系统有很好的帮助
💻 C
字号:
/*********************************************************************************************************
**                                        Small RTOS
**                                   The Real-Time Kernel
**                           (c) Copyright 2002-2003, chenmingji
**                                     All Rights Reserved
**                                      V1.50.0 内部测试版
**
**--------------文件信息--------------------------------------------------------------------------------
**文   件   名: ext1.c
**创   建   人: 陈明计
**最后修改日期: 2004年8月8日
**描        述: ext1源代码。
**
********************************************************************************************************/

#include "config.h"

        uint8 random(uint8 seed)
{
    uint16 temp;

    temp = rand();
    temp = temp % seed;
	return temp;
}

        void PC_DispChar (uint8 x, uint8 y, uint8 c, uint8 color)
{
    OS_ENTER_CRITICAL();
    
    UART0Putch(0xff);
    UART0Putch(x);
    UART0Putch(y);
    UART0Putch(c);
    UART0Putch(color);
  
    OS_EXIT_CRITICAL();
}

        void PC_DispStr (uint8 x, uint8 y, const char *s, uint8 color)
{
    while (*s)
    {
        if (x >= DISP_MAX_X)
        {
            x = 0;
            y++;
        }
        PC_DispChar(x, y, *s++, color);
        x++;
    }
    OSTimeDly(10);
}

        void PC_DispClrScr (uint8 color)
{
    uint16      i,j;

    for (i = 0; i < DISP_MAX_Y; i++)
    {
        for (j = 0; j < DISP_MAX_X; j++)
        {
            PC_DispChar(j, i, ' ', color);
        }
        OSTimeDly(10);
    }
}

/*********************************************************************************************************/

OS_STK      TaskStatStk[512];
OS_STK      TaskStk[10][512];

const char *DisPlay = "0123456789";

/*********************************************************************************************************/

volatile unsigned long long OSIdleCtr;
volatile unsigned long long OSIdleCtrMax;

void TaskStat(void *Pdata);
void TaskB(void *Pdata);

        int main(void)
{
    OSInit();
    TargetInit();
    OSTaskCreate(TaskStat, NULL, &(TaskStatStk[512 - 1]), OS_LOWEST_PRIO - 1, 10, 512, USR32Mode, 0);

    while(1)
    {
        OS_ENTER_CRITICAL();
        OSIdleCtr++;
        OS_EXIT_CRITICAL();
//        PCON = PCON | 0x01;                     /* CPU进入休眠状态 */
    }
    return 0;
}

/*********************************************************************************************************/
extern int UART0SendBuf[];
                            void TaskStat(void *Pdata)
{
    unsigned long long     run;
    unsigned long long     max;
    uint16      usage;
    char b;

	PC_DispClrScr(DISP_FGND_WHITE + DISP_BGND_LIGHT_GRAY); 

/*                      01234567890123456789012345678901234567890123456789012345678901234567890123456789 */
    PC_DispStr( 0,  0, "                Small RTOS, the Real-Time Kernel(For ARM7TDMI                   ", DISP_FGND_WHITE + DISP_BGND_RED + DISP_BLINK);
    PC_DispStr( 0,  1, "                                  Chen Ming Ji                                  ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
    PC_DispStr( 0,  2, "                                                                                ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
    PC_DispStr( 0,  3, "                                    EXAMPLE #1                                  ", DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
    PC_DispStr( 0, 22, "                                                                                ", DISP_FGND_BLACK + DISP_BGND_GREEN);
    PC_DispStr( 0, 23, "                                                                                ", DISP_FGND_BLACK + DISP_BGND_GREEN);
    PC_DispStr( 0, 24, "      CPU     Usage:        %                                                   ", DISP_FGND_BLACK + DISP_BGND_GREEN);

    while (QueueNData(UART0SendBuf));

    OSTimeDly(OS_TICKS_PER_SEC);

    OSIdleCtr = 0L;

    OSTimeDly(OS_TICKS_PER_SEC);


    OSIdleCtrMax = OSIdleCtr;

    OSTaskCreate(TaskB, (void *)(DisPlay + 0), &(TaskStk[0][512 - 1]), 5, 0, 512, USR32Mode, 0);
    OSTaskCreate(TaskB, (void *)(DisPlay + 1), &(TaskStk[1][512 - 1]), 5, 1, 512, USR32Mode, 0);
    OSTaskCreate(TaskB, (void *)(DisPlay + 2), &(TaskStk[2][512 - 1]), 5, 2, 512, USR32Mode, 0);
    OSTaskCreate(TaskB, (void *)(DisPlay + 3), &(TaskStk[3][512 - 1]), 5, 3, 512, USR32Mode, 0);
    OSTaskCreate(TaskB, (void *)(DisPlay + 4), &(TaskStk[4][512 - 1]), 5, 4, 512, USR32Mode, 0);
    OSTaskCreate(TaskB, (void *)(DisPlay + 5), &(TaskStk[5][512 - 1]), 5, 5, 512, USR32Mode, 0);
    OSTaskCreate(TaskB, (void *)(DisPlay + 6), &(TaskStk[6][512 - 1]), 5, 6, 512, USR32Mode, 0);
    OSTaskCreate(TaskB, (void *)(DisPlay + 7), &(TaskStk[7][512 - 1]), 5, 7, 512, USR32Mode, 0);
    OSTaskCreate(TaskB, (void *)(DisPlay + 8), &(TaskStk[8][512 - 1]), 5, 8, 512, USR32Mode, 0);
    OSTaskCreate(TaskB, (void *)(DisPlay + 9), &(TaskStk[9][512 - 1]), 5, 9, 512, USR32Mode, 0);
    
    max = OSIdleCtrMax / 1000;
    b = '_';
    while (1)
    {
        OSIdleCtr = 0;
        OSTimeDly(OS_TICKS_PER_SEC);
        run = OSIdleCtr;
        usage = run / max;
        usage = 1000 - usage;
        
        PC_DispChar(22, 24, b, DISP_FGND_YELLOW + DISP_BGND_BLUE);
        PC_DispChar(23, 24, usage / 1000 + '0', DISP_FGND_YELLOW + DISP_BGND_BLUE);
        PC_DispChar(24, 24, (usage % 1000) / 100 + '0', DISP_FGND_YELLOW + DISP_BGND_BLUE);
        PC_DispChar(25, 24, (usage % 100) / 10 + '0', DISP_FGND_YELLOW + DISP_BGND_BLUE);
        PC_DispChar(26, 24, '.', DISP_FGND_YELLOW + DISP_BGND_BLUE);
        PC_DispChar(27, 24, usage % 10 + '0', DISP_FGND_YELLOW + DISP_BGND_BLUE);
        if (b == '_')
        {
            b = ' ';
        }
        else
        {
            b = '_';
        }
    } 
}

/*********************************************************************************************************/
                            void TaskB(void *Pdata)
{
    uint8  x;
    uint8  y;
    char DisPlay;

    DisPlay = ((char *)Pdata)[0];

    while (1)
    {
        OS_ENTER_CRITICAL();
        x = random(80);
        y = random(16);
        OS_EXIT_CRITICAL();

        PC_DispChar(x, y + 5, DisPlay, DISP_FGND_BLACK + DISP_BGND_LIGHT_GRAY);
        OSTimeDly(5);
    }
}
/*********************************************************************************************************
**                            End Of File
********************************************************************************************************/

⌨️ 快捷键说明

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