当前位置:   article > 正文

STM32 相关RTOS_stm32与rtxrots

stm32与rtxrots

        从keil4keil5,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实验_任务创建和删除的工程中,配置宏定义如下(仅做参考):

  1. #define OS_TASKCNT 4 // 指定同时处于活跃状态任务的最大数目
  2. #define OS_PRIVCNT 4 // 指定带有用户提供栈的任务数目
  3. #define OS_STKSIZE 256 // 指定为每个任务分配堆栈的大小
  4. #define OS_STKCHECK 1 // 开启或禁止堆栈检查
  5. #define OS_RUNPRIV 1 // 开启或禁止特权模式——(默认无,在\Keil\ARM\Startup\RTX_Conf_CM.c)
  6. #define OS_TIMER 0 // 指定CPU时钟作为实时系统的基本时钟
  7. #define OS_CLOCK 72000000 // 为选中的时钟指定输入时钟频率:72MHz
  8. #define OS_TICK 10000 // 指定定时器节拍间隔:10ms
  9. #define OS_ROBIN 1 // 开启或禁止多任务轮转调度
  10. #define OS_ROBINTOUT 5 // 多任务轮转中分配给当前任务的时间片
  11. #define OS_TIMERCNT 0 // 指定用户定时器的数目
  12. #define OS_FIFOSZ 16 // 中断服务先进先出队列:16条队列——(默认无,在\Keil\ARM\Startup\RTX_Conf_CM.c)
  13. #define OS_MUTEXCNT 8 // 系统标准库互斥量数量——(默认无,在\Keil\ARM\Startup\RTX_Conf_CM.c)
  14. void os_idle_demon (void) __task {
  15. for (;;) {
  16. }
  17. }
  18. // 标识IDLE 指令是否在空闲任务中运行,默认设置是OFF,禁止CPU进入空闲任务。可以在这儿添加代码,当没有任务就绪时就可以执行这段代码。
  1. Task Configuration
  2.  Number of concurrent running tasks
  3. 参数范围 0250
  4. 表示同时运行的最大任务数,这个数值一定要大于等于用户实际创建的任务数,空闲任务不包含
  5. 在这个里面。比如当前的数值是 6,就表示用户最多可以创建 6 个任务。
  6.  Number of tasks with user-provided stack
  7. 参数范围 0250
  8. 表示自定义任务堆栈的任务数,如果这个参数定义为 0 的话,表示所有的任务都是使用的配置向
  9. 导里面第三个参数 Task statck size 大小。比如:
  10. Number of concurrent running tasks = 6
  11. Number of tasks with user-provided stack = 0
  12. 表示允许用户创建 6 个任务,所有的 6 个任务都是分配第三个参数 Task statck size 大小的任务
  13. 堆栈空间。
  14. Number of concurrent running tasks = 6
  15. Number of tasks with user-provided stack = 3
  16. 表示允许用户创建 6 个任务,其中 3 个任务是用户自定义任务堆栈大小,另外 3 个任务是用的第
  17. 三个参数 Task statck size 大小的任务堆栈空间。
  18.  Task statck size
  19. 表示系统分配的任务堆栈大小,单位字节。
  20.  Check for the stack overflow
  21. 选择是否使能任务堆栈监测,选上单选框表示使能,取消单选框表示禁能。
  22.  Run in privileged mode
  23. 选择是否使能特权级模式,选上单选框表示使能任务工作在特权级模式,取消单选框表示任务工
  24. 作在非特权级模式。特权级和非特权级在第九章有详细讲解。
  25.  Tick Timer Configuration
  26.  Hardware timer
  27. Core SysTick 表示选择系统滴答定时器,因为 M3/M4 内核带有滴答定时器,一般情况下都是
  28. 选用滴答定时器作为系统时钟节拍。
  29. Peripheral Timer 表示使用外设定时器。
  30.  Timer clock value
  31. 表示定时器主频,单位 Hz。
  32.  Timer tick value
  33. 表示系统时钟节拍周期,单位 us。
  34.  System Configuration
  35.  Round-Robin Task switching
  36. 选择是否使能时间片调度,选上单选框表示使能时间片调度,取消单选框表示不使用时间片调度。
  37.  Round-Robin Timeout [ticks]
  38. 范围 11000
  39. 表示时间片的大小,单位是系统时钟节拍个数。
  40.  Number of user timers
  41. 范围 1250
  42. 表示用户定时器个数,即软定时器个数。
  43.  ISR FIFO Queue size
  44. 表示 ISR FIFO 队列大小。中断服务程序中调用以 isr_ 开头的函数时,会将请求类型存到此缓冲

 

 

相对默认配置,修改了上图红色箭头所示的三个地方:
1. 任务运行在特权级模式。
2. 滴答定时器主频 72MHz,这个也是 STM32F103 的主频。
3. 系统时钟节拍周期 1ms。
修改好配置后,在 main.c 文件中添加如下代码,代码中简单的创建了两个用户任务:
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/在线问答5/article/detail/840207?site
推荐阅读
相关标签
  

闽ICP备14008679号