freeRTOS 如何在切换线程时维护函数变量?

How does freeRTOS maintain function variables while switching threads?

最近我一直在为 ARM 和 PIC 设备开发自己的 RTOS,所以我正在分析当前的 RTOS 概念。我在学习FreeRTOS的过程中遇到了一些疑惑,

它是如何处理函数变量的?我们如何管理函数内的变量?

Ex-1:

我们在函数 A 和 B 的两个线程中声明了一个局部变量 'i' FreeRTOS,但是函数A的变量'i'受函数B的影响。

Ex-2:

我们有两个线程 A 、 B 和一个类似延迟的函数。但是线程A和B都调用了同一个函数delay。 FreeRTOS 如何将单个延迟资源分配给两个线程(A 和 B)?

在函数中声明的变量放在堆栈上。线程有不同的栈,所以函数局部变量也不同。

这是第 2 个问题的答案。对于 delay,OS 必须为每个线程创建数据结构。例如,delay 参数将有一个 delta 延迟。最小delta的线程被唤醒;但是在第一次运行时设置了 2nd 线程的定时器中断。如果 2nd 线程具有更高的优先级,它会在中断时被唤醒(如果不是,它会被置于就绪状态)。堆栈和延迟状态由列表或其他数据结构中的每个任务 OS 全局管理。

局部变量存储在栈中;每个任务都有一个独立的堆栈。通过将任务 stack-pointer 恢复到 SP 寄存器,在上下文切换期间选择堆栈。

在 RTOS 中,一般每个任务都有一个任务控制块,TCB 将包含一个设置为延迟长度的计数器,在每个定时器中断时,计数器递减;当任务延迟计数器变为零时,任务就绪,如果它是最高优先级就绪任务,它将运行。确切的细节可能因不同的 RTOS 实现而异(通常 FreeTROS 在许多方面都远非典型)。

学习 RTOS 基础知识的更好资源可能是 Micro C/OS-II(或 III)。它的内部结构详尽 documented 并且专门用于教授 RTOS 实现原理。

我认为这是一个学校项目,我担心您可能已经贪多嚼不烂(俗话说),因为在了解更高级的 RTOS 主题之前,有必要了解嵌入式编程。这是一个(非常古老的)link,它将提供一些有关 FreeRTOS(和其他 RTOS)如何管理线程和堆栈的基础知识:http://www.freertos.org/implementation/main.html