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系统延时分析》
2.4 队列
参考文档:
《FreeRTOS系列第17篇---FreeRTOS队列》
《FreeRTOS系列第18篇---FreeRTOS队列API函数》
2.5 信号量
参考文档:
《FreeRTOS系列第19篇---FreeRTOS信号量》
《FreeRTOS系列第20篇---FreeRTOS信号量API函数》
《FreeRTOS高级篇6---FreeRTOS信号量分析》
2.6 内核控制:中断、调度器、上下文切换、系统Tick
参考文档:
《FreeRTOS系列第13篇---FreeRTOS内核控制》
2.7 可视化跟踪调试
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学习及移植笔记之二:在IAR和STM32F103VET上移植FreeRTOS》
《RTOS Demo for RISC-V QEMU sifive_e Model》