1. 程式人生 > >【RTX作業系統教程】第5章 RTX作業系統庫方式移植(超級簡單)

【RTX作業系統教程】第5章 RTX作業系統庫方式移植(超級簡單)

第5章      RTX作業系統庫方式移植(超級簡單)

原文來源:http://forum.armfly.com/forum.php?mod=viewthread&tid=16596&highlight=RTX%B2%D9%D7%F7%CF%B5%CD%B3%BD%CC%B3%CC         本章教程為大家將介紹RTX作業系統庫方式移植,庫方式的移植超級簡單,應該是所有RTOS裡面最簡單的了,僅需簡單的兩步就可以完成。         本章教程含Cortex-M3核心的STM32F103的移植和Cortex-M4核心的STM32F407移植。         5.1 移植前準備工作說明         5.2 STM32F103移植RTX系統         5.3 STM32F407移植RTX系統         5.4   總結5.1  移植前準備工作說明

1.     RTX系統軟體開發平臺僅支援MDK,建議使用MDK4.74,因為後面的例子都是以MDK4.74為平臺。 2.     找一個簡單的工程,最好是跑馬燈之類的,越簡單越好,我們就在這個簡單的工程上面移植即可。 3.     大家使用的簡單工程裡面不能有SysTick,PendSV和SVC三個系統中斷的使用,因為RTX系統要使用這三個中斷。

5.2   STM32F103移植RTX系統5.2.1      RTX作業系統移植     首先準備好一個簡單的裸機工程模板,工程模板的製作就不做講解了,這裡的重點是教大家移植RTX系統。準備好的工程模板如下圖5.1所示(大家也可以製作其它任意的工程模板,不限制

):

圖5.1 工程模板

    準備好工程模板後,就可以開始移植了,移植過程比較簡單,需要兩步就可以完成了: u 第1步:使能RTX

u 第2步:新增RTX系統的配置檔案,配置檔案在MDK的安裝目錄C:\\Keil_v474\\ARM\\RL\\RTX\\Config     下面,檔名RTX_Conf_CM.c,下面將這個檔案複製到MDK工程的User資料夾下面,並新增到MDK工程上

通過這兩步,RTX作業系統的移植就完成了。5.2.2     RTX作業系統配置說明    RTX作業系統的配置工作是通過配置檔案RTX_Conf_CM.c實現。在MDK工程中開啟檔案RTX_Conf_CM.c,可以看到如下圖5.2所示的工程配置嚮導:

圖5.2 RTX的配置嚮導

u  Task Configuration l Number of concurrent running tasks       引數範圍0 – 250        表示同時執行的最大任務數,這個數值一定要大於等於使用者實際建立的任務數,空閒任務不包含在這個裡面。比如當前的數值是6,就表示使用者最多可以建立6個任務。 l Number of tasks with user-provided stack       引數範圍0 – 250        表示自定義任務堆疊的任務數,如果這個引數定義為0的話,表示所有的任務都是使用的配置嚮導裡面第三個引數Task statck size大小。比如:         Numberof concurrent running tasks = 6         Numberof tasks with user-provided stack = 0       表示允許使用者建立6個任務,所有的6個任務都是分配第三個引數Task statck size大小的任務堆疊空間。         Numberof concurrent running tasks = 6         Numberof tasks with user-provided stack = 3       表示允許使用者建立6個任務,其中3個任務是使用者自定義任務堆疊大小,另外3個任務是用的第三個引數Task statck size大小的任務堆疊空間。 l Task statck size       表示系統分配的任務堆疊大小,單位位元組。 l Check for the stack overflow       選擇是否使能任務堆疊監測,選上單選框表示使能,取消單選框表示禁能。 l Run in privileged mode       選擇是否使能特權級模式,選上單選框表示使能任務工作在特權級模式,取消單選框表示任務工作在非特權級模式。特權級和非特權級在第九章有詳細講解。 u Tick Timer Configuration l Hardware timer       CoreSysTick 表示選擇系統滴答定時器,因為M3/M4核心帶有滴答定時器,一般情況下都是選用滴答定時器作為系統時鐘節拍。       PeripheralTimer 表示使用外設定時器。 l Timer clock value       表示定時器主頻,單位Hz。 l Timer tick value       表示系統時鐘節拍週期,單位us。 u System Configuration l Round-Robin Task switching       選擇是否使能時間片排程,選上單選框表示使能時間片排程,取消單選框表示不使用時間片排程。 l Round-Robin Timeout [ticks]       範圍1 – 1000。       表示時間片的大小,單位是系統時鐘節拍個數。 l Number of user timers       範圍1 – 250。       表示使用者定時器個數,即軟定時器個數。 l ISR FIFO Queue size       表示ISR FIFO佇列大小。中斷服務程式中呼叫以isr_ 開頭的函式時,會將請求型別存到此緩衝中。5.2.3     RTX作業系統應用例項       通過上面對RTX作業系統的配置講解,這裡將其修改為如下圖5.3所示的配置:

圖5.3 RTX的配置嚮導

相對預設配置,修改了上圖紅色箭頭所示的三個地方: 1.     任務執行在特權級模式。 2.     滴答定時器主頻72MHz,這個也是STM32F103的主頻。 3.     系統時鐘節拍週期1ms。 修改好配置後,在main.c檔案中新增如下程式碼,程式碼中簡單的建立了兩個使用者任務: AppTaskLED任務 :LED閃爍。 AppTaskStart任務:啟動任務,也是最高優先順序任務,這裡實現LED閃爍。

  1. #include "bsp.h"            /* 底層硬體驅動 */
  2. #include "RTL.h"
  3. /*
  4. **********************************************************************************************************
  5.                                                    函式宣告
  6. **********************************************************************************************************
  7. */
  8. static void AppTaskCreate (void);
  9. __task void AppTaskLED(void);
  10. __task void AppTaskStart(void);
  11. /*
  12. **********************************************************************************************************
  13.                                                     變數
  14. **********************************************************************************************************
  15. */
  16. static uint64_t AppTaskLEDStk[256/8];     /* 任務棧 */
  17. static uint64_t AppTaskStartStk[512/8];   /* 任務棧 */
  18. /* 任務控制代碼 */
  19. OS_TID HandleTaskLED = NULL;
  20. /*
  21. *********************************************************************************************************
  22. *    函 數 名: main
  23. *    功能說明: 標準c程式入口。
  24. *    形    參: 無
  25. *    返 回 值: 無
  26. *********************************************************************************************************
  27. */
  28. int main (void)
  29. {   
  30.      /* 初始化外設 */
  31.      bsp_Init();
  32.      /* 建立啟動任務 */
  33.      os_sys_init_user (AppTaskStart,             /* 任務函式 */
  34.                        2,                        /* 任務優先順序 */
  35.                        &AppTaskStartStk,         /* 任務棧 */
  36.                        sizeof(AppTaskStartStk)); /* 任務棧大小,單位位元組數 */
  37.      while(1);
  38. }
  39. /*
  40. *********************************************************************************************************
  41. *    函 數 名: AppTaskLED
  42. *    功能說明: LED閃爍
  43. *    形    參: 無
  44. *    返 回 值: 無
  45. *    優 先 級: 1  (數值越小優先順序越低,這個跟uCOS相反)
  46. *********************************************************************************************************
  47. */
  48. __task void AppTaskLED(void)
  49. {
  50.     while(1)
  51.     {
  52.          bsp_LedToggle(2);
  53.          bsp_LedToggle(3);
  54.          os_dly_wait(200);
  55.     }
  56. }
  57. /*
  58. *********************************************************************************************************
  59. *    函 數 名: AppTaskStart
  60. *    功能說明: 啟動任務,也就是最高優先順序任務。
  61. *    形    參: 無
  62. *    返 回 值: 無
  63. *    優 先 級: 2
  64. *********************************************************************************************************
  65. */
  66. __task void AppTaskStart(void)
  67. {
  68.      AppTaskCreate();
  69.     while(1)
  70.     {
  71.          bsp_LedToggle(1);
  72.          bsp_LedToggle(4);
  73.          os_dly_wait(500);
  74.     }
  75. }
  76. /*
  77. *********************************************************************************************************
  78. *    函 數 名: AppTaskCreate
  79. *    功能說明: 建立應用任務
  80. *    形    參: 無
  81. *    返 回 值: 無
  82. *********************************************************************************************************
  83. */
  84. static void AppTaskCreate (void)
  85. {
  86.      HandleTaskLED = os_tsk_create_user(AppTaskLED,              /* 任務函式 */
  87.                                         1,                       /* 任務優先順序 */
  88.                                         &AppTaskLEDStk,          /* 任務棧 */
  89.                                         sizeof(AppTaskLEDStk));  /* 任務棧大小,單位位元組數 */
  90. }

複製程式碼

按照第三章的3.4小節中介紹的除錯方法,可以看到如下圖5.4所示的任務執行狀態:

圖5.4 RTX的除錯資訊元件

除了建立的兩個使用者任務以外,還有空閒任務,這個任務是系統建立的。至此,RTX的庫方式移植的工程就可以運行了。

5.3  STM32F407移植RTX系統5.3.1     RTX作業系統移植      首先準備好一個簡單的裸機工程模板,工程模板的製作就不做講解了,這裡的重點是教大家移植RTX系統。準備好的工程模板如下圖5.5所示(大家也可以製作其它任意的工程模板,不限制):

圖5.5 工程模板

    準備好工程模板後,就可以開始移植了,移植過程比較簡單,需要兩步就可以完成了: u 第1步:使能RTX

u 第2步:新增RTX系統的配置檔案,配置檔案在MDK的安裝目錄C:\\Keil_v474\\ARM\\RL\\RTX\\Config     下面,檔名RTX_Conf_CM.c,下面將這個檔案複製到MDK工程的User資料夾下面,並新增到MDK工程上

通過這兩步,RTX作業系統的移植就完成了。 5.3.2     RTX作業系統配置說明     RTX作業系統的配置工作是通過配置檔案RTX_Conf_CM.c實現。在MDK工程中開啟檔案RTX_Conf_CM.c,可以看到如下圖5.6所示的工程配置嚮導:

圖5.6 RTX的配置嚮導

u  Task Configuration l Number of concurrent running tasks     引數範圍0 – 250      表示同時執行的最大任務數,這個數值一定要大於等於使用者實際建立的任務數,空閒任務不包含在這個裡面。比如當前的數值是6,就表示使用者最多可以建立6個任務。 l Number of tasks with user-provided stack     引數範圍0 – 250      表示自定義任務堆疊的任務數,如果這個引數定義為0的話,表示所有的任務都是使用的配置嚮導裡面第三個引數Task statck size大小。比如:       Numberof concurrent running tasks = 6       Numberof tasks with user-provided stack = 0     表示允許使用者建立6個任務,所有的6個任務都是分配第三個引數Task statck size大小的任務堆疊空間。       Numberof concurrent running tasks = 6       Numberof tasks with user-provided stack = 3     表示允許使用者建立6個任務,其中3個任務是使用者自定義任務堆疊大小,另外3個任務是用的第三個引數Task statck size大小的任務堆疊空間。 l Task statck size     表示系統分配的任務堆疊大小,單位位元組。 l Check for the stack overflow     選擇是否使能任務堆疊監測,選上單選框表示使能,取消單選框表示禁能。 l Run in privileged mode     選擇是否使能特權級模式,選上單選框表示使能任務工作在特權級模式,取消單選框表示任務工作在非特權級模式。特權級和非特權級在第九章有詳細講解。 u Tick Timer Configuration l Hardware timer     CoreSysTick 表示選擇系統滴答定時器,因為M3/M4核心帶有滴答定時器,一般情況下都是選用滴答定時器作為系統時鐘節拍。     PeripheralTimer 表示使用外設定時器。 l Timer clock value     表示定時器主頻,單位Hz。 l Timer tick value     表示系統時鐘節拍週期,單位us。 u System Configuration l Round-Robin Task switching     選擇是否使能時間片排程,選上單選框表示使能時間片排程,取消單選框表示不使用時間片排程。 l Round-Robin Timeout [ticks]     範圍1 – 1000。     表示時間片的大小,單位是系統時鐘節拍個數。 l Number of user timers     範圍1 – 250。     表示使用者定時器個數,即軟定時器個數。 l ISR FIFO Queue size      表示ISR FIFO佇列大小。中斷服務程式中呼叫以isr_ 開頭的函式時,會將請求型別存到此緩衝中。5.3.3     RTX作業系統應用例項      通過上面對RTX作業系統的配置講解,這裡將其修改為如下圖5.7所示配置:

圖5.7 RTX的配置嚮導

相對預設配置,修改了上圖紅色箭頭所示的三個地方: 1.     任務執行在特權級模式。 2.     滴答定時器主頻168MHz,這個也是STM32F407的主頻。 3.     系統時鐘節拍週期1ms。 修改好配置後,在main.c檔案中新增如下程式碼,程式碼中簡單的建立了兩個使用者任務: AppTaskLED任務 :LED閃爍。 AppTaskStart任務:啟動任務,也是最高優先順序任務,這裡實現LED閃爍。

  1. #include "bsp.h"            /* 底層硬體驅動 */
  2. #include "RTL.h"
  3. /*
  4. **********************************************************************************************************
  5.                                                    函式宣告
  6. **********************************************************************************************************
  7. */
  8. static void AppTaskCreate (void);
  9. __task void AppTaskLED(void);
  10. __task void AppTaskStart(void);
  11. /*
  12. **********************************************************************************************************
  13.                                                     變數
  14. **********************************************************************************************************
  15. */
  16. static uint64_t AppTaskLEDStk[256/8];     /* 任務棧 */
  17. static uint64_t AppTaskStartStk[512/8];   /* 任務棧 */
  18. /* 任務控制代碼 */
  19. OS_TID HandleTaskLED = NULL;
  20. /*
  21. *********************************************************************************************************
  22. *    函 數 名: main
  23. *    功能說明: 標準c程式入口。
  24. *    形    參: 無
  25. *    返 回 值: 無
  26. *********************************************************************************************************
  27. */
  28. int main (void)
  29. {   
  30.      /* 初始化外設 */
  31.      bsp_Init();
  32.      /* 建立啟動任務 */
  33.      os_sys_init_user (AppTaskStart,             /* 任務函式 */
  34.                        2,                        /* 任務優先順序 */
  35.                        &AppTaskStartStk,         /* 任務棧 */
  36.                        sizeof(AppTaskStartStk)); /* 任務棧大小,單位位元組數 */
  37.      while(1);
  38. }
  39. /*
  40. *********************************************************************************************************
  41. *    函 數 名: AppTaskLED
  42. *    功能說明: LED閃爍
  43. *    形    參: 無
  44. *    返 回 值: 無
  45. *    優 先 級: 1  (數值越小優先順序越低,這個跟uCOS相反)
  46. *********************************************************************************************************
  47. */
  48. __task void AppTaskLED(void)
  49. {
  50.     while(1)
  51.     {
  52.          bsp_LedToggle(2);
  53.          bsp_LedToggle(3);
  54.          os_dly_wait(200);
  55.     }
  56. }
  57. /*
  58. *********************************************************************************************************
  59. *    函 數 名: AppTaskStart
  60. *    功能說明: 啟動任務,也就是最高優先順序任務。
  61. *    形    參: 無
  62. *    返 回 值: 無
  63. *    優 先 級: 2
  64. *********************************************************************************************************
  65. */
  66. __task void AppTaskStart(void)
  67. {
  68.      AppTaskCreate();
  69.     while(1)
  70.     {
  71.          bsp_LedToggle(1);
  72.          bsp_LedToggle(4);
  73.          os_dly_wait(500);
  74.     }
  75. }
  76. /*
  77. *********************************************************************************************************
  78. *    函 數 名: AppTaskCreate
  79. *    功能說明: 建立應用任務
  80. *    形    參: 無
  81. *    返 回 值: 無
  82. *********************************************************************************************************
  83. */
  84. static void AppTaskCreate (void)
  85. {
  86.      HandleTaskLED = os_tsk_create_user(AppTaskLED,              /* 任務函式 */
  87.                                         1,                       /* 任務優先順序 */
  88.                                         &AppTaskLEDStk,          /* 任務棧 */
  89.                                         sizeof(AppTaskLEDStk));  /* 任務棧大小,單位位元組數 */
  90. }

複製程式碼

按照第三章的3.4小節中介紹的除錯方法,可以看到如下圖5.8所示的任務執行狀態:

圖5.8 RTX的除錯資訊元件

除了建立的兩個使用者任務以外,還有空閒任務,這個任務是系統建立的。至此,RTX的庫方式移植的工程就可以運行了。

5.4  總結  

    本章節為大家講解了庫移植方法,移植比較簡單。另一個重要內容是系統配置嚮導檔案的說明,這個比較重要,初學者要好好熟悉下。