⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.c

📁 程序展示了 ucos在EASYARM2200上的移植。并添加了多个设备在UCOS下的驱动UART:SPI:IIC:ZLG7290.当然还没有完全完成板上其它设备的驱动。由于限制
💻 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 + -