📄 test.c
字号:
/*
*********************************************************************************************************
* uC/OS-II
* The Real-Time Kernel
*
* Author:陈是知
* All Rights Reserved
* v0.1
* 密码器包协议
*********************************************************************************************************
*/
#include <includes.h>
/*
*********************************************************************************************************
* CONSTANTS
*********************************************************************************************************
*/
#define TASKSTART_ID 4 /* 任务的ID */
#define RxTASK_ID 5
#define TxTASK_ID 6
#define OETASK_ID 7
#define TASKSTART_PRIO 4 /* 任务的优先级 */
#define RxTASK_PRIO 5
#define TxTASK_PRIO 6
#define OETASK_PRIO 7
/*
*********************************************************************************************************
* LOCAL GLOBAL VARIABLES
*********************************************************************************************************
*/
INT8U RESFlag=0x00;
INT8U OEFlag =0x00;
INT8U InBuf[130];
INT8U OutBuf[256];
INT8U TICKS;
/*
*********************************************************************************************************
* VARIABLES
*********************************************************************************************************
*/
OS_STK TaskStartStk[TASK_STK_SIZE]; /* 声明启动任务堆栈 */
OS_STK RxTASKStk[TASK_STK_SIZE]; /* 声明接收任务堆栈 */
OS_STK TxTASKStk[TASK_STK_SIZE]; /* 声明发送任务堆栈 */
OS_STK OETASKStk[TASK_STK_SIZE]; /* 声明加/解密任务堆栈 */
/*
*********************************************************************************************************
* FUNCTION PROTOTYPESZ
*********************************************************************************************************
*/
void TaskStart(void *cszdata) reentrant; /* 声明任务原型 */
void RxTASK(void *cszdata) reentrant;
void TxTASK(void *cszdata) reentrant;
void OETASK(void *cszdata) reentrant;
void TaskCreate(void);
/*
*********************************************************************************************************
* MAIN
*********************************************************************************************************
*/
void main(void)
{
OS_STK *ptos;
OS_STK *pbos;
INT32U size;
OSInit(); /* 初始化uC/OS-II */
InitTimer0(); /* 初始化定时器0 */
CommBufInit(); /* 初始化串口缓冲区 */
CommInit(); /* 初始化串口 */
ptos = &TaskStartStk[0]; /* 51的堆栈是从下向上递增的,所以栈顶为最低地址 */
pbos = &TaskStartStk[TASK_STK_SIZE - 1];
size = TASK_STK_SIZE;
/* 建立TaskStart任务 */
OSTaskCreateExt(TaskStart,
(void *)0,
ptos,
TASKSTART_PRIO,
TASKSTART_ID,
pbos,
size,
(void *)0,
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
OSStart(); /* 开始执行 */
}
/*
*********************************************************************************************************
* STARTUP TASK
*********************************************************************************************************
*/
void TaskStart (void *cszdata) reentrant
{
INT16U i=0;
INT16U j=0;
INT16U CRC;
/*
命令表如下,用户可以通过虚拟接受来实现脱离实际开发环境的程序调试。
CMD1: 1B 03 01 F6 E0
RES1: 1B 0C 01 01 01 01 01 01 01 01 01 01 2C 1F
CMD2: 1B 07 02 01 02 03 04 FD 95
RES2: 1B 0B 02 XX XX XX XX 01 02 03 04 XX XX
CMD3: 1B 0A 03 O1 02 03 04 01 02 03 3E CC
RES3: 1B OD 03 XX XX XX XX 01 02 03 01 02 03 XX XX
*/
INT8U Puts[64]={0x1B,0x0A,0x03,0x01,0x02,0x03,0x04,0x01,0x02,0x03}; //这里填上需要虚拟接受的命令包内容
extern INT8U TICKS;
cszdata = cszdata; /* 防止编译警告 */
//注意!在最高优先级任务循环前打开定时器中断,以满足在OSStart()前不产生中断的要求。
//在系统调用OSInit()时会自动创建一个优先级最低的系统任务,创建过程中会调用OS_EXIT_CRITICAL()打开EA。
//若在InitTimer0()里打开T0中断,则违反了在OSStart()前不产生中断的要求。
//切记将ET0=1;放在最高优先级任务里,OSStart()将调用OSStartHighRdy()第一个运行最高优先级任务,这样ET0=1总能被第一个执行。
ET0=1;
//如果需要虚拟接受命令包,将下面的代码加入编译,如果命令包正确,程序运行后会发出响应包
/*
CRC = cal_crc(Puts,(Puts[1]));
j=(INT16U)Puts[1];
Puts[j+1]=(INT8U)CRC;
Puts[j]=(INT8U)(CRC>>8);
j=j+2;
for(i=0;i<j;i++)
{CommPutRxChar(Puts[i]);}
*/
TaskCreate(); /* 创建任务 */
for(;;)
{
TICKS++;
OSTimeDly(OS_TICKS_PER_SEC); /* 延时一秒 */
}
}
/*
*********************************************************************************************************
* CREATE TASKS
*********************************************************************************************************
*/
void TaskCreate (void)
{
OSTaskCreateExt(RxTASK,
(void *)0,
&RxTASKStk[0],
RxTASK_PRIO,
RxTASK_ID,
&RxTASKStk[TASK_STK_SIZE - 1],
TASK_STK_SIZE,
(void *)0,
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
OSTaskCreateExt(TxTASK,
(void *)0,
&TxTASKStk[0],
TxTASK_PRIO,
TxTASK_ID,
&TxTASKStk[TASK_STK_SIZE - 1],
TASK_STK_SIZE,
(void *)0,
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
OSTaskCreateExt(OETASK,
(void *)0,
&OETASKStk[0],
OETASK_PRIO,
OETASK_ID,
&OETASKStk[TASK_STK_SIZE-1],
TASK_STK_SIZE,
(void *)0,
OS_TASK_OPT_STK_CHK | OS_TASK_OPT_STK_CLR);
}
/*
*********************************************************************************************************
* RxTASK
*********************************************************************************************************
*/
void RxTASK(void *cszdata) reentrant
{
INT8U ch;
INT8U err;
INT8U Flag=0x00;
INT8U CRCLEN;
INT8U H,L;
INT8U CMD;
INT16U LENCtr=0;
INT16U i=2;
INT16U CRC,k;
extern INT8U InBuf[130];
extern INT8U RESFlag;
extern INT8U OEFlag;
cszdata=cszdata;
for (;;)
{
ch=CommGetChar(OS_TICKS_PER_SEC,&err);
if(err==COMM_NO_ERR)
{
if(ch==0x1B)
{Flag=0x01;InBuf[0]=0x1B;}
else
{
if(Flag==0x01)
{LENCtr=(INT16U)ch;Flag=0x02;InBuf[1]=ch;}
else
{
if(LENCtr>0)
{InBuf[i]=ch;i++;LENCtr--;
if(LENCtr==0)
{Flag=0x00;CRCLEN=InBuf[1];k=(INT16U)InBuf[1];
CRC=cal_crc(InBuf,CRCLEN);
L=(INT8U)CRC;H=(INT8U)(CRC>>8);
if(H==InBuf[k] && L==InBuf[k+1])
{CMD=InBuf[2];
switch(CMD)
{
case 0x01:RESFlag=0x01;break;
case 0x02:OEFlag =0x01;break;
case 0x03:OEFlag =0x02;break;
}
}
}
}
}
}
}
OSTimeDly(2);
}
}
/*
*********************************************************************************************************
* TxTASK
*********************************************************************************************************
*/
void TxTASK(void *cszdata) reentrant
{
INT8U RES1[14]={0x1B,0x0C,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,0x00};
INT8U H,L;
INT8U CRCLEN;
INT16U i,j;
INT16U CRC;
extern INT8U OutBuf[256];
extern INT8U RESFlag;
cszdata=cszdata;
for (;;)
{
switch(RESFlag)
{
case 0x01:CRCLEN=0x0C;
CRC=cal_crc(RES1,CRCLEN);
RES1[13]=(INT8U)CRC;
RES1[12]=(INT8U)(CRC>>8);
for(i=0;i<14;i++)
{CommPutChar(RES1[i],OS_TICKS_PER_SEC);}
RESFlag=0x00;break;
case 0x02:CRCLEN=OutBuf[1];
CRC=cal_crc(&OutBuf[0],CRCLEN);
j=(INT16U)OutBuf[1];
for(i=0;i<j;i++)
{CommPutChar(OutBuf[i],OS_TICKS_PER_SEC);}
L=(INT8U)CRC;H=(INT8U)(CRC>>8);
CommPutChar(H,OS_TICKS_PER_SEC);
CommPutChar(L,OS_TICKS_PER_SEC);
RESFlag=0x00;break;
case 0x03:CRCLEN=OutBuf[1];
CRC=cal_crc(&OutBuf[0],CRCLEN);
j=(INT16U)OutBuf[1];
for(i=0;i<j;i++)
{CommPutChar(OutBuf[i],OS_TICKS_PER_SEC);}
L=(INT8U)CRC;H=(INT8U)(CRC>>8);
CommPutChar(H,OS_TICKS_PER_SEC);
CommPutChar(L,OS_TICKS_PER_SEC);
RESFlag=0x00;break;
}
OSTimeDly(2);
}
}
/*
*********************************************************************************************************
* OETASK
*********************************************************************************************************
*/
void OETASK(void *cszdata) reentrant
{
INT8U H2,H1,L2,L1;
INT16U k;
INT16U i,j;
extern INT8U OutBuf[256];
extern INT8U InBuf[130];
cszdata=cszdata;
for (;;)
{
srand(TICKS);
switch(OEFlag)
{
case 0x01:OutBuf[0]=0x1B;
OutBuf[1]=InBuf[1]+0x04;
OutBuf[2]=0x02;
j=(INT16U)OutBuf[1];
H2=rand();
H1=rand();
L2=rand();
L1=rand();
OutBuf[3]=H2;
OutBuf[4]=H1;
OutBuf[5]=L2;
OutBuf[6]=L1;
for(i=7;i<j;i++)
{
OutBuf[i]=InBuf[i-4];
}
RESFlag=0x02;OEFlag=0x00;break;
case 0x02:OutBuf[0]=0x1B;
OutBuf[1]=InBuf[1];
OutBuf[2]=0x03;
j=(INT16U)InBuf[1];k=0;
H2=rand();
H1=rand();
L2=rand();
L1=rand();
OutBuf[3]=H2;
OutBuf[4]=H1;
OutBuf[5]=L2;
OutBuf[6]=L1;
for(i=7;i<j;i++)
{OutBuf[i]=InBuf[i];k++;}
OutBuf[1]=OutBuf[1]+(INT8U)k;
for(i=j;i<j+k;i++)
{OutBuf[i]=InBuf[i-k];}
RESFlag=0x03;OEFlag=0x00;break;
}
OSTimeDly(2);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -