打印

不同时钟下ucos ii调度时间为什么不一样?

[复制链接]
1762|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wujun23941105|  楼主 | 2013-7-8 22:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
主芯片:STM32F103VE 系统:ucos ii
外部时钟 12M  PLL进行6倍频产生72M系统时钟
#define COMMONPost(Flag) OSFlagPost(COMMONFlag,Flag,OS_FLAG_SET,&err)
#define COMMONPend(Flag) OSFlagPend(COMMONFlag,Flag,OS_FLAG_WAIT_SET_ALL+OS_FLAG_CONSUME,0,&err)
#define TIM4_Flag  (1<<1)
#define COMMONFlagInit         0
#define TIME4_PRESCALER 72
OS_FLAG_GRP * COMMONFlag;

void main()
{
  bool Flag=0;
…………硬件初始化
OS_CPU_SysTickInit();
....
    DRV_Tim4Init();
    COMMONFlag = OSFlagCreate(COMMONFlagInit, &err);//创建标志位
  创建任务AppTask();
}

void AppTask(void);
{
   while(1)
{
         DRV_Tim4Pend();
         if(Flag)
         {
              SetRLED();
             Flag=0;
         }
       else
      {
        ClrRLED();
             Flag=1;

      }
}


void DRV_Tim4Pend(void)
{
        uint8 err;
        
        COMMONPend(TIM4_Flag);
}

void DRV_Tim4Init(void)
{
…………
TIM4->PSC = TIME4_PRESCALER-1;//72分频
.......
NVIC_InitStructure.NVIC_IRQChannel = TIM4_IRQChannel;
...
TIM4->ARR = 250;//250us定时
……。
TIM_Cmd(TIM4, ENABLE);
}
//中断函数
void DRV_Tim4Irq(void)
{
   if(TIM4->SR&0X0001)//溢出中断
        {
                TIM4->SR&=~(1<<0);//清除中断标志位      
                COMMONPost(TIM4_Flag);
        }
}

这时用示波器看输出的高低变化为250us
当把系统时钟改为12M   #define TIME4_PRESCALER 12
时出来的波形变化有时小于200us有时大于300us请问各位大侠这是什么原因呢?
沙发
i55| | 2013-7-8 23:10 | 只看该作者
因为中断函数DRV_Tim4Irq进入的时候没有用OSIntEnter,退出的时候也没有用OSIntExit,不符合ucosii的要求。

OSIntExit()会引发任务调度,让pend在flag的task立刻执行,你没有使用这个函数,后果就是把抢占式RTOS变成了没有实时性的时间片任务调度器。

使用特权

评论回复
板凳
wujun23941105|  楼主 | 2013-7-9 10:52 | 只看该作者
i55 发表于 2013-7-8 23:10
因为中断函数DRV_Tim4Irq进入的时候没有用OSIntEnter,退出的时候也没有用OSIntExit,不符合ucosii的要求。 ...

谢谢,改完后时间不会差太多但出来的高低电平变化有时240us 有时260us,但从定时中断那测试高低电平变化每次都是250us,这又是什么原因呢?

使用特权

评论回复
地板
wujun23941105|  楼主 | 2013-7-9 10:53 | 只看该作者
wujun23941105 发表于 2013-7-9 10:52
谢谢,改完后时间不会差太多但出来的高低电平变化有时240us 有时260us,但从定时中断那测试高低电平变化 ...

能不能做到250us?

使用特权

评论回复
5
i55| | 2013-7-9 11:12 | 只看该作者
wujun23941105 发表于 2013-7-9 10:52
谢谢,改完后时间不会差太多但出来的高低电平变化有时240us 有时260us,但从定时中断那测试高低电平变化 ...

这就不知道了你单步跟一下吧。

使用特权

评论回复
6
trumpxp| | 2013-7-9 18:29 | 只看该作者
单步调试调试   应该问题不是很大   楼主   顶一个

使用特权

评论回复
7
wujun23941105|  楼主 | 2013-7-9 20:22 | 只看该作者
i55 发表于 2013-7-9 11:12
这就不知道了你单步跟一下吧。

还创建了其它任务其中一个是20ms检测一次按键,如果要保证闪灯时间准确是不是要把优先级设为最高,单步执行也看不出什么问题

使用特权

评论回复
8
i55| | 2013-7-9 20:35 | 只看该作者
wujun23941105 发表于 2013-7-9 20:22
还创建了其它任务其中一个是20ms检测一次按键,如果要保证闪灯时间准确是不是要把优先级设为最高,单步执 ...

如果任务比较重要当然要优先级高了!按键任务优先级最低都可以。

使用特权

评论回复
9
wujun23941105|  楼主 | 2013-7-9 22:46 | 只看该作者
i55 发表于 2013-7-9 20:35
如果任务比较重要当然要优先级高了!按键任务优先级最低都可以。

刚查了下资料,这种情况是不是ucos存在的时间抖动问题

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

22

帖子

0

粉丝