FreeRTOS实现机制理论学习--Applecai的学习笔记

  1. List结构关系
    任务节点中成员的含义


    1.png

    链表的创建操作,xLIST可以理解为根节点。
    初始化尾插:


    2.png

    一个优先级就绪链表中有多个任务节点。比如如下创建任务后可以看到同一个优先级下的3个任务。
    3.png
  2. 任务切换
    首次启动,需要打开所有中断,并且任务切换中断为一个软中断,优先级最低。将currentTCB指向最高优先级就绪队列,然后在中断中实现上下文切换。

  3. 优先级策略
    就绪列表数组按优先级高的搜索是否为空,若不为空说明此最高优先级中有就绪任务,则进行任务切换。

  4. 阻塞
    将任务从就绪列表中移除,选择下一个优先级最高的任务执行。若就绪列表为空,则执行Idle task。

  5. 时间片
    针对同一优先级的任务队列,会在system tick时间进行next切换,这个system tick时间就是任务切换时间片。

  6. 周期延时机制
    适用于创建周期任务。从就绪队列移除,添加到一个delay链表(绝对时间从小到大出入),仅通过base+tickcounter=delay链表的第一个值时,判断delay时间到之后添加到delay溢出就绪队列。

  7. Event机制。
    适用于创建事件触发任务。和信号量相比主要区别是一对多。一个task可以等待多个事件的(与/或)逻辑关系满足后,进行触发。主要就是setbit,然后waitbit后触发任务,否则挂起。
    其它信号量,互斥,消息队列等也是类似,FIFO条件满足后切换任务。

  8. 任务通知
    暂时理解为可以代替事件组/信号量/消息队列,但是不能代替互斥量。每个任务中独有的。32bit的变量和8bit的状态。

  9. 内存管理
    暂时只知道每个task都要设置独立的堆栈。若按POSIX系统来可以理解,可认为每个task就是一个进程。内存分配时间也有要求,教程中说内存分配没有使用虚拟内存,只能直接使用物理地址。关于动态分配,主要通过算法来优化,而且还包括碎片处理。这个我觉得不会吧!另外它提供了多种内存分配方法。申请内存的时候把调度器挂起是否会影响周期任务的准确性。

目前只是了解了实现机制及一些主要函数。之后会再仔细分析一些关键代码。
先调用list函数,做了一个list的实验进行熟悉根节点及子节点的创建连接关系。

定义:
struct xLIST List_Test; //根节点
struct xLIST_ITEM List_Item1;//子节点1
struct xLIST_ITEM List_Item2;//子节点2
struct xLIST_ITEM List_Item3;//子节点3
放入初始化函数:
vListInitialise(&List_Test);
vListInitialiseItem(&List_Item1);
vListInitialiseItem(&List_Item2);
vListInitialiseItem(&List_Item3);

vListInsertEnd(&List_Test,&List_Item1);
vListInsertEnd(&List_Test,&List_Item2);
vListInsertEnd(&List_Test,&List_Item3);

调试看效果,结果正确,连接关系如上图3
子节点1的next指向子节点2,子节点2的next指向子节点3,子节点2的prev指向子节点1,等等一一验证正确。


mytest.png

你可能感兴趣的:(FreeRTOS实现机制理论学习--Applecai的学习笔记)