上海爱观视觉 发表于 2017-11-3 11:33:24

嵌入式实时操作性能评估

各位使用过实时操作系统的大佬,可否交流下使用过的OS的实时性,比如can通讯频率能到多高,任务时间最快可以到什么量级等等,感谢!

bg6agf 发表于 2017-11-3 14:17:20

貌似所有操作系统都有这种参数。而且是很重要的参数。。

上海爱观视觉 发表于 2017-11-3 14:42:26

RE: 嵌入式实时操作(FreeRTOS)学习交流贴(长期)

bg6agf 发表于 2017-11-3 14:17
貌似所有操作系统都有这种参数。而且是很重要的参数。。

我正在看基于STM32的FreeRTOS,里面写到OS的时钟是1ms,我理解的是调度器每1ms根据任务的优先级去集中处理所有任务,比如三个任务A:1KHz的串口通讯, 500Hz的IO翻转, 100Hz的液晶屏显示, 优先级A>B>C,那么是不是CPU开始计时,到1ms时要执行任务A,当2ms时要执行 A和B,当10ms是要执行A,B,C。即所有的任务根据优先级在1ms内执行完成,执行不完也要丢弃任务,当然执行不完的肯定是那些低优先级的任务?而在每个任务中我们主要就是调用ST的库函数去进行数据交互?不知道这样理解对不对,欢迎讨论

flamma 发表于 2017-11-3 14:56:19

上海爱观视觉 发表于 2017-11-3 14:42
我正在看基于STM32的FreeRTOS,里面写到OS的时钟是1ms,我理解的是调度器每1ms根据任务的优先级去集中处理 ...

不完全对。并不是执行1ms才放弃,而是随时高优先级的都可能会打断底优先级的,只要高优先级处于就绪状态。这种调度一般通过中断来完成,而不仅仅是tick中断。只有同优先级(如果支持)的,才是按时间片轮转。但还有很多细节各操作系统处理并不一样。

3DA502 发表于 2017-11-3 15:49:15

有严格时序要求的地方,比如汽车ECU,不用这种有名字的OS,我见到的是中断和时间片轮转的

kingway00 发表于 2017-11-3 16:31:22

3DA502 发表于 2017-11-3 15:49
有严格时序要求的地方,比如汽车ECU,不用这种有名字的OS,我见到的是中断和时间片轮转的 ...

我见到的汽车ECU用的是RTA OS

security 发表于 2017-11-3 16:49:22

上海爱观视觉 发表于 2017-11-3 14:42
我正在看基于STM32的FreeRTOS,里面写到OS的时钟是1ms,我理解的是调度器每1ms根据任务的优先级去集中处理 ...

你需要去看操作系统的书,或者论坛里面搜一下。

给你个帖子:
关于操作系统的调度的,看这边:「UCOSIII中无干扰下最高优先级任务何时才会任务切换?」,4 楼的回复。

上海爱观视觉 发表于 2017-11-3 17:02:15

RE: 嵌入式实时操作性能评估

security 发表于 2017-11-3 16:49
你需要去看操作系统的书,或者论坛里面搜一下。

给你个帖子:


嗯,下午一直在看这块的内容,FreeRTOS的任务调度机制现在清楚了,我们现在有个项目,有点像六轴云台,想找一个实时操作系统融合多传感器信息去控制六个伺服电机的转角,伺服电机控制器的位置环500Hz - 1KHz可调,所以我想使用CAN总线控制6个电机,像通讯频率尽可能高点1KHz吧,传感器主要是IMU也希望快点,所以想看看使用STM32F429 主频180M,想看看OS的节拍最高能到多少,不知道有没有人实际用过。

现在用PC去控制6个电机,100Hz不到,我都快哭了。

上海爱观视觉 发表于 2017-11-3 17:03:17

flamma 发表于 2017-11-3 14:56
不完全对。并不是执行1ms才放弃,而是随时高优先级的都可能会打断底优先级的,只要高优先级处于就绪状态 ...

这个我也看到了,也可以使用任务绝对延时函数来实现任务定频运行

security 发表于 2017-11-3 17:09:05

上海爱观视觉 发表于 2017-11-3 17:02
嗯,下午一直在看这块的内容,FreeRTOS的任务调度机制现在清楚了,我们现在有个项目,有点像六轴云台,想 ...

我这边一直使用 tick = 1ms。
更低的,你可以试一下。
可以戳这里,看看有没有想法:「为什么RTOS系统时钟都是1毫秒?可以调到0.1毫秒不?」

上海爱观视觉 发表于 2017-11-3 17:22:00

flamma 发表于 2017-11-3 14:56
不完全对。并不是执行1ms才放弃,而是随时高优先级的都可能会打断底优先级的,只要高优先级处于就绪状态 ...

这个我也看到了,也可以使用任务绝对延时函数来实现任务定频

上海爱观视觉 发表于 2017-11-4 14:25:09

security 发表于 2017-11-3 17:09
我这边一直使用 tick = 1ms。
更低的,你可以试一下。
可以戳这里,看看有没有想法:「为什么RTOS系统时 ...

嗯这个帖子了解到不少,里面提到可以开一个10K的定时器去查询高开销任务的中断标志位(比如接收标志位),一旦确认接收到以后,给任务发信号量唤醒任务,这样就不用特别高的系统节拍了,问题是中断发出信号量后,任务应该在下一个节拍开始时才能接收到信号量吧,这个延时是不确定的,理论最大延时是一个节拍的时间。但是感觉如果有多个高实时性的任务的话感觉还是提高节拍比较好


帖子里的回答让我感觉好像不是所有的资源都由OS调度,用户也可以划出一部分资源用STM32自带的库函数直接访问,再加上DMA,感觉RTOS好灵活啊

security 发表于 2017-11-4 16:22:23

上海爱观视觉 发表于 2017-11-4 14:25
嗯这个帖子了解到不少,里面提到可以开一个10K的定时器去查询高开销任务的中断标志位(比如接收标志位 ...

错,
在中断中,释放了信号量,一旦这个信号量使得更高优先级的线程就绪,在退出中断时,就会触发一次线程调度切换,即时切换到更高优先级的线程上。
这也是抢占式 RTOS 能够冠以实时的一个基本因素。

你自己再好好看看书吧。

redroof 发表于 2017-11-4 18:22:05

security 发表于 2017-11-4 16:22
错,
在中断中,释放了信号量,一旦这个信号量使得更高优先级的线程就绪,在退出中断时,就会触发一次线 ...

这不是自动的。如果某个中断里有可能释放信号量,那么这个中断函数必须在退岀之前调用系统的一个检查函数,这个检查函数会在需要的情况下假造一个中断现场来切换到高优先级任务。

shangdawei 发表于 2017-11-4 18:57:44

security 发表于 2017-11-4 16:22
错,
在中断中,释放了信号量,一旦这个信号量使得更高优先级的线程就绪,在退出中断时,就会触发一次线 ...

在退出中断时,就会触发一次线程调度切换,即时切换到更高优先级的线程上。



是这么回事吗

Preemptive multitasking

Real-time operating systems like embOS operate with preemptive multitasking.
The highest-priority task in the READY state always executes as long as
the task is not suspended by a call of any operating system function.
A high-priority task waiting for an event is signaled READY as soon as the event occurs.
The event can be set by an interrupt handler, which then activates the task immediately.
Other tasks with lower priority are suspended (preempted) as long as the high-priority task is executing.
A real-time operating system, such as embOS, normally comes with a regular timer
interrupt to interrupt tasks at regular intervals and to perform task switches if timed task switches are necessary

抢先多任务

像embOS这样的实时操作系统可以抢先进行多任务操作。
该就绪状态下最高优先级的任务总是在任务不执行时执行通过任何操作系统函数调用暂停。
等待的高优先级任务一旦事件发生,一个事件就会发出READY信号。
事件可以由一个中断处理程序,然后立即激活任务。
其他任务较低只要高优先级任务正在执行,优先级就被暂停(抢占)。
一个实时操作系统,比如embOS,通常配备一个普通的定时器中断以定期中断任务,如果定时执行任务切换任务切换是必要的

shangdawei 发表于 2017-11-4 19:05:56

http://www.emcu.it/STM32F4xx/Exe2_FreeRTOS_on_STM32F4-Discovery/EXE2_FreeRTOS_on_STM32F4-Discovery.html



security 发表于 2017-11-6 08:26:36

redroof 发表于 2017-11-4 18:22
这不是自动的。如果某个中断里有可能释放信号量,那么这个中断函数必须在退岀之前调用系统的一个检查函数 ...

嗯,你这边说的更细致些。

security 发表于 2017-11-6 08:32:30

shangdawei 发表于 2017-11-4 18:57
在退出中断时,就会触发一次线程调度切换,即时切换到更高优先级的线程上。




是这样的意思。

上海爱观视觉 发表于 2017-11-6 09:57:33

redroof 发表于 2017-11-4 18:22
这不是自动的。如果某个中断里有可能释放信号量,那么这个中断函数必须在退岀之前调用系统的一个检查函数 ...

所以说中断不但要释放信号量,还要立马通知OS,让他进行任务切换?

redroof 发表于 2017-11-6 10:17:32

上海爱观视觉 发表于 2017-11-6 09:57
所以说中断不但要释放信号量,还要立马通知OS,让他进行任务切换?

所有的中断在退出之前永远调用一下系统的检查函数也无所谓,只是浪费一点CPU而已。
平常为了节约时间,如果明知道这个中断肯定不影响系统任务调度,那么就不需要在退出之前检查任务切换。

security 发表于 2017-11-6 10:19:10

上海爱观视觉 发表于 2017-11-6 09:57
所以说中断不但要释放信号量,还要立马通知OS,让他进行任务切换?

这部分动作是 RTOS 的职责,移植 RTOS 时,这部分逻辑就已经要写好、就绪了。
应用层开发,用户无需关注。

security 发表于 2017-11-6 10:34:14

上海爱观视觉 发表于 2017-11-6 09:57
所以说中断不但要释放信号量,还要立马通知OS,让他进行任务切换?

你只要按照 RTOS 的手册来编程即可。
这部分通知 OS,切换任务的事情,从理论上讲,这是 RTOS 的职责,它需要负责对你进行屏蔽,让你感觉不到:与传统的 ISR 的写法,有什么差异。

以 ucos 为例,进入中断,需要用 OSIntEnter 和 OSIntExit 来标记。
记住这个特殊的编程规则就是了。

你可以去看 OSIntExit 的源码,就会发现,内部,它已经替你实现了这部分动作。

上海爱观视觉 发表于 2017-11-6 13:56:41

感谢各位,我基本上对RTOS的一些原理有了解了,最后一个问题,请问悬赏怎么给别人啊{:sweat:}
页: [1]
查看完整版本: 嵌入式实时操作性能评估