📄 main11.c
字号:
/*
* 本程序为演示实例
* 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 + -