第一部分 裸机系统和RTOS系统
1、裸机:不带任何操作系统,又称为前后台系统,前台系统指的中断函数,后台系统指的大循环。
缺点: ①:实时性差,轮流执行;
②:delay,空等待,CPU不执行其他代码
③:结构臃肿,实习功能都放在无限循环
2、RTOS:实时操作系统
优点:①:分而治之,实现功能划分为多个任务
②:延时函数:任务调度
③:抢占式:高优先级任务抢占低优先级任务
④:任务堆栈:每个任务都有自己的栈空间
注意:1.中断可以打断任意任务 2.任务可以同等优先级
3、任务调度
抢占式调度:主要针对优先级不同的任务,每个任务都有一个优先级,优先级高的任务可以抢占优先级低的任务。
时间片调度:主要针对优先级相同的任务,当多个任务的优先级相同时,任务调度器会在每一次系统时钟节拍到的时候切换任务。
第二部分 任务定义
1、任务
根据功能的不同,把裸机系统分割为⼀个个独⽴的⽆线循环且⽆法返回的函数。我们把这种函数称 之为任务。
注意:
1.输入参数为void*,这样保证可以给任务传递需要的值;
2.任务没有返回参数
在FreeRTOS中,为了简化任务的管理和调度,尽可能地减少了内核的复杂性和资源占用。任务的执行是一个无限循环(infinite loop),任务内部的逻辑通过不断循环执行来实现。当任务执行结束时,其实际的返回值并不会被使用,因为任务并不会像函数一样被调用者获取其返回值。简化任务的设计也有助于提高系统的实时性和效率,因为不需要额外的堆栈空间来保存任务的返回值,也不需要额外的处理来管理返回值的传递和处理。
3.无限循环
(1)连续性:死循环使得任务能够持续执行,不会在任务完成一次执行后立即终止。这需要不断地执行某项任务或监控某个状态的任务。
(2)周期性调度: 实时操作系统通常会使用调度器来管理任务的执行,根据任务的优先级和调度算法来决定任务的执行顺序。通过死循环,任务可以周期性地执行,并根据调度器的调度策略来确保各个任务的执行顺序和时间片分配。 (3)资源管理: 死循环使得任务能够在执行过程中管理自己的资源,如分配和释放内存、访问外设等。任务可以根据需要重复执行特定的操作,而不必担心执行完一次后就被系统终止。
2、任务栈
首先我们知道所有函数开辟是需要栈来存放临时变量和他调用结束后返回的地址,所以每个任务都需要一个任务栈来存放他任务结束后需要返回的地址或被某中断打断后的保护现场。
每个任务都有自己的栈空间,用来保护每个任务的现场。函数在中断、任务调度、自己调用函数等情况下都需要保护自己的现场,就需要自己的任务栈。
3、系统栈
系统栈中保存中断。每个systick中断都会使用到系统栈。
疑点1:任务栈为什么会在.bss段:
-
内存管理:将任务栈分配到.bss段可以帮助在编译时确定任务栈的大小,并在程序加载时根据需要动态分配内存,从而更好地管理内存资源。
-
未初始化数据: 任务栈在任务创建时通常是未初始化的,因为任务的执行会在创建后立即开始。.bss段用于存储未初始化的全局或静态变量,因此将任务栈分配到.bss段可以保持一致性
-
疑点2:系统栈和任务栈为什么不在一块
-
栈大小的灵活配置:不同的任务可能需要不同大小的栈空间,根据任务的需求分配独立的任务栈可以更好地控制栈大小。
-
避免系统栈溢出影响任务:如果任