📄 main.c
字号:
/****************************************Copyright (c)**************************************************
** Guangzou ZLG-MCU Development Co.,LTD.
** graduate school
** http://www.zlgmcu.com
**
**--------------File Info-------------------------------------------------------------------------------
** File name: main.c
** Last modified Date: 2004-09-16
** Last Version: 1.0
** Descriptions: The main() function example template
**
**------------------------------------------------------------------------------------------------------
** Created by: Chenmingji
** Created date: 2004-09-16
** Version: 1.0
** Descriptions: The original version
**
**------------------------------------------------------------------------------------------------------
** Modified by:
** Modified date:
** Version:
** Descriptions:
**
********************************************************************************************************/
#include "config.h"
#include "stdlib.h"
#define TaskStkLengh 64 //Define the Task0 stack length 定义用户任务0的堆栈长度
OS_STK TaskStk [TaskStkLengh]; //Define the Task0 stack 定义用户任务0的堆栈
void Task0(void *pdata); //Task0 任务0
int main (void)
{
OSInit ();
OSTaskCreate (Task0,(void *)0, &TaskStk[TaskStkLengh - 1], 2);
OSStart ();
return 0;
}
/*********************************************************************************************************
** Task0 任务0
********************************************************************************************************/
#define TaskUSBStkLengh 256
OS_STK TaskStk_Host [TaskUSBStkLengh];
void Task_USB_Host_Serve(void *pdata);
OS_EVENT *Uart0ReviceMbox; /* 串口接收数据邮箱 */
OS_STK TaskStk_Uart0 [TaskStkLengh];
void TaskUart0Revice(void *pdata);
#define TaskUDiskStkLengh 100
OS_STK TaskStk_UDisk[TaskUDiskStkLengh];
void Task_U_disk_DEMO(void *pdata);
void Task0 (void *pdata)
{
pdata = pdata;
OSTaskCreate (Task_USB_Host_Serve,(void *)0,
&TaskStk_Host[TaskUSBStkLengh-1],3); // 建立USB主机服务任务,USB主机服务任优先级就高于其它使用USB主机操作任务
OSTaskCreate(TaskUart0Revice, (void *)0,
&TaskStk_Uart0[TaskStkLengh - 1], 4);
OSTaskCreate (Task_U_disk_DEMO,(void *)0,
&TaskStk_UDisk[TaskUDiskStkLengh-1],5);
TargetInit ();
/* 创建Uart0接收任务 */
while (1)
{
OSTimeDly(10);
}
}
/*********************************************************************************************************
** USB 主机任务
********************************************************************************************************/
void Task_USB_Host_Serve(void *pdata)
{
pdata = pdata;
while (1)
{
USB_Host_Serve();
}
}
/*********************************************************************************************************
** 函数名称: TaskUart0Revice
** 功能描述: μCOS-II的任务
********************************************************************************************************/
void TaskUart0Revice(void *pdata)
{
uint8 Buf[8],i;
pdata = pdata; /* 避免编译警告 */
Uart0ReviceMbox = OSMboxCreate(NULL); /* 建立邮箱 */
if (Uart0ReviceMbox == NULL)
while (1);
for (;;)
{
Buf[0] = UART0Getch(); /* 接收数据头 */
for (i = 1; i < 8; i++)
Buf[i] = UART0Getch();
OSMboxPost(Uart0ReviceMbox, (void *)Buf);
}
}
/*********************************************************************************************************
** USB 大容量演示任务
********************************************************************************************************/
#define CMD_INIT 0x00 /* 初始化U盘命令 */
#define CMD_READ 0x01 /* 读命令 */
#define CMD_WRITE 0x02 /* 写命令 */
#define CMD_DATA_TRANS 0x04 /* 将data_buf中的数据发送到PC机 */
#define CMD_DATA_RECV 0x05 /* 接收来自串口的数据,并放入data_buf中 */
/* U盘读写缓冲区,比U盘一个块大8字节 */
uint8 data_buf[520];
void Task_U_disk_DEMO(void *pdata)
{
uint8 *pRec;
uint8 err;
uint32 bufaddr,blockaddr;
hMedLUN * MediumPtr;
device_instance * dviPtr;
pdata = pdata; /* 避免编译警告 */
for (;;)
{
pRec = (uint8 *)OSMboxPend(Uart0ReviceMbox, 0, &err); /* 接收数据 */
switch(pRec[0])
{
case CMD_INIT:
dviPtr = find_class_interface(MASSSTRAGE_CLASS_INTERFACE,0);
if(dviPtr)
{
MediumPtr = Creat_Medium( dviPtr ,0);
pRec[1] = MediumPtr?0:1;
// U盘总扇区数
pRec[2] = (uint8)(MediumPtr->LastLogicalBlookAddress/0x1000000);
pRec[3] = (uint8)(MediumPtr->LastLogicalBlookAddress/0x10000);
pRec[4] = (uint8)(MediumPtr->LastLogicalBlookAddress/0x100);
pRec[5] = (uint8)MediumPtr->LastLogicalBlookAddress;
// 扇区大小
pRec[6] = (uint8)(MediumPtr->BlockLengthInBytes/0x100);
pRec[7] = (uint8)MediumPtr->BlockLengthInBytes;
}
else
pRec[1] = 1; /* 初始化卡 */
break;
case CMD_READ:
blockaddr = (pRec[1] << 24) + (pRec[2] << 16) + /* 计算块地址 */
(pRec[3] << 8) + pRec[4];
pRec[1] = ReadBlockData(MediumPtr, data_buf, blockaddr, 1)?0:1; /* 读U盘一个扇区 */
break;
case CMD_WRITE:
blockaddr = (pRec[1] << 24) + (pRec[2] << 16) +
(pRec[3] << 8) + pRec[4];
pRec[1] = WriteBlockData(MediumPtr, data_buf, blockaddr, 1)?0:1; /* 写U盘一个扇区 */
break;
case CMD_DATA_RECV:
bufaddr = (pRec[1] << 8) + pRec[2]; /* 计算缓冲区地址 */
memcpy(data_buf + bufaddr, &pRec[3], 5); /* 收到数据放入pRec */
break;
case CMD_DATA_TRANS:
bufaddr = (pRec[1] << 8) + pRec[2]; /* 计算缓冲区地址 */
memcpy(&pRec[1], data_buf + bufaddr, 7); /* data_buf数据放入pRec */
break;
default: break;
}
UART0Write(pRec, 8); /* 发送响应帧 */
}
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -