手动触发上下文切换 像信号量等阻塞的,当满足条件不阻塞了,要调用这个,让高优先级的任务抢占。 #if (configUSE_PREEMPTION == 0) /* 如果使用协作式调度(cooperative scheduling), * 那么就算有更高优先级的任务被唤醒,也不应该立即触发一次调度
队列必须掌握,这是其它的基石,不理解这个,其它的源码也看不懂。 queue.c、queue.h 队列结构体: typedef struct QueueDefinition { int8_t *pcHead; // 队列存储区开始地址 int8_t *pcWriteTo; //
列表是 FreeRTOS 系统各种功能实现的的基础,本质上是一个双向循环链表。 类型定义 列表类型: typedef struct xLIST { listFIRST_LIST_INTEGRITY_CHECK_VALUE volatile UBaseT
线程控制块 PCB,记录线程的数据。 struct rt_thread { /* rt 对象 */ char name[RT_NAME_MAX]; /* 线程名字 */ rt_uint8_t type; /* 对象类型 */ rt_uint8_t flags; /* 标注位 */ rt
中断管理 为了把操作系统和系统底层的异常、中断硬件隔离开来,RT-Thread 把中断和异常封装为一组抽象接口,如下图所示: rt_interrupt_enter() 和 rt_interrupt_leave():用于在中断服务程序进入和离开时通知内核中断上下文的切换。 <
数据传递 邮箱 特性: 每封邮件固定为 4 字节, 可以直接传输 32 位无符号数 恰好能容纳一个指针,可传递指向缓冲区的地址。但是不能显式的指定数据的长度,在使用的时候一定要注意越界的问题。 多个线程可等待同一个邮箱。
时钟节拍 时钟节拍在 rtconfig.h 中设置 /* *频率是 1000HZ 周期是 1/1000 s *所以节拍是 1ms */ #define RT_TICK_PER_SECOND 1000 给 RT-Thread 提供时钟节拍: void SysTick_Handler(void) {
软件定时器,单位为时钟节拍,定时数值必须是 OS Tick 的整数倍。 定时器控制块: struct rt_timer { struct rt_object parent; rt_list_t row[RT_TIMER_SKIP_LIST_LEVEL]; /* 定时器链表节点 */
内存堆初始化 使用堆内存,必须先初始化堆。 void rt_system_heap_init(void* begin_addr, void* end_addr); begin_addr:堆内存区域起始地址 end_addr:堆内存区域结束地址 使用 memheap 堆内存: rt_err_t rt_
由于FreeRTOS是抢占式的,任务需主动让出CPU,否则会卡死。 vTaskDelay void vTaskDelay(TickType_t xTicksToDelay); 延时的是系统节拍,需使用 pdMS_TO_TICKS() 宏将毫秒ms转换为系统节拍。时基通常为1ms,所以也不用这个函数转
FreeRTOS 并不直接使用C语言中的 malloc 和 free,它有自己的、依赖度低、移植性高的库。 FreeRTOS 在 portable/MemMang 目录下提供了5种可选的内存管理方案,分别对应不同的堆管理策略: 名称
互斥:同一时刻,共享资源只能被一个任务所使用。 同步:控制不同任务访问共享资源的顺序。 其实,就可以把通知理解为同步,它们的作用都是控制任务的执行顺序。 任务之间的通信,称为 IPC(Inner-Process Communication) FreeRTOS中提供了队列、信号量、事件组、任务通知用于
断言机制 断言:条件为假,执行代码(通常让程序停止执行)。 FreeRTOS 默认的断言: #define configASSERT(x) if (!x) while(1); 改进的断言: #define configASSERT(x) if(!x) { printf("%s %s %d\r\n"
使能软件定时器功能: 添加 timer.c 和 timer.h 文件 添加配置 #define configUSE_TIMERS 1 创建定时器 // 动态创建定时器 TimerHandle_t xTimerCreate(const char * const pcTimerName,
中断配置 FreeRTOS 屏蔽的是 NVIC 配置的中断优先级,而不是芯片中固定的中断号。 使用 FreeRTOS 的时候,单片机优先级组通常必须设置为 NVIC_PriorityGroup_4,以适应 FreeRTOS,因为 FreeRTOS 只关注抢占优先级。 对于 Cortex-M,数字越小
FreeRTOS中叫任务,RT-Thread中叫线程,一个东西。 FreeRTOS 是抢占式调度系统,高优先级任务一旦就绪(如被信号量唤醒、延迟到期等),会立即抢占 CPU。 任务状态 四种任务状态:运行态、就绪态、阻塞态和挂起态 运行态:任务得到了CPU的使用权,正在执行中。单核处理器的同一时刻,
从官方示例中得到的配置文件,是不能直接使用的,需要修改,以符合单片机硬件。 FreeRTOS 支持: 时间片调度:任务按时间片执行,时间片通常为1ms。 抢占式调度:高优先级任务抢占低优先级,高优先级任务需让出内存。 抢占式+时间片调度 默认只开启抢占式调度。 系统相关配置