【发布时间】: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