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

[复制链接]
 楼主| 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的线程收到信号以后,开始执行你的任务。
 楼主| yunyoushuaiqi 发表于 2017-2-17 12:21 | 显示全部楼层
aozima 发表于 2017-2-17 10:52
UCOS2不支持同优先级轮转,哪来的时间片?
既然使用了RTOS了,那么你的应用程序结构就应该改成事件驱动的。 ...

请问应该开个什么中断呢?单片机里唯一能按时触发的就是定时中断了。可是我之前加了一个定时器中断以后发现程序就不能正常运转了。。。。。。。。。
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
理由:感谢

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

不能正常运转,要自己调试转出原因来。
开中断,就是弄个定时器中断。
如果你的系统时钟节拍中断是10ms的话,用延时也是可以的。
当然,具体还要看你系统的要求。
 楼主| yunyoushuaiqi 发表于 2017-2-17 13:46 | 显示全部楼层
lishutong 发表于 2017-2-17 12:27
楼主可以考虑这样。

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

多谢你的建议我研究研究。
Larm1 发表于 2017-2-17 13:54 | 显示全部楼层
1. 可以是否操作系统的延时函数,但是时间肯定不精准;
2. 将这部分功能放在定时中断服务程序中,时间精度高;
3. 采用定时器中断加信号量的方式, 也可以将程序放在任务中,但是时间精度可能比2的稍差。
 楼主| yunyoushuaiqi 发表于 2017-2-17 14:33 | 显示全部楼层
6楼的方法是可行的。用信号量的方式。固定时间进行触发。任务执行程序等待到有信号量的时候再执行。感谢@liushutong
lishutong 发表于 2017-2-17 14:38 | 显示全部楼层
yunyoushuaiqi 发表于 2017-2-17 14:33
6楼的方法是可行的。用信号量的方式。固定时间进行触发。任务执行程序等待到有信号量的时候再执行。感谢@li ...

注意调下任务的优先级,如果希望定时发生后,能够立即触发执行的话。任务的优先级要高点,否则就可能会因cpu被别的任务占用而延迟,导致延时精度更差。
 楼主| yunyoushuaiqi 发表于 2017-2-17 15:50 | 显示全部楼层
lishutong 发表于 2017-2-17 14:38
注意调下任务的优先级,如果希望定时发生后,能够立即触发执行的话。任务的优先级要高点,否则就可能会因 ...

多谢,
m564522634 发表于 2017-2-17 16:05 | 显示全部楼层
uc/os 任务是并发的,有可能你在for里面执行函数的时候任务切换,所以整个for的运行就不是一个固定值了。 你这种for计时本身就有太多的问题了,在一个函数阻塞在太多时候了,不管在裸机还是在操作系统里都不是一个好的方法了,只不过裸机不会任务切换所以你看到执行的时间是固定的了。
 楼主| yunyoushuaiqi 发表于 2017-2-17 16:36 | 显示全部楼层
m564522634 发表于 2017-2-17 16:05
uc/os 任务是并发的,有可能你在for里面执行函数的时候任务切换,所以整个for的运行就不是一个固定值了。  ...

多谢,我已经用信号量的问题解决了。
usysm 发表于 2017-2-17 22:43 | 显示全部楼层
这个不是中断函数自己执行的吗
usysm 发表于 2017-2-17 22:45 | 显示全部楼层
楼主使用while(n),这个不用这样执行吧,systick可以转换。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

21

主题

185

帖子

12

粉丝
快速回复 在线客服 返回列表 返回顶部

21

主题

185

帖子

12

粉丝
快速回复 在线客服 返回列表 返回顶部