4909|7

6

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

求指点关于uCOS不能长时间运行的问题 [复制链接]

 我是在飞思卡尔S12XE系列下进行移植到,移植后测试也通过了。第一天在里面加了1个写SD卡的任务(30秒)和1个Mobus的任务(从机),跑了一晚也都能正常运行;
第二天再加上了2个Can发送到任务,一个100ms,一个200ms,这次跑了1个小时多点就挂掉了;以为是can发送到问题,第二天晚上只开写SD卡和2个发送任务,也能够运行一晚上。第三天就又全开用仿真器一直仿,发现停下来的时候SP指针居然在中断向量表段;又仿了一次,发现SP指针跑到未使用的ROM空间去了。也就是说跑飞了,而且是Modbus造成的,可能跟它用的中断有关。分析了好几天也想不出问题出在哪里,还请前辈们多指点下,谢谢了!!
程序中我在Modbus用到3个中断,一个串口,1个1.5ms的时钟,1个3.5ms 的时钟,这两个时钟只在串口中断里面打开,然后进中断后会关闭。串口中断和1.5ms中断中没进行任何处理(也试过在这两个中断中加上 OSIntEnter(),但坚持时间更短),3.5ms的中断如下
#pragma CODE_SEG __NEAR_SEG NON_BANKED
#pragma NO_RETURN
void interrupt  67 Inter_T35(void) {
  //  #if OS_CRITICAL_METHOD == 3                                /* Allocate storage for CPU status register */
  //  OS_CPU_SR  cpu_sr;
//#endif
    #ifdef BANKED
asm
{
  ldaa PPAGE;       //save ppage to stack PPAGE->A
  psha;             /*出栈,A->SP*/
}
#endif
     //DisableInterrupts;
     OSIntEnter();
     OS_SAVE_SP();
     
     PITTF_PTF1=1;        // clear channel 1 flag
     PITCE_PCE1=0;
     PITINTE_PINTE1=0;
    // OS_ENTER_CRITICAL();
     这里是一个任务处理函数,里面有OSSemPost(Modbus_OKptr)给Modbus任务用
    // OS_EXIT_CRITICAL();
     OSIntExit();
     //EnableInterrupts;
     asm
{
    #ifdef BANKED
  pula;            /*SP->A*/
  staa PPAGE;      /* restore ppage from stack ,A->PPAGE*/
  nop;
    #endif
  rti;             /*interrupt return*/
}

最新回复

看了感觉代码结构上没有什么问题,不知道是怎么一回事。猜测是不是代码中指针或数据的地址越界,导致程序长时间运行后越界进入异常处理中了。  详情 回复 发表于 2013-1-19 12:40
点赞 关注
 

回复
举报

436

帖子

5

TA的资源

五彩晶圆(初级)

沙发
 
 
 

回复

436

帖子

5

TA的资源

五彩晶圆(初级)

板凳
 
你的描述看得不太懂。不知道怎么分析你的问题。

你测试系统跑的时间长短都是在连上仿真器的环境下吗?建议在实测阶段,不要连接仿真器,这个本身仿真器可能会对实际运行系统是有影响的。另外,UCOS2的稳定性还是很不错的,不要轻易怀疑是它本身的问题。
 
 
 

回复

6

帖子

0

TA的资源

一粒金砂(中级)

4
 
连仿真器试过,晚上跑到时候就没连。现在我找到问题可能出在中断处,但是不知道具体哪里有问题
 
 
 

回复

436

帖子

5

TA的资源

五彩晶圆(初级)

5
 
你把中断里面的代码贴出来看一下
 
 
 

回复

6

帖子

0

TA的资源

一粒金砂(中级)

6
 
前面3.5ms的中断在前面,下面是串口和1.5ms的
#pragma TRAP_PROC
//#pragma NO_RETURN
interrupt 66 void Inter_T15(void) {

     // OSIntEnter();
     // OS_SAVE_SP();
      PITTF_PTF0=1;        // clear channel 1 flag
      PITCE_PCE0=0;
      PITINTE_PINTE0=0;
      //OS_ENTER_CRITICAL();
      T15();
     // OS_EXIT_CRITICAL();
     // OSIntExit();

}
#pragma TRAP_PROC
//#pragma NO_RETURN
interrupt 21 void inter_SCI1HMI(void) {
   
    //OSIntEnter();
    //OS_SAVE_SP();
    //OS_CPU_SR     cpu_sr;
     
    if(SCI1SR1_RDRF) {
        if(REV.EndFLG15) {
                StartT35();
                return;
         }
         REV.OK=FALSE ;
         StartT15();
         StartT35();                       
         *(REV.REVbuff+REV.REVlength)=SCI1DRL;
         REV.REVlength++;
    }
   //OSIntExit();
  // OS_EXIT_CRITICAL();
}

点评

看了感觉代码结构上没有什么问题,不知道是怎么一回事。猜测是不是代码中指针或数据的地址越界,导致程序长时间运行后越界进入异常处理中了。  详情 回复 发表于 2013-1-19 12:40
 
 
 

回复

436

帖子

5

TA的资源

五彩晶圆(初级)

7
 
原帖由 cqxjian 于 2013-1-19 11:56 发表
前面3.5ms的中断在前面,下面是串口和1.5ms的
#pragma TRAP_PROC
//#pragma NO_RETURN
interrupt 66 void Inter_T15(void) {

     // OSIntEnter();
     // OS_SAVE_SP();
      PITTF_PTF0=1;        // ...
看了感觉代码结构上没有什么问题,不知道是怎么一回事。猜测是不是代码中指针或数据的地址越界,导致程序长时间运行后越界进入异常处理中了。
 
 
 

回复

6

帖子

0

TA的资源

一粒金砂(中级)

8
 
恩,我再查查看,谢谢你了!
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/8 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表