tft每日頭條

 > 科技

 > freertos 系統架構

freertos 系統架構

科技 更新时间:2025-02-23 22:42:13

  十年工作經驗,主持設計多個爆款智能硬件,老司機帶你飛,快上車,麻煩點個關注。 freertos 系統架構(手把手教你學嵌入式操作系統FreeRTOS)(1)

  今天狗哥開始正式跟大家一起學習FreeRTOS這一實時操作系統,這節課我們學習FreeRTOS最基本的任務控制。

  任務概述 FreeRTOS中資源的分配是以任務為依托的,每個任務占用獨立的任務棧空間,獨占一部分資源,在CPU的調度下獨立運行,你可以想象是一個旅館,有好多獨立的空房間,房間裡面有電視、床、水、沙發等資源,可以多個人入住不同的房間,互不影響。

  我們編寫軟件的時候是以任務為基本模塊單元的,這會極大的方便我們抽象任務,提高開發效率。舉個栗子,我們接到任務,要開發一個數據采集器,通過串口接收和發送命令,采集ADC數據。

  那麼很自然的我們就想到,把需求抽象為兩大任務:串口任務和ADC任務。下面我們來看看如何創建任務。

  創建任務 freertos 系統架構(手把手教你學嵌入式操作系統FreeRTOS)(2)

  //定義串口任務優先級、任務棧空間

  osThreadDef(UART_TASK, uart_task, osPriorityNormal, 0,configMINIMAL_STACK_SIZE);

  //創建串口任務

  Uart_ThreadHandle = osThreadCreate(osThread(UART_TASK), NULL);

  這兩條語句就可以創建一個任務,是不是很簡單,我們來分析下各個參數

  osThreadDef函數用來定義任務所需要的名稱,任務優先級,棧空間等信息。

  1、任務名稱:自己定義,這裡我們定義為UART_TASK

  2、任務函數:這裡我們定義為uart_task

  3、任務優先級:這裡我們定義為normal的等級

  4、線程實例個數:這個暫時用不到,置0

  5、任務棧大小:我們按默認最小值

  osThreadCreate這個函數用來創建線程空間,讓我們的任務運行,這個函數隻有兩個參數

  1、定義的線程:我們上一個函數裡定義的線程,也就是UART_TASK

  2、線程參數:暫時用不到,NULL

  好了,這兩個函數寫好後,标識我們任務運行的線程空間已經構建好了,相當于房間開好了,接下來,就要寫我們具體的任務了。

  一個典型的任務框架是這樣的

  void uart_task(void const *arg)

  {

  for(;;)

  {

  //TODO:

  printf("uart task running\n");

  }

  }

  這裡的uart_task就是我們剛才定義線程空間時傳入的參數,也就是說這個線程空間是uart_task這個任務所獨占的。需要注意的是任務函數是永不返回的,任務之間的切換是由調度器來控制的。

  啟動調度器

  osKernelStart();

  這個函數用來啟動調度器,調度器開啟後,整個系統就由調度器接手了,她來決定讓哪一個任務來運行,後面我們都會詳細講到。

  總結 要啟動一個任務,首先要定義線程空間,然後要定義任務函數,寫自己的業務邏輯,啟動調度器,大功告成。

  這個過程就像去住賓館,先要确定好自己住大床房還是标間,也就是定義線程空間;之後就要定義任務函數,也就是想好到房間裡是洗澡還是看電視,寫自己的業務邏輯;最後一步就是啟動調度器,到前台取房卡。

  今天的作業:大家創建一個自己的任務并運行起來。

  今天的課不知道狗哥講明白了沒有,有什麼建議大家盡管在評論區提出來,狗哥不斷改進。還有一點就是希望大家踴躍發言,下節課是繼續往下講還是希望繼續深入分析任務創建。沒啥講課經驗,盡可能的把自己的意思表達出來,有不足的地方還希望大家海涵,謝謝各位!

  ,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关科技资讯推荐

热门科技资讯推荐

网友关注

Copyright 2023-2025 - www.tftnews.com All Rights Reserved