在裸机系统中,以一定的时间间隔循环调用CTSU APIs
在QE for Cap Touch工具生成的Cap Touch Sample Code中
• 使用While(true)实现循环调用CTSU APIs
• 使用R_BSP_SoftwareDelay()实现适当的定时间隔
在嵌入式多任务系统中,也需要以一定的时间间隔循环运行CTSU APIs
• CTSU运行涉及的相关ISR以及API可直接移植到多任务系统中
• 需要对QE for Cap Touch工具生成的CapTouch Sample Codee进行改写
CTSU底层驱动程序和应用程序在向RTOS系统中移植时,一般需要考虑的基本内容
• RTOS中Systick的设定
• RTOS延时函数的使用
• MCU中断优先级与RTOS任务优先级的设置
• QE for Cap Touch工具生成的CTSU CapTouch Sample Code的改写
Systick的设定
以FreeRTOS为例,使用e2 studio新建的FreeRTOS工程中, Systick的默认设定为1ms
RTOS延时函数的使用
以FreeRTOS为例,FreeRTOS延时函数vTaskDelay()和vTaskDelayUntil()
• FreeRTOS提供了两个系统延时函数:相对延时函数vTaskDelay()和绝对延时vTaskDelayUntil()。
• 这两个延时函数和自己实现的延时函数不同,这两个延时函数一旦被调用,当前任务会立刻进入阻塞状态,而自己写的延时函数(以for循环等形式实现的软件延时)会被当做有效任务而一直执行。
• 相对延时是指每次延时都是从任务执行函数vTaskDelay()开始,延时指定的时间结束;
vTaskDelay()函数的参数xTicksToDelay表示延时多少个系统节拍时钟周期(Systick)。
void vTaskDelay( const TickType_t xTicksToDelay )
• 绝对延时是指每隔指定的时间,执行一次调用vTaskDelayUntil()函数的任务。换句话说:任务以固定的频率执行
MCU中断优先级与RTOS任务优先级的设置
以FreeRTOS任务优先级为例说明
FreeRTOS中任务的最高优先级是通过FreeRTOSConfig.h文件中的configMAX_PRIORITIES进行配置的,用户实际可以使用的优先级范围是0到configMAX_PRIORITIES – 1,建议用户配置宏定义configMAX_PRIORITIES的最大值不要超过32。根据实际应用配置,配置越大,需要的内存空间越大
使用e2 studio新建的FreeRTOS工程中, configMAX_PRIORITIES默认为5
MCU中断优先级和FreeRTOS任务优先级区别
简单地说,这两者之间没有任何关系,不管中断的优先级是多少, MCU中断的优先级永远高于任何FreeRTOS任务的优先级,即在执行的过程中, MCU中断来了就开始执行中断服务程序。
MCU中断优先级数值越小,优先级就越高;而FreeRTOS的任务优先级是,任务优先级数值越小,任务优先级越低。
MCU中断优先级与RTOS任务优先级
通常的优先级分配方案:
• IRQ任务:IRQ任务是指通过中断服务程序进行触发的任务,所有任务中优先级最高
• 高优先级后台任务:比如按键检测、触摸检测、USB消息处理
• 低优先级时间调度任务:比如LCD界面显示、LED数码管显示
IRQ任务和高优先级任务必须设置为阻塞式(调用消息等待或者延迟等函数),只有这样高优先级任务才会 释放CPU的使用权,从而低优先级任务才会有机会得到执行。
CTSU CapTouch触摸按键任务建议配置成高优先级任务,并且设置成阻塞式。
CTSU CapTouch Sample Code的改写
默认的CTSU CapTouch Sample Code
• QE for Cap Touch工具可生成默认的CapTouch Sample Code
• Sample Code中使用While(1)死循环等待测量完成,以及使用R_BSP_SoftwareDelay()实现CTSU APIs的20ms左右定时间隔的循环调用
• CapTouch触摸按键对于实时性的要求并不高,但是涉及CTSU运行的很多参数都与循环调用的定时间隔有关,因此较大程度决定了触摸按键的灵敏度
例如Drift Correction Interval
下图中的设定值为255,实际值为255 x API定时调用间隔,按键按下的positive noise filter和按键释放的Negative Noise Filter也是如此。
因此,用户需要根据系统对Cap Touch触摸按键的实时性和灵敏度的要求,合理的改写默认的CTSU CapTouch Sample Code
对默认的CTSU CapTouch Sample Code进行改写
以FreeRTOS为例
• 合理设定Cap Touch Thread的优先级,例如设定为最高优先级
• API调用报错时的改写
while(ture){} 改为 return
• 延时R_BSP_SoftwareDelay() 的改写
可改为vTaskDelay()
• Qe_touch_main()以及CTSU_FN_ISR测量完成中断Callback函数的改写
增加OS Timer和Semaphore,定时启动CTSU的测量,释放while(1)等待测量完成中断时的CPU时间,此时可取消while(0 == g_qe_touch_flag)和R_BSP_SoftwareDelay() / vTaskDelay()
目的:分析整个系统中CapTouch线程与用户线程的运行关系
根据触摸按键的数量:
• 确保CapTouch线程以合适的时间间隔循环运行
• 确保CapTouch线程的按键处理阶段,不被其他用户线程抢占
• 确保CapTouch线程的触摸按键测量阶段,其他用户线程可以运行
一些RTOS支持的分析工具
FreeRTOS:SEGGER Systemviewer
Azure ThreadX:TraceX
RT-Thread:SEGGER Systemviewer
SEGGER SystemViewer应用示例
CapTouch触摸按键的基本运行过程
全部0条评论
快来发表一下你的评论吧 !