本帖最后由 ccxlslr 于 2010-5-8 09:51 编辑
基本情况:
程序在RAM执行,FLASH里面只有基本的内存配置和禁用中断代码!执行完后死循环.
RAM里程序采用向量中断,只用串口0发送中断,串口0接收中断和TIMER5定时中断.
程序的串口发送和接收都用环形队列实现.
程序的主要功能是,实现Modbus RTU.
接受和发送采用环形队列.入队和出队代码如下:
问题在 ENTER_CRITICAL()和 EXIT_CRITICAL()两个宏,一个为禁止中断,一个为开中断,当没有这两个宏时,程序正常,但有这两个宏时,程序不知道怎么跳到了FLASH里面,最后执行到死循环.
两个宏如下,三个中断程序也附在后面.
#define ENTER_CRITICAL() rINTMSK|=(BIT_GLOBAL)
#define EXIT_CRITICAL() rINTMSK&=~(BIT_GLOBAL)
//FIFO加入数据,BUFFER满返回-1,其它返回数据量
int FifoEnqueue(FifoQueue *queue,char c)
{
int ret;
ENTER_CRITICAL();
if(queue->count<BUFFERLEN)
{
*queue->ptw=c;
queue->count++;
queue->ptw++;
if(queue->ptw>=queue->buffer+BUFFERLEN)
{
queue->ptw=queue->buffer;
}
ret=queue->count;
}
else
{
ret=-1;
}
EXIT_CRITICAL();
return(ret);
}
//FIFO取数据
char FifoDequeue(FifoQueue *queue)
{
char ret;
ENTER_CRITICAL();
if(queue->count>0)
{
ret=*queue->ptr;
queue->count--;
queue->ptr++;
if(queue->ptr>=queue->buffer+BUFFERLEN)
{
queue->ptr=queue->buffer;
}
}
EXIT_CRITICAL();
return(ret);
}
//串口0发送中断
void __irq utxd0(void)
{
if(transmitqueue.count)
{
OutChar(FifoDequeue(&transmitqueue));
}
rI_ISPC=BIT_UTXD0;
}
//串口0接收中断,MODBUS
void __irq urxd0(void)
{
char c;
c=rURXH0;
if(!modbus_cmdflag)
{
modbus_cmdflag=1;
}
FifoEnqueue(&receivequeue,c);
modbus_timec=0;
rI_ISPC=BIT_URXD0;
}
//2ms中断
void __irq timer5(void)
{
size_t i,temp;
if(modbus_cmdflag&&modbus_timec>=3&&mdcmd.valid==0)
{
temp=receivequeue.count;
for(i=0;i<temp;i++)
{
*(mdcmd.buffer+i)=FifoDequeue(&receivequeue);
}
mdcmd.length=temp;
mdcmd.valid=1;
modbus_cmdflag=0;
}
modbus_timec++;
rI_ISPC=BIT_TIMER5;
} |