查看: 7398|回复: 11

[MQX] MQX程序调试时跳入_mqx_idle_task函数(已解决)

[复制链接]

该用户从未签到

24

主题

252

帖子

0

高级会员

Rank: 4

积分
504
最后登录
1970-1-1
发表于 2014-12-10 18:49:03 | 显示全部楼层 |阅读模式
本帖最后由 blacklili 于 2014-12-26 14:09 编辑

在线调试EEE功能时,执行“FTFL_FSTAT |= FTFL_FSTAT_CCIF_MASK;”语句的时候,MQX任务会跳入_mqx_idle_task函数,并且调试中断。这是为什么呢?
我知道答案 目前已有11人回答
error.png
回复

使用道具 举报

该用户从未签到

3

主题

57

帖子

0

中级会员

Rank: 3Rank: 3

积分
400
最后登录
2017-11-10
发表于 2014-12-10 19:00:17 | 显示全部楼层
执行FTFL_FSTAT |= FTFL_FSTAT_CCIF_MASK 这个是不是一个寄存器的配置或者是一个标志,有这个标志使得系统进入了idle 状态。所以需要你多了解下这条语句真正的含义。
回复 支持 反对

使用道具 举报

该用户从未签到

24

主题

252

帖子

0

高级会员

Rank: 4

积分
504
最后登录
1970-1-1
 楼主| 发表于 2014-12-10 20:07:45 | 显示全部楼层
蓝色雪狐 发表于 2014-12-10 19:00
执行FTFL_FSTAT |= FTFL_FSTAT_CCIF_MASK 这个是不是一个寄存器的配置或者是一个标志,有这个标志使得系统 ...

FTFL_FSTAT |= FTFL_FSTAT_CCIF_MASK;这条语句是清除Flash状态寄存器的命令完成标志位操作,对FTFL_FSTAT寄存器的CCIF位写1清除。应该不会引起任务堵塞吧。?
回复 支持 反对

使用道具 举报

该用户从未签到

3

主题

57

帖子

0

中级会员

Rank: 3Rank: 3

积分
400
最后登录
2017-11-10
发表于 2014-12-10 22:08:53 | 显示全部楼层
blacklili 发表于 2014-12-10 20:07
FTFL_FSTAT |= FTFL_FSTAT_CCIF_MASK;这条语句是清除Flash状态寄存器的命令完成标志位操作,对FTFL_FSTAT ...

是不是下面这个函数? 如果是,那么是否可以认为在等待flash的操作完成,因为flash的写操作和擦出操作都需要一定的时间。所以可能是flash操作出错了。你提问题的时候需要完整的描述下你这里是做什么,为了达到什么目的,这样才比较好分析问题。
static Byte FTFL_FlashCommandSequence(Byte index)
{
  Byte* ptrFccobReg = (Byte*)&FTFL_BASE_PTR->FCCOB3;
  Byte* ptrCommandObj = (Byte*)&CommandObj;
  /* wait till CCIF bit is set */
  while((FTFL_FSTAT&FTFL_FSTAT_CCIF_MASK) != FTFL_FSTAT_CCIF_MASK){};
  /* clear RDCOLERR & ACCERR & FPVIOL flag in flash status register */
  FTFL_FSTAT = FTFL_FSTAT_ACCERR_MASK|FTFL_FSTAT_FPVIOL_MASK|FTFL_FSTAT_RDCOLERR_MASK;  
  
  /* load FCCOB registers */  
  while(index--)
    *ptrFccobReg++ = *ptrCommandObj++;
  
//  launch a command
  FTFL_FSTAT |= FTFL_FSTAT_CCIF_MASK;
   
  //  waiting for the finishing of the command
  while((FTFL_FSTAT&FTFL_FSTAT_CCIF_MASK) != FTFL_FSTAT_CCIF_MASK){};
  
  /* Check error bits */
  /* Get flash status register value */
  if(FTFL_FSTAT & (FTFL_FSTAT_ACCERR_MASK|FTFL_FSTAT_FPVIOL_MASK|FTFL_FSTAT_MGSTAT0_MASK))
    return 0;
  else return 1;
}
回复 支持 反对

使用道具 举报

该用户从未签到

24

主题

252

帖子

0

高级会员

Rank: 4

积分
504
最后登录
1970-1-1
 楼主| 发表于 2014-12-10 22:33:35 | 显示全部楼层
蓝色雪狐 发表于 2014-12-10 22:08
是不是下面这个函数? 如果是,那么是否可以认为在等待flash的操作完成,因为flash的写操作和擦出操作都 ...

我是自己按照说明写的代码,如下。前面的几句都执行没有问题,在FTFL_FSTAT = FTFL_FSTAT_CCIF_MASK;这句程序执行的时候,在线调试中断,此时程序在执行_mqx_idle_task函数。我认为FTFL_FSTAT = FTFL_FSTAT_CCIF_MASK;这句程序是清除Flash状态寄存器的命令完成标志位,从而开始新的命令,应该不会阻塞CPU吧。并且我除了这个任务之外,还有其他任务啊,这个任务阻塞了可以去执行其他任务的啊。但_mqx_idle_task函数又是在所有任务都阻塞的情况下才执行。所以很不解。
FTFL_FCCOB0 = FTFL_FCCOB0_CCOBn(0x80);
FTFL_FCCOB1 = 0x00;
FTFL_FCCOB2 = 0x00;
FTFL_FCCOB3 = 0x00;
FTFL_FCCOB4 = 0x03;
FTFL_FCCOB5 = 0x05;
FTFL_FSTAT = FTFL_FSTAT_CCIF_MASK;
while(!(FTFL_FSTAT & FTFL_FSTAT_CCIF_MASK));
回复 支持 反对

使用道具 举报

该用户从未签到

3

主题

57

帖子

0

中级会员

Rank: 3Rank: 3

积分
400
最后登录
2017-11-10
发表于 2014-12-10 22:52:30 | 显示全部楼层
blacklili 发表于 2014-12-10 22:33
我是自己按照说明写的代码,如下。前面的几句都执行没有问题,在FTFL_FSTAT = FTFL_FSTAT_CCIF_MASK;这句 ...

你贴的代码的本意和我给的那个看上去差不多啊,都是对FCCOB 进行操作,那么有两个办法,参考我的代码写,然后看看结果,或者是你把下面while 那句注释掉再调试看看。一般来说在线调试中断是系统复位了,比如看门狗复位或者其他的硬件复位,而你看到的_mqx_idle_task 这个未必是真实的情况,所以可以先不用纠结这个。
回复 支持 反对

使用道具 举报

该用户从未签到

24

主题

252

帖子

0

高级会员

Rank: 4

积分
504
最后登录
1970-1-1
 楼主| 发表于 2014-12-10 23:07:40 | 显示全部楼层
蓝色雪狐 发表于 2014-12-10 22:52
你贴的代码的本意和我给的那个看上去差不多啊,都是对FCCOB 进行操作,那么有两个办法,参考我的代码写, ...

把while那句注释了也是一样的。有个现象是,当第一次点击运行后,在执行FTFL_FSTAT = FTFL_FSTAT_CCIF_MASK时调试中断(显示为暂停),这时我再点击运行,就可以一直运行下去了。你说的在线调试中断是系统复位了?那我再次点击运行就相当于是重新开始运行了?
回复 支持 反对

使用道具 举报

该用户从未签到

3

主题

57

帖子

0

中级会员

Rank: 3Rank: 3

积分
400
最后登录
2017-11-10
发表于 2014-12-11 08:41:08 | 显示全部楼层
blacklili 发表于 2014-12-10 23:07
把while那句注释了也是一样的。有个现象是,当第一次点击运行后,在执行FTFL_FSTAT = FTFL_FSTAT_CCIF_MA ...

那这样吧,不用调试模式,就是直接跑看看能不能走下去,用串口加一些信息来debug看看。比如到这里就把一个变量加1,然后可以找一个地方print 出来,看看这里执行是否OK。或者简单的看看走到这里系统会不会复位。

另外,你现在这个任务是做什么的,为什么会去操作驱动层的东西呢。
回复 支持 反对

使用道具 举报

该用户从未签到

24

主题

252

帖子

0

高级会员

Rank: 4

积分
504
最后登录
1970-1-1
 楼主| 发表于 2014-12-11 12:40:41 | 显示全部楼层
直接上电有时可以,有时会出问题。设计的板子没有串口接口,所以无法如此调试了。我再试试,谢谢你!
回复 支持 反对

使用道具 举报

该用户从未签到

24

主题

252

帖子

0

高级会员

Rank: 4

积分
504
最后登录
1970-1-1
 楼主| 发表于 2014-12-11 12:41:28 | 显示全部楼层
蓝色雪狐 发表于 2014-12-11 08:41
那这样吧,不用调试模式,就是直接跑看看能不能走下去,用串口加一些信息来debug看看。比如到这里就把一 ...

直接上电有时可以,有时会出问题。设计的板子没有串口接口,所以无法如此调试了。我再试试,谢谢你!
回复 支持 反对

使用道具 举报

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

本版积分规则

关闭

站长推荐上一条 /3 下一条

Archiver|手机版|小黑屋|恩智浦技术社区

GMT+8, 2025-7-20 13:25 , Processed in 0.109751 second(s), 31 queries , MemCache On.

Powered by Discuz! X3.4

Copyright © 2001-2024, Tencent Cloud.

快速回复 返回顶部 返回列表