OpenEdv-开源电子网

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

@zuozhongkai 关于UCOS教程可能的错误

[复制链接]

70

主题

6761

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13114
金钱
13114
注册时间
2012-11-26
在线时间
3812 小时
发表于 2016-5-20 14:16:58 | 显示全部楼层 |阅读模式
@zuozhongkai


最近比较闲,看了下UCOS 3的教程,某些地方有些疑问


1、delay_ms函数,缺少else语句吧?判断OS是否启动,根据OS启动情况选择延时方案
//延时nms
//nms:要延时的ms数
void delay_ms(u16 nms)
{
if(delay_osrunning&&delay_osintnesting==0) //如果OS已经在跑了,并且不是在中断里面(中断里面不能任务调度)     
{   
  if(nms>=fac_ms)       //延时的时间大于OS的最少时间周期
  {
      delay_ostimedly(nms/fac_ms);  //OS延时
  }
  nms%=fac_ms;       //OS已经无法提供这么小的延时了,采用普通方式延时   
}
else
{
delay_us((u32)(nms*1000));     //普通方式延时  
}
}


2、这个不管是否POST成功,都该free吧,而不是失败了才free


picpic.png
学无止境
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2016-5-20 15:03:50 | 显示全部楼层
本帖最后由 zuozhongkai 于 2016-5-20 15:05 编辑

第一个确实要加个else,多谢提醒,第二个是正确的,申请的这个pbuf内存在消息被发送出去,并且OSQPend()请求到,处理了这个消息以后就会释放掉这个pbuf的内存,如下图: P8G@D%`FDR`Y7GAR23UDI`B.png
如果已发送成功就释放内存的话就相当于删除了这条消息。
回复 支持 反对

使用道具 举报

70

主题

6761

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13114
金钱
13114
注册时间
2012-11-26
在线时间
3812 小时
 楼主| 发表于 2016-5-20 15:06:40 | 显示全部楼层
zuozhongkai 发表于 2016-5-20 15:03
第一个确实要加个else,多谢提醒,第二个是正确的,申请的这个pbuf内存在消息被发送出去,并且OSQPend()请 ...

这个用户层面申请的内存,系统会去释放?


总感觉怪怪的,得再研究下了
学无止境
回复 支持 反对

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2016-5-20 15:09:57 | 显示全部楼层
jermy_z 发表于 2016-5-20 15:06
这个用户层面申请的内存,系统会去释放?

不是系统释放的,看我那个图,是自己调用函数释放的。
开往春天的手扶拖拉机
回复 支持 反对

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2016-5-20 15:11:45 | 显示全部楼层
本帖最后由 zuozhongkai 于 2016-5-20 15:13 编辑

看了一下delay_ms()延时也是没有问题的。
`DQW1_J4OOO$JGP9}[46~_A.png
开往春天的手扶拖拉机
回复 支持 反对

使用道具 举报

70

主题

6761

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13114
金钱
13114
注册时间
2012-11-26
在线时间
3812 小时
 楼主| 发表于 2016-5-20 15:18:33 | 显示全部楼层
zuozhongkai 发表于 2016-5-20 15:09
不是系统释放的,看我那个图,是自己调用函数释放的。

这两个问题,保留个人意见  
学无止境
回复 支持 反对

使用道具 举报

70

主题

6761

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13114
金钱
13114
注册时间
2012-11-26
在线时间
3812 小时
 楼主| 发表于 2016-5-20 15:20:26 | 显示全部楼层
zuozhongkai 发表于 2016-5-20 15:11
看了一下delay_ms()延时也是没有问题的。

是哦,这个没注意,哈哈,不好意思,不过那个释放内存的,应该是有些问题吧,你那个有错误之后,才会释放,难道我又错过了什么?
学无止境
回复 支持 反对

使用道具 举报

88

主题

7377

帖子

5

精华

资深版主

Rank: 8Rank: 8

积分
14980
金钱
14980
注册时间
2013-11-13
在线时间
1823 小时
发表于 2016-5-20 15:31:22 | 显示全部楼层
jermy_z 发表于 2016-5-20 15:20
是哦,这个没注意,哈哈,不好意思,不过那个释放内存的,应该是有些问题吧,你那个有错误之后,才会释放 ...

你看一下msgdis_task()任务函数,发送成功以后不能释放内存,原因很简单,UCOSIII里面发送消息只是把这个消息的地址发送过去,UCOSIII并不会替你保管这个消息的,你如发送成功就释放掉 内存,那么这个消息也就会干掉了,那么什么时候改释放这个消息的内存呢?那就是这条消息被Pend以后并且正常处理了才可以释放内存哒。
开往春天的手扶拖拉机
回复 支持 反对

使用道具 举报

70

主题

6761

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
13114
金钱
13114
注册时间
2012-11-26
在线时间
3812 小时
 楼主| 发表于 2016-5-20 15:35:47 | 显示全部楼层
zuozhongkai 发表于 2016-5-20 15:31
你看一下msgdis_task()任务函数,发送成功以后不能释放内存,原因很简单,UCOSIII里面发送消息只是把这个 ...

嗯,没看全部代码,仅看了手册,没注意在别的地方还有释放   不好意思啦,还耽误你时间
学无止境
回复 支持 反对

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-6-8 06:10

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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