FreeRTOS学习笔记(一)

跟着正点原子STM32F4 FreeRTOS开发手册_V1.1 学习

1、FreeRTOS的移植

基于led跑马灯的移植,已成功。

2、FreeRTOS系统配置

        在实际使用RTOS的时候我们时常需要根据自己的需求来配置FreeRTOS,而且不同架构的MCU在使用的时候配置也不同。FreeRTOS的系统配置文件为FreeRTOSConfig.h,在此配置文件中可以完成FreeRTOS的裁剪和配置。

        分为2.1FreeRTOSConfig.h文件

                2.2"INCLUDE_"开始的宏

                2.3“config”开始的宏

2.1FreeRTOSConfig.h文件

        FreeRTOS的配置基本是通过在FreeRTOSConfig.h中使用“#define”这样的语句来定义宏定义实现的。在FreeRTOS的官方demo中,每个工程都有一个FreeRTOSConfig.h文件,我们在使用的时候可以参考。

2.2“INCLUDE_”开始的宏

        使用“INCLUDE_”开头的宏来表示使能或者除能FreeRTOS中相应的API函数。比如当INCLUDE_vTaskPriortySet设置为0的时候就表示不能使用vTaskPrioritySet(),当设置为1的就可以使用。

2.3“config”开始的宏

        “config”宏和“INCLUDE_”开始的宏一样,都是用来完成FreeRTOS的配置和裁剪的。

2.3.1 conifgAPPLICATION_ALLOCATED_HEAP

        默认情况下FreeRTOS的堆栈是由编译器来分配的,将configAPPLICATION_ALLOCATED_HEAP定义为1的话堆内存可以由用户自己设置,堆内存在heap_1/2/3/4/5.c中有定义,具体在哪个文件取决用户选择哪种管理方式。

2.3.2 configASSERT

        断言,类似C标准库中的assert()函数,调试代码的时候可以检查传入的参数是否合理,FreeRTOS内核中的关键点都会调用configASSERT(x),当x为0的时候说明有错误,使用断言会使开销加大,一般在调试阶段使用。

#define configASSERT((x))  if((x)=0)vAssertCalled(_FILE,_LINE);

        注意,vAssertCalled()函数需要用户自行定义,可以是显示到LCD上的函数,也可以是串口打印。本教程均采用串口打印:

#define vAssertCalled(char,int)    printf("Error:%s,%d\r\n",char,int)
#define configASSERT((x))  if((x)=0)vAssertCalled(_FILE,_LINE);

        当参数x错误的时候就通过串口打印出发生错误的文件名和错误所在的行号,调试代码的时候可以使用断言,当调试完成以后尽量去掉断言。

2.3.3configCHECK_FOR_STACK_OVERFLOW

        设置堆栈溢出监测,每个任务都有一个任务堆栈,如果使用函数xTaskCreate()创建一个任务的话那么这个任务的堆栈是自动从FreeRTOS的堆(ucHeap)中分配的,堆栈的大小是由函数xTaskCreate()的参数usStackDepth来决定的。如果使用函数xTaskCreateStatic()创建任务的话任务堆栈是由用户设置的。

        堆栈溢出是导致应用程序不稳定的主要因素,FreeRTOS提供了两种可选的机制来帮助检测和调试,不管哪种都要设置宏configCHECK_FOR_STACK_OVERFLOW。如果使能了堆栈检测功能的话,即configCHECK_FOR_STACK_OVERFLOW不为0,那么用户必须提供一个钩子函数(回调函数),当检测到溢出以后就会调用这个函数,原型:

void vApplicationStackOverflowHook(TaskHandle_t      xTask,
                                   char*             pcTaskName);

参数xTask是任务句柄,pcTaskName是任务名字,要注意的是堆栈溢出太严重的话可能会损毁这两个参数。

        configCHECK_FOR_STACK_OVERFLOW==1,使用堆栈溢出监测方法1。

        上下文切换的时候需要保存现场,现场是保存在堆栈中的,这个时候任务堆栈使用率很可能达到最大值,方法一就是不断地检测任务堆栈指针是否能指向有效空间,如果指向了无效空间的话就会调用钩子函数。方法1的优点就是快!缺点就是不能检测出所有的堆栈溢出。

        configCHECK_FOR_STACK_OVERFLOW==2,使用堆栈溢出检测方法2。

        使用方法2的话在创建任务的时候会向任务栈填充一个已知的标记值,方法二一直检测堆栈后面的几个bytes(标记值)是否被改写,如果被改写的话就会调用堆栈溢出钩子函数,方法二也会使用方法一中的机制!方法二比方法一要慢一些,但是对用户而言是很快的!方法二能检测到几乎所有的堆栈溢出,但是也有一些情况检测不到,比如溢出值和标记值相同的时候。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值