图6.2 RTX配置向导
1. Task Configuration
1. Number of concurrent running tasks
参数范围0 – 250
表示同时运行的最大任务数,这个数值一定要大于等于用户实际创建的任务数,空闲任务不包含在这个里面。比如当前的数值是6,就表示用户最多可以创建6个任务。
2. 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大小的任务堆栈空间。
3. Task statck size
表示系统分配的任务堆栈大小,单位字节。
4. Check for the stack overflow
选择是否使能任务堆栈监测,选上单选框表示使能,取消单选框表示禁能。
5. Run in privileged mode
选择是否使能特权级模式,选上单选框表示使能任务工作在特权级模式,取消单选框表示任务工作在非特权级模式。特权级和非特权级在第九章有详细讲解。
2. Tick Timer Configuration
1. Hardware timer
CoreSysTick 表示选择系统滴答定时器,因为M3/M4内核带有滴答定时器,一般情况下都是选用滴答定时器作为系统时钟节拍。
PeripheralTimer 表示使用外设定时器。
2. Timer clock value
表示定时器主频,单位Hz。
3. Timer tick value
表示系统时钟节拍周期,单位us。
3. System Configuration
1. Round-Robin Task switching
选择是否使能时间片调度,选上单选框表示使能时间片调度,取消单选框表示不使用时间片调度。
2. Round-Robin Timeout [ticks]
范围1 – 1000。
表示时间片的大小,单位是系统时钟节拍个数。
3. Number of user timers
范围1 – 250。
表示用户定时器个数,即软定时器个数。
4. ISR FIFO Queue size
表示ISR FIFO队列大小。中断服务程序中调用以isr_ 开头的函数时,会将请求类型存到此缓冲中。
6.2.3 RTX操作系统应用实例 通过上面对RTX操作系统的配置讲解,这里将其修改为如下图6.3所示配置:
图6.3 RTX配置向导
相对默认配置,修改了上图红色箭头所示的三个地方:
1. 任务运行在特权级模式。
2. 滴答定时器主频72MHz,这个也是STM32F103的主频。
3. 系统时钟节拍周期1ms。
修改好配置后,在main.c文件中添加如下代码,代码中简单的创建了两个用户任务:
AppTaskLED任务 :LED闪烁。
AppTaskStart任务:启动任务,也是最高优先级任务,这里实现LED闪烁。
- #include "includes.h" /* 底层硬件驱动 */
-
- /*
- **********************************************************************************************************
- 函数声明
- **********************************************************************************************************
- */
- static void AppTaskCreate (void);
- __task void AppTaskLED(void);
- __task void AppTaskStart(void);
-
- /*
- **********************************************************************************************************
- 变量
- **********************************************************************************************************
- */
- static uint64_t AppTaskLEDStk[256/8]; /* 任务栈 */
- static uint64_t AppTaskStartStk[512/8]; /* 任务栈 */
-
- /* 任务句柄 */
- OS_TID HandleTaskLED = NULL;
-
- /*
- *********************************************************************************************************
- * 函 数 名: main
- * 功能说明: 标准c程序入口。
- * 形 参: 无
- * 返 回 值: 无
- *********************************************************************************************************
- */
- int main (void)
- {
- /* 初始化外设 */
- bsp_Init();
-
- /* 创建启动任务 */
- os_sys_init_user (AppTaskStart, /* 任务函数 */
- 2, /* 任务优先级 */
- &AppTaskStartStk, /* 任务栈 */
- sizeof(AppTaskStartStk)); /* 任务栈大小,单位字节数 */
- while(1);
- }
-
- /*
- *********************************************************************************************************
- * 函 数 名: AppTaskLED
- * 功能说明: LED闪烁
- * 形 参: 无
- * 返 回 值: 无
- * 优 先 级: 1 (数值越小优先级越低,这个跟uCOS相反)
- *********************************************************************************************************
- */
- __task void AppTaskLED(void)
- {
- while(1)
- {
- bsp_LedToggle(2);
- bsp_LedToggle(3);
- os_dly_wait(200);
- }
- }
-
- /*
- *********************************************************************************************************
- * 函 数 名: AppTaskStart
- * 功能说明: 启动任务,也就是最高优先级任务。
- * 形 参: 无
- * 返 回 值: 无
- * 优 先 级: 2
- *********************************************************************************************************
- */
- __task void AppTaskStart(void)
- {
- AppTaskCreate();
-
- while(1)
- {
- bsp_LedToggle(1);
- bsp_LedToggle(4);
- os_dly_wait(500);
- }
- }
-
- /*
- *********************************************************************************************************
- * 函 数 名: AppTaskCreate
- * 功能说明: 创建应用任务
- * 形 参: 无
- * 返 回 值: 无
- *********************************************************************************************************
- */
- static void AppTaskCreate (void)
- {
- HandleTaskLED = os_tsk_create_user(AppTaskLED, /* 任务函数 */
- 1, /* 任务优先级 */
- &AppTaskLEDStk, /* 任务栈 */
- sizeof(AppTaskLEDStk)); /* 任务栈大小,单位字节数 */
- }
复制代码
按照第三章的3.4小节中介绍的调试方法,可以看到如下图6.4所示任务执行状态:
图6.4 RTX的调试信息组件
除了创建的两个用户任务以外,还有空闲任务,这个任务是系统创建的。至此,RTX的库方式移植的工程就可以运行了。