OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 5466|回复: 20

在ucosii使用中遇到的奇怪问题

[复制链接]

20

主题

134

帖子

0

精华

高级会员

Rank: 4

积分
550
金钱
550
注册时间
2016-7-26
在线时间
90 小时
发表于 2016-8-5 11:21:48 | 显示全部楼层 |阅读模式
20金钱
在ucos的一个任务中,写了这样一段程序
while(1)
  if()
   表达式1;
else if()
  表达式2;
else if()
  表达式3;


第二个else if 和表达式3 如下:
else if(Can_msg1[1] == 0xB0)
        {
                Send_FlashData();
                Can_msg1[1]=0x00;
                continue;
        }

奇怪的是只要注释掉这段,程序就会卡死,实在是理解不了,这一段判断语句怎么会影响程序运行呢?

求大神指点~~

最佳答案

查看完整内容[请看2#楼]

你这问题我曾经也遇到过。怎么解决的,记不清了,不过就是内存问题导致的。我按下面的事项调整下程序试试。 ucos使用注意事项: 1、每个任务都需要加延时,不然在任务切换时,会因为某个任务一直在占用CPU,导致其他任务无法执行 2、如图所示,其堆栈值要合理 3、在os_cfg.h文件中,OS_MAX_TASKS等配置项要合理,具体代表啥意思问度娘 4、注意各个任务的优先级 5、各个任务的堆栈值大小由每个任务中所使用的最大内存为主,包 ...
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

14

主题

219

帖子

0

精华

高级会员

Rank: 4

积分
598
金钱
598
注册时间
2014-4-14
在线时间
76 小时
发表于 2016-8-5 11:21:49 | 显示全部楼层
你这问题我曾经也遇到过。怎么解决的,记不清了,不过就是内存问题导致的。我按下面的事项调整下程序试试。
ucos使用注意事项:
1、每个任务都需要加延时,不然在任务切换时,会因为某个任务一直在占用CPU,导致其他任务无法执行
2、如图所示,其堆栈值要合理
3、在os_cfg.h文件中,OS_MAX_TASKS等配置项要合理,具体代表啥意思问度娘
4、注意各个任务的优先级
5、各个任务的堆栈值大小由每个任务中所使用的最大内存为主,包括每个任务的子函数,
例如:有任务1,任务1调用了子函数A,而任务1本身没使用啥内存,但是函数A却使用了1024的内存,那么任务1在设置堆栈时,要尽可能的大于1024。(不确定可自行实验)
1.png
回复

使用道具 举报

20

主题

134

帖子

0

精华

高级会员

Rank: 4

积分
550
金钱
550
注册时间
2016-7-26
在线时间
90 小时
 楼主| 发表于 2016-8-5 18:22:52 | 显示全部楼层
没人遇到过这种情况吗
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2016-8-5 23:54:30 | 显示全部楼层
仿真看看
回复

使用道具 举报

20

主题

134

帖子

0

精华

高级会员

Rank: 4

积分
550
金钱
550
注册时间
2016-7-26
在线时间
90 小时
 楼主| 发表于 2016-8-6 12:46:54 | 显示全部楼层

仿真时就在这几个判断中循环,hardfault_handler 前最后执行的好像是OSTimeDlyHMSM(0,0,0,10)里面,而且运行四个任务的话会死,而这四个任务中运行三个的话就正常
回复

使用道具 举报

20

主题

134

帖子

0

精华

高级会员

Rank: 4

积分
550
金钱
550
注册时间
2016-7-26
在线时间
90 小时
 楼主| 发表于 2016-8-6 12:48:07 | 显示全部楼层

而且是运行一会儿卡死
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165524
金钱
165524
注册时间
2010-12-1
在线时间
2116 小时
发表于 2016-8-6 19:31:17 | 显示全部楼层
wanyingwe 发表于 2016-8-6 12:46
仿真时就在这几个判断中循环,hardfault_handler 前最后执行的好像是OSTimeDlyHMSM(0,0,0,10)里面,而且 ...

看看是不是堆栈小了的问题
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
正点原子官方微信公众平台,点击这里关注“正点原子”
回复

使用道具 举报

20

主题

134

帖子

0

精华

高级会员

Rank: 4

积分
550
金钱
550
注册时间
2016-7-26
在线时间
90 小时
 楼主| 发表于 2016-8-7 15:27:19 | 显示全部楼层
正点原子 发表于 2016-8-6 19:31
看看是不是堆栈小了的问题

试过了,都改成2048了还这样
回复

使用道具 举报

20

主题

134

帖子

0

精华

高级会员

Rank: 4

积分
550
金钱
550
注册时间
2016-7-26
在线时间
90 小时
 楼主| 发表于 2016-8-7 15:56:44 | 显示全部楼层
捕获.JPG
每次死之前跳到了这个地方
回复

使用道具 举报

20

主题

134

帖子

0

精华

高级会员

Rank: 4

积分
550
金钱
550
注册时间
2016-7-26
在线时间
90 小时
 楼主| 发表于 2016-8-9 08:18:33 | 显示全部楼层
删除掉一个任务就可以正常工作,加上一个空任务运行到这段也会卡死
回复

使用道具 举报

20

主题

134

帖子

0

精华

高级会员

Rank: 4

积分
550
金钱
550
注册时间
2016-7-26
在线时间
90 小时
 楼主| 发表于 2016-8-9 16:13:51 | 显示全部楼层
GS1101923161 发表于 2016-8-9 08:56
你这问题我曾经也遇到过。怎么解决的,记不清了,不过就是内存问题导致的。我按下面的事项调整下程序试试。 ...

感谢回复!
感觉是任务调度哪里有问题,因为添加一个空任务,只有OSTimeDlyHMSM()函数也会卡死,而删除这个任务就运行正常,另外在调用的子函数中OSTimeDlyHMSM()函数也会卡死任务优先级和堆栈都试过,还是没有效果,郁闷。。
回复

使用道具 举报

14

主题

219

帖子

0

精华

高级会员

Rank: 4

积分
598
金钱
598
注册时间
2014-4-14
在线时间
76 小时
发表于 2016-8-10 08:28:12 | 显示全部楼层
wanyingwe 发表于 2016-8-9 16:13
感谢回复!
感觉是任务调度哪里有问题,因为添加一个空任务,只有OSTimeDlyHMSM()函数也会卡死,而删 ...

就是内存没弄好,导致调度出错,你这问题我遇到过,当时我的做法就是新建个工程,然后代码一句一句的还原,每还原一个就重新运行下,结果就这么解决了~~
回复

使用道具 举报

19

主题

430

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1341
金钱
1341
注册时间
2016-4-22
在线时间
187 小时
发表于 2016-8-10 08:50:56 | 显示全部楼层
是不是去掉代码后进入else if(Can_msg1[1] == 0xB0)变成空跑,这样就变成死循环,抢占了所有资源。只看这几句代码我只能这样猜。
伤情最是晚凉天,憔悴斯人不堪怜。
邀酒摧肠三杯醉,寻香惊梦五更寒。
钗头凤斜卿有泪,荼蘼花了我无缘。
小楼寂寞新雨月,也难如钩也难圆。
回复

使用道具 举报

2

主题

8

帖子

0

精华

初级会员

Rank: 2

积分
98
金钱
98
注册时间
2016-7-19
在线时间
19 小时
发表于 2016-8-10 09:00:45 | 显示全部楼层
Send_FlashData();

把这个拿出来单独运行下看看有没有问题?
回复

使用道具 举报

20

主题

134

帖子

0

精华

高级会员

Rank: 4

积分
550
金钱
550
注册时间
2016-7-26
在线时间
90 小时
 楼主| 发表于 2016-8-10 10:19:58 | 显示全部楼层
ysq7120 发表于 2016-8-10 08:50
是不是去掉代码后进入else if(Can_msg1[1] == 0xB0)变成空跑,这样就变成死循环,抢占了所有资源。只看这几 ...

好像确实是会空跑,可是几个else if 语句只有哦这句有影响,想不通
回复

使用道具 举报

20

主题

134

帖子

0

精华

高级会员

Rank: 4

积分
550
金钱
550
注册时间
2016-7-26
在线时间
90 小时
 楼主| 发表于 2016-8-10 10:21:11 | 显示全部楼层
RogerSt 发表于 2016-8-10 09:00
Send_FlashData();

把这个拿出来单独运行下看看有没有问题?

函数本身应该没有问题,之前可以正常执行,就是添加了一个新任务就出现问题了,而且只是添加了一个空任务。
回复

使用道具 举报

19

主题

430

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1341
金钱
1341
注册时间
2016-4-22
在线时间
187 小时
发表于 2016-8-10 11:16:41 | 显示全部楼层
任务中如果没有代码,可以暂时调用delay适当延时,这样任务能释放时间给别的任务,不然有很意义。
伤情最是晚凉天,憔悴斯人不堪怜。
邀酒摧肠三杯醉,寻香惊梦五更寒。
钗头凤斜卿有泪,荼蘼花了我无缘。
小楼寂寞新雨月,也难如钩也难圆。
回复

使用道具 举报

20

主题

134

帖子

0

精华

高级会员

Rank: 4

积分
550
金钱
550
注册时间
2016-7-26
在线时间
90 小时
 楼主| 发表于 2016-8-10 15:27:25 | 显示全部楼层
ysq7120 发表于 2016-8-10 11:16
任务中如果没有代码,可以暂时调用delay适当延时,这样任务能释放时间给别的任务,不然有很意义。

这个任务中我就只写了这个:
while(1)
{
   OSTimeDlyHMSM(0,0,0,10);
}
是不是这个意思
回复

使用道具 举报

19

主题

430

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1341
金钱
1341
注册时间
2016-4-22
在线时间
187 小时
发表于 2016-8-10 15:47:30 | 显示全部楼层
wanyingwe 发表于 2016-8-10 15:27
这个任务中我就只写了这个:
while(1)
{

是的。保证你的框架逻辑是对的。在有问题就打印堆栈信息,确认堆栈够大,不会溢出,然后查指针数组的访问。这些问题最容易出现。
伤情最是晚凉天,憔悴斯人不堪怜。
邀酒摧肠三杯醉,寻香惊梦五更寒。
钗头凤斜卿有泪,荼蘼花了我无缘。
小楼寂寞新雨月,也难如钩也难圆。
回复

使用道具 举报

20

主题

134

帖子

0

精华

高级会员

Rank: 4

积分
550
金钱
550
注册时间
2016-7-26
在线时间
90 小时
 楼主| 发表于 2016-8-10 15:49:42 | 显示全部楼层
GS1101923161 发表于 2016-8-10 08:28
就是内存没弄好,导致调度出错,你这问题我遇到过,当时我的做法就是新建个工程,然后代码一句一句的还原 ...

我也计划这么试试,没办法了,还有hd.s文件中堆栈的设置有什么原则吗,和任务堆栈设置有什么关系呢,我查了半天也没理解。
回复

使用道具 举报

14

主题

219

帖子

0

精华

高级会员

Rank: 4

积分
598
金钱
598
注册时间
2014-4-14
在线时间
76 小时
发表于 2016-8-11 08:26:10 | 显示全部楼层
wanyingwe 发表于 2016-8-10 15:49
我也计划这么试试,没办法了,还有hd.s文件中堆栈的设置有什么原则吗,和任务堆栈设置有什么关系呢,我查 ...

工程比较大的话,在不太懂的情况下,只要不超出CPU的内存大小,劲量设置的大点还是比较保险的。具体的还是问度娘比较好~~
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-7 21:01

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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