13-1 定時器的理論介紹
- Tick中斷呼叫timer函式的回撥函式--Linux
- 在某個任務中執行--RTOS
- 把任務寫入佇列通知守護任務,佇列要是滿了需要等待
- 定時器的超時函式在守護任務中執行
13-2 定時器的一般使用
- 啟動定時器實際上是把任務發給佇列
- 守護任務的優先順序更高會切換到守護任務,看串列埠列印被打斷可知
- 任務的優先順序其實不能取到最大值
- 定時器函式的優先順序過低會被搶佔
13-3 使用定時器消除抖動
- 給中斷增加延時處理,如果不滿足延時時間,就不會判定為按鍵按下
14 中斷管理
- 更正,不能在中斷裡使用xTimerReset()
- 帶FromISR的函式他不會發起排程,會喚醒任務但不會引起排程,會在變數
BaseType_t self_HigherPriorityTaskWoken
裡邊記住是否需要排程 portYIELD_FROM_ISR()
觸發排程,但是不是即刻引起排程
15_資源管理
- 可以透過函式去遮蔽別的中斷或者任務
- 任務和任務之間可以遮蔽任務排程器
- 優先順序最高的三個中斷不可以遮蔽
- 八位暫存器管理中斷優先順序
- 使能和恢復是不同的
- 使能:是開啟
- 恢復:原本什麼樣變成什麼樣,開啟變開啟,禁止變禁止
16-1_除錯
- 判斷棧溢位方法
- 使用TCB結構體的棧標記判斷並不準確,要切換任務才會把實際的棧位置存入結構體,因此這個只是一種判斷棧溢位的方法,但是高效
- 方法2:最後16個位元組不是0xA5就認為棧溢位,更準確
16-2_統計任務資訊的原理
-
棧的使用情況
- 水位越大表明空閒的棧太大了,說明分配的棧太大了
- count會記錄0xA5的位元組數
- 一般保證每個水位有幾十位元組就可以了
-
每個任務的CPU執行時間
-
主要問題是時間記錄的準不準?
-
Tick中斷是1ms一次,會導致記錄不準
-
引入更快的時間週期/定時器
- 時間記錄要一個任務執行count和總的時間timer
-
任務進入和離開都會記錄一個總的任務執行的時間
-
uxTaskGetSystemState:獲得任務的統計資訊
UBaseType_t uxTaskGetSystemState( TaskStatus_t * const pxTaskStatusArray, const UBaseType_t uxArraySize, uint32_t * const pulTotalRunTime );
引數 描述 pxTaskStatusArray 指向一個TaskStatus_t結構體陣列,用來儲存任務的統計資訊。
有多少個任務?可以用uxTaskGetNumberOfTasks()
來獲得。uxArraySize 陣列大小、陣列項個數,必須大於或等於 uxTaskGetNumberOfTasks()
pulTotalRunTime 用來儲存當前總的執行時間(更快的定時器),可以傳入NULL 返回值 傳入的pxTaskStatusArray陣列,被設定了幾個陣列項。
注意:如果傳入的uxArraySize小於uxTaskGetNumberOfTasks()
,返回值就是0 -
vTaskList :獲得任務的統計資訊,形式為可讀的字串。注意,pcWriteBuffer必須足夠大。
void vTaskList( signed char *pcWriteBuffer );
-
vTaskGetRunTimeStats:獲得任務的執行資訊,形式為可讀的字串。注意,pcWriteBuffer必須足夠大
void vTaskGetRunTimeStats( signed char *pcWriteBuffer )
-
16-3_編寫程式獲取統計資訊
- 多看需要