【问题标题】:How portYIELD works in freeRTOSportYIELD 如何在 freeRTOS 中工作
【发布时间】:2016-08-27 08:18:32
【问题描述】:

我完全是freeRTOS的初学者,在freeRTOS中documentationtaskYIELD用于请求上下文切换,taskYIELD定义如下

#define taskYIELD()                 portYIELD()

portYIELD 定义如下:

#define portYIELD()                 {__asm__ __volatile__ ("scall");}

如果我不明白这将导致系统调用异常。

在我的port的exception.s中,系统调用处理如下:

.org  0x100
  // Supervisor Call.
  _handle_Supervisor_Call:
  rjmp $

意思是程序会进入一个无限循环,那么问题是程序是如何从这个无限循环中跳出来的呢? 如果我的理解有任何错误,请随时发表评论。

我正在使用 Atmel uc3a0512 和 Atmel Studio 7.0

【问题讨论】:

  • 我没用过FreeRTOS,但是将无限循环作为系统调用指令的处理程序是正常的吗?我怀疑这个想法是通过进行允许阻止/调度的系统调用来实现的。即系统调用处理程序应该检查当前任务是否已经运行很长时间,如果是,则跳转到调度程序以查找 CPU 现在应该做什么。
  • 是的,确实对我来说也很奇怪。
  • 那个无限循环是你写的吗?如果是这样,是不是大多数项目都打算取代它?
  • 不,我没有更改任何显示的代码是从一个工作的 freeRTOS 示例中提取的。

标签: c assembly embedded freertos


【解决方案1】:

您使用什么版本的 FreeRTOS?你用什么编译器?我有版本 8.2.3 和 9.0.0。 AVR32 UC3 的两个版本都有两个端口:GCC 和 IAR。

FreeRTOS\Source\portable\GCC\AVR32_UC3\exception.S中我们可以看到:

        .org  0x100
        // Supervisor Call.
_handle_Supervisor_Call:
        lda.w   pc, SCALLYield

对于 IAR,我们有类似的代码。所以你可以看到有SCALLYield的调用。下载最新版本,尽情享受吧!

【讨论】:

  • 它是 freeRTOS 7.0.0 和 AVR32/GNU 编译器,我向您保证,我尝试运行多个任务并且工作正常,但问题是如何与我上面显示的代码一起正常工作?
  • 哇哦。你确定你打电话给taskYIELD()portYIELD()?使用调试器或 printf 到 UART 检查它!还有其他切换上下文的方法:vTick() 调用 vTaskSwitchContext()
  • @Mouin:你没有在问题中说它有效!我假设它确实像你说的那样进入了一个无限循环,而你在问它应该如何爆发。 (即对代码进行什么更改才能使其正常工作)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 2019-09-22
  • 2021-02-05
  • 1970-01-01
  • 2021-05-09
  • 1970-01-01
  • 2021-07-17
相关资源
最近更新 更多