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

时间:2016-01-19 12:26:41

标签: c operating-system embedded freertos

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

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

实施例1:

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

EX-2:

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

3 个答案:

答案 0 :(得分:5)

在函数中声明的变量放在堆栈上。线程有不同的堆栈,因此函数局部变量对它们来说是不同的。

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

答案 1 :(得分:1)

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

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

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

答案 2 :(得分:0)

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