FreeRTOS笔记——循序渐进探究内核源码的实现(一)

0 概述

参考FreeRTOS源码,使用其中部分代码,自己从头编写操作系统是如何实现任务定义、任务调度等功能,通过编写这些工程代码,能够更加深入的理解FreeRTOS系统的实现原理。
备注:部分内容参考野火的FreeRTOS相关开发资料。

1 本节目标

参考官方源码,编写简单的任务创建方法,然后加入到就绪队列,最后使用手动指定进行任务的切换。

2 任务创建

创建一个任务,需要具备三个关键元素:

  • 任务栈
    裸机系统中只有一个main函数执行应用代码,涉及到的局部变量、函数返回地址等存放在主栈中,一般不需要我们去操心;
    而多任务系统中,每个任务相互独立,我们需要专门的一块区域存放每个任务涉及到的局部变量、中断发生时函数返回地址等等环境参数,这样额一片内存区域就是任务栈。
    任务栈可以是一个预先定义好的全局数组,称之为静态栈,创建后一直存在;或者是动态申请的一端连续内存空间,称之为动态栈,任务不需要执行操作时,可以考虑释放栈空间;一般情况都是使用的静态栈。
    栈的大小不能太小,否则会产生溢出;也不能过大,否则浪费内存,需要结合实际场景进行设置。

注意,栈是自顶向下生长的,比如在任务中连续声明两个局部变量

unsigned char a,b;
printf("addr %p, %p\n", &a, &b);

打印的地址是a的地址大于b的地址

  • 入口函数
    我们的任务具体要完成什么功能?这边是入口函数要做的事情,入口函数一般是一个独立,主体无限循环不能返回的函数。
void task_enrty(Void *arg)
{
  init_something();
  while(1)
  {
      //TODO something
      do_something();
  }
}
  • 任务控制块
    裸机编程时,只有一个main函数执行代码,我们只要设计好代码执行逻辑即可。
    多任务系统中,任务的执行时系统调度的;为了方便系统进行任务的调度,FreeRTOS定义了任务控制块,每个任务创建时都会实例化一个任务控制块,内部包含了任务的栈指针、任务名称、任务形参等信息,该控制块会挂载到任务列表(就绪或延时链表,取决于任务的运行状态),系统调度可以获取到该任务控制块来控制任务的执行状态。

任务创建就是将三大核心元素联系起来。

3 就绪列表

任务创建完毕之后,需要添加到就绪列表中(就是链表),表示任务已经就绪,系统可以按照一定的策略进行调度了。

4 任务调度

是RTOS操作系统的核心,主要功能室根据一定的策略,比如优先级、阻塞延时等,最后从就绪列表中找到符合条件的任务(比如优先级最高),然后去执行该任务。

5 代码编写

下面主要讲解下代码中的关键内容。

明晚更新…

keil仿真代码工程链接:github工程网址

还是建议大家自己手动敲一遍,在调试过程中不断成长。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值