?? 基于lpc2104+μcos-ii操作系統代碼.c
字號:
基于學習ARM和μC/OS-II,已成功移植μC/OS-II到LPC2104上。采用ADS1.2編譯器。建立5個任務:
任務1: 讀/寫卡(視頻卡),優先級最高。
任務2: 接收PC命令,命令分析
任務3: 顯示
任務4: 負責返回數據給PC
任務5: 數據存儲
/*
*********************************************************************************************************
* uC/OS-II
* The Real-Time Kernel
*
* (c) Copyright 1992-2002, Jean J. Labrosse, Weston, FL
* All Rights Reserved
*
* EXAMPLE #1
*********************************************************************************************************
*/
#include "includes.h"
#include "config.h"
#include "harder.h"
#include "libvic.h"
#include "libuart.h"
#include "uart.h"
#include "main.h"
#include "zlg500B.h"
#include "myconfig.h"
#include "OS_CPU.h"
#include "libi2c.h"
/*
*********************************************************************************************************
* GLOBAL VARIABLES
*********************************************************************************************************
*/
#define COM2 2
#define COMM_RX_BUF_SIZE1 64 /* Number of characters in Rx ring buffer */
#define COMM_TX_BUF_SIZE1 64
typedef struct {
INT16U RingBufRxCtr; /* Number of characters in the Rx ring buffer */
OS_EVENT *RingBufRxSem; /* Pointer to Rx semaphore */
INT8U *RingBufRxInPtr; /* Pointer to where next character will be inserted */
INT8U *RingBufRxOutPtr; /* Pointer from where next character will be extracted */
INT8U RxStep;
INT8U RxIndex;
INT8U RxBCC;
INT8U RxLen;
INT8U ACKIN;
INT8U ZLG500InFlag;
INT8U RingBufRx[COMM_RX_BUF_SIZE1]; /* Ring buffer character storage (Rx) */
INT8U databuf[16];
INT16U RingBufTxCtr; /* Number of characters in the Tx ring buffer */
OS_EVENT *RingBufTxSem; /* Pointer to Tx semaphore */
INT8U *RingBufTxInPtr; /* Pointer to where next character will be inserted */
INT8U *RingBufTxOutPtr; /* Pointer from where next character will be extracted */
INT8U TxStep;
INT8U TxIndex;
INT8U TxLen;
INT8U ZLG500OutFlag;
INT8U TxBCC;
INT8U RingBufTXBusy;
INT8U RingBufTx[COMM_TX_BUF_SIZE1]; /* Ring buffer character storage (Tx) */
} COMM_RING_BUF1;
COMM_RING_BUF1 MyComm1Buf;
INT8U Nkey_b[6];
INT32U flag;
uchar BCC_sum;
uchar newdata;
uchar MifrStep;
uchar card_snr[8];
uchar databuf[16];
uchar I2cDataBuf[16];
extern void ARMDisableInt(void);
extern void ARMEnableInt(void);
/*
*********************************************************************************************************
* CONSTANTS
*********************************************************************************************************
*/
#define TASK_STK_SIZE 128 /* Size of each task's stacks (# of WORDs) */
/*
*********************************************************************************************************
* VARIABLES
*********************************************************************************************************
*/
OS_STK TaskStartStk[TASK_STK_SIZE];
OS_STK Task1Stk[256];
OS_STK Task2Stk[TASK_STK_SIZE];
OS_STK Task3Stk[TASK_STK_SIZE];
OS_STK Task4Stk[TASK_STK_SIZE];
OS_STK Task5Stk[TASK_STK_SIZE];
OS_EVENT *Mbox1;
OS_EVENT *Mbox2;
/*
*********************************************************************************************************
* FUNCTION PROTOTYPES
*********************************************************************************************************
*/
void Task1(void *data); /* Function prototypes of tasks */
void Task2(void *data);
void Task3(void *data);
void Task4(void *data);
void Task5(void *data); /* Function prototypes of tasks */
void TaskStart(void *data); /* Function prototypes of Startup task */
//uchar ShakeHand1(void);
void InitUart0(void);
/*$PAGE*/
/*
*********************************************************************************************************
* MAIN
*********************************************************************************************************
*/
void TargetInit(void);
int main (void)
{
OSInit();
Beep(3);
OSTaskCreate(TaskStart, (void *)0, &TaskStartStk[TASK_STK_SIZE - 1], 0);
OSStart(); /* Start multitasking */
}
/*
*********************************************************************************************************
* STARTUP TASK
*********************************************************************************************************
*/
void TaskStart (void *pdata)
{
pdata = pdata;
//目標初始化
TargetInit();
//I2C初始化
//串口初始化
Mbox1 = OSMboxCreate(NULL);
Mbox2 = OSMboxCreate(NULL);
InitUart0(); //關中斷
ComInit(COM2,57600);
I2cInit(100000);
OSTaskCreate(Task5, (void *)0, &Task5Stk[TASK_STK_SIZE - 1], 1);
OSTaskCreate(Task1, (void *)0, &Task1Stk[TASK_STK_SIZE - 1], 2);
OSTaskCreate(Task2, (void *)0, &Task2Stk[TASK_STK_SIZE - 1], 3);
OSTaskCreate(Task3, (void *)0, &Task3Stk[TASK_STK_SIZE - 1], 4);
OSTaskCreate(Task4, (void *)0, &Task4Stk[TASK_STK_SIZE - 1], 5);
flag=mifs_close();
flag=mifs_config();
flag=mifs_get_info(MyComm1Buf.databuf);
flag=mifs_load_key(KEYB,1,Nkey_b);
flag=mifs_load_key(KEYB,5,Nkey_b);
flag=mifs_read_E2(0x7f,1,MyComm1Buf.databuf);
if(flag ==0){
Beep(1);
OSTaskDel(0);
}
}
/*
************************************
*
************************************
*/
/*
************************************
*I2C操作
************************************
*/
void Task1 (void *pdata)
{
uchar i;
char *Msg=NULL;
INT8U err;
INT16U CNT;
pdata = pdata;
SetPinMode(LED2,0,0); //LED2 =11
SetPinMode(LED3,0,0);
SetPinMode(LED4,0,0);
SetPin(LED1);
SetPin(LED2);
SetPin(LED3);
SetPin(LED4);
for (;;)
{
Msg = (char *)OSMboxPend(Mbox1, 0, &err); //等待消息!
if(err == OS_NO_ERR)
{ // 收到消息,處理消息
if((Msg[0]=='R')&&(Msg[1]=='E')&&(Msg[2]=='A')&&(Msg[3]=='D'))
{
I2cDataBuf[0] = 0; // 從機地址
CNT= I2cRead(CSI24WC02, I2cDataBuf, I2cDataBuf, 1, 10);
if(CNT==10){
Msg="E";
OSMboxPost(Mbox2, Msg);
}
else Beep(1);
}
else if((Msg[0]=='W')&&(Msg[1]=='R')&&(Msg[2]=='I')&&(Msg[3]=='T')&&(Msg[4]=='E'))
{
for (i = 0; i < 10; i++)
{
I2cDataBuf[i + 1] = 0x11;
}
I2cDataBuf[0] = 0; /* 擴展地址 */
I2cWrite(CSI24WC02, I2cDataBuf, 11);
}
}
CplPin(LED1);
OSTimeDlyHMSM(0, 0,1,0);
}
}
/*
*****************************************
* 該任務負責顯示
*****************************************
*/
void Task2 (void *pdata)
{
int i=0;
for (;;)
{
if(i>=16)
i=0;
Display(i++);
OSTimeDlyHMSM(0, 0,1,0);
}
}
/*
**************************************
* 負責接收命令,并處理命令
**************************************
*/
void Task3 (void *pdata)
{
#if OS_CRITICAL_METHOD == 3 /* Allocate storage for CPU status register */
OS_CPU_SR cpu_sr;
#endif
uint32 Cmd;
char *Msg=NULL;
pdata = pdata;
for (;;)
{
if(ComGetFrame(COM2)){ //等待上位機發來的命令
OS_ENTER_CRITICAL();
Cmd=4;
Comm2Buf.RingBufRxBusy=0;
if(Comm2Buf.RingBufRx[1]==0x01)Cmd=1;
else if(Comm2Buf.RingBufRx[1]==0x02)Cmd=2;
OS_EXIT_CRITICAL();
switch(Cmd)
{
case 1: //返回的數據正確
Beep(1); break;
case 2: //告訴任務1讀E2CPROM
Msg="READ";
OSMboxPost(Mbox1, Msg);break;
case 4: Msg="WRITE";
OSMboxPost(Mbox1, Msg);break;
default :break;
}
}
OSTimeDlyHMSM(0, 0,0,300);
}
}
/*
*******************************************
* 負責向上位機返回數據
*******************************************
*/
void Task4 (void *pdata)
{
char *Msg=NULL;
INT8U err;
pdata = pdata;
for (;;)
{
Msg = (char *)OSMboxPend(Mbox2, 0, &err); //等待消息!
if(err == OS_NO_ERR){ // 收到消息
//處理消息
if((Msg[0]=='D')&&(Msg[1]=='A')&&(Msg[2]=='T')&&(Msg[3]=='A'))
{ //發送卡的數據
// CommSendString(COM2,"\r\nWELCOME!");
ComSendBuff(COM2,databuf,10);
}
else if(Msg[0]=='E')
{ //發送EEPROM的數據
ComSendBuff(COM2,I2cDataBuf,10);
}
}
}
}
/*
***************************************************
* Mifare卡操作:該任務每秒執行一次
***************************************************
*/
void Task5(void *pdata)
{
uchar i;
char *Msg=NULL;
pdata = pdata;
for(;;)
{
if(mifs_request(IDLE,databuf)==MI_OK) //there is card
{
if(mifs_anticoll2(0,0,card_snr)==MI_OK){ //anticollision?
if(mifs_select(card_snr,databuf)==MI_OK){ //select
//if(mifs_authentication2(KEYB,5,1)==MI_OK){ //autnentication
//密碼需要從EEPROM中讀取:
for(i=0;i<6;i++)Nkey_b[i]=0xff;
if(mifs_authKey(KEYA,5,Nkey_b)==0){
if(mifs_read(22,databuf)==MI_OK) { //read
if(databuf[0]==0x10){
Msg="DATA";
OSMboxPost(Mbox2, Msg); //告訴任務4開始返回數據給上位機
Beep(1);
}
mifs_halt();
mifs_reset(1);
}
}
}
}
}
OSTimeDlyHMSM(0, 0, 1, 0);
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -