在裸機系統中,以一定的時間間隔循環調用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任務是指通過中斷服務程序進行觸發的任務,所有任務中優先級最高
?低優先級時間調度任務:比如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觸摸按鍵的基本運行過程
-
mcu
+關注
關注
146文章
17019瀏覽量
350373 -
嵌入式
+關注
關注
5071文章
19026瀏覽量
303497 -
操作系統
+關注
關注
37文章
6747瀏覽量
123201
發布評論請先 登錄
相關推薦
評論