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

📄 main11.c

📁 Bycore是一个嵌入式操作系统内核。Bycore包括内存管理、任务管理、中断管理、任务互斥、同步与通信管理等功能。Bycore全部由C语言完成
💻 C
📖 第 1 页 / 共 2 页
字号:
/*
 * 本程序为演示实例
 * Task0:跑马灯
 * Task1~Task2:与Task2之间通过管道通信,Task1创建管道,然后从键盘接收
 *    字符串,并通过管道将数据传递给Task2,Task2通过串口打印接收到的数
 *    据。当打印完数据后,通知Task1撤销管道。
 * Task3~Task8:该组任务测试邮箱功能。通过此邮箱,Task3向Task5和Task6
 *    传输数据;Task4向Task7和Task8传输从键盘接收的数据。
 * Task9~Task10:该组任务测试共享内存。Task9负责创建与删除共享的内存区
 *    域,Task10负责打印共享内存区域的数据。
 * Task11:该任务负责显示从键盘输入的命令。
 *
 */
#include <string.h>

#include "arch\arm7\cpu.h"
#include "include\core.h"
#include "include\irq.h"
#include "include\pipe.h"
#include "include\mailbox.h"
#include "include\mem.h"
#include "drivers\console.h"

#include "regdef.h"

#define STACK_SIZE 4096
#define CMD_MAX 16

#define TESTYEAR  (0x08)
#define TESTMONTH (0x3)
#define TESTDAY   (0x31)
#define TESTDATE  (0x02)  // SUN:1 MON:2 TUE:3 WED:4 THU:5 FRI:6 SAT:7
#define TESTHOUR  (0x23)
#define TESTMIN   (0x59)
#define TESTSEC   (0x59)
#define RTC_ISR_NUM 20

const char_t logo[] =  {
    0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x20, 0x20, 0x3D, 0x3D, 0x3D,
    0x3D, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3D, 0x3D, 0x3D, 0x3D,
    0x20, 0x20, 0x20, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x20, 0x20, 0x20, 0x20,
    0x20, 0x20, 0x20, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x20, 0x20, 0x20, 0x20,
    0x20, 0x20, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x20, 0x20, 0x20,
    0x20, 0x20, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0D, 0x0A,
    0x3D, 0x3D, 0x20, 0x20, 0x20, 0x20, 0x3D, 0x3D, 0x20, 0x20, 0x20, 0x3D,
    0x3D, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3D, 0x3D, 0x20, 0x20,
    0x20, 0x3D, 0x3D, 0x3D, 0x20, 0x20, 0x20, 0x3D, 0x3D, 0x20, 0x20, 0x20,
    0x20, 0x3D, 0x3D, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3D, 0x3D, 0x20, 0x20,
    0x20, 0x20, 0x3D, 0x3D, 0x20, 0x20, 0x20, 0x20, 0x3D, 0x3D, 0x20, 0x20,
    0x20, 0x20, 0x3D, 0x3D, 0x0D, 0x0A, 0x3D, 0x3D, 0x20, 0x20, 0x20, 0x20,
    0x20, 0x3D, 0x3D, 0x20, 0x20, 0x20, 0x3D, 0x3D, 0x20, 0x20, 0x20, 0x20,
    0x20, 0x3D, 0x3D, 0x20, 0x20, 0x20, 0x3D, 0x3D, 0x20, 0x20, 0x20, 0x20,
    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3D, 0x3D, 0x20, 0x20, 0x20, 0x20,
    0x20, 0x20, 0x20, 0x3D, 0x3D, 0x20, 0x20, 0x20, 0x3D, 0x3D, 0x20, 0x20,
    0x20, 0x20, 0x20, 0x3D, 0x3D, 0x20, 0x20, 0x20, 0x3D, 0x3D, 0x0D, 0x0A,
    0x3D, 0x3D, 0x20, 0x20, 0x20, 0x20, 0x3D, 0x3D, 0x20, 0x20, 0x20, 0x20,
    0x20, 0x3D, 0x3D, 0x20, 0x20, 0x20, 0x3D, 0x3D, 0x20, 0x20, 0x20, 0x3D,
    0x3D, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3D,
    0x3D, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3D, 0x3D,
    0x20, 0x20, 0x3D, 0x3D, 0x20, 0x20, 0x20, 0x20, 0x3D, 0x3D, 0x20, 0x20,
    0x20, 0x20, 0x3D, 0x3D, 0x0D, 0x0A, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D,
    0x3D, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3D, 0x3D, 0x3D, 0x3D,
    0x3D, 0x20, 0x20, 0x20, 0x20, 0x3D, 0x3D, 0x20, 0x20, 0x20, 0x20, 0x20,
    0x20, 0x20, 0x20, 0x20, 0x20, 0x3D, 0x3D, 0x20, 0x20, 0x20, 0x20, 0x20,
    0x20, 0x20, 0x20, 0x20, 0x3D, 0x3D, 0x20, 0x20, 0x3D, 0x3D, 0x3D, 0x3D,
    0x3D, 0x3D, 0x3D, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3D, 0x3D, 0x3D, 0x3D,
    0x3D, 0x3D, 0x3D, 0x3D, 0x0D, 0x0A, 0x3D, 0x3D, 0x20, 0x20, 0x20, 0x20,
    0x3D, 0x3D, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3D, 0x3D, 0x3D,
    0x20, 0x20, 0x20, 0x20, 0x20, 0x3D, 0x3D, 0x20, 0x20, 0x20, 0x20, 0x20,
    0x20, 0x20, 0x20, 0x20, 0x20, 0x3D, 0x3D, 0x20, 0x20, 0x20, 0x20, 0x20,
    0x20, 0x20, 0x20, 0x20, 0x3D, 0x3D, 0x20, 0x20, 0x3D, 0x3D, 0x20, 0x20,
    0x3D, 0x3D, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3D, 0x3D, 0x0D, 0x0A,
    0x3D, 0x3D, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3D, 0x3D, 0x20, 0x20, 0x20,
    0x20, 0x20, 0x20, 0x3D, 0x3D, 0x3D, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
    0x3D, 0x3D, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20,
    0x3D, 0x3D, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3D, 0x3D, 0x20,
    0x20, 0x20, 0x3D, 0x3D, 0x20, 0x20, 0x20, 0x3D, 0x3D, 0x20, 0x20, 0x20,
    0x20, 0x20, 0x3D, 0x3D, 0x0D, 0x0A, 0x3D, 0x3D, 0x20, 0x20, 0x20, 0x20,
    0x3D, 0x3D, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3D, 0x3D, 0x3D,
    0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3D, 0x3D, 0x3D, 0x20, 0x20,
    0x20, 0x3D, 0x3D, 0x20, 0x20, 0x20, 0x20, 0x3D, 0x3D, 0x20, 0x20, 0x20,
    0x20, 0x20, 0x3D, 0x3D, 0x20, 0x20, 0x20, 0x20, 0x3D, 0x3D, 0x20, 0x20,
    0x20, 0x20, 0x3D, 0x3D, 0x20, 0x20, 0x20, 0x20, 0x3D, 0x3D, 0x0D, 0x0A,
    0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x20, 0x20, 0x20, 0x20, 0x20,
    0x20, 0x20, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x20, 0x20, 0x20, 0x20, 0x20,
    0x20, 0x20, 0x20, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x20, 0x20, 0x20, 0x20,
    0x20, 0x20, 0x20, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x20, 0x20, 0x20, 0x20,
    0x20, 0x20, 0x3D, 0x3D, 0x20, 0x20, 0x20, 0x20, 0x20, 0x3D, 0x3D, 0x3D,
    0x20, 0x20, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x3D, 0x0D, 0x0A,
    0x00
};

pipe_t *pipe;
mail_t *mail;
buf_t *pbuf;

char_t cmd[][16] =  {
    "pipe", "mbox", "shm", "clr", "logo", "mem", "show", "task", "light", "key",
    "time"
}; //这些字符串分别对应不同的功能编号,功能编号从0开始,并一一对应

uword_t year, month, day, weekday, hour, min, sec;
char_t *date[8] =  {
    "", "SUN", "MON", "TUE", "WED", "THU", "FRI", "SAT"
};
word_t tick_flag;

void irq_rtc_display(void) {
    if(rBCDYEAR == 0x99) {
        year = 0x1999;
    } else {
        year = 0x2000 + rBCDYEAR;
    }

    month = rBCDMON;
    day = rBCDDAY;
    weekday = rBCDDATE;
    hour = rBCDHOUR;
    min = rBCDMIN;
    sec = rBCDSEC;

    rRTCCON = 0x0;
    rINTMSK |= 0x01000000; //mask tick interrupt
    rI_ISPC = BIT_TICK;
    tick_flag = TRUE;
}

static void init_rtc() {
    rRTCCON = 0x01; // R/W enable, 1/32768, Normal(merge), No reset

    rBCDYEAR = TESTYEAR;
    rBCDMON = TESTMONTH;
    rBCDDAY = TESTDAY; // SUN:1 MON:2 TUE:3 WED:4 THU:5 FRI:6 SAT:7
    rBCDDATE = TESTDATE;
    rBCDHOUR = TESTHOUR;
    rBCDMIN = TESTMIN;
    rBCDSEC = TESTSEC;

    tick_flag = FALSE;
    isrInstall(RTC_ISR_NUM, 0, irq_rtc_display);
    rRTCCON = 0x0;
}

static void display_time(void) {
    Print("  时间演示。\n");
    Print("  请按任意键结束!\n");

    rRTCCON = 0x01; // R/W enable, 1/32768, Normal(merge), No reset
    rINTMSK &= 0x0FEFFFFF; //enable tick interrupt
    rTICINT = 127+(1 << 7); //START

    while(1) {
        if(tick_flag == TRUE) {
            Print("\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b %4x-%2x-%2x %s. %2x:%2x:%2x",
                      year, month, day, date[weekday], hour, min, sec);
            tick_flag = FALSE;
            rRTCCON = 0x01; // R/W enable, 1/32768, Normal(merge), No reset
            rINTMSK &= 0x0FEFFFFF; //enable tick interrupt
            rTICINT = 127+(1 << 7); //START
        }
        if(RevByte()) {
            Print("\n  本测试结束!\n\n");
            break;
        }
    }
}

static void init_hardware(void) {
    rPDATC = 0; //初始化LED端口;
    rPCONC &= ~0xFD;
    rPCONC |= 0x54;

    //初始化按键端口
    rPDATG = 0;
    rPCONG &= 0xFF;
    rPCONG |= 0x0;

    //初始化RTC
    init_rtc();
}

static void clear(void) {
    uword_t i = 24;

    while(i--) {
        Print("\n");
    }
}

static void print_logo(void) {
    uword_t i;
    const char_t *p = logo;

    clear();

    Print("\n\n");

    for(i = 0; i < 5; i++) {
        Print(" ");
    }

    while(*p) {
        Print("%c",  *p);
        if(*p == 0x0A)
        for(i = 0; i < 5; i++) {
            Print(" ");
        }
        p++;
    }

    for(i = 0; i < 5; i++) {
        Print("\n");
    }

    for(i = 0; i < 26; i++) {
        Print(" ");
    }
    Print("Welcome to use ByCore Beta!\n");

    for(i = 0; i < 30; i++) {
        Print(" ");
    }
    Print("All Rights Reserved!\n");

    for(i = 0; i < 32; i++) {
        Print(" ");
    }
    Print("anmnmnly@163.com\n");

    for(i = 0; i < 35; i++) {
        Print(" ");
    }
    Print("381666673\n");

}

static void delay(uword_t cnt) {
    uword_t i, j;
    for(i = 0; i < 50000; i++)
        for(j = 0; j < cnt; j++)
            ;
}

static word_t light(void) {
    rPDATC = 0xE;
    delay(50);

    if(RevByte()) {
        return TRUE;
    }

    rPDATC &= 0xD;
    delay(50);
    rPDATC = 0xE;

    if(RevByte()) {
        return TRUE;
    }

    rPDATC &= 0xA;
    delay(50);
    rPDATC = 0xE;

    if(RevByte()) {
        return TRUE;
    }

    rPDATC &= 0x6;
    delay(50);
    rPDATC = 0xE;

    if(RevByte()) {
        return TRUE;
    }

    delay(50);
    rPDATC = 0x0;

    if(RevByte()) {
        return TRUE;
    }

    delay(50);
    rPDATC = 0xE;

    if(RevByte()) {
        return TRUE;
    }

    delay(50);
    rPDATC = 0x0;

    if(RevByte()) {
        return TRUE;
    }

    delay(50);
    rPDATC = 0xE;

    if(RevByte()) {
        return TRUE;
    }

    delay(50);
    rPDATC = 0x0;
    delay(50);
    return FALSE;
}

static void getString(char_t *string) {
    char_t ch;
    char_t *string2 = string;

    while(1) {
        while((ch = RevByte()) != '\r' && ch != 0) {
            if(ch == '\b') {
                if((int)string2 < (int)string) {
                    Print("\b \b");
                    string--;
                }
            } else {
                *string++ = ch;
                SendByte(ch);
            }
        }
        if(ch == '\r') {
            Print("\n");
            break;
        }
    }
    *string = '\0';
}

static void print_dot(uword_t s) {
    uword_t i;

    for(i = 0; i < s; i++) {
        Print(".");
        delay(10);
    }
}

static void Task0(void) {
    while(1) {
        osSleep();
        Print("  您选择了跑马灯程序。\n");
        Print("  请按任意键结束!\n");
        while(light())
            ;
        Print("  本测试结束!\n\n");
    }
}

static void Task1(void) {
    char_t *str,  *p;
    uword_t err;

    while(1) {
        osSleep();

        Print("  您选择了管道功能测试。\n");
        Print("  该功能测试原理如下:\n");
        Print(0,
                   "      Task1将创建一个管道,并从键盘接收数据,然后通过管道将数据传递给Task2,\n");
        Print(0,
                   "      Task2通过串口打印接收到的数据,当打印完数据后,通知Task1撤销管道。\n");
        Print("  请按任意键继续...\n\n\n");
        while(!RevByte())
            ;

        Print("  Task1开始创建管道。\n");
        Print("  ");
        print_dot(6);
        Print("\n");

        if(((pipe = pipeInit(101, 102, 64)) == NULL) || ((str = (char_t*)
           kmalloc(64)) == NULL)) {
            Print("No Free Memory!\n");
            while(1)
                ;
            //死机
        }
        p = str;
        Print("  管道创建成功。\n");
        Print("  请从键盘输入数据:");
        getString(str);

        Print("  您输入的数据为:");
        Print("%s\n", str);
        Print("  请按任意键将数据发送给Task2,并唤醒Task2接受数据:\n");
        while(!RevByte())
            ;
        Print("  ");
        print_dot(6);
        Print("\n");
        if(pipeSend(pipe, str, &err) == TRUE) {
            Print("  数据发送成功,现在唤醒Task2接受数据。\n\n\n");
            osWakeUp(102);
        } else {
            Print("  数据发送失败!\n");
        }
        osSleep();
        Print("  Task1重新运行,开始撤销管道。\n");
        Print("  ");
        print_dot(6);
        Print("\n");
        kfree(p);
        pipeDel(pipe);
        Print("  撤销管道成功,本测试结束!\n\n");

    }
}

static void Task2(void) {
    uword_t err;
    char_t *p;
    while(1) {
        osSleep();
        if((p = (char_t*)kmalloc(64)) == NULL) {
            Print("No Free Memory!\n");
            while(1)
                ;
        }

        Print("  Task2开始运行,准备从管道中取出Task1发送的数据。\n");
        Print("  ");
        print_dot(6);
        Print("\n");
        p = (char_t*)pipeRev(pipe, &err);
        if(err == PIPE_OK) {
            Print("  取数完毕,打印数据:");
            Print("%s\n", p);
            kfree(p);
            Print("  请按任意键通知Task1撤销该管道。\n\n\n");
            while(!RevByte())
                ;
            osWakeUp(101);
        } else {
            Print("  取数据失败!\n");
        }
    }
}

static void Task3(void) {
    uword_t err;
    static char_t str[2][64];

    while(1) {
        osSleep();
        Print("  您选择了邮箱功能测试。\n");
        Print("  该功能测试原理如下:\n");
        Print("      Task3将创建一个邮箱,并从键盘接收两个数据串,然后通过邮箱分别数据传递给\n");
        Print("      Task5和Task6; Task4也将从键盘接收两个数据串,然后通过邮箱分别数据传递给\n");
        Print("      Task7和Task8,当Task5~Task8打印完数据后,通知Task3撤销邮箱。\n");
        Print("  请按任意键继续...\n\n\n");
        while(!RevByte())
            ;

        Print("  Task3开始运行,创建邮箱。\n");
        Print("  ");
        print_dot(6);
        Print("\n");
        if((mail = mboxInit(64)) == NULL) {
            Print("  邮箱创建失败!\n");
            while(1)
                ;
        }

        Print("  邮箱创建成功!\n");
        Print("  请从键盘输入数据(Task3将此数据发送给Task5):");
        getString(str[0]);
        Print("  您输入的数据为:");
        Print("%s\n", str[0]);
        Print("  开始发送数据。\n");
        Print("  ");
        print_dot(6);
        Print("\n");
        mboxSend(mail, 100, 105, str[0], &err);
        Print("  发送成功!\n");

        Print("  请按任意键继续输入...\n\n");
        while(!RevByte())
            ;

        Print("  请从键盘输入数据(Task3将此数据发送给Task6):");
        getString(str[1]);
        Print("  您输入的数据为:");
        Print("  %s\n", str[1]);
        Print("  开始发送数据。\n");
        Print("  ");
        print_dot(6);

⌨️ 快捷键说明

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