LXR | KVM | PM | Time | Interrupt | Systems Performance | Bootup Optimization

FreeRTOS相关教程

 首先介绍选择FreeRTOS的原因和入门,然后介绍如何配置FreeRTOS、内存、任务、队列、信号量、中断、调度、SysTick、调试等等。

1. FreeRTOS目录组成

FreeRTOS系列第1篇---为什么选择FreeRTOS?

FreeRTOS系列第2篇---FreeRTOS入门指南

2. FreeRTOS组件分析

2.1 通用配置

FreeRTOS系列第3篇---FreeRTOS移植指南

FreeRTOS系列第4篇---FreeRTOS编码标准及风格指南

FreeRTOS系列第5篇---FreeRTOS在Cortex-M3上的移植

FreeRTOS系列第6篇---FreeRTOS内核配置说明

FreeRTOS系列第7篇---Cortex-M内核使用FreeRTOS特别注意事项

FreeRTOS高级篇1---FreeRTOS列表和列表项

2.2 内存管理

 FreeRTOS提供了5中内存管理方案:

  • 都有哪5中内存方案,他们之间的优劣分别是?
  • 这5种内存方案的使用场景分别是?
  • 内存管理接口?效率?

参考文档:

FreeRTOS系列第8篇---FreeRTOS内存管理

FreeRTOS高级篇7---FreeRTOS内存管理分析

  heap_1 heap_2 heap_3 heap_4 heap_5
 

申请后不释放

使用最佳匹配算法

简单包装了malloc()和free()

使用一个最佳匹配算法,但会将相邻的空闲内存块合并成一个更大的块(包含一个合并算法) 实现了heap_4.c中的合并算法,并且允许堆栈跨越多个非连续的内存区
优点

实现和分配过程非常简单

不会产生内存碎片,内存位于静态数组中。

允许释放申请的内存  更通用 使用灵活,相对于heap_2内存碎片程度降低 堆栈跨多个非连续内存区
缺点 使用不灵活 不会对相邻内存进行合并,有可能造成内存碎片。

需要链接器设置一个堆栈,并且编译器库提供malloc()和free()函数。

不具有确定性

可能明显的增大RTOS内核的代码大小

   

 

2.3 任务创建、删除、控制、通知

参考文档:

FreeRTOS系列第9篇---FreeRTOS任务概述

FreeRTOS系列第10篇---FreeRTOS任务创建和删除

FreeRTOS系列第11篇---FreeRTOS任务控制

FreeRTOS系列第12篇---FreeRTOS任务应用函数

FreeRTOS系列第14篇---FreeRTOS任务通知

FreeRTOS系列第15篇---使用任务通知实现命令行解释器

FreeRTOS高级篇2---FreeRTOS任务创建分析

FreeRTOS高级篇3---FreeRTOS调度器启动过程分析

FreeRTOS高级篇4---FreeRTOS任务切换分析

FreeRTOS高级篇8---FreeRTOS任务通知分析

FreeRTOS高级篇9---FreeRTOS系统延时分析

FreeRTOS高级篇10---系统节拍时钟分析

FreeRTOS高级篇11---空闲任务分析

2.4 队列

参考文档:

FreeRTOS系列第17篇---FreeRTOS队列
FreeRTOS系列第18篇---FreeRTOS队列API函数

FreeRTOS高级篇5---FreeRTOS队列分析

2.5 信号量

参考文档:

FreeRTOS系列第19篇---FreeRTOS信号量

FreeRTOS系列第20篇---FreeRTOS信号量API函数

FreeRTOS高级篇6---FreeRTOS信号量分析

2.6 内核控制:中断、调度器、上下文切换、系统Tick

参考文档:

FreeRTOS系列第13篇---FreeRTOS内核控制 

2.7 可视化跟踪调试

FreeRTOS系列第16篇---可视化追踪调试 

3. 镜像优化

3.1 优化axf文件大小

功能开关FreeRTOSConfig.h

关闭FPU、TrustZone、

尺寸减小

gcc优化

3.2 检查axf文件大小

分析大小:riscv64-unknown-elf-size FreeRTOSDemo_ns.axf 。 

   text       data        bss        dec        hex    filename
  37312      17032      11252      65596      1003c    FreeRTOSDemo_ns.axf

详细查看函数和数据大小:arm-none-eabi-readelf -s FreeRTOSDemo_ns.axf  | grep FUNC | sort -n -r -k 3。

riscv64-unknown-elf-readelf -s FreeRTOSDemo_ns.axf | grep OBJECT |  sort -n -r -k 3

   665: 20008000 16384 OBJECT  LOCAL  DEFAULT    2 ucHeap
    97: 2000c2a0   512 OBJECT  LOCAL  DEFAULT    3 uxIdleTaskStack.10409
   261: 2000cb00   512 OBJECT  LOCAL  DEFAULT    3 xSecureCallingTaskStack.5
   249: 2000c8e0   512 OBJECT  LOCAL  DEFAULT    3 xRWAccessTaskStack.5463
   248: 2000c6e0   512 OBJECT  LOCAL  DEFAULT    3 xROAccessTaskStack.5462
   101: 2000c4a0   512 OBJECT  LOCAL  DEFAULT    3 uxTimerTaskStack.10416
   735: 00010000   304 OBJECT  GLOBAL DEFAULT    1 __Vectors
  1166: 00010000   304 OBJECT  GLOBAL DEFAULT    1 g_pfnVectors
...

riscv64-unknown-elf-readelf -s FreeRTOSDemo_ns.axf | grep FUNC |  sort -n -r -k 3
  1223: 00010e85   608 FUNC    GLOBAL DEFAULT    1 _vfprintf_r
  1163: 00010e85   608 FUNC    GLOBAL DEFAULT    1 _vfiprintf_r
  1203: 000110e5   588 FUNC    GLOBAL DEFAULT    1 _printf_i
  1231: 00012c91   532 FUNC    GLOBAL DEFAULT    4 vPortStoreTaskMPUSettings
   832: 00010c85   512 FUNC    GLOBAL DEFAULT    1 _svfprintf_r
  1121: 00010c85   512 FUNC    GLOBAL DEFAULT    1 _svfiprintf_r
...

4. 参考文档

Cortex M33处理器下移植FreeRTOS V10.2.0的操作记录

FreeRTOS基础篇

FreeRTOS学习及移植笔记之一:开始FreeRTOS之旅

FreeRTOS学习及移植笔记之二:在IAR和STM32F103VET上移植FreeRTOS

RTOS Demo for RISC-V QEMU sifive_e Model

ARM Cortex-M33 (ARMv8-M) Keil Simulator Demo Using Keil uVision IDE》:使用uVision IDE模拟调试M33+FreeRTOS
ARM Cortex-M33 (ARMv8-M) Demo for NXP LPCXpresso55S69 Development Board Using MCUXpresso IDE》: 使用NXP LPCXpresso55S69 Development Board,在MCUXpressoIDE环境中调试。

posted on 2021-06-25 10:33  ArnoldLu  阅读(2590)  评论(1编辑  收藏  举报

导航