打印

对44B0熟悉的朋友看看怎么回事!

[复制链接]
1526|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
ccxlslr|  楼主 | 2010-5-8 09:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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;
}

相关帖子

沙发
ccxlslr|  楼主 | 2010-5-8 09:50 | 只看该作者
可能不是很详细,看大家遇到过类似的问题没有!

使用特权

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

本版积分规则

个人签名:电位器,可调电阻,微调电阻就选BOURNS 3362 带刻度,温漂小于100ppm/℃。 http://www.szlcsc.com/search/global.html&global_search_keyword=3362%2520BOURNS

68

主题

587

帖子

3

粉丝