最近忙一个项目,EntherCAT移植,驱动伺服控制器,这玩意对时间要求十分苛刻。尝试许多方法,用PIT或者GPT的中断都不行,通过debug仿真来看没什么问题,但电机就是抖,只能理解为定时器中断不够准,因为在while里面电机是一点都不抖的,滴答定时器最稳,无奈只能把滴答定时器换出来。
- 使用NXP的RT1062开发板,更改FreeRTOS默认的滴答定时器时基,使用其他平台过程应该也一样。
- 先替换掉滴答定时器初始化,初始化在port.c文件中为弱定义。在任务调度器开始时被调用。
可以看到这个vPortSetupTimerInterrupt(void)函数是个弱定义,直接在其他函数重新定义就行。这里我直接在main上面重写一个。其他地方什么都不用做。
- FreertosConfig.h文件最后一行中重新定义中断向量,改为你更改的定时器的中断服务函数,这里我改为了GPT的中断向量。
- 最后简单更改一下void xPortSysTickHandler( void )函数,因为滴答定时器不需要清中断标志,也无需防止中断嵌套等等,新的定时器可能需要清标志,否则无法正常切换任务。
- 注意事项:时基频率,一般configTICK_RATE_HZ为1000,也就是对应定时器一毫秒中断一次
中断优先级,如果滴答定时器运行比较重要的任务,需要保证滴答定时器优先级高于RTOS时基中断优先级。 - 这就完事了,测试后每个任务都正常。