我目前正在efm32gg mcu上实施freertos。 我使用启动线程来初始化项目。 此线程在项目初始化期间禁用上下文切换(TaskSuspendAll),其他模块创建其线程,因此初始化仅由中断而不是其他线程中断。 在项目初始化结束时,启动线程启用了上下文切换(ResumeAll)。
当前的演示项目增加了1个线程,它会使LED闪烁。 一旦启动线程启用了关键部分,这导致某个时刻进行了portYield调用,应用程序就会跳回main()(我不知道是通过重置还是通过调用main)。
但是当我只使用启动线程并保持项目初始化函数为空时,则根据需要,freertos继续运行空闲任务。
有人知道这种行为的原因是什么吗?
答案 0 :(得分:1)
关于在调度程序暂停时创建线程,请参阅常见问题解答的下一页上的编号列表项目9,基本上不会这样做。原因是创建一个线程可能导致需要上下文切换(如果线程的优先级高于创建它的线程),但是如果调度程序被挂起则不会发生:https://www.freertos.org/FAQHelp.html
如果你想拥有一个创建其他线程的初始化线程,但你不想让其他线程运行,那么我建议初始化线程的优先级高于它创建的任何线程的优先级 - 然后调度程序不会选择任何其他线程。在初始化结束时,您可以降低初始化线程的优先级,或者只删除它,以最合适的为准。
我怀疑在你的情况下,电路板正在被重置,所以你需要找到它的来源。