📄 main.c
字号:
/****************************************Copyright (c)**************************************************
**
**
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
#include "config.h"
#include "taskPriority.h"
#include "hc595.h"
#define TASK_STK_SIZE 128
OS_STK TaskStartStk[TASK_STK_SIZE];
OS_STK taskUart0RcvStk[256];
OS_STK taskAdcSampleStk[TASK_STK_SIZE];
OS_STK taskUart0SendStk[TASK_STK_SIZE];
OS_STK taskKeyStk[TASK_STK_SIZE];
#define KEY1 (1 << 14) /* P0.14为key1 */
#define BEE (1 << 7) /* P0.07为蜂鸣器 */
static INT8U rxCount;
/***
消息队列及内存分区通信参数
***/
uint8 adcPowerdownMode;/***全局变量,控制ADC进入掉电模式与否***/
uint8 adcStartWay; /***ADC启动方式***/
INT8U sampleCounter;
//OS_EVENT *adcMux; /***uart0发送互斥信号量***/
OS_EVENT *adcMbox;
/***外部中断消息邮箱***/
//OS_EVENT *uart0Mux;
OS_EVENT *uart0RcvMsgQueue; /***串口0消息队列***/
void *uart0RcvMsgTable[UART0QUEUELENGTH]; /***UART0消息数组***/
OS_MEM *memUart0Partition; /***UART0内存分区指针***/
static INT8U *uart0Partition[UART0QUEUELENGTH][UART0QUEUEEMESSAGELENGTH]; /***UART0内存分区尺寸 50*9***/
OS_EVENT *uart0Mbox;
/***
消息队列及内存分区通信参数 OVER
***/
/***
系统任务定义
***/
void taskKeyProcess(void *pdata);
void TaskStart(void *pdata);
void taskUart0Rcv(void *pdata);
void taskUart0Send(void *pdata);
void taskAdcSample(void *pdata);
uint32 GetOSPrioCur(void)
{
return OSPrioCur;
}
/***
系统任务定义 OVER
***/
/*********************************************************************************************************
** 函数名称: main
** 功能描述: c语言的主函数,由它启动多任务环境
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块: OSInit,OSTaskCreate,OSStart
**
** 作 者:
** 日 期: 2003年7月8日
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
int main (void)
{
OSInit();
OSTaskCreate(TaskStart, (void *)0, &TaskStartStk[TASK_STK_SIZE - 1], 0);
OSStart();
return 0;
}
/*********************************************************************************************************
** 函数名称: TaskStart
** 功能描述: μCOS-II的第一个任务,通常由它初始化目标板和建立其它任务
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块:
**
** 作 者:
** 日 期:
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void TaskStart(void *pdata)
{
INT8U err;
INT8U loop;
pdata = pdata;/***避免编译警告***/
TargetInit();/***目标板初始化***/
rxCount=0;
sampleCounter=0;
adcPowerdownMode=1;
adcStartWay=ADCSTARTSOFTWARE;
/*********************创建任务****************************************/
OSTaskCreate(taskUart0Rcv,(void*)0,&taskUart0RcvStk[TASK_STK_SIZE-1],UART0RCVTASKPRIORITY);/***创建UART0接收数据处理任务***/
OSTaskCreate(taskAdcSample,(void*)0,&taskAdcSampleStk[TASK_STK_SIZE-1],ADCSAMPLETASKPRIORITY);/***创建ADC采样任务***/
OSTaskCreate(taskUart0Send,(void *)0,&taskUart0SendStk[TASK_STK_SIZE-1],UART0SENDTASKPRIORITY);/***创建UART0发送数据处理任务,用于测试目的***/
OSTaskCreate(taskKeyProcess,(void *)0,&taskKeyStk[TASK_STK_SIZE-1],KEYTASKPRIORITY);
/*********************创建通信工具以及内存管理****************************************/
uart0RcvMsgQueue=OSQCreate(&uart0RcvMsgTable[0],UART0QUEUELENGTH); /***创建UART0接收数据队列***/
OSQFlush(uart0RcvMsgQueue);
memUart0Partition=OSMemCreate(uart0Partition,UART0QUEUELENGTH,UART0QUEUEEMESSAGELENGTH,&err);/***创建UART0内存分区***/
if(err==OS_NO_ERR&&memUart0Partition!=NULL)/***创建内存分区成功***/
hc595SendData1(0x55);
else
hc595SendData1(0x00);/***创建内存分区有错误***/
adcMbox=OSMboxCreate((void*)0);/***创建ADC消息邮箱***/
uart0Mbox=OSMboxCreate((void *)0);
for(loop=0;loop<8;loop++)
zlg7290DisChar(loop,loop+1);
/*********************删除任务本身****************************************/
//IO0CLR=1<<BEEPCON;
OSTaskDel(OS_PRIO_SELF);
}
/*********************************************************************************************************
** 函数名称: TaskUart0Revice
** 功能描述: μCOS-II的任务 从串口消息队列中读取数据进行处理
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块:
**
** 作 者:
** 日 期:
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void taskUart0Rcv(void *pdata)
{
uint8 err,i,*pt,*ptBack;
uint8 rxBuffer[8];
uint8 counter;
pdata=pdata;
while(1)
{
U0IER=0X05;
pt=(INT8U*)OSQPend(uart0RcvMsgQueue,0,&err);
//OSMboxPend(uart0Mbox,0,&err);
rxCount++;
if(rxCount==0xff)
rxCount=0;
hc595SendData1(rxCount);
if((err!=OS_NO_ERR)|(pt==NULL)) //等待队列消息出错
{
hc595SendData1(0x01);
} //如果出错,LED指示灯全部点亮
else
{
ptBack=pt;
counter=(INT8U)(*pt);
pt++;
for(i=0;i<counter;i++)//此次从串口接收到了几个数据,最后拼接数据帧
{
*(rxBuffer+i)=(INT8U)(*pt);
pt++;
}
//uart0SendByte(0xbb);
OSMemPut(memUart0Partition,ptBack);//释放内存
//OSQFlush(uart0RcvMsgQueue);
}
//OSTimeDly(OS_TICKS_PER_SEC);//等待一个周期
}
}
/*********************************************************************************************************
** 函数名称:
** 功能描述:
** 输 入: 无
** 输 出: 无
** 全局变量: 无
** 调用模块:
**
** 作 者:
** 日 期:
**-------------------------------------------------------------------------------------------------------
** 修改人:
** 日 期:
**------------------------------------------------------------------------------------------------------
********************************************************************************************************/
void taskUart0Send(void *pdata)
{
INT8U buffer[11];
INT8U i;
buffer[0]=0x00;//存储设备子地址
for(i=1;i<11;i++)
*(buffer+i)=i+0x10;
pdata=pdata;
while(1)
{
//uart0SendByte(0xaa);
/*
iicWrite(0XA0,buffer,11);
OSTimeDly(OS_TICKS_PER_SEC);
for(i=1;i<11;i++)
*(buffer+i)=0;
iicRead(0XA0,buffer,buffer,1,10);
for(i=0;i<10;i++)
uart0SendByte(*(buffer+i));
buffer[0]=0x00;//存储设备子地址
for(i=1;i<11;i++)
*(buffer+i)=i+0x10;
*/
OSTimeDly(OS_TICKS_PER_SEC);
}
}
void taskAdcSample(void *pdata)
{
INT8U err;
INT8U *msg;
INT16U adcResult;
pdata=pdata;
/*
while(1)
{
sampleCounter++;
if(sampleCounter==0XFF)
sampleCounter=0;
hc595SendData(~sampleCounter);
startAdc(1,1,0);//以软件方式立即启动AD转换
while((ADDR&0x80000000)==0);//等ADC转换结束
OSTimeDly(OS_TICKS_PER_SEC/10);
}
*/
while(1)
{
msg=(INT8U *)OSMboxPend(adcMbox,0,&err);
if(err!=OS_NO_ERR|msg==NULL)//如果有错误发生
{
while(1);
}
if(err==OS_NO_ERR&&msg!=NULL)//如果成功ADC采集
{
sampleCounter++;
if(sampleCounter==0XFF)
sampleCounter=0;
hc595SendData(~sampleCounter);
IO0SET=1<<BEEPCON;
startAdc(*msg,1,0);//以软件方式立即启动AD转换
while((ADDR&0x80000000)==0);//等ADC转换结束
adcResult=ADDR;
hc595SendData(0xf0);
adcResult=(adcResult>>6)&0x3FF;//数据右移动6位之后屏蔽其他数据获得转换结果,
//读ADDR同时清除了ADDR中的DONE位
}
}
}
void taskKeyProcess(void *pdata)
{
INT16U keyValue;
pdata=pdata;
keyValue=0;
while(1)
{
keyValue=zlg7290GetKey();
if(keyValue==0|keyValue>=0x100)
{
OSTimeDly(OS_TICKS_PER_SEC/50);
continue;
}
if(keyValue<17)
{
if(keyValue<9)
zlg7290Glitter(keyValue);
uart0SendByte(keyValue);
}
OSTimeDly(OS_TICKS_PER_SEC/10);
}
}
/*********************************************************************************************************
** End Of File
********************************************************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -