FreeRTOS學習隨記-4

明图發表於2024-12-09

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_編寫程式獲取統計資訊

  • 多看需要

相關文章