发新帖本帖赏金 1.00元(功能说明)我要提问
返回列表
打印
[STM32F1]

请问大家一个UCOS2里面任务用到时间片的问题

[复制链接]
3037|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yunyoushuaiqi|  楼主 | 2017-2-17 10:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

请问各位大神一个UCOS2的问题

在UCOS2的任务里用到了for循环,在for的每次循环里面希望程序每次循环都是固定的执行一定时间。

发现在裸机里面用while(n); 利用n在定时中断自减很好实现,但是在ucos里面好像不能这么用

因为while前面还有一些程序,这些程序受反馈影响,每次时间都不一样。所以用延时的话就不能保证每次循环的时间一样。
沙发
yunyoushuaiqi|  楼主 | 2017-2-17 10:16 | 只看该作者
        for(vs_i=1;vs_i<=(10*speed_num4);vs_i++)
                        {                                       
                                        sudu_time=10;       
                                        speed(0x01,0x01,vsyou);
                                  speed(0x01,0x02,vszuo);
          bianma1=Get_Moto_Pulse_Unclr(TIM2);       
          bianmab=(-Get_Moto_Pulse_Unclr(TIM1));                                               
                                        if(bianma1>(vss_num_you*vs_i))
                                        {
                                         speed(0x01,0x01,0);                                              
                                        }                                                                               
                                        if(bianmab>(vss_num_zuo*vs_i))
                                        {
                                         speed(0x01,0x02,0);                                                            
                                        }       
          while(sudu_time);
         
                        }

使用特权

评论回复
板凳
yunyoushuaiqi|  楼主 | 2017-2-17 10:18 | 只看该作者
上面 的是我的裸机的程序,是一个电机控制的程序。以10ms为时间片的控制方法。反馈是编码器的数值。在移植的过程中发现操作系统里不知道怎么写了。

使用特权

评论回复
地板
aozima| | 2017-2-17 10:52 | 只看该作者
UCOS2不支持同优先级轮转,哪来的时间片?
既然使用了RTOS了,那么你的应用程序结构就应该改成事件驱动的。
比如开个中断,让以10ms为周期来触发事件,如释放信号量。
RTOS的线程收到信号以后,开始执行你的任务。

使用特权

评论回复
5
yunyoushuaiqi|  楼主 | 2017-2-17 12:21 | 只看该作者
aozima 发表于 2017-2-17 10:52
UCOS2不支持同优先级轮转,哪来的时间片?
既然使用了RTOS了,那么你的应用程序结构就应该改成事件驱动的。 ...

请问应该开个什么中断呢?单片机里唯一能按时触发的就是定时中断了。可是我之前加了一个定时器中断以后发现程序就不能正常运转了。。。。。。。。。

使用特权

评论回复
6
lishutong| | 2017-2-17 12:27 | 只看该作者
yunyoushuaiqi 发表于 2017-2-17 10:16
for(vs_i=1;vs_i(vss_num_you*vs_i))
                                        {
                                         speed(0x01,0x01,0);                                              

楼主可以考虑这样。

        for(vs_i=1;vs_i<=(10*speed_num4);vs_i++)
                        {                                       
                                        // 等待信号量sem
                                       OSSemPend(sem,)

                                        speed(0x01,0x01,vsyou);
                                  speed(0x01,0x02,vszuo);
          bianma1=Get_Moto_Pulse_Unclr(TIM2);        
          bianmab=(-Get_Moto_Pulse_Unclr(TIM1));                                                
                                        if(bianma1>(vss_num_you*vs_i))
                                        {
                                         speed(0x01,0x01,0);                                               
                                        }                                                                                
                                        if(bianmab>(vss_num_zuo*vs_i))
                                        {
                                         speed(0x01,0x02,0);                                                            
                                        }                  
                        }
然后在一个10ms的定时中断中,调用OSSemPost(sem)。
蔌者,如果时间要求不是那么严格的话,将while(sudu_time)改成OSTimeDly(xxx)就好了。

看得出来你对rtos原理还不了解,建议深入学习下。
如果感兴趣的话,欢迎关注我的21ic公开课-自己动手从0到1写嵌入式操作系统,会有用力于你实际应用。

使用特权

评论回复

打赏榜单

yunyoushuaiqi 打赏了 1.00 元 2017-02-17
理由:感谢

7
lishutong| | 2017-2-17 12:32 | 只看该作者
yunyoushuaiqi 发表于 2017-2-17 12:21
请问应该开个什么中断呢?单片机里唯一能按时触发的就是定时中断了。可是我之前加了一个定时器中断以后发 ...

不能正常运转,要自己调试转出原因来。
开中断,就是弄个定时器中断。
如果你的系统时钟节拍中断是10ms的话,用延时也是可以的。
当然,具体还要看你系统的要求。

使用特权

评论回复
8
yunyoushuaiqi|  楼主 | 2017-2-17 13:46 | 只看该作者
lishutong 发表于 2017-2-17 12:27
楼主可以考虑这样。

        for(vs_i=1;vs_i(vss_num_you*vs_i))

多谢你的建议我研究研究。

使用特权

评论回复
9
Larm1| | 2017-2-17 13:54 | 只看该作者
1. 可以是否操作系统的延时函数,但是时间肯定不精准;
2. 将这部分功能放在定时中断服务程序中,时间精度高;
3. 采用定时器中断加信号量的方式, 也可以将程序放在任务中,但是时间精度可能比2的稍差。

使用特权

评论回复
10
yunyoushuaiqi|  楼主 | 2017-2-17 14:33 | 只看该作者
6楼的方法是可行的。用信号量的方式。固定时间进行触发。任务执行程序等待到有信号量的时候再执行。感谢@liushutong

使用特权

评论回复
11
lishutong| | 2017-2-17 14:38 | 只看该作者
yunyoushuaiqi 发表于 2017-2-17 14:33
6楼的方法是可行的。用信号量的方式。固定时间进行触发。任务执行程序等待到有信号量的时候再执行。感谢@li ...

注意调下任务的优先级,如果希望定时发生后,能够立即触发执行的话。任务的优先级要高点,否则就可能会因cpu被别的任务占用而延迟,导致延时精度更差。

使用特权

评论回复
12
yunyoushuaiqi|  楼主 | 2017-2-17 15:50 | 只看该作者
lishutong 发表于 2017-2-17 14:38
注意调下任务的优先级,如果希望定时发生后,能够立即触发执行的话。任务的优先级要高点,否则就可能会因 ...

多谢,

使用特权

评论回复
13
m564522634| | 2017-2-17 16:05 | 只看该作者
uc/os 任务是并发的,有可能你在for里面执行函数的时候任务切换,所以整个for的运行就不是一个固定值了。 你这种for计时本身就有太多的问题了,在一个函数阻塞在太多时候了,不管在裸机还是在操作系统里都不是一个好的方法了,只不过裸机不会任务切换所以你看到执行的时间是固定的了。

使用特权

评论回复
14
yunyoushuaiqi|  楼主 | 2017-2-17 16:36 | 只看该作者
m564522634 发表于 2017-2-17 16:05
uc/os 任务是并发的,有可能你在for里面执行函数的时候任务切换,所以整个for的运行就不是一个固定值了。  ...

多谢,我已经用信号量的问题解决了。

使用特权

评论回复
15
usysm| | 2017-2-17 22:43 | 只看该作者
这个不是中断函数自己执行的吗

使用特权

评论回复
16
usysm| | 2017-2-17 22:45 | 只看该作者
楼主使用while(n),这个不用这样执行吧,systick可以转换。

使用特权

评论回复
发新帖 本帖赏金 1.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

21

主题

185

帖子

12

粉丝