首页 > 其他分享 >freertos-刘火良:内核实现

freertos-刘火良:内核实现

时间:2022-11-05 23:34:27浏览次数:43  
标签:初始化 刘火良 freertos 一个 链表 内核 TCB 节点 定义

定义习惯

  变量

    将变量类型缩写当作前缀,如无符号字符uc,字符指针pc,数据结构、任务句柄等用x

  函数

    返回值类型缩写当作前缀,如无返回v,私有函数加pri前缀

  宏定义

    宏定义大写,所在头文件名字缩写为前缀,小写。(信号量函数是宏定义,但命名按函数定义)

    

 

    通用宏定义

     

 

链表实现

  节点定义

    根节点:根节点实际上就是一个链表(或者说链表头),所以其为第一个节点同时也是最后一个节点。属性有:链表上的节点个数(不包括根节点)、索引值(用来遍历节点,指向入口节点)、最后一个节点(本质是精简节点MINIitem):根节点自身item,和普通节点一样有辅助值、前一节点后一节点。

      

 

    节点:属性为辅助排序值(确定该节点在链表中顺序,作用是确定优先级进行排序)、前一个节点、后一个节点、owner(挂载的TCB结构体)、container(节点所在链表)

      

 

  节点初始化 

    根节点初始化:初始化时由于没有其他节点,则前一个节点和后一个节点都指向自身,index索引值指向最后一个节点即同样指向自身,链表上挂载节点数为0,根节点自身排序为最大MAX

    

 

 

 

    节点初始化:节点初始化时不挂载任何链表,即container = NULL

    

 

 

 

向链表添加节点  

  链表尾部添加节点

    尾部添加涉及到三个节点的属性更改

    新节点:新节点的前一个节点为根节点原前一个节点,即NewItem->pxPrevious = pxIndex->pxPrevious;新节点的前一个节点为根节点,即NewItem->pxNext = pxIndex;同时新节点挂载链表为指定链表,即container = list。

    根节点原前一个节点:作为根节点原前一个节点,其下一个节点不再是第一个节点即根节点,而是插入的新节点,即pxIndex->pxPrevious->pxNext = NewItem

    根节点:根节点前一个节点将变成新节点,即pxIndex->pxPrevious = NewItem;同时链表节点计数器加一

    

  按辅助顺序值添加节点

    设置一个临时节点iterator,使用for循环进行遍历,当iterator的下一个节点的辅助值大于要添加的节点的顺序值时,则将新节点位置确定在iterator和iterator->next之间。

    

 

创建任务

  所谓创建任务,其实就是给TCB对象内属性初始化

  首先看TCB结构体

typedef struct tasTaskControlerBlock
{
    volatile StackType_t *pxTopOfStack;                        //栈顶
    ListItem_t xStateListItem;                                 //任务节点(链表项)
    StackType_t *pxStack;                                      //任务栈起始地址
    char pcTaskName[configMAX_TASK_NAME_LEN];                //任务名称
}tskTCB;    
typedef tskTCB    TCB_t;

  可以看到TCB结构体内有栈顶、栈起始地址、任务节点即链表项、任务名称。我们要做的就是对这四个值进行赋值初始化

  

  

标签:初始化,刘火良,freertos,一个,链表,内核,TCB,节点,定义
From: https://www.cnblogs.com/toriyung/p/16837371.html

相关文章

  • linux 升级内核版本
    #安装最新的内核#我这里选择的是稳定版kernel-ml  如需更新长期维护版本kernel-lt yum --enablerepo=elrepo-kernel install kernel-ml#查看已安装那些内核r......
  • 深入理解LINUX内核 第三版 电子书 pdf
    作者:(美)博韦,西斯特出版社:中国电力出版社原作名:UnderstandingtheLinuxKernel译者:陈莉君;张琼声;张宏伟 链接:深入理解LINUX内核第三版  为了彻底理解......
  • [IE编程] 多页面基于IE内核浏览器的代码示例
    有不少人发信问这个问题,我把答案贴在这里:建议参考WTL(WindowsTemplateLibrary)的代码示例工程TabBrowser(在WTL目录/Samples/TabBrowser下面)。该工程演示了如何用W......
  • 野火 STM32MP157 开发板内核和设备树的编译烧写
    一、环境编译环境:Ubuntu版本:18.4.6交叉编译工具:arm-linux-gnueabihf-gcc版本:7.4.1开发板:STM32MP157pro烧写方式:STM32CubeProgrammer、TFTP、在线烧写安装工具gcc......
  • 《linux内核精髓》-记录-资源管理
    《linux内核精髓》-记录-资源管理资源管理资源管理本节主要内容:通过cgroup和namespace实现容器功能容器cgroup:cgroup是将任意进程进行分组化管理的linux内核功能。c......
  • 驱动开发:内核封装TDI网络通信接口
    在上一篇文章《驱动开发:内核封装WSK网络通信接口》中,LyShark已经带大家看过了如何通过WSK接口实现套接字通信,但WSK实现的通信是内核与内核模块之间的,而如果需要内核与应用层......
  • 驱动开发:内核封装TDI网络通信接口
    在上一篇文章《驱动开发:内核封装WSK网络通信接口》中,LyShark已经带大家看过了如何通过WSK接口实现套接字通信,但WSK实现的通信是内核与内核模块之间的,而如果需要内核与应用......
  • 驱动开发:内核封装WSK网络通信接口
    本章LyShark将带大家学习如何在内核中使用标准的Socket套接字通信接口,我们都知道Windows应用层下可直接调用WinSocket来实现网络通信,但在内核模式下应用层API接口无法使用,......
  • 记录一次实验室linux系统的GPU服务器死机排查过程——某显卡满负荷导致内核进程超时导
    在自己没有管理多台高负荷的ubuntu显卡服务器之前,我是万万想不到linux服务器居然也是如此容易死机的。什么每个版本的TensorFlow调用显卡驱动时和内核不兼容,什么系统自动......
  • 驱动开发:内核层InlineHook挂钩函数
    在上一章《驱动开发:内核LDE64引擎计算汇编长度》中,LyShark教大家如何通过LDE64引擎实现计算反汇编指令长度,本章将在此基础之上实现内联函数挂钩,内核中的InlineHook函数挂钩......