最近我一直在为ARM和PIC设备开发自己的RTOS,所以我正在分析当前的RTOS概念。我在学习FreeRTOS时有些疑惑,
如何处理函数变量?我们如何管理函数内的变量?
实施例1:
我们在两个带有函数A和B的线程中声明了一个局部变量'i' FreeRTOS,但函数A的变量'i'受函数B的影响。
EX-2:
我们有两个线程A,B和一个像延迟这样的函数。但是线程A和B都调用相同的函数delay
。 FreeRTOS如何将单个延迟资源分配给两个线程(A和B)?
答案 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