硬汉嵌入式论坛

 找回密码
 立即注册
查看: 3701|回复: 1
收起左侧

[RL-RTX] 【RTX操作系统教程】第25章    使用RTX时注意事项总结

[复制链接]

740

主题

1326

回帖

3546

积分

管理员

春暖花开

Rank: 9Rank: 9Rank: 9

积分
3546
QQ
发表于 2016-1-14 14:57:23 | 显示全部楼层 |阅读模式
第25章    使用RTX时注意事项总结


    本章节主要是总结一下RTX使用中几个常见问题的解决办法。
25.1 RTX使用中注意事项
25.2      总结

25.1  RTX使用中注意事项

    下面都是初学者容易犯错误的地方,特此总结一下,望初学者在使用时注意这些问题。

25.1.1 MDK版本问题

    使用教程配套的例子请务必使用MDK4.74。
u 每个MDK的安装目录里面都会有一个RTX源码,对于MDK4.XX来说,大家使用的那个MDK版本,务必使用那个MDK版本下面的RTX,这样使用MDK自带的RTX调试组件时,才能显示正确的调试信息。
u 当前STM32F103和STM32F407开发板使用的RTX源码是MDK4.74里面的,KEIL官方已经放弃MDK4系列的更新了,这个版本号是MDK4系列里面最新版本了。如果需要使用MDK自带的RTX调试组件显示信息,请务必使用MDK4.74
u 对于MDK5.XX,RTX也在其安装目录里面,但是RTX已经不作为单独版本发布了,它有一个全新的名字叫CMSIS-RTOS RTX。ARM官方在RTX的基础上给RTX又做了一层封装。

25.1.2 外设初始化位置

    建议用户将外设初始化放在RTX启动前完成,也就是如下的形式:
  1. int main (void)
  2. {   
  3.      /* 初始化外设 */
  4.      bsp_Init();
  5.      
  6.      /* 创建启动任务 */
  7.      os_sys_init_user (AppTaskStart,             /* 任务函数 */
  8.                        2,                        /* 任务优先级 */
  9.                        &AppTaskStartStk,         /* 任务栈 */
  10.                        sizeof(AppTaskStartStk)); /* 任务栈大小,单位字节数 */
  11.      while(1);
  12. }
复制代码
这样做的好处就是用户可以提前将特权级寄存器先初始化完成,之后任务运行在非特权级模式。推荐用户将任务工作模式设置为特权级。

25.1.3 中断优先级分组设置

     强烈推荐用户将Cortex-M3内核的STM32F103和Cortex-M4内核的STM32F407的NVIC优先级分组设置为4,即:NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);这样中断优先级的管理将非常方便。此函数在bsp_Init中第一个被调用:
  1. /*
  2. *********************************************************************************************************
  3. *    函 数 名: bsp_Init
  4. *    功能说明: 初始化硬件设备。只需要调用一次。该函数配置CPU寄存器和外设的寄存器并初始化一些全局变量。
  5. *            全局变量。
  6. *    形    参:无
  7. *    返 回 值: 无
  8. *********************************************************************************************************
  9. */
  10. void bsp_Init(void)
  11. {   
  12.      /* 优先级分组设置为4, 优先配置好NVIC */
  13.      NVIC_PriorityGroupConfig(NVIC_PriorityGroup_4);
  14.      
  15.      bsp_InitUart();   /* 初始化串口 */
  16.      bsp_InitLed();        /* 初始LED指示灯端口 */
  17.      bsp_InitKey();         /* 初始化按键 */
  18.      
  19. }
复制代码

25.1.4 任务优先级分配方案

    这个问题在第8章,8.2小节中有详细讲解。

25.1.5 任务栈和系统栈大小的分配

    任务栈大小可以通过MDK中自带的RTX调试组件很方便的观察,而系统栈不容易测试,用户可以简单的计算最大的中断嵌套层数,并在此基础上再增加些空间。另外要注意的是,RTX的内核函数都是在SVC中断中调用的,用户也需要把这个考虑到系统栈大小里面,按照官方的说明,最小128字节,推荐256字节。
    一般情况下,用户分配1-2KB的系统栈大小即可。

25.1.6 RTX中使用中断注意事项

    在RTX系统中使用中断基本上是没有限制的,但是用户要注意以下几个问题。
u PendSV中断,SysTick中断和SVC 0中断用户不可调用,这三个被RTX占用。
u 优先级分组必须在RTX系统初始化之前配置好,并推荐将优先级分组设置为4,即16个抢占式优先级,范围0-15,没有子优先级。
u 对于STM32F103或者STM32F407来说,当用户将优先级分组设置为4的时候,PendSV的中断优先级是15,SysTick的中断优先级也是15,而SVC的中断优先级是14。其余的0-13供用户使用。

25.1.7 保证MDK工程独立性的问题

    为了保证MDK工程的独立性,就不得不说下头文件的包含问题,一般用户包含头文件主要有如下两种方式:
#include  <stdarg.h>
#include  <stdio.h>
#include  <stdlib.h>
#include  <math.h>

#include “bsp_uart_fifo.h”
#include “bsp_led.h”
#include “bsp_timer.h”
#include “bsp_key.h”
u <>包含头文件的方式---优先在系统目录下找,对于MDK来说就是优先在MDK的安装目录里面查找,如果找不到就去用户所创建的工程里面找。
u “”  包含头文件的方式---优先在当前目录下找,对于MDK来说就是优先在用户所创建的工程里面找,如果找不到就去MDK的安装目录里面查找。
    MDK工程的独立性问题就由上面的两种包含方式而引起,如果大家在使用中不注意这个问题的话,有时候很多麻烦的问题就来了,根本原因是MDK的安装目录里面也有芯片厂商库文件和其它的一些源码文件(比如RTX操作系统)。可以想象,比如用户采用下面的方式添加头文件
#include<STM32F10x.h>
    那么MDK就会优先从安装目录里面去查找,如果用户升级了固件库,但是MDK安装目录里面的是低版本的固件库,那么问题就来了,用户此时使用的固件库头文件是低版本的,而源码文件是高版本的。这时,最好的解决办法就是把MDK中No Auto Includes选项选上。
25.1.png


选上了这个选项以后,就不会从MDK安装目录里面搜索头文件了,除了系统头文件,比stdio.h,  string.h等。如下是MDK的help文档对此选项的说明:
25.2.png

    教程中配套的例子基本都把这个选项选上了,而且在做RTX的源码方式移植的时候这个选项就很有用了。

25.2 总结

    这里仅为大家总结了七条常见问题,使用中还会遇到其它的问题,望初学者不断的积累这方面的经验,让自己的工程代码更加健壮。

评分

参与人数 1金币 +1 收起 理由
joshuazchen + 1 赞一个!

查看全部评分

努力打造安富莱高质量微信公众号:点击扫描图片关注
回复

使用道具 举报

5

主题

578

回帖

593

积分

版主

Rank: 7Rank: 7Rank: 7

积分
593
发表于 2016-1-16 23:04:24 | 显示全部楼层
我补充下系统栈要注意的地方,,,使用用户svc的不提了,这些函数都是用系统栈

尤其要注意的是,用户定时器指定的id号,可以一一对应到定时器回调函数里执行,注意这些函数是在systick里运行的,同样也是使用的系统栈

如果疏忽了就可能在用户定时器回调使用大的局部变量,导致栈溢出
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋|Archiver|手机版|硬汉嵌入式论坛

GMT+8, 2024-5-12 10:43 , Processed in 0.274588 second(s), 32 queries .

Powered by Discuz! X3.4 Licensed

Copyright © 2001-2023, Tencent Cloud.

快速回复 返回顶部 返回列表