现在的位置: 首页 > 综合 > 正文

技术探讨:关于带UCOS的嵌入式系统如STM32微妙级延时和处理方法

2019年03月23日 ⁄ 综合 ⁄ 共 2613字 ⁄ 字号 评论关闭

http://blog.sina.com.cn/s/blog_9cc481910101i7zc.html

QQ群中不少学友提出,使用了UCOS,不知道如何实现微秒级别的延时(如100微秒处理一次)

困惑主要原因在于:还是想用OSTimeDly,认为应该使用OS的系统服务来做

我这里说说我对这个问题的理解:

OSTIMETICK是操作系统的时钟滴答服务,如果度过我写的那本《嵌入式实时操作系统μCOS原理与实践》,看过对源码的分析,应该知道,滴答服务做是将延时的任务延时时间--,减到0就恢复任务就绪状态,然后如果当前运.行的任务不再是优先级最高的,进行一次任务调度OSSCHED.其实功能是有限的。而一般在32下使用SYSTICK中断触发滴答服务,这个时间应该是1MS到100MS为宜。而且,延时时间是有量化误差的,OSTIMEDLY(1)是极其不准确的。因此,首先应否决使用延时在做这个事情。

那么,就应该用定时器,设置定时器的中断发生周期是微秒级别的。当定时器中断的时候,就进行处理。但是,处理的代码较长,在中断服务程序ISR中去写是不好的,系统的实时性变差。那又如何是好!

其实,信号量管理这些事件管理,这时就要显示能力了。做法应该是:

1。创建一个信号量,其值为0

2.处理任务PEND信号量,被阻塞

3.定时器中断服务程序POST信号量,处理任务就绪,离开中断后处理任务接管CPU进行处理。现在是在用户模式下进行数据处理,不影响系统中断响应,这样就解决了问题。

 

以下是QQ群225306620部分聊天记录:

OBIN(86884260) 0:00:38
老师您好!我是刚加入这个群的。
我是刚开始弄UCOS,我想用在伺服控制方面。用UCOS可以把控制周期控制在0.1ms以内吗
2014(1073169975) 0:01:23
我也想知道
成都-亮点-UCOS(759019) 0:01:25
没问题
2014(1073169975) 0:01:45
cpu时钟配置成多少好呢
成都-亮点-UCOS(759019) 0:02:17
但是我想你的设计应该是用一个定时器产生
成都-亮点-UCOS(759019) 0:02:24
0.1MS的中断
成都-亮点-UCOS(759019) 0:02:34
而不是用SYSTICK
成都-亮点-UCOS(759019) 0:02:42
SYSTICK是用来做系统服务
成都-亮点-UCOS(759019) 0:02:55
定时器的ISR中PEND信号量给任务就可以了
成都-亮点-UCOS(759019) 0:03:23
系统滴答服务不要小于1MS
成都-亮点-UCOS(759019) 0:03:39
不会用的人只会延时,那是不行的
2014(1073169975) 0:03:44
我开的1000
成都-亮点-UCOS(759019) 0:03:46
没有了解UCOS的真谛
2014(1073169975) 0:04:00
1s1000次
ROBIN(86884260) 0:04:22
那如何保证系统滴答1ms呢?我的控制周期必须控制在0.1ms以内
2014(1073169975) 0:04:50
是啊
成都-亮点-UCOS(759019) 0:04:53
你的定时器设置0.1ms以内中断一次
成都-亮点-UCOS(759019) 0:05:03
STM32一堆定时器
2014(1073169975) 0:05:03
系统滴答的优先级在那设置呢
2014(1073169975) 0:05:19
他的优先级是不是最高的》
成都-亮点-UCOS(759019) 0:05:20
SYSTICK在NVIC中
2014(1073169975) 0:05:21

成都-亮点-UCOS(759019) 0:05:24
很好设置的
ROBIN(86884260) 0:05:32

成都-亮点-UCOS(759019) 0:05:34
可以调整优先级
2014(1073169975) 0:05:42
我用的3.5的库
2014(1073169975) 0:05:59
初始化默认是最高吗
成都-亮点-UCOS(759019) 0:06:04
库里没有的话你都可以写寄存器
成都-亮点-UCOS(759019) 0:06:08
这些不是问题
2014(1073169975) 0:06:13

成都-亮点-UCOS(759019) 0:06:18
库是方便你的工具
成都-亮点-UCOS(759019) 0:06:37
SYSTICK默认很高的
成都-亮点-UCOS(759019) 0:06:45
你可以修改的

2014(1073169975) 0:06:52
哦哦
2014(1073169975) 0:07:34
很多时候还是对stm32的配置不是很清楚
ROBIN(86884260) 0:07:41
就是说把定时器优先级设高,每格0.1ms进入中断。systick保证任务切换1ms  是这样吗
成都-亮点-UCOS(759019) 0:08:05
SYSTICK不一定做任务切换
成都-亮点-UCOS(759019) 0:08:10
这个是个误区
成都-亮点-UCOS(759019) 0:08:36
你们以为滴答服务做切换,我书里对嘀嗒服务程序的代码讲的很清楚
成都-亮点-UCOS(759019) 0:08:46
是用来判断谁延时时间到了的

2014(1073169975) 0:08:53

成都-亮点-UCOS(759019) 0:09:23
你的定时器中断0.1MS来一次,POST信号量给任务,就能切换了
成都-亮点-UCOS(759019) 0:09:29
不需要等滴答服务
成都-亮点-UCOS(759019) 0:09:42
这个切换时间是微秒级的
成都-亮点-UCOS(759019) 0:09:49
否则算什么RTOS

ROBIN(86884260) 0:10:02

成都-亮点-UCOS(759019) 0:10:56
不用UCOS,你要么加长ISR,要么在ISR中置为全局变量,然后在主程序中查询
成都-亮点-UCOS(759019) 0:11:07
这样都做不到微妙级
2014(1073169975) 0:11:23
这么说要精确控制只能中断了??
成都-亮点-UCOS(759019) 0:11:32
当然
2014(1073169975) 0:11:38
哦哦
2014(1073169975) 0:11:53

2014(1073169975) 0:12:24
那样的话精确控制时间很难
2014(1073169975) 0:12:44
中断必须要短

抱歉!评论已关闭.