CANRing.h代码如下:
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __CANRINGQ_H__
#define __CANRINGQ_H__
/* Includes ------------------------------------------------------------------*/
#include "can_driver.h"
#include <stdio.h>
#include "stm32f10x_can.h"
#ifdef __cplusplus
CanRxMsgRing space;
extern "C" {
#endif
/* Private define ------------------------------------------------------------*/
#define QUEUE_MAX 128
/* Private typedef -----------------------------------------------------------*/
typedef struct RxRing{
int head;
int tail;
int tag ;
int size ;
CanRxMsg CANRxSpace[QUEUE_MAX];
}CANRxRINGQ;
typedef struct TxRing{
int head;
int tail;
int tag ;
int size ;
CanTxMsg CANTxSpace[QUEUE_MAX];
}CANTxRINGQ;
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
extern CANRxRINGQ CANRxBuf, * RxPtr;
extern CANTxRINGQ CANTxBuf, * TxPtr;
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
int CANRxRINGQ_init(CANRxRINGQ * p_queue);
int CANRxRINGQ_free(CANRxRINGQ * p_queue);
int CANRxRINGQ_push(CANRxRINGQ * p_queue,CanRxMsg data);
int CANRxRINGQ_poll(CANRxRINGQ * p_queue,CanRxMsg *p_data);
#define CANRxRINGQ_is_empty(q) ( (q->head == q->tail) && (q->tag == 0))
#define CANRxRINGQ_is_full(q) ( (q->head == q->tail) && (q->tag == 1))
int CANTxRINGQ_init(CANTxRINGQ * p_queue);
int CANTxRINGQ_free(CANTxRINGQ * p_queue);
int CANTxRINGQ_push(CANTxRINGQ * p_queue,CanTxMsg data);
int CANTxRINGQ_poll(CANTxRINGQ * p_queue,CanTxMsg *p_data);
#define CANTxRINGQ_is_empty(q) ( (q->head == q->tail) && (q->tag == 0))
#define CANTxRINGQ_is_full(q) ( (q->head == q->tail) && (q->tag == 1))
#ifdef __cplusplus
}
#endif
#endif /* __CANRxRINGQ_H__ */
/*********************************END OF FILE**********************************/
CANRing.C代码如下:
/* Define to prevent recursive inclusion -------------------------------------*/
/* Includes ------------------------------------------------------------------*/
#include "CANRing.h"
/* Private typedef -----------------------------------------------------------*/
/* Private define ------------------------------------------------------------*/
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
CANRxRINGQ CANRxBuf={0,0,0,0,{0}};
CANRxRINGQ *RxPtr;
CANTxRINGQ CANTxBuf = {0,0,0,0,{0}};
CANTxRINGQ *TxPtr;
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
int CANRxRINGQ_init(CANRxRINGQ * p_queue)
{
p_queue->size = QUEUE_MAX ;
p_queue->head = 0;
p_queue->tail = 0;
p_queue->tag = 0;
return 0;
}
int CANRxRINGQ_free(CANRxRINGQ * p_queue){
return 0;
}
int CANRxRINGQ_push(CANRxRINGQ * p_queue,CanRxMsg data)
{
if(CANRxRINGQ_is_full(p_queue))
{
return -1;
}
p_queue->CANRxSpace[p_queue->tail] = data;
p_queue->tail = (p_queue->tail + 1) % p_queue->size ;
if(p_queue->tail == p_queue->head)
{
p_queue->tag = 1;
}
return p_queue->tag;
}
int CANRxRINGQ_poll(CANRxRINGQ * p_queue,CanRxMsg * p_data)
{
if(CANRxRINGQ_is_empty(p_queue))
{
return -1;
}
*p_data = p_queue->CANRxSpace[p_queue->head];
p_queue->head = (p_queue->head + 1) % p_queue->size ;
if(p_queue->tail == p_queue->head)
{
p_queue->tag = 0;
}
return p_queue->tag ;
}
int CANTxRINGQ_init(CANTxRINGQ * p_queue)
{
p_queue->size = QUEUE_MAX ;
p_queue->head = 0;
p_queue->tail = 0;
p_queue->tag = 0;
return 0;
}
int CANTxRINGQ_free(CANTxRINGQ * p_queue){
return 0;
}
int CANTxRINGQ_push(CANTxRINGQ * p_queue,CanTxMsg data)
{
if(CANRxRINGQ_is_full(p_queue))
{
return -1;
}
p_queue->CANTxSpace[p_queue->tail] = data;
p_queue->tail = (p_queue->tail + 1) % p_queue->size ;
if(p_queue->tail == p_queue->head)
{
p_queue->tag = 1;
}
return p_queue->tag;
}
int CANTxRINGQ_poll(CANTxRINGQ * p_queue,CanTxMsg * p_data)
{
if(CANRxRINGQ_is_empty(p_queue))
{
return -1;
}
*p_data = p_queue->CANTxSpace[p_queue->head];
p_queue->head = (p_queue->head + 1) % p_queue->size ;
if(p_queue->tail == p_queue->head)
{
p_queue->tag = 0;
}
return p_queue->tag ;
}
/*********************************END OF FILE**********************************/
main.c 代码如下:
*/
/* Includes ------------------------------------------------------------------*/
#include "CANRing.h"
/* Private macro -------------------------------------------------------------*/
/* Private variables ---------------------------------------------------------*/
/* Private function prototypes -----------------------------------------------*/
/* Private functions ---------------------------------------------------------*/
int main(void)
{
RxPtr = &CANRxBuf;
CANRxRINGQ_init(RxPtr);
TxPtr = &CANTxBuf;
CANTxRINGQ_init(TxPtr);
CanRxMsg test_RxMessage = {0x00,02000000, 0x00,0x00, 0x08, {0},0x00};
CANRxRINGQ_push(RxPtr, test_RxMessage);
while (1)
{
if(!CANRxRINGQ_is_empty(RxPtr)){
CanRxMsg Rxmsg;
CANRxRINGQ_poll(RxPtr,&Rxmsg);
//To deal with CANRX message
//CAN_cmd_ExecutiveCommand(&Rxmsg);
}
if(!CANTxRINGQ_is_empty(TxPtr)){
CanTxMsg Txmsg;
CANTxRINGQ_poll(TxPtr,&Txmsg);
//To deal with CANTX message
//CAN_WriteData(&Txmsg);
}
}
}
/*********************************END OF FILE**********************************/
CANRxRINGQ_push()可以放入CAN接受中断处理函数中,CANTxRINGQ_push()可以放任意想放的位置将要发的CANmessage压入CAN环内。