关于RTOS的全部真相。 第十二条 任务处理服务



我们将继续审查提供有关任务和操作的其他信息的RTOS服务。

与任务相关的其他API调用包括调用以获取任务ID,检查堆栈大小,重置任务,获取有关任务的信息以及确定系统中的任务数。 Nucleus RTOS和Nucleus SE为这些操作提供了4个主要的API调用,我将在本文中介绍。

该系列中的先前文章:
第11条 任务:API的配置和介绍
第10条 计划程序:高级功能和上下文保留
第9条。 调度程序:实施
第8条 Nucleus SE:内部设计和部署
第7条 Nucleus SE:简介
第6条。 其他RTOS服务
第5条 任务交互和同步
第4条 任务,上下文切换和中断
第3条 任务与计划
第2条。 RTOS:结构和实时模式
第1条 RTOS:简介。

获取当前任务的ID


该实用程序调用返回被调用任务的ID。 对于Nucleus RTOS,这是指向当前任务控制单元的指针。 对于Nucleus SE,是当前任务的索引(0-15)。

在Nucleus RTOS中调用当前任务
服务电话原型:
NU_TASK * NU_Current_Task_Pointer(VOID);

参数:
缺席。

返回值:
指向当前任务控制单元的指针;
NU_NULL-不执行任何任务。

在Nucleus SE中挑战正在进行的任务
该API调用支持Nucleus RTOS API的核心功能。

服务电话原型:
NUSE_TASK NUSE_Task_Current(void);

参数:
缺席。

返回值:
当前(称为)任务的索引。

在Nucleus SE中完成正在进行的任务
在这种情况下,API调用的实现非常简单: 返回全局变量NUSE_Task_Active的值。

检查可用的堆栈大小


该实用程序调用返回当前任务的可用堆栈大小(以字节为单位)。 这仅适用于计划者,因为每个任务都有自己的堆栈。 即 不适合Nucleus SE中的“运行完成”(RTC)计划程序。

在Nucleus RTOS中调用堆栈卷信息
服务电话原型:
未签名的NU_Task_Check_Stack(VOID);

参数:
缺席。

返回值:
当前任务的可用堆栈大小的大小(以字节为单位)。

调用Nucleus SE中的堆栈大小信息
该API调用支持Nucleus RTOS API的核心功能。 但是,Nucleus SE需要一个正式的(虚拟)参数,以便更轻松地获取所使用堆栈的指针值。

服务电话原型:
U16 NUSE_Task_Check_Stack(U8虚拟);

参数:
虚拟 -任何值,因为实际上没有使用。

返回值:
当前任务的可用堆栈大小的大小(以字节为单位)。

实作
对于这样的呼叫,代码必须是可移植的:



如果使用RTC调度程序,则返回值为0,因为无法(使用可移植代码)确定任务可用的堆栈空间。

在其他情况下,通过找到虚拟参数的地址来确定堆栈指针的值,该地址几乎位于堆栈的开始处。 严格来说,这样的方法取决于开发/编译工具,但始终有效。 返回值是此值与堆栈空间原始值之间的差,已转换为字节。

任务重置


在这种情况下,API调用将任务返回到其原始未使用状态。 这种API函数与其他内核对象的常规API重置函数不同,仅是因为它是重置,而不仅仅是将任务设置为其初始状态(对于Nucleus SE,它是NUSE_READY或条目NUSE_Task_Initial_State [] (请参见下一篇)); 该任务被搁置( NUSE_PURE_SUSPEND ),必须恢复该任务才能再次计划。 此逻辑类似于Nucleus RTOS中相应API调用的功能。

Nucleus RTOS中的任务重置调用
服务电话原型:
状态NU_Reset_Task(NU_TASK *任务,UNSIGNED argc,VOID * argv);

参数:
任务 -指向任务控制块的指针;
argc-可用于将信息传输到任务的数据元素;
argv是可用于将信息传递给任务的指针。

返回值:
NU_SUCCESS-调用成功完成;
NU_INVALID_TASK-指向任务的无效指针;
NU_NOT_TERMINATED-描述的任务未处于完全挂起(终止)或完成(完成)的状态; 只能重置处于暂停或完成状态的任务。

Nucleus SE中的任务重置调用
该API调用支持Nucleus RTOS API的核心功能。

服务电话原型:
状态NUSE_Task_Reset(NUSE_TASK任务);

参数:
任务 -要重置的任务的索引(ID)。

返回值:
NUSE_SUCCESS-呼叫成功完成;
NUSE_INVALID_TASK-无效的任务索引。

在Nucleus SE中实施重置任务
检查参数后,API函数NUSE_Task_Reset()的主要目的是重新初始化所有任务数据结构:



如果在调用API等待访问内核对象时阻止了任务,则要做的第一件事就是设置与该对象相对应的阻止任务的计数器。 这是通过switch语句完成的。

然后,通过调用初始化函数NUSE_Init_Task()来初始化任务数据结构(基本上是零,除了上下文块外 。 在下一篇描述系统初始化的文章中将更详细地讨论其实现。 最后,任务状态设置为NUSE_PURE_SUSPEND

获取任务信息


该服务调用提供有关任务的部分信息。 Nucleus SE的实现与Nucleus PLUS有所不同,在后者中,返回的信息较少,这是因为不支持命名对象,取代优先级较低的任务和时间片,并且不返回优先级作为冗余信息。

Nucleus RTOS中的呼叫任务信息
服务电话原型:
状态NU_Task_Information(NU_TASK *任务,CHAR *名称,DATA_ELEMENT *任务状态,UNSIGNED * schedule_count,OPTION *优先级,OPTION *抢占,UNSIGNED * time_slice,VOID ** stack_base,UNSIGNED * stack_size,UNSIGNED * minimum_stack;

参数:
任务 -指向请求其信息的任务的指针;
name-指向任务名称的8个字符的字符串的指针; 包括一个用于空字符的区域;
task_status-指向接收当前任务状态值的变量的指针;
schedule_count-指向接收计数器值的变量的指针,该任务已被添加到调度程序的次数;
优先级 -指向获取任务优先级的变量的指针;
抢占 -指向变量的指针,用于排挤优先级较低的任务的选项; NU_PREEMPT表示任务可以被挤出,而NU_NO_PREEMPT表示任务不能被挤出。
time_slice-指向获取任务时间量值的变量的指针; 值为0表示无法完成此任务的时间量化;
stack_base-指向获取任务堆栈地址的变量的指针;
stack_size-指向获取任务堆栈大小的变量的指针;
minimum_stack-指向变量的指针,以获取堆栈上剩余的最小字节数。

返回值:
NU_SUCCESS-调用成功完成;
NU_INVALID_TASK-指向任务的无效指针。

在Nucleus SE中调用任务信息
该调用支持Nucleus PLUS API的核心功能。

服务电话原型:
状态NUSE_Task_Information(NUSE_TASK任务,U8 * task_status,U16 * Scheduled_count,ADDR * stack_base,U16 * stack_size);

参数:
任务 -请求有关信息的任务的索引;
task_status-指向U8变量的指针,该变量接收任务状态的当前值(如果任务的等待状态不可用, 则不返回任何内容);
cheduled_count-指向变量U16的指针,该变量接收添加到调度程序中的任务数的计数器值(如果禁用了调度任务的计数器,则不返回任何内容);
stack_base-指向ADDR变量的指针,该变量接收任务堆栈的地址(如果使用RTC调度程序, 则不返回任何内容);
stack_size是指向U16变量的指针,该变量获取任务堆栈的大小(如果使用RTC调度程序,则不返回任何内容)。

返回值:
NUSE_SUCCESS-呼叫成功完成;
NUSE_INVALID_TASK-无效的任务索引;
NUSE_INVALID_POINTER-指针参数(一个或多个)不正确。

在Nucleus SE中实施任务信息检索
实现此API调用非常简单:



该函数将考虑各种配置选项,返回任务的状态。

获取任务数


该服务调用返回有关在应用程序中配置的任务数量的信息。 在Nucleus RTOS中,此数字可以更改,并且返回值将表示当前的当前任务数;在Nucleus SE中,返回值是在组装期间设置的,不再更改。

在Nucleus RTOS中获得任务数量的挑战
服务电话原型:
UNSIGNED NU_Established_Tasks(VOID);

参数:
缺席

返回值:
应用程序中已安装(创建但未删除)的任务数。

在Nucleus SE中获得任务数量的挑战
该API调用支持Nucleus PLUS API的核心功能。

服务电话原型:
U8 NUSE_Task_Count(无效);

参数:
缺席

返回值:
应用程序中已配置任务的数量。

实作
此API调用的实现非常简单: 返回 #define NUSE_TASK_NUMBER指令的值。

下面的文章将讨论Nucleus SE中与任务有关的数据结构以及Nucleus SE不支持的一些标准API调用。

关于作者: Colin Walls在电子行业工作了30多年,大部分时间用于固件。 他现在是Mentor Embedded(Mentor Graphics的一个部门)的固件工程师。 Colin Walls经常在会议和研讨会上发表演讲,他撰写了许多技术文章并撰写了两本有关固件的书。 居住在英国。 Colin的专业博客 ,电子邮件:colin_walls@mentor.com。

关于翻译:尽管尽管在某些地方已经描述了过时的方法,但该系列文章似乎很有趣,作者以一种非常易于理解的语言向未受过良好培训的读者介绍了实时OS的功能。 我本人属于俄罗斯RTOS的创建者团队,我们打算免费提供它 ,我希望这一周期对新手开发人员有用。

Source: https://habr.com/ru/post/zh-CN424713/


All Articles