freeRtos学习笔记

freeRtos内核剪裁

#define configCPU_CLOCK_HZ

系统主频

#define configTICK_RATE_HZ

时钟节拍

#define configTOTAL_HEAP_SIZE

freeRtos使用的堆栈大小,注意cortex系列的内核一般都是双堆栈指针的,MSP(Main Stack Pointer主堆栈指针)和PSP(Process Stack Pointer)。这种设计非常适合RTOS的设计。MSP顾名思义是给系统栈使用的。PSP是给进程栈使用的。在RTOS运行中,整个栈空间是由PSP管理的,而切换到ISR中则使用MSP。.s文件中的heap只管分配给MSP,而这里的则是分配给PSP。

#define configMINIMAL_STACK_SIZE

空闲任务堆栈大小,单位是字

#define configSUPPORT_DYNAMIC_ALLOCATION

是否使用动态内存分配API,一般使用动态分配,从configTOTAL_HEAP_SIZE中获取未使用的内存块进行分配。

#define configSUPPORT_STATIC_ALLOCATION

是否使用静态内存分配API,一般不使用静态分配,麻烦

#define configAPPLICATION_ALLOCATED_HEAP

使用动态内存分配时,freeRtos有5种内存分配方式,一般使用heap_4.c文件,该文件开始部分直接定义了一个configTOTAL_HEAP_SIZE大小的数组,用于动态内存分配使用。默认为1,如果为0,则需要用户自己实现uint8_t ucHeap[ configTOTAL_HEAP_SIZE ]数组,比如使用stm32F4系列单片机,通常使用CCM用作freeRtos的任务堆栈,就可以将此处设置为0,自己定义uint8_t ucHeap[ configTOTAL_HEAP_SIZE ]并通过编译器的__attribute__((at(n)))指令将数组存放在固定的地址,注意keil的AC6使用__attribute__((section(".ARM._at"#n)))

#define configMAX_PRIORITIES

任务最大优先级数 注意frertos任务优先级越大,优先级越高,空闲任务默认优先级为0.
用户实际可以使用的优先级范围是 1 到 configMAX_PRIORITIES – 1

#define configUSE_PREEMPTION

使用抢占式任务调度

#define configUSE_TIME_SLICING

是能时间片

#define configIDLE_SHOULD_YIELD

用户任务是否可以使用空闲任务优先级,一般不使用

#define configMAX_TASK_NAME_LEN

用户任务名字最大长度

#define configUSE_16_BIT_TICKS

是否是16位的单片机

#define configUSE_TIMERS

是否使用软件定时器

#define configTIMER_TASK_PRIORITY

软件定时器任务优先级

#define configTIMER_QUEUE_LENGTH

软件定时器队列长度,软件定时器可以看作是一个系统任务,软件定时器的一些API操作可以看作是对该任务发送消息。

#define configTIMER_TASK_STACK_DEPTH

软件定时器任务堆栈大小

#define configUSE_MUTEXES

是否使用互斥信号量,互斥信号量可以避免优先级反转,常用于临界资源的互斥访问

#define configUSE_RECURSIVE_MUTEXES

是否使用递归互斥信号量

#define configUSE_COUNTING_SEMAPHORES

计数信号量,可以当作二值信号量来用,常用于任务间的同步

#define configUSE_QUEUE_SETS

是否使用消息队列

#define configUSE_TASK_NOTIFICATIONS

是否启用任务通知功能,可以高效率进行任务间通讯

#define configUSE_TRACE_FACILITY

是否开启跟踪调试功能,会激活一些附加的结构体成员和函数,开启后方便内核调试

#define configUSE_TICKLESS_IDLE

是否开启低功耗模式

#ifndef configEXPECTED_IDLE_TIME_BEFORE_SLEEP

如果开启了低功耗模式,除空闲任务外,其他任务在接下来configEXPECTED_IDLE_TIME_BEFORE_SLEEP 个tick时间中均堵塞或者挂起),则会进入低功耗模式

#define configUSE_APPLICATION_TASK_TAG

给任务分配标签,一般不使用

#define configUSE_NEWLIB_REENTRANT

每个任务创建的时候将分配 Newlib 的重入结构体

#define configUSE_CO_ROUTINES

使用合作式调度,一般不使用

#define configCHECK_FOR_STACK_OVERFLOW

堆栈溢出检查

  • 0不检查

  • 1检查 在任务切换时检测任务栈指针是否过界了,如果过界了,在任务切换的时候会触发栈溢出钩子函
    数。
    void vApplicationStackOverflowHook( TaskHandle_t xTask,
    signed char *pcTaskName );
    用户可以在钩子函数里面做一些处理。这种方法不能保证所有的栈溢出都能检测到。比如任务在执行
    的过程中出现过栈溢出。任务切换前栈指针又恢复到了正常水平,这种情况在任务切换的时候是检测
    不到的。又比如任务栈溢出后, 把这部分栈区的数据修改了, 这部分栈区的数据不重要或者暂时没有
    用到还好, 但如果是重要数据被修改将直接导致系统进入硬件异常, 这种情况下,栈溢出检测功能也
    是检测不到的。

  • 2检查 任务创建的时候将任务栈所有数据初始化为 0xa5,任务切换时进行任务栈检测的时候会检测末
    尾的 16 个字节是否都是 0xa5,通过这种方式来检测任务栈是否溢出了。相比方法一, 这种方法的速
    度稍慢些, 但是这样就有效地避免了方法一里面的部分情况。 不过依然不能保证所有的栈溢出都能检
    测到,比如任务栈末尾的 16 个字节没有用到, 即没有被修改,但是任务栈已经溢出了, 这种情况是
    检测不到的。 另外任务栈溢出后, 任务栈末尾的 16 个字节没有修改,但是溢出部分的栈区数据被修
    改了, 这部分栈区的数据不重要或者暂时没有用到还好, 但如果是重要数据被修改将直接导致系统进
    入硬件异常, 这种情况下,栈溢出检测功能也是检测不到的。

#define configQUEUE_REGISTRY_SIZE

设置可以注册的信号量和消息队列个数。内核调试时使用,如果不进行内核调试,没有作用。

#define configASSERT( x )

断言

#define configUSE_IDLE_HOOK

空闲任务回调函数使能,发生空闲任务时,是否调用vApplicationIdleHook(void)函数,注意该函数需要用户自己编写

#define configUSE_TICK_HOOK

时间片钩子函数使能,发生时间片中断时,是否调用vApplicationTickHook(void)函数,注意该函数需要用户自己编写

#define configUSE_MALLOC_FAILED_HOOK

每当一个任务、队列、信号量被创建时,内核使用一个名为pvPortMalloc()的函数来从堆中分配内存。官方的下载包中包含5个简单内存分配策略,分别保存在源文件heap_1.c、heap_2.c、heap_3.c、heap_4.c、heap_5.c中。仅当使用这五个简单策略之一时,宏configUSE_MALLOC_FAILED_HOOK才有意义。
如果定义并正确配置malloc()失败钩子函数,则这个函数会在pvPortMalloc()函数返回NULL时被调用。只有FreeRTOS在响应内存分配请求时发现堆内存不足才会返回NULL。
如果宏configUSE_MALLOC_FAILED_HOOK设置为1,那么必须定义一个malloc()失败钩子函数void vApplicationMallocFailedHook( void),如果宏configUSE_MALLOC_FAILED_HOOK设置为0,malloc()失败钩子函数不会被调用,即便已经定义了这个函数。

#define configUSE_DAEMON_TASK_STARTUP_HOOK

定义守护进程HOOK函数,如果设置为1且configUSE_TIMERS设置为1,用户应用程序必须定义一个守护钩子函数void vApplicationDaemonTaskStartupHook(void);

#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY

此宏定义是用来配置FreeRTOS用到的SysTick中断和PendSV中断的优先级。在NVIC分组设置为4的情况下,此宏定义的范围就是0-15,即专门配置抢占优先级。这里配置为了0x0f,即SysTick和PendSV都是配置为了最低优先级,实际项目中也建议大家配置最低优先级即可。

#define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY

此宏定义比较重要,定义了受FreeRTOS管理的最高优先级中断。简单的说就是允许用户在这个中断服务程序里面调用FreeRTOS的API的最高优先级。

比如说设置NVIC的优先级分组为4的情况下。配置configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY为0x01表示用户可以在抢占式优先级为1到15的中断里面调用FreeRTOS的API函数,抢占式优先级为0的中断里面是不允许调用的,也就是说优先级为0的中断服务函数和裸机上是一样的。

#define configKERNEL_INTERRUPT_PRIORITY

#define configKERNEL_INTERRUPT_PRIORITY ( configLIBRARY_LOWEST_INTERRUPT_PRIORITY << (8 - configPRIO_BITS) )

宏定义configLIBRARY_LOWEST_INTERRUPT_PRIORITY的数值经过4bit偏移后得到一个8bit的优先级数值,即宏定义configKERNEL_INTERRUPT_PRIORITY的数值。这个8bit的数值才可以实际赋值给相应中断的优先级寄存器。
也许初学者有疑问了,为什么前面NVIC配置的时候不是8bit的方式进行配置?这是因为ST的库函数NVIC_Init()已经为我们做好了。这里的宏定义数值是供PendSV和SysTick中断进行优先级配置的。比如:我们这里配置宏定义configLIBRARY_LOWEST_INTERRUPT_PRIORITY是0x0f,经过4bit偏移后就是0xf0,即SysTick和PendSV的中断优先级就是240。

#define configMAX_SYSCALL_INTERRUPT_PRIORITY

宏定义configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY的数值经过4bit偏移后得到一个8bit的优先级数值,即宏定义configMAX_SYSCALL_INTERRUPT_PRIORITY的数值。这个数值是赋值给寄存器basepri使用的,8bit的数值才可以实际赋值给相应中断的优先级寄存器。这里的宏定义数值赋给寄存器basepri后就可以实现全局的开关中断操作了。

比如:我们这里配置宏定义configLIBRARY_LOWEST_INTERRUPT_PRIORITY是0x01,经过4bit偏移后就是0x10,即16。调用了FreeRTOS的关中断后,所有优先级数值大于等于16的中断都会被关闭。优先级数值小于16的中断不会被关闭,对寄存器basepri寄存器赋值0,那么被关闭的中断会被打开。

本文参考 freertos官方文档 https://freertos.org/a00110.html

博客 https://www.cnblogs.com/yeshenmeng/p/9805080.html

freeRtos学习笔(1)内核剪裁相关推荐

  1. freeRtos学习笔(2)任务管理

    freeRtos学习笔记 freeRtos任务管理 freeRtos任务状态 freeRtos中任务有四种状态:就绪态.运行态.杜塞态.挂起态. 图 16-1(1): 创建任务→就绪态(Ready): ...

  2. freeRtos学习笔(4)消息队列

    freeRtos学习笔记 freeRtos消息队列 为什么要用消息队列 消息队列可以在任务与任务间,中断与任务间传递信息.为什么不用全局数组?全局数组也可以传递信息,但是和消息队列相比,消息队列有一下 ...

  3. freeRtos学习笔(3)临界区管理

    freeRtos学习笔记 freeRtos临界区管理 freeRtos临界区 代码的临界段也称为临界区,一旦这部分代码开始执行,则不允许任何中断打断.为确保临界段代码的执行不被中断,在进入临界段之前须 ...

  4. FreeRtos学习笔记(11)查找就绪任务中优先级最高任务原理刨析

    FreeRtos学习笔记(11)查找就绪任务中优先级最高任务原理刨析 怎么查找就绪任务中优先级最高的? tasks.c中声明了一个全局变量 uxTopReadyPriority,任务从其他状态进入就绪 ...

  5. freeRtos学习笔记 (9) 移植和CPU利用率统计

    freeRtos学习笔记 (9) 移植和CPU利用率统计 使用官方固件移植 首先准备一个能跑的裸机工程 注意,freertos需要使用systick定时器,而stm32HAL库默认使用systick作 ...

  6. freeRtos学习笔记 (5)事件组

    freeRtos学习笔记 freeRtos事件组 为什么要用事件组? 多任务环境下, 任务.中断之间往往需要同步操作,一个事件发生会告知等待中的任 务,即形成一个任务与任务.中断与任务间的同步.事件可 ...

  7. FreeRTOS学习笔记【二】——FreeRTOS 移植

    上一章中我们初步的了解了一下 FreeRTOS,本章就正式踏上 FreeRTOS 的学习之路, 首先 肯定是把 FreeRTOS 移植到我们所使用的平台上, 这里以 ALIENTEK 的 STM32F ...

  8. FreeRTOS学习笔记

    FreeRTOS学习笔记 (这是我自己学习FreeRTOS整理的笔记,仅供参考) 第一部分:实现FreeRTOS内核 变量名: 定义变量时往往会把变量的类型当作前缀加在变量上 变量类型 前缀 char ...

  9. 1、野火freertos学习笔记

    野火freertos学习笔记 1.任务 1.1 栈 1.2 任务的切换 taskYIELD(); 1.3 临界段 2.空闲任务 3.任务优先级 4.任务延时的表现 5.时间片 5.1抢占式.协做式 6 ...

最新文章

  1. 多级反馈队列调度算法具体原理
  2. 使用Spring框架的好处(转帖)
  3. 怎么自动备份mysql数据库备份_3步教你一键自动备份mysql数据库的方法
  4. SAP ABAP实用技巧介绍系列之 使用XSLT替换xml中指定node的value
  5. redis 删除操作
  6. 微软著名程序员、歌手、NBA球队老板保罗·艾伦逝世,盖茨、库克等大佬发文悼念...
  7. ubuntu下定时任务的执行
  8. 关于bootstrap的table表显示无法找到匹配内容的问题随笔
  9. 异常详细信息: System.UnauthorizedAccessException: 对路径“”的访问被拒绝。
  10. python 爬虫1
  11. Go开发 之 设计模式
  12. 软文营销文案兼具有趣的灵魂才能形成广泛传播
  13. LTspice - 基本操作
  14. editplus终极爆破修改版:
  15. 快速迁移可持续使用的开发环境
  16. Failed to load build-tools\xx\lib\dx.jar的解决方式
  17. 【每日一道智力题】之猴子搬香蕉
  18. 基于Java毕业设计在线学习平台源码+系统+mysql+lw文档+部署软件
  19. java环境配置https访问(本地测试)
  20. 自定义C++ void swap(int ra, int * pb)函数

热门文章

  1. java.lang.OutOfMemoryError处理错误
  2. 单元测试之道一:NUnit基础
  3. wince下sources\sources.cmn\Makefile.def的相关作用
  4. WINCE6.0 Quarter VGA(QVGA) Resources组件
  5. xp系统怎么连接云服务器,xp系统怎么连接云服务器
  6. python小工具myqr生成动态二维码
  7. WPF 曲线图表控件(自制)(二)
  8. Iterator:访问数据集合的统一接口
  9. STM32 flash
  10. proc下kcore是什么文件