?? test.c
字號(hào):
#include "config.h"
#define TASK_STK_SIZE 64
OS_STK TaskStartStk[TASK_STK_SIZE];
void TaskStart(void *pdata);
/****************************************************************************
* 名稱:ASCII_TO_HEX()
* 功能:ASCII轉(zhuǎn)16進(jìn)制數(shù)
****************************************************************************/
uint8 ASCII_TO_HEX(uint16 ASCII)
{ uint8 data;
uint8 HEX;
data=(uint8)ASCII;
if(data>'9')
data=data-'A' + 0x0a;
else
data=data-'0';
HEX = data;
data=(uint8)(ASCII>>8);
if(data>'9')
data=data-'A' + 0x0a;
else
data=data-'0';
HEX |= data<<4;
return HEX;
}
/*********************************************************************************************************
** 函數(shù)名稱: RetStateToPC
** 功能描述: 返回指令執(zhí)行狀態(tài)到PC機(jī)
** 輸 入: 無(wú)
** 輸 出: 無(wú)
** 全局變量: 無(wú)
********************************************************************************************************/
void RetStateToPC(uint8 RetData)
{
uint8 RetData2PC[7]={'S','T','A','T','E',':','N'}; //初始化返回到PC的狀態(tài)
if(RetData)
{
RetData2PC[6]='Y'; //指令正常完成
}
UART0Write(RetData2PC,7); // 寫(xiě)數(shù)據(jù)到PC
}
/*********************************************************************************************************
** 函數(shù)名稱: SendDriveInfo
** 功能描述: 返回指令執(zhí)行狀態(tài)到PC機(jī)
** 輸 入: DeviceInfo,描述信息數(shù)據(jù)結(jié)構(gòu)指針
** 輸 出: 無(wú)
** 全局變量: 無(wú)
********************************************************************************************************/
void SendDriveInfo(PCF_IDENTIFY_DATA DeviceInfo)
{
UART0Write((uint8*)DeviceInfo->ModelNumber,40);//發(fā)送設(shè)備型號(hào)
UART0Write((uint8*)DeviceInfo->SerialNumber,20);//發(fā)送設(shè)備序列號(hào)
UART0Write((uint8*)&DeviceInfo->CurrentSectorCapacity,4); //發(fā)送設(shè)備總扇區(qū)數(shù)
}
/*********************************************************************************************************
** 函數(shù)名稱: main
** 功能描述: c語(yǔ)言的主函數(shù),由它啟動(dòng)多任務(wù)環(huán)境
** 輸 入: 無(wú)
** 輸 出: 無(wú)
** 全局變量: 無(wú)
********************************************************************************************************/
int main (void)
{
OSInit();
OSTaskCreate(TaskStart, (void *)0, &TaskStartStk[TASK_STK_SIZE - 1], 0);
OSStart();
return 0;
}
/*********************************************************************************************************
** 函數(shù)名稱: TaskStart
** 功能描述: μCOS-II的第一個(gè)任務(wù),通常由它初始化目標(biāo)板和建立其它任務(wù)
** 輸 入: 無(wú)
** 輸 出: 無(wú)
** 全局變量: 無(wú)
********************************************************************************************************/
uint8 DataBuff[0x10000]; //保存扇區(qū)數(shù)據(jù)緩沖區(qū)
void TaskStart(void *pdata)
{
#define DEVICE0 0
uint16 SectorCount; //扇區(qū)數(shù)
uint32 SectorNumber; //扇區(qū)號(hào)
uint32 ReceiveData; //接收到數(shù)據(jù)的字節(jié)數(shù)
uint16 i;
uint8 RetData,buff[15];
uint8 CommandCode;
pdata = pdata; /* 避免編譯警告 */
TargetInit(); /* 目標(biāo)板初始化 */
for (;;)
{
err:
while ((UART0Getch() != 'Z'));
for(i=0;i<15;i++)buff[i]=UART0Getch();
if((buff[0]!='L')||(buff[1]!='G')||(buff[2]!=':')) goto err;
CommandCode = (ASCII_TO_HEX(buff[3])<<4)|ASCII_TO_HEX(buff[4]); //指令代碼
SectorNumber = (ASCII_TO_HEX(buff[5])<<28)|(ASCII_TO_HEX(buff[6])<<24)| //扇區(qū)號(hào)
(ASCII_TO_HEX(buff[7])<<20)|(ASCII_TO_HEX(buff[8])<<16)|
(ASCII_TO_HEX(buff[9])<<12)|(ASCII_TO_HEX(buff[10])<<8)|
(ASCII_TO_HEX(buff[11])<<4)|ASCII_TO_HEX(buff[12]);
SectorCount = (ASCII_TO_HEX(buff[13])<<4)|ASCII_TO_HEX(buff[14]); // 扇區(qū)數(shù)
switch(CommandCode)
{
case 0xE0://立即待機(jī)
RetData = ATA_StandbyImmediate(DEVICE0);
break;
case 0xE1://立即空閑
RetData = ATA_IdleImmediate(DEVICE0);
break;
case 0x20://讀扇區(qū)
RetData = ATA_ReadSector(DEVICE0,(uint16*)DataBuff,SectorNumber,SectorCount);//寫(xiě)CF卡或IDE硬盤(pán)數(shù)扇區(qū)數(shù)據(jù)
if(SectorCount==0)
SectorCount =256; //如果扇區(qū)數(shù)為0,即操作256個(gè)扇區(qū)
ReceiveData = 512*SectorCount; //傳輸總字節(jié)數(shù)
UART0Write(DataBuff,ReceiveData); //傳輸數(shù)據(jù)到PC
break;
case 0x30://寫(xiě)扇區(qū)
if(SectorCount==0) //如果扇區(qū)號(hào)為0即寫(xiě)256個(gè)扇區(qū)
ReceiveData = 512*256; //需要收到的數(shù)據(jù)字節(jié)總數(shù)
else
ReceiveData = 512*SectorCount; //需要收到的數(shù)據(jù)字節(jié)總數(shù)
OS_ENTER_CRITICAL();
for(i=0;i<ReceiveData;i++)
{
DataBuff[i]=UART0Getch(); //接收扇區(qū)數(shù)據(jù)
}
OS_EXIT_CRITICAL();
RetData = ATA_WriteSector(DEVICE0,(uint16*)DataBuff,SectorNumber,SectorCount);//寫(xiě)CF卡或IDE硬盤(pán)數(shù)扇區(qū)數(shù)據(jù)
break;
case 0xEC://獲取設(shè)備識(shí)別信息
RetData = ATA_IdentifyDrive(DEVICE0,DataBuff); //獲取設(shè)備識(shí)別信息
if(RetData)
SendDriveInfo((PCF_IDENTIFY_DATA)DataBuff); //傳輸數(shù)據(jù)到PC
break;
default:
RetData = FALSE;
break;
}
RetStateToPC(RetData);//向PC返回指令執(zhí)行狀態(tài)
}
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -