STM32 相关RTOS

        从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 文件中添加如下代码,代码中简单的创建了两个用户任务:
  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值