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

#include

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

#include

#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) ;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值