打印

环形队列解决生产消费问题

[复制链接]
188|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
se, TI, Queue, dc, ck
#include <math.h>

int n=2048,n1=2048,n2=2048;

  uint8_t Count=0;

  uint8_t f=0;

  int val=0;

void ADC_DATA_CALLBACK(uint32_t u32UserData)

{

  n=n1;

  n1=n2;

  n2=DrvADC_GetConversionData(1);

  if(n2-n>650)

  {

   DrvGPIO_ClrBit(E_PORT2, E_PIN7);

  }

  if(n-n2>650)

  {

  

     DrvGPIO_SetBit(E_PORT2, E_PIN7);

  }

/* val=abs(n2-n);

if((val>650)&&(Count==0))

  {

  

   Count=1;        

  

  }

  else

  {

   Count=0;

  }



     if(Count==1)

     {

   

     if(f)

     {

       f=0;

      DrvGPIO_SetBit(E_PORT2, E_PIN7);

     }         

     else

     {

       f=1;

      DrvGPIO_ClrBit(E_PORT2, E_PIN7);

     }

   } */

    DrvADC_StartConvert();  

}





void time1_callback(uint32_t da)//定时器1专门作为闪烁使用

{

      

  

  

   DrvSYS_UnlockProtectedReg();  

DrvWDT_Ioctl(E_WDT_IOC_RESET_TIMER,0);  //喂狗

      DrvSYS_LockProtectedReg();

   



}



void time0_callback(uint32_t da)//定时器0专门做采样工作和刷新屏幕显示

{

   

}



void initsys()

{

   

while(DrvSYS_SetOscCtrl(E_SYS_XTL12M, 1)!=FALSE);//使能外部12MHZ晶振

DrvSYS_SelectPLLSource(E_SYS_EXTERNAL_12M);

DrvSYS_SetPLLMode(0);//pll正常

DrvSYS_UnlockProtectedReg();//关闭寄存器保护

DrvSYS_Open(50000000);//sys=12MHZ

DrvSYS_SelectHCLKSource(2);//pll

//while( DrvSYS_SelectHCLKSource(0) !=FALSE);//HCLK=12MHZ

DrvSYS_SetClockDivider(E_SYS_HCLK_DIV , 0);//HCLK1分频

while(DrvSYS_SelectSysTickSource(0)!=FALSE);//选择系统嘀嗒时钟源为外部12MHZ晶振

DrvSYS_LockProtectedReg();



}

void initTMR0()

{

  DrvSYS_SetIPClock(E_SYS_TMR0_CLK,1); //使能始终

  DrvSYS_SelectIPClockSource(E_SYS_TMR0_CLKSRC,2 );//这个TIM0是接到APB总线,不可以用外部晶振,手册的是错误的,应该看下面的APBPCLK的时钟

  DrvTIMER_Init();

  DrvTIMER_Open(E_TMR0,1,E_PERIODIC_MODE); //100MS

  DrvTIMER_EnableInt(E_TMR0);

  DrvTIMER_SetTimerEvent(E_TMR0, 2, time0_callback, 1);//1s

  DrvTIMER_Start(E_TMR0);



  DrvSYS_SetIPClock(E_SYS_TMR1_CLK,1); //使能始终

  DrvSYS_SelectIPClockSource(E_SYS_TMR1_CLKSRC,2 );//这个TIM0是接到APB总线,不可以用外部晶振,手册的是错误的,应该看下面的APBPCLK的时钟

  DrvTIMER_Open(E_TMR1,10,E_PERIODIC_MODE); //100MS

  DrvTIMER_EnableInt(E_TMR1);

  DrvTIMER_SetTimerEvent(E_TMR1, 2, time1_callback, 1);//0.5s

  DrvTIMER_Start(E_TMR1);

  

}

  void init_ADC()

  {





   /*Initialize ADC*/

DrvGPIO_InitFunction(E_FUNC_ADC1 );

    DrvADC_Open(ADC_SINGLE_END, ADC_CONTINUOUS_OP, 0x02, EXTERNAL_12MHZ, 59);

DrvADC_EnableADCInt(ADC_DATA_CALLBACK,0);

DrvADC_StartConvert();



  }





#include <stdio.h>

#include <string.h>

#include "SqQueue.h"

status InitQueue(SqQueue *Q,QElemType *Q_BUF)

{

   Q->base=Q_BUF;

   Q->front=0;

   Q->rear=0;

  return OK;

}



int QueueLength(SqQueue *Q)

{



return ((Q->rear-Q->front+MAXQSIZE) % MAXQSIZE);

}

status EnQueue(SqQueue *Q,QElemType *e)

{



if(((Q->rear+1) % MAXQSIZE) == Q->front) return ERROR;

   Q->base[Q->rear] = *e;

   Q->rear = (Q->rear+1) % MAXQSIZE;

   return OK;

}

status DeQueue(SqQueue *Q,QElemType *e)

{



if(Q->front == Q->rear) return ERROR;

    *e = Q->base[Q->front] ;

Q->front = (Q->front+1) % MAXQSIZE;

   return OK;

}





#define MAXQSIZE 100

#define ERROR       0

#define OK        1

#define  status unsigned char

#define  QElemType unsigned char



typedef struct{

QElemType *base;

unsigned char front;

unsigned char rear;

}SqQueue;

status InitQueue(SqQueue *Q,QElemType *Q_BUF);

int QueueLength(SqQueue *Q);

status EnQueue(SqQueue *Q,QElemType *e);

status DeQueue(SqQueue *Q,QElemType *e) ;复制代码

使用特权

评论回复

相关帖子

发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

432

主题

439

帖子

0

粉丝