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工程网址
还是建议大家自己手动敲一遍,在调试过程中不断成长。