FreeRTOS#1——源码移植
·
FreeRTOS
官方源码
FreeRTOS 源码仓库结构:
├── backoffAlgorithm/ # 重试退避算法库
├── coreHTTP/ # HTTP 客户端库
├── coreJSON/ # JSON 解析器
├── coreMQTT/ # MQTT 客户端库
├── corePKCS11/ # PKCS#11 加密接口
├── coreSNTP/ # SNTP 时间同步客户端
├── FreeRTOS-Cellular-Interface/ # 蜂窝网络抽象层
├── FreeRTOS-Kernel/ # FreeRTOS 实时内核(核心)
└── FreeRTOS-Plus-TCP/ # TCP/IP 协议栈
FreeRTOS/portable/
├── Compiler/ # 不同编译器
│ ├── GCC/
│ ├── IAR/
│ ├── ARMCC/ # Keil MDK
│ ├── CCS/ # TI Code Composer Studio
│ ├── MSVC-MingW/ # Windows 模拟器
│ └── Rowley/
├── Architecture/ # 不同处理器架构
│ ├── ARM/
│ ├── RISC-V/
│ ├── x86/
│ ├── PIC32/
│ ├── RX/
│ └── AVR/
└── ThirdParty/ # 第三方集成
├── Xilinx/
├── Altera/
└── ...
移植
将源码加入工程后
- 根据需求重新配置 FreeRTOSConfig.h 文件中的配置项
- 重写下列三个中断函数
#define xPortPendSVHandler PendSV_Handler
#define vPortSVCHandler SVC_Handler
void SysTick_Handler(void)
{
uint32_t ulReturn;
/* 进入临界段,临界段可以嵌套 */
ulReturn = taskENTER_CRITICAL_FROM_ISR();
xPortSysTickHandler();
/* 退出临界段 */
taskEXIT_CRITICAL_FROM_ISR( ulReturn );
}
基础知识
函数前缀
- v——void 无返回值
- x——BaseType_t 或 句柄
- ux——无符号句柄
- e——enum 枚举值
- p——pointer 指针
- px——句柄指针
- pv——无符号指针
中断管理
-
在PendSV_Handler 中进行任务切换
-
中断优先级 要设置为抢占优先级
-
FreeRTOS 需使用SYSTICK_Handler、SVC_Handler、PENDSV_Handler
-
#define xPortPendSVHandler PendSV_Handler #define vPortSVCHandler SVC_Handler -
要在其他中断函数中调用FreeRTOS的接口 需要该中断优先级不能高于FreeRTOS 所管理的中断的最高优先级,一般在5-15
-
#define configLIBRARY_LOWEST_INTERRUPT_PRIORITY 15 /* 中断最低优先级 */ #define configLIBRARY_MAX_SYSCALL_INTERRUPT_PRIORITY 5 /* FreeRTOS可管理的最高中断优先级 */
时间片
- 最小时间片为一个TICK,TICK时长由configTICK_RATE_HZ决定:TickPeriod = 1 / configTICK_RATE_HZ 秒。
空间分配
- 使用freeRTOS是会自动分配一个静态数组,作为系统空间,在heapx.c分配,在配置文件中configTOTAL_HEAP_SIZE 定义数组大小
动态空间分配
- 创建任务是通过 pvPortMalloc() 从堆空间中 分配 任务块TCB、任务栈 两部分空间
- 这个堆是自己定义的静态数组,通常在.bss段
静态分配
- 任务创建时,自己分配TCB空间 和 任务栈空间
更多推荐

所有评论(0)