从keil4到keil5,keil的功能越来越强大。特别是keil5之后,出现了RTE配置环境,实时操作系统原理基本都一样。但是RTX有它独特之处,就是它中断延时对M3/M4内核可以实现零等待,带有免版税,确定性的RTOS。话不多说,咱们开始创建RTX工程。前提是你得安装了keil5,我的是5.22版本。
首先需要找一个模板工程文件 ,打开工程文件 然后添加RTT RTOS
如图所示 添加CMSIS 下的CORE RTOS(API) Keil RTX
添加完RTOS相关组件后的工程 如下图所示
但是此时编译会出现三个错误 重复定义
分别三个中断错误
SVC_Handler() PendSV_Handler() SysTick_Handler()三个函数为了避免函数名被重复定义,这三个函数必须注释掉,要不RTX就没法运行;
接着,必须在RTX_Config.c文件中做出必要的 修改来设置RTX内核以适应应用程序的需要。
如RTX实验_任务创建和删除的工程中,配置宏定义如下(仅做参考):
#define OS_TASKCNT 4 // 指定同时处于活跃状态任务的最大数目
#define OS_PRIVCNT 4 // 指定带有用户提供栈的任务数目
#define OS_STKSIZE 256 // 指定为每个任务分配堆栈的大小
#define OS_STKCHECK 1 // 开启或禁止堆栈检查
#define OS_RUNPRIV 1 // 开启或禁止特权模式——(默认无,在\Keil\ARM\Startup\RTX_Conf_CM.c)
#define OS_TIMER 0 // 指定CPU时钟作为实时系统的基本时钟
#define OS_CLOCK 72000000 // 为选中的时钟指定输入时钟频率:72MHz
#define OS_TICK 10000 // 指定定时器节拍间隔:10ms
#define OS_ROBIN 1 // 开启或禁止多任务轮转调度
#define OS_ROBINTOUT 5 // 多任务轮转中分配给当前任务的时间片
#define OS_TIMERCNT 0 // 指定用户定时器的数目
#define OS_FIFOSZ 16 // 中断服务先进先出队列:16条队列——(默认无,在\Keil\ARM\Startup\RTX_Conf_CM.c)
#define OS_MUTEXCNT 8 // 系统标准库互斥量数量——(默认无,在\Keil\ARM\Startup\RTX_Conf_CM.c)
void os_idle_demon (void) __task {
for (;;) {
}
}
// 标识IDLE 指令是否在空闲任务中运行,默认设置是OFF,禁止CPU进入空闲任务。可以在这儿添加代码,当没有任务就绪时就可以执行这段代码。
Task Configuration
Number of concurrent running tasks
参数范围 0 – 250
表示同时运行的最大任务数,这个数值一定要大于等于用户实际创建的任务数,空闲任务不包含
在这个里面。比如当前的数值是 6,就表示用户最多可以创建 6 个任务。
Number of tasks with user-provided stack
参数范围 0 – 250
表示自定义任务堆栈的任务数,如果这个参数定义为 0 的话,表示所有的任务都是使用的配置向
导里面第三个参数 Task statck size 大小。比如:
Number of concurrent running tasks = 6
Number of tasks with user-provided stack = 0
表示允许用户创建 6 个任务,所有的 6 个任务都是分配第三个参数 Task statck size 大小的任务
堆栈空间。
Number of concurrent running tasks = 6
Number of tasks with user-provided stack = 3
表示允许用户创建 6 个任务,其中 3 个任务是用户自定义任务堆栈大小,另外 3 个任务是用的第
三个参数 Task statck size 大小的任务堆栈空间。
Task statck size
表示系统分配的任务堆栈大小,单位字节。
Check for the stack overflow
选择是否使能任务堆栈监测,选上单选框表示使能,取消单选框表示禁能。
Run in privileged mode
选择是否使能特权级模式,选上单选框表示使能任务工作在特权级模式,取消单选框表示任务工
作在非特权级模式。特权级和非特权级在第九章有详细讲解。
Tick Timer Configuration
Hardware timer
Core SysTick 表示选择系统滴答定时器,因为 M3/M4 内核带有滴答定时器,一般情况下都是
选用滴答定时器作为系统时钟节拍。
Peripheral Timer 表示使用外设定时器。
Timer clock value
表示定时器主频,单位 Hz。
Timer tick value
表示系统时钟节拍周期,单位 us。
System Configuration
Round-Robin Task switching
选择是否使能时间片调度,选上单选框表示使能时间片调度,取消单选框表示不使用时间片调度。
Round-Robin Timeout [ticks]
范围 1 – 1000。
表示时间片的大小,单位是系统时钟节拍个数。
Number of user timers
范围 1 – 250。
表示用户定时器个数,即软定时器个数。
ISR FIFO Queue size
表示 ISR FIFO 队列大小。中断服务程序中调用以 isr_ 开头的函数时,会将请求类型存到此缓冲
中
相对默认配置,修改了上图红色箭头所示的三个地方:
1. 任务运行在特权级模式。
2. 滴答定时器主频 72MHz,这个也是 STM32F103 的主频。
3. 系统时钟节拍周期 1ms。
修改好配置后,在 main.c 文件中添加如下代码,代码中简单的创建了两个用户任务: