1.常见单词:
(1)kernel:核心
(2)Periodic:周期
(3)Preempted:批准,允许
(4)Inherit:继承
(5)Idle task:空闲任务
(6)Deadlock:死锁
(7)overflow:溢出
2. 系统会创建最低优先级的空闲任务(普通任务也可以设置和空闲任务一样的优先级)
3. xTaskCreate() :创建任务,写在int main()中
4. vTaskStartScheduler():启动调度器,写在int main()中
5. 任务写在死循环中,for( ; ; ){}
6. FreeRTOS中任务优先级数值越大,优先级越高(0表示最低优先级),这个与中断优先级相反
7. 阻塞:表示一个任务正在等待某个时间。一个任务进入阻塞后,调度就选择其他任务来执行
(1)阻塞可以使得低优先级任务不被饿死,没有阻塞的话,低优先级任务无法执行
(2)调度器会选择当前可执行任务中优先级最高的那个
8. 空闲任务的责任是要将分配给已删除任务的内存释放掉。因此有一点很重要,那就是使用vTaskDelete()函数的任务千万不能把空闲任务的执行时间饿死
9. vTaskDelete():删除任务
10. vTaskPriofitySet():在调度器启动后改变任务优先级
11. xQueueCreate():创建队列,写在int main()中
12. 不要在中断服务例程中调用xQueueRceive()和xQueuePeek();中断安全版本的替代API 函数为xQueueReceiveFromISR()
13. 中断服务例程(ISR)快速处理少量工作之后移交给handler(延迟处理任务),理解为handler是推出ISR后的第一个执行的任务注:中断(ISR)通过xSemaphoreGiveFromISR()给出信号量后,任务可以获得,但是之后不会给回来,类似于FIFO,这个区别于其他信号量(在中断中,信号量只是起到同步的作用)
14. vSemaphoreCreateBinary():创建二值信号量,写在int main()中
15. 一个二值信号量最多可以锁存一个中断事件
16. 函数可重入(可以安全的被多个任务调用,或者在中断与任务重均可被调用):一个函数除了访问自己栈空间上分配的数据或内核寄存器中的数据外,不会访问其他任何数据
17. 临界区:临界区间内关掉中断,但必须只有很少的时间,具体是在taskENTER_CRITICAL()与taskEXIT_CRITICAL()之间的代码,临界区内可嵌套
18. 如果临界区太长不适合直接关中断,可以使用挂起调度器的方法,这时中断是使能的
19. 互斥量用于互斥功能,二值信号量用于中断同步;前者需要归还,后者不需要
20. xSemaphoreCreateMutex():创建互斥量类型的信号量,写在int main()中
(1)缺点:容易产生优先级反转,在某些极端情况下,甚至出现高优先级在等低优先级交出信号量,但是低优先级并未运行的奇怪现象(信号量是两者之间传递,出现优先级在两者之间的第三个任务就会不可控)
(2)优化方法:继承优先级,当低优先级任务获得信号量然后开始运行时,继承等待互斥量的任务的优先级
21. 死锁:任务A和B分别都需要互斥量x和y,A获得x等待y,B获得y等待x,A没有y无法继续,也无法交出x,B同理,所以程序卡死
22. 守护任务:对某个资源具有唯一所有权的任务,守护任务大部分处在阻塞态,不必担心死锁和优先级反转
23. 空闲任务钩子函数:vApplicationIdleHook()(回调,call-back(cb))
(1)空闲任务钩子函数会被空闲任务每循环一次就自动调用一次
(2)如果应用程序用到了vTaskDelete() AP 函数,则空闲钩子函数必须能够尽快返回,
(3)因为在任务被删除后,空闲任务负责回收内核资源。如果空闲任务一直运行在钩子函数中,则无法进行回收工作
24. malloc和free通常不具备线程安全性;且都会产生内存碎片
(1)pvPortMalloc():内核请求内存
(2)vPortFree():释放内存
25. 如果应用程序不需要删除任务,队列或者信号量,则具有使用heap_1 的潜质。Heap_1
总是具有确定性;heap_2 采用了一个最佳匹配算法来分配内存,并且支持内存释放。Heap_2.c 适合用于那些重复创建与删除具有相同栈空间任务的应用程序。
26. 空闲任务是在vTaskStartScheduler()调用中自动创建的。如果由于内存不足而无法创建空闲任务,vTaskStartScheduler()会直接返回。在调用vTaskStartScheduler()后加上一条空循环[for(;;)]可以使这种错误更加容易调试。
27. 除了具有后缀为”FromISR”函数名的API 函数,不要在中断服务例程中调用其它API 函数。