高级会员
- 积分
- 658
- 金钱
- 658
- 注册时间
- 2013-11-22
- 在线时间
- 131 小时
|
楼主 |
发表于 2016-1-6 16:07:16
|
显示全部楼层
[mw_shl_code=applescript,true]
/***********************队列管理代码*************************/
#define QUEUE_CIRCULAR_BUF_SIZE 200 //队列循环缓冲buf长度 ,最多支持的同时打印队列长度
#define PRINT_IF_BLOCK 0 //打印输出是否允许阻塞; 1,阻塞方式;0,非阻塞方式 ,最好不用阻塞模式
static unsigned char xdata queue_circular_buf[QUEUE_CIRCULAR_BUF_SIZE] = {0}; //队列循环缓冲 数组
static unsigned char xdata queue_front = 0; //队列头部
static unsigned char xdata queue_back = 0; //队列尾部
static unsigned char xdata queue_size = 0; //队列有效元素大小
//队列初始化
static void queue_circular_buf_init(void)
{
queue_front = 0; //队头索引清零
queue_back = 0; //队尾索引清零
queue_size = 0; //队长(chang)清零
}
//入队
static void queue_circular_buf_push(unsigned char indata)
{
queue_circular_buf[queue_back] = indata; //存储数据
queue_back++; //队尾变化
if(QUEUE_CIRCULAR_BUF_SIZE == queue_back)
{
queue_back = 0;
}
queue_size++; //有效长度自增
}
//出队
static unsigned char queue_circular_buf_pop(void)
{
unsigned char outdata = queue_circular_buf[queue_front]; //取出数据
queue_front++; //队头变化
if(QUEUE_CIRCULAR_BUF_SIZE == queue_front)
{
queue_front = 0;
}
queue_size--; //有效长度自减
return outdata;
}
//判空,空返回1,非空返回0
static unsigned char queue_circular_buf_empty(void)
{
if(queue_size)
{
return 0;
}
return 1;
}
//判满,满返回1,非满返回0
static unsigned char queue_circular_buf_full(void)
{
if(QUEUE_CIRCULAR_BUF_SIZE == queue_size)
{
return 1;
}
return 0;
}
/***********************队列管理代码**尾***********************/
//串口0打印,将数据放在打印缓冲区,启动发送
void uart0_print(const unsigned char *buf, unsigned char len)
{
unsigned char *temp_buf = buf;
CRITICAL_ENTER; //关闭总中断
#if PRINT_IF_BLOCK //如果是阻塞模 式
while (len--)
{
while (queue_circular_buf_full()) //
{
task_sleep(2); //系统延时
}
queue_circular_buf_push(*temp_buf); //队列未满,数据入队列
temp_buf++;
}
#else //如果是非阻塞模式
while (len--)
{
if (queue_circular_buf_full())
{
CRITICAL_EXIT;
return;//队列已满
}
else
{
queue_circular_buf_push(*temp_buf); //队列未满,数据入队列
}
temp_buf++;
}
#endif
CRITICAL_EXIT; //打开总中断
TI = 1;//启动发送
}
//串口中断服务函数,不断的从队列中取出数据打印
void uart0_isr() interrupt 4 using 2
{
if (TI) //如果是发送中断事件
{
if (!queue_circular_buf_empty()) //非空
{
S0BUF = queue_circular_buf_pop(); //出队列
}
TI = 0;
}
if (RI)
RI = 0;
}[/mw_shl_code]
|
|