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

📄 main11.c

📁 Bycore是一个嵌入式操作系统内核。Bycore包括内存管理、任务管理、中断管理、任务互斥、同步与通信管理等功能。Bycore全部由C语言完成
💻 C
📖 第 1 页 / 共 2 页
字号:
        Print("\n");
        mboxSend(mail, 101, 106, str[1], &err);
        Print("  发送成功!\n");

        Print("  请按任意键唤醒Task4运行。\n\n");
        while(!RevByte())
            ;
        osWakeUp(104);

        osSleep();
        Print("  Task3重新运行,开始撤销邮箱。\n");
        Print("  ");
        print_dot(6);
        Print("\n");
        mboxDel(mail);
        Print("  撤销邮箱成功,本测试结束!\n\n");

    }
}

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

    while(1) {
        osSleep();
        Print("  Task4开始运行。\n");

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

        Print("  ");
        print_dot(6);
        mboxSend(mail, 102, 107, str[0], &err);
        Print("  发送成功!\n");

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

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

        Print("  ");
        print_dot(6);
        mboxSend(mail, 103, 108, str[1], &err);
        Print("  发送成功!\n");

        Print("  请按任意键唤醒Task5,Task6,Task7,Task8接收数据。\n\n");
        while(!RevByte())
            ;
        osWakeUp(105);
        osWakeUp(106);
        osWakeUp(107);
        osWakeUp(108);
    }
}

static void Task5(void) {
    char_t *str;
    uword_t err;

    while(1) {
        osSleep();
        Print("  Task5开始运行\n");
        Print("  请按任意键开始从邮箱中取出属于自己的数据。\n");
        while(!RevByte())
            ;

        Print("  ");
        print_dot(6);
        Print("\n");
        if((str = (char_t*)mboxRev(mail, 100, 103, &err)) == NULL) {
            Print("  取数据失败!");
            while(1)
                ;
        }
        Print("  取数据成功!\n");
        Print("  打印数据:");
        Print("%s\n", str);
        Print("  打印数据完毕,请按任意键继续...\n\n");

        while(!RevByte())
            ;
    }
}

static void Task6(void) {
    char_t *str;
    uword_t err;

    while(1) {
        osSleep();
        Print("  Task6开始运行。\n");
        Print("  请按任意键开始从邮箱中取出属于自己的数据。\n");
        while(!RevByte())
            ;

        Print("  ");
        print_dot(6);
        Print("\n");
        if((str = (char_t*)mboxRev(mail, 101, 103, &err)) == NULL) {
            Print("  取数据失败!");
            while(1)
                ;
        }
        Print("  取数据成功!\n");
        Print("  打印数据:");
        Print("%s\n", str);
        Print("  打印数据完毕,请按任意键继续...\n\n");

        while(!RevByte())
            ;
    }
}

static void Task7(void) {
    char_t *str;
    uword_t err;

    while(1) {
        osSleep();
        Print("  Task7开始运行\n");
        Print("  请按任意键开始从邮箱中取出属于自己的数据。\n");
        while(!RevByte())
            ;

        Print("  ");
        print_dot(6);
        if((str = (char_t*)mboxRev(mail, 102, 104, &err)) == NULL) {
            Print("  取数据失败");
            while(1)
                ;
        }
        Print("  取数据成功!\n");
        Print("  打印数据:");
        Print("%s\n", str);
        Print("  打印数据完毕,请按任意键继续...\n\n");

        while(!RevByte())
            ;
    }
}

static void Task8(void) {
    char_t *str;
    uword_t err;

    while(1) {
        osSleep();
        Print("  Task8开始运行。\n");
        Print("  请按任意键开始从邮箱中取出属于自己的数据。\n");
        while(!RevByte())
            ;

        Print("  ");
        print_dot(6);
        if((str = (char_t*)mboxRev(mail, 103, 104, &err)) == NULL) {
            Print("  取数据失败");
            while(1)
                ;
        }
        Print("  取数据成功!\n");
        Print("  打印数据:");
        Print("%s\n", str);
        Print("  打印数据完毕,请按任意键唤醒Task3撤销该管道。\n\n");

        while(!RevByte())
            ;
        osWakeUp(103);
    }
}

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

    while(1) {
        osSleep();

        Print("  您选择了共享内存功能测试。\n");
        Print("  该功能测试原理如下:\n");
        Print("      Task9将创建一个内存缓冲区,并从键盘接收数据,然后将数据放到此缓冲区,并通\n");
        Print("      知Task10来取数据,Task10取出数据显示,最后通知Task9撤销缓冲区。\n");
        Print("  请按任意键继续...\n\n\n");
        while(!RevByte())
            ;

        Print("  Task9 开始创建共享缓冲区。\n");
        Print("  ");
        print_dot(6);
        Print("\n");

        if(((pbuf = bufInit(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("  请按任意键将数据发送给Task10,并唤醒Task10接受数据:\n");
        while(!RevByte())
            ;
        Print("  ");
        print_dot(6);
        Print("\n");
        bufSendStr(pbuf, str, &err);
        if(err == BUF_OK) {
            Print("  数据发送成功,现在唤醒Task10接受数据。\n\n\n");
            osWakeUp(110);
        } else {
            Print("  数据发送失败!\n");
        }
        osSleep();
        Print("  Task9重新运行,开始撤销共享缓冲区。\n");
        Print("  ");
        print_dot(6);
        Print("\n");
        kfree(p);
        bufDel(pbuf);
        Print("  撤销共享缓冲区成功,本测试结束!\n\n");
    }
}

static void Task10(void) {
    uword_t err;
    char_t *str,  *p;
    while(1) {
        osSleep();
        if((str = (char_t*)kmalloc(64)) == NULL) {
            Print("No Free Memory!\n");
            while(1)
                ;
        }
        p = str;
        Print("  Task10开始运行,准备从共享缓冲区中取出Task9发送的数据。\n");
        Print("  ");
        print_dot(6);
        Print("\n");
        bufRevStr(pbuf, str, &err);
        if(err == BUF_OK) {
            Print("  取数完毕,所取数据为:");
            Print("%s\n", p);
            kfree(p);
            Print("  请按任意键通知Task9撤销该管道。\n\n\n");
            while(!RevByte())
                ;
            osWakeUp(109);
        } else {
            Print("  取数据失败!\n");
        }
    }
}

static void Task11(void) {
    while(1) {
        osSleep();

        Print("  pipe:  ");
        Print("\t管道功能演示\n");

        Print("  mbox:  ");
        Print("\t邮箱功能演示\n");

        Print("  shm:  ");
        Print("\t共享内存演示\n");

        Print("  clr:  ");
        Print("\t清除屏幕\n");

        Print("  logo:  ");
        Print("\t打印起始屏幕\n");

        Print("  mem: ");
        Print("\t\t打印内存信息\n");

        Print("  show:  ");
        Print("\t显示所有的命令\n");

        Print("  task:  ");
        Print("\t查看全部任务\n");

        Print("  light:  ");
        Print("\t跑马灯演示\n");

        Print("  key:  ");
        Print("\t按键演示\n");

        Print("  time:  ");
        Print("\t显示时间\n");

    }
}

static void Task12(void) {
    word_t data;

    while(1) {
        osSleep();
        Print("  您选择了按键程序。\n");
        Print("  请按任意键结束!\n");
        while(1) {
            data = rPDATG;
            delay(15);
            data >>= 4;
            switch(data) {
                case 0xE:
                    Print("  键1被按下!\n");
                    break;
                case 0xD:
                    Print("  键2被按下!\n");
                    break;
                case 0xB:
                    Print("  键3被按下!\n");
                    break;
                case 0x7:
                    Print("  键4被按下!\n");
                    break;
                default:
                    break;
            }
            if(RevByte()) {
                Print("  本测试结束!\n\n");
                break;
            }
        }
    }
}

static void print_mem_info(void) {
    uword_t used_count = 0;
    uword_t free_count = 0;
    page_t *pmem = kgetmemlist();

    Print("\t\t\t内存信息如下\n");
    Print("\t实际物理内存大小:");
    Print("\t%d Byte\n", MEM_SIZE);

    while(pmem != NULL) {
        if(pmem->status == MEM_FREE) {
            free_count += pmem->size;
        } else if(pmem->status == MEM_ALLOC) {
            used_count += pmem->size;
        }
        pmem = pmem->mem_down;
    }
    Print("\t已用空间:\t");
    Print("\t%d Byte\n", used_count);
    Print("\t空闲空间:\t");
    Print("\t%d Byte\n", free_count);
}

static void print_task_info(void) {
    tcb_t *ptcb;
    list_t *list,  *plist;
    char_t *pstr;

    pstr = (char_t*)kmalloc(32);

    Print("任务ID\t优先级\t  状态\t时间片\t运行时间  等待时间\n");
    list = osGetTaskHead();
    plist = list->next;

    do {
        ptcb = mac_find_entry(plist, tcb_t, task_link);
        switch(ptcb->status) {
            case T_READY:
                pstr = "就绪";
                break;
            case T_BLOCK:
                pstr = "阻塞";
                break;
            case T_SLEEP:
                pstr = "休眠";
                break;
            case T_DELAY:
                pstr = "延时";
                break;
            default:
                break;
        }
        Print("  %d\t  %d\t  %s\t  %d\t  %d\t    %d\n", ptcb->id, ptcb
                   ->prio, pstr, ptcb->slice_time, ptcb->exe_time, ptcb
                   ->delay_time);
        plist = plist->next;
    } while(plist != list->next);
    kfree(pstr)
        ;
}

static void shell(void) {
    uword_t i;
    char_t *str,  *p;

    while(1) {
        Print(":)");

        if((str = (char_t*)kmalloc(32)) == NULL) {
            Print("No Free Memory!\n");
            while(1)
                ;
            //死机
        }
        kmemset(str, 0, 32);
        p = str;
        getString(str);

        for(i = 0; i < CMD_MAX; i++) {
            if((strcmp(str, cmd[i])) == 0) {
                switch(i) {
                    case 0:
                        osWakeUp(101);
                        break;
                    case 1:
                        osWakeUp(103);
                        break;
                    case 2:
                        osWakeUp(109);
                        break;
                    case 3:
                        clear();
                        break;
                    case 4:
                        print_logo();
                        break;
                    case 5:
                        print_mem_info();
                        break;
                    case 6:
                        osWakeUp(111);
                        break;
                    case 7:
                        print_task_info();
                        break;
                    case 8:
                        osWakeUp(100);
                        break;
                    case 9:
                        osWakeUp(112);
                        break;
                    case 10:
                        display_time();
                    default:
                        break;
                }
                break;
            }
        }
        if(i >= CMD_MAX &&  *str != 0) {
            Print("  您输入的命令不存在,请使用show命令查看可用命令!\n")
                       ;
        }
        kfree(p);
    }
}

void Main(void) {
    init_hardware();

    osInitTask(Task0, 100, 1, 25, STACK_SIZE);
    osInitTask(Task1, 101, 2, 15, STACK_SIZE);
    osInitTask(Task2, 102, 3, 10, STACK_SIZE);
    osInitTask(Task3, 103, 4, 18, STACK_SIZE);
    osInitTask(Task4, 104, 5, 23, STACK_SIZE);
    osInitTask(Task5, 105, 6, 22, STACK_SIZE);
    osInitTask(Task6, 106, 7, 11, STACK_SIZE);
    osInitTask(Task7, 107, 8, 13, STACK_SIZE);
    osInitTask(Task8, 108, 9, 24, STACK_SIZE);
    osInitTask(Task9, 109, 10, 21, STACK_SIZE);
    osInitTask(Task10, 110, 11, 32, STACK_SIZE);
    osInitTask(Task11, 111, 12, 11, STACK_SIZE);
    osInitTask(Task12, 112, 13, 26, STACK_SIZE);
    osInitTask(shell, 1000, 50, 17, STACK_SIZE);
    print_logo();
    uartClear();
}

⌨️ 快捷键说明

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