FreeRTOS学习笔记4

FreeRTOS配置管理:

网上移植教程较多,也可以使用官方提供的各种Demo工程进行移植,不在详细介绍。本文主要介绍FreeRTOS移植成功后进行的配置方式。使其成为自己最匹配最精简,最适用的系统。

FreeRTOSConfig.h几乎包含了所有需要的配置。下文讲述主要的几项配置:

  1. 包含INCLUDE_。。。的宏定义。所有这些宏都是条件编译所需的。可以根据自身需要进行定义。例如INCLUDE_xTaskAbortDelay是需要使用函数 xTaskAbortDelay()时定义为1。这样做的好处是使处理器不编译不需要的函数。减少代码量。函数的功能在函数名字中已体现出来。根据需要进行定义即可。
  2. config开始的宏:

   2.1 configAPPLICATION_ALLOCATED_HEAP 该宏定义为1时用户可以自己家设置堆内存,堆内存的详细代码在heap_1.c到heap_5.c中。具体取决于用户选择哪种内存管理方式。网上都推荐使用4。

   2.2 configASSERT 断言,和assert()函数类似,调试时可以判断传入的参数是否合理。一般在调试结束后关闭。FreeRTOS内核中的关键点都会调用 configASSERT(x),configASSERT()需要在 需要在 FreeRTOSConfig.h文 件中定义, 如下实例: #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  configCHECK_FOR_STACK_OVERFLOW 堆栈溢出检测。堆栈的大小是从任务创建时就已经定义完成的。如果定义了堆栈溢出检测,用户必须定义一个钩子函数(回调函数)当堆栈溢出时,就会调用该函数。函数原型:

    void vApplicationStackOverflowHook( TaskHandle_t xTask, char * pcTaskName );

参数 xTask是任务句柄, pcTaskName是任务名字,要注意的堆栈溢出太严重话可能会 是任务名字,要注意的堆栈溢出太严重话可能会 是任务名字,要注意的堆栈溢出太严重话可能会 损毁这两个参数, 损毁这两个参数, 如果发生这种情况的话可以直接查看变量 如果发生这种情况的话可以直接查看变量 如果发生这种情况的话可以直接查看变量 如果发生这种情况的话可以直接查看变量 如果发生这种情况的话可以直接查看变量 pxCurrentTCB来确定哪个任务发 生了堆栈溢出,一般在调试结束时将该宏关闭,减少系统开销。该宏可以等于1或者2,方法1较快,方法2慢一点但是几乎可以检测出所有堆栈溢出的情况。

   2.4 configCPU_CLOCK_HZ 设置 CPU的频率。

   2.5 configSUPPORT_DYNAMIC_ALLOCATION 定义为 1的话在创建 FreeRTOS的内核对象时候 所需要的 RAM就会从 FreeRTOS的堆中 的堆中 动态的获取内存,定义为0的话需要用户自行提供。默认为1。

   2.6 configGENERATE_RUN_TIME_STATS 置为 1开启时间统计功能, 开启时间统计功能, 相应的 API函数会被编译, 为 0时关闭间统计功能。 时关闭间统计功能。 如果 宏 configGENERATE_RUN_TIME_STATS为 1的话还需要定义一个外设来作为时间系统的基准,还需要一个宏返回当前基准时钟的值。

   2.7 configIDLE_SHOULD_YIELD 一般关闭,空闲任务。没什么作用。

   2.8 configKERNEL_INTERRUPT_PRIORITY、
       onfigMAX_SYSCALL_INTERRUPT_PRIORITY、
       onfigMAX_API_CALL_INTERRUPT_PRIORITY
       三个宏和FreeRTOS 的中断配置有关。

   2.9 configMAX_CO_ROUTINE_PRIORITIES 系统的最大优先级数量

   2.10 configMAX_PRIORITIES 设置任务的优先级数量,设置好以后任务就可以使用从0 到configMAX_PRIORITIES-1 的优先级,其中0 是最低优先级,configMAX_PRIORITIES-1 是最高优先级。

   2.11 configMAX_TASK_NAME_LEN 设置任务名最大长度。

    2.12 configMINIMAL_STACK_SIZE 设置空闲任务的最小堆栈大,以字为单位,不是字节。

    2.13 configNUM_THREAD_LOCAL_STORAGE_POINTERS 每个任务的指针数组大小。

    2.14 configUSE_MUTEXES 为1时使用互斥信号量。

    2.15 configUSE_PORT_OPTIMISED_TASK_SELECTION FreeRTOS有两种方法来选择下一个 要运行的任务,是通用另外有两种方法来选择下一个 要运行的任务,是通用另外有两种方法来选择下一个 要运行的任务,是通用另外是特殊的 方法, 也就是硬件方法, 使用 MCU自带 的硬件指令来实现。(注:使用硬件方式时和使用的CPU有关,例如stm32有32个中断,因此,使用stm32时硬件方式最多使用32个任务。而通用方式无限制。)

    2.16 onfigUSE_PREEMPTION 为1时使用抢占式任务调度器。0为协程方式。(FreeRTOS已经不再更新协程方式的算法。我们也可以使用同一优先级多个任务的方式来进行相类似的效果。)

    2.17 configUSE_TICKLESS_IDLE 低功耗模式

      configUSE_TIMERS 软件定时器模式。并不精确。

    2.18 configUSE_TIME_SLICING 为1时使用抢占式调度器,这样会使调度器无限调用最高级优先级任务。为0时使用轮盘式任务调度模式。默认为1。

  这是这个头文件中我认为最常用也是最基本的几个宏,在今后使用中有需要再具体查看即可。

时间: 2024-10-09 09:07:27

FreeRTOS学习笔记4的相关文章

FreeRTOS学习笔记——二值型信号量

1.前言 在嵌入式操作系统中二值型信号量是任务间.任务与中断间同步的重要手段.FreeRTOS的二值型信号量简单易用,下面结合一个具体例子说明FreeRTOS中的二值型信号量如何使用. [相关博文] [FreeRTOS STM32移植笔记] [FreeRTOS学习笔记--任务间使用队列同步数据] [如何在FreeRTOS下实现低功耗--MSP430F5438平台] [代码链接]--示例代码存于百度网盘 2.特别说明         二值型信号量的使用方法见图1所示,二值型信号量可以理解为任务与中

FreeRTOS学习笔记2

FreeRTOS函数原型解析: portBASE_TYPE xTaskCreate( pdTASK_CODE pvTaskCode, const signed portCHAR * const pcName,              unsigned portSHORT usStackDepth,              void *pvParameters,              unsigned portBASE_TYPE uxPriority,.              xTas

FreeRTOS学习笔记7-FreeRTOS 队列相关

在实际的应用中,常会遇到一个任务或者断服需要和另外进 在实际的应用中,常会遇到一个任务或者断服需要和另外进 行"沟通交流", 行"沟通交流", 行"沟通交流", 这个"沟通交流"的过程其实就是消息传递 这个"沟通交流"的过程其实就是消息传递 这个"沟通交流"的过程其实就是消息传递 这个"沟通交流"的过程其实就是消息传递 的过程.在 的过程.在 没有操作系统的时候两个应

FreeRTOS学习笔记5-静态方式创建任务函数

配置完成后的进行任务创建,使用静态方式创建任务时需要使将宏 configSUPPORT_STATIC_ALLOCATION设置为 1,即使用静态内存.还需要将函数 vApplicationGetIdleTaskMemory()和 ApplicationGetTimerTaskMemory()进行实现.通过这两个函数来给空闲任务 和定时器服的任务堆 栈和任务控制块分配内存.在maiinc.c中进行定义.定义静态的任务堆栈和任务控制块内存,然后将这些内存传递给函数参数.最后创建空闲任务和定时器任务的

FreeRTOS 学习笔记 1

之所以要学习 FreeRTOS,不是因为它多么出众,仅仅是因为公司要做的项目使用的芯片上有它,而我是后参与进来的,之前就听到前面的人说这部分比较难,所以就来学一下,免得做项目的时候抓瞎,所以我现在也不知道他到底难不难,完全没 Feel . Ps:对于前人的指教还是比较信任的...反正总不会害我... 这一次也要开始使用 Keil,以前一直用的是 IAR,熟悉一下应该也没有问题... 本人英语不是很好,幸好 Zou Changjun 前辈翻译了中文版,感谢 Zou Changjun 前辈... 桌

FreeRTOS 学习笔记 5 —— 调度算法.简述

优先级抢占式调度: 1. 每个任务都赋予了一个优先级. 2. 每个任务都可以存在于一个或多个状态. 3. 在任何时候都只有一个任务可以处于运行状态. 4. 调度器总是在所有处于就绪态的任务中选择具有最高优先级的任务来执行. 这种类型的调度方案被称为"固定优先级抢占式调度".所谓"固定优先级"是指每个任务都被赋予了一个优先级,这个优先级不能被内核本身改变(只能被任务修改)."抢占式"是指当任务进入就绪态或是优先级被改变时,如果处于运行态的任务优先级

LwIP学习笔记——STM32 ENC28J60移植与入门

0.前言 去年(2013年)的整理了LwIP相关代码,并在STM32上"裸奔"成功.一直没有时间深入整理,在这里借博文整理总结.LwIP的移植过程细节很多,博文也不可能一一详解个别部分只能点到为止. [本文要点] [1]不带操作系统的LwIP移植,LwIP版本为1.4.1. [2]MCU为STM32F103VE,网卡为ENC28J60. [3]移植过程重点描述ethernetif.c和LwIP宏配置等. [4]一个简单的TCP echo例子. [5]力求简单,没有DHCP功能,甚至没有

vector 学习笔记

vector 使用练习: /**************************************** * File Name: vector.cpp * Author: sky0917 * Created Time: 2014年04月27日 11:07:33 ****************************************/ #include <iostream> #include <vector> using namespace std; int main

Caliburn.Micro学习笔记(一)----引导类和命名匹配规则

Caliburn.Micro学习笔记(一)----引导类和命名匹配规则 用了几天时间看了一下开源框架Caliburn.Micro 这是他源码的地址http://caliburnmicro.codeplex.com/ 文档也写的很详细,自己在看它的文档和代码时写了一些demo和笔记,还有它实现的原理记录一下 学习Caliburn.Micro要有MEF和MVVM的基础 先说一下他的命名规则和引导类 以后我会把Caliburn.Micro的 Actions IResult,IHandle ICondu