需要移植一个裸奔AD程序到RTX上,结果发现延迟总是出问题,,于是仅创建了一个任务进行测试~
发现延迟完全超出预计了~~
我是在
STM32f103上实现的,看了RTX的手册仍然没找到问题出在哪~ 恳请大神给小弟指点指点!!
RTX配置文件设置:
timer clock value[Hz]: 72000000
Timer tick value [us]: 1000
这样每个时钟节拍应该是1ms,那么os_dly_wait(16)不是应该延迟16ms吗?,,,
最初发现时间不对,以为是调试窗口显示有问题,使用LED灯进行测试,设置延迟500ms,
结果等了半天才闪一次~~然后就知道真的出问题了~~
可是测试结果是这样的~
延迟前后时间对比:
任务运行视图:
听了你的建议,在调试窗口设置断点查看了一遍:时钟配置:
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的时钟频率进行修改,,,
看来得重新研究研究文档了~~~
一周热门 更多>