FreeRTOS知识小结

1.freertos中,数字优先级越小,逻辑优先级也越小,空闲任务优先级为0。(与隔壁的RT-Thread 和 μC/OS 刚好相反)

2.时间片:同一优先级下能有多个任务,每个任务轮流的享有相同的CPU时间,享有CPU的时间我们叫做时间片。在RTOS中,最小的时间单位是一个tick,即 SysTick 的中断周期。

3.静态任务需要打开宏,创建空闲任务。

4.互斥量:更适用于可能会引起优先级翻转的情况,优先级继承降低优先级翻转的危害,互斥量不能在中断服务函数中使用.

5.优先级翻转:在很多场合中,某些资源只有一个,当低优先级任务正在占用该资源的时候,即便高优先级任务也只能乖乖的等待低优先级任务使用完该资源后释放资源。这里高优先级任务无法运行而低优先级任务可以运行的现象称为“优先级翻转”。

6.优先级继承:在 H 任务申请该资源的时候,由于申请不到资源会进入阻塞态,那么系统就会把当前正在使用资源的 L 任务的优先级临时提高到与 H 任务优先级相同,此时 M 任务被唤醒了,因为它的优先级比 H 任务低,所以无法打断 L 任务,因为此时 L 任务的优先级被临时提升到 H,所以当 L 任务使用完该资源了,进行释放,那么此时 H 任务优先级最高,将接着抢占 CPU 的使用权, H 任务的阻塞时间仅仅是 L 任务的执行时间,此时的优先级的危害降到了最低.

7.vtaskdelay:每次任务间隔时间一致。
vtaskdelayuntil:每次任务启动时间一致。(无视任务运行时间)

vTaskDelay延时时间由参数 xTicksToDelay 来确定,为要延时的时间节拍数,延时时间肯定要大于 0。该函数主要流程是:
(1)、调用函数 vTaskSuspendAll()挂起任务调度器。
(2)、调用函数 prvAddCurrentTaskToDelayedList() 将要延时的任务添加到延时列表pxDelayedTaskList 或 者 pxOverflowDelayedTaskList() 中 。 后 面 会 具 体 分 析 函 数prvAddCurrentTaskToDelayedList()。
(3)、调用函数 xTaskResumeAll()恢复任务调度器。
(4)、如果函数 xTaskResumeAll()没有进行任务调度的话那么在这里就得进行任务调度。
(5)、调用函数 portYIELD_WITHIN_API()进行一次任务调度。
延时函数不会删除任务。

8.临界段用一句话概括就是一段在执行的时候不能被中断的代码段,关中断函数分带返回值和不带返回值两种。带返回值可以嵌套,可以在中断里面使用。不带返回值不能嵌套,不能在中断里面使用。(不带返回值指不用管当前的中断状态是怎样的)

9.xQueueReceive()用于从一个队列中接收消息,并把接收的消息从队列中删除。

10.协程是为那些资源很少的 MCU 而做的,但是随着 MCU 的飞速发展,性能越来越强大,现在协程几乎很少用到了!但是 FreeRTOS 目前还没有把协程移除的计划,在概念上协程和任务是相似的,但是有如下根本上的不同:
(1)堆栈使用
所有的协程使用同一个堆栈(如果是任务的话每个任务都有自己的堆栈),这样就比使用任务消耗更少的 RAM。
(2)调度器和优先级
协程使用合作式的调度器,但是可以在使用抢占式的调度器中使用协程。
(3)宏实现
协程是通过宏定义来实现的。
(4)使用限制
为了降低对 RAM 的消耗做了很多的限制。

11.内存管理
heap_1 - the very simplest, does not permit memory to be freed.
heap_2 - permits memory to be freed, but does not coalescence adjacent free blocks.
heap_3 - simply wraps the standard malloc() and free() for thread safety.
heap_4 - coalescences adjacent free blocks to avoid fragmentation. Includes absolute address placement option.
heap_5 - as per heap_4, with the ability to span the heap across multiple non-adjacent memory areas.
Notes:
heap_1 is less useful since FreeRTOS added support for static allocation.
heap_2 is now considered legacy as the newer heap_4 implementation is preferred.

12.事件可使用于多种场合,它能够在一定程度上替代信号量,用于任务与任务间,中断与任务间的同步。 与信号量不同的是,事件的发送操作是不可累计的,而信号量的释放动作是可累计的。事件另外一个特性是,接收任务可等待多种事件,即多个事件对应一个任务或多个任务。同时按照任务等待的参数,可选择是“逻辑或”触发还是“逻辑与”触发。这个特性也是信号量等所不具备的,信号量只能识别单一同步动作,而不能同时等待多个事件的同步。

13.任务通知
(1)代替消息队列 /事件组
发送:xTaskNotify(…);发送通知,带有通知值并且不保留接收任务原通知值,用在任务中。
接收:xTaskNotifyWait(…);

(2)代替二值信号量/计数信号量
发送:xTaskNotifyGive(…);发送通知,不带通知值并且不保留接收任务的通知值,会将接收任务的通知值加一,用于任务中。
接收:ulTaskNotifyTake(…);

14.软件定时器的状态有三种:休眠,活动和期满。定时器初始化后就会进入休眠状态,启动定时器以后就处于互动状态,定时器计时到期就会进入期满状态,如果此时重启定时器又会进入活动状态。

15.消息队列是单相异步传输。一个任务发送,一个任务接收,发送和接收不需要同步进行。

16.FreeRTOS中内核控制函数主要有:
taskYIELD() 任务切换。
taskENTER_CRITICAL() 进入临界区,用于任务中。
taskEXIT_CRITICAL() 退出临界区,用于任务中。
taskENTER_CRITICAL_FROM_ISR() 进入临界区,用于中断服务函数中。
taskEXIT_CRITICAL_FROM_ISR() 退出临界区,用于中断服务函数中。
taskDISABLE_INTERRUPTS() 关闭中断。
taskENABLE_INTERRUPTS() 打开中断。
vTaskStartScheduler() 开启任务调度器。
vTaskEndScheduler() 关闭任务调度器。
vTaskSuspendAll() 挂起任务调度器。
xTaskResumeAll() 恢复任务调度器。
vTaskStepTick() 设置系统节拍值。

你可能感兴趣的:(c语言)