2023年12月7日发(作者:)

【RTX操作系统教程】第5章RTX操作系统库方式移植(超级

简单)

第5章 RTX操作系统库方式移植(超级简单)

5.2 STM32F103移植RTX系统

5.2.1 RTX操作系统移植

首先准备好一个简单的裸机工程模板,工程模板的制作就不做讲解了,这里的重点是教大家移植RTX系统。准备好的工程模板如下图5.1

所示(大家也可以制作其它任意的工程模板,不限制):

图5.1 工程模板 准备好工程模板后,就可以开始移植了,移植过程比较简单,需要两步就可以完成了:

u 第1步:使能RTX

u 第2步:添加RTX系统的配置文件,配置文件在MDK的安装目录C:Keil_v474ARMRLRTXConfig

下面,文件名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. /* 创建启动任务 */

34. os_sys_init_user (AppTaskStart, /* 任务函数 */

35. 2, /* 任务优先级 */

36. &AppTaskStartStk, /* 任务栈 */

37. sizeof(AppTaskStartStk)); /* 任务栈大小,单位字节数 */

38. while(1);

39. }

40. /*

41. *********************************************************************************************************

42. * 函 数 名: AppTaskLED

43. * 功能说明: LED闪烁

44. * 形 参: 无

45. * 返 回 值: 无

46. * 优 先 级: 1 (数值越小优先级越低,这个跟uCOS相反)

47. *********************************************************************************************************

48. */

49. __task void AppTaskLED(void)

50. {

51. while(1)

52. {

53. bsp_LedToggle(2);

54. bsp_LedToggle(3);

55. os_dly_wait(200);

56. }

57. }

58. /*59. *********************************************************************************************************

60. * 函 数 名: AppTaskStart

61. * 功能说明: 启动任务,也就是最高优先级任务。

62. * 形 参: 无

63. * 返 回 值: 无

64. * 优 先 级: 2

65. *********************************************************************************************************

66. */

67. __task void AppTaskStart(void)

68. {

69. AppTaskCreate();

70.

71. while(1)

72. {

73. bsp_LedToggle(1);

74. bsp_LedToggle(4);

75. os_dly_wait(500);

76. }

77. }

78. /*

79. *********************************************************************************************************

80. * 函 数 名: AppTaskCreate

81. * 功能说明: 创建应用任务

82. * 形 参: 无

83. * 返 回 值: 无

84. *********************************************************************************************************

85. */

86. static void AppTaskCreate (void)

87. {

88. HandleTaskLED = os_tsk_create_user(AppTaskLED, /* 任务函数 */

89. 1, /* 任务优先级 */

90. &AppTaskLEDStk, /* 任务栈 */

91. sizeof(AppTaskLEDStk)); /* 任务栈大小,单位字节数 */

92. }

复制代码

按照第三章的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_v474ARMRLRTXConfig

下面,文件名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. /* 创建启动任务 */

34. os_sys_init_user (AppTaskStart, /* 任务函数 */

35. 2, /* 任务优先级 */

36. &AppTaskStartStk, /* 任务栈 */

37. sizeof(AppTaskStartStk)); /* 任务栈大小,单位字节数 */

38. while(1);

39. }

40. /*

41. *********************************************************************************************************

42. * 函 数 名: AppTaskLED

43. * 功能说明: LED闪烁

44. * 形 参: 无

45. * 返 回 值: 无

46. * 优 先 级: 1 (数值越小优先级越低,这个跟uCOS相反)

47. *********************************************************************************************************

48. */

49. __task void AppTaskLED(void)

50. {

51. while(1)

52. {

53. bsp_LedToggle(2);

54. bsp_LedToggle(3);

55. os_dly_wait(200);

56. }

57. }

58. /*

59. *********************************************************************************************************

60. * 函 数 名: AppTaskStart61. * 功能说明: 启动任务,也就是最高优先级任务。

62. * 形 参: 无

63. * 返 回 值: 无

64. * 优 先 级: 2

65. *********************************************************************************************************

66. */

67. __task void AppTaskStart(void)

68. {

69. AppTaskCreate();

70.

71. while(1)

72. {

73. bsp_LedToggle(1);

74. bsp_LedToggle(4);

75. os_dly_wait(500);

76. }

77. }

78. /*

79. *********************************************************************************************************

80. * 函 数 名: AppTaskCreate

81. * 功能说明: 创建应用任务

82. * 形 参: 无

83. * 返 回 值: 无

84. *********************************************************************************************************

85. */

86. static void AppTaskCreate (void)

87. {

88. HandleTaskLED = os_tsk_create_user(AppTaskLED, /* 任务函数 */

89. 1, /* 任务优先级 */

90. &AppTaskLEDStk, /* 任务栈 */

91. sizeof(AppTaskLEDStk)); /* 任务栈大小,单位字节数 */

92. }

复制代码

按照第三章的3.4小节中介绍的调试方法,可以看到如下图5.8所示的任务执行状态:

图5.8 RTX的调试信息组件

除了创建的两个用户任务以外,还有空闲任务,这个任务是系统创建的。至此,RTX的库方式移植的工程就可以运行了。

5.4 总结

本章节为大家讲解了库移植方法,移植比较简单。另一个重要内容是系统配置向导文件的说明,这个比较重要,初学者要好好熟悉下。