你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

RTX时间管理函数os_dly_wait()延迟时间不对~

[复制链接]
Tobey_YF 提问时间:2016-8-15 12:00 /
  需要移植一个裸奔AD程序到RTX上,结果发现延迟总是出问题,,于是仅创建了一个任务进行测试~  
  发现延迟完全超出预计了~~
  我是在stm32f103上实现的,看了RTX的手册仍然没找到问题出在哪~  恳请大神给小弟指点指点!!

  RTX配置文件设置:
      Timer clock value[Hz]: 72000000
      Timer tick value [us]:   1000

   这样每个时钟节拍应该是1ms,那么os_dly_wait(16)不是应该延迟16ms吗?,,,
   最初发现时间不对,以为是调试窗口显示有问题,使用LED灯进行测试,设置延迟500ms,
   结果等了半天才闪一次~~然后就知道真的出问题了~~

   可是测试结果是这样的~  


延迟前后时间对比:
   dly_wait_1.png
dly_wait_2.png

任务运行视图:
dly_wait_3.png
收藏 评论9 发布时间:2016-8-15 12:00

举报

9个回答
moyanming2013 回答时间:2016-8-15 13:33:15
时间多了10倍,你看下时钟具体多少?另外有几个线程?
Tobey_YF 回答时间:2016-8-15 13:46:42
moyanming2013 发表于 2016-8-15 13:33
时间多了10倍,你看下时钟具体多少?另外有几个线程?

是的,多了10倍,,时钟我在上面给了啊?不是这个时钟设置吗? 72MHz, 滴答设置为1ms, 就开了一个任务进行测试,,
moyanming2013 回答时间:2016-8-15 15:00:45
Tobey_YF 发表于 2016-8-15 13:46
是的,多了10倍,,时钟我在上面给了啊?不是这个时钟设置吗? 72MHz, 滴答设置为1ms, 就开了一个任务 ...

还是没配置正确,你看下这里:
http://blog.csdn.net/ropai/article/details/19970839
另外建议使用CMSIS-RTOS里面的API。
Tobey_YF 回答时间:2016-8-15 16:30:17
moyanming2013 发表于 2016-8-15 15:00
还是没配置正确,你看下这里:
http://blog.csdn.net/ropai/article/details/19970839
另外建议使用CMSIS ...

好的,谢谢! 不过出问题后我就找了类似的资料修改了~  并没有用,,, 刚刚重新编译了一遍(rebulid),延迟突然就正确了,,还是没明白是哪的问题~   
还有,再请教你一个问题:我在RTX的新开了一个任务,调用了HAL_TIM_Base_Start_IT(&htim1);启用stm32的定时器TIM1,结果程序就不稳定了,,,是不是不能直接在任务中使用HAL_TIM_Base_Start_IT(&htim1)?
moyanming2013 回答时间:2016-8-15 20:44:24
Tobey_YF 发表于 2016-8-15 16:30
好的,谢谢! 不过出问题后我就找了类似的资料修改了~  并没有用,,, 刚刚重新编译了一遍(rebulid), ...

少许误差还是正常的,但具体到HAL_TIM_Base_Start_IT我就不清楚了。
Tobey_YF 回答时间:2016-8-16 07:33:05
moyanming2013 发表于 2016-8-15 20:44
少许误差还是正常的,但具体到HAL_TIM_Base_Start_IT我就不清楚了。

好的,我自己再研究研究吧~  多谢了
回答时间:2016-8-16 09:36:39
楼主,如果在不开TIM1的情况下,延时正确,说明tim1的中断处理延时太长,看一下这个中断中处理是否增加了延时,导致滴答时钟中断被打断时间太长导致。
Tobey_YF 回答时间:2016-8-16 13:27:15
安 发表于 2016-8-16 09:36
楼主,如果在不开TIM1的情况下,延时正确,说明tim1的中断处理延时太长,看一下这个中断中处理是否增加了延 ...

听了你的建议,在调试窗口设置断点查看了一遍:时钟配置:
    1、RTX滴答中断设置为1ms
    2、TIM1设置为向上溢出中断,时间间隔为1ms以下为测试结果:
    3、中断程序执行时间0.0046us
    4、两次进入中断的时间间隔大致为1ms


从上面的数据上我看不出问题来,, 中断程序的执行时间在滴答中断周期之内,,

从裸奔程序移植到RTX后出问题的一直都是AD模块,,,在裸奔情况下延迟时间放大几倍都能正常运行~~
在RTX中却不管延迟时间长短频频出错(一会儿对一会错),

AD模块通过ADS1248芯片实现,芯片的校准及获取AD数据等待RDRY为低电平的方式实现;
裸奔情况下采用嵌套for循环(总共循环500次),AD实现正常,其后测试将延迟修改为1ms,2ms,3ms等,
均运行正常;在RTX中为了将等待时间用于其它任务使用,延迟采用os_dly_wait(1)的方式实现。(1ms)


刚刚将先前运行正常的裸机AD程序与RTX项目中的配置进行比较:
   两者的区别在于:
        裸机时使用的时钟源是HSI,而现在使用8M外部高速晶振HSE,这造成了时钟配置发生了改变
        SYSCLK, HCLK,AHB,Cortex System timer,FCLK,APB1外设时钟,APB1计时器时钟,APB2外设时钟,APB2计时器时钟
        裸机时:APB1外设时钟及APB2外设时钟为18MHz,其余均为36MHz
        RTX中:APB1外设时钟及APB2外设时钟为36MHz,其余均为72MHz(即增大了一倍)


于是在裸机程序中对时钟配置进行了修改,发现修改后AD数据也不对了~~
经过逐一排查,发现问题出自于APB1的时钟配置上,在RTX中将APB1的时钟配置缩小一倍后再次进行调试,这回没问题了,
然而程序中使用到APB1时钟的当前只有SPI2,,,这下又来了个新问题~  SPI时钟为什么会对AD数值产生影响呢?
是因为ADS1248上的串口时钟与其不匹配?可是串口时钟接的是GPIO引脚,时钟为APB2时钟,此时双方频率都增大了一倍了啊~
而SPI2的预分配我已经设置为最大了~,只能通过修改APB1的时钟频率进行修改,,,
看来得重新研究研究文档了~~~


评分

参与人数 1ST金币 +5 收起 理由
zero99 + 5 神马都是浮云

查看全部评分

sxhbbde 回答时间:2016-8-17 09:22:07
楼上moyanming2013说的RTX_CONFIG.C这个文件,也遇到过,用的文件和MDK的版本不对,造成延时相差非常大,改成对应MDK下的RTX_CONFIG.C就可以了

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
微信公众号二维码 微信公众号
手机版二维码 手机版