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空间 和 任务栈空间
Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐