主页 文档 下载 莱特 沙龙 English

RTESM文档
RTEMS精彩应用
RTEMS版权说明
其他RTOS
ARM/DSP专区
AVR/FPGA/PCB
嵌入式文件系统
ARM AVR仿真器DIY
莱特电子工作室
联系我们
 


单调周期调度函数举例

作者 Ray

RTEMS版权所有,转载请注明来源www.rtems.net,作者Ray

20.3.6 : 例子

下列举例说明使用单调周期创建周期性任务的方法。

20.3.7 : 简单的周期任务

下面的代码创建了一个每隔100个时钟滴哒执行一次的任务。

rtems_task Periodic_task(rtems_task_argument arg)

{

rtems_name name;

rtems_id period;

rtems_status_code status;

 

name = rtems_build_name( 'P', 'E', 'R', 'D' );

 

status = rtems_rate_monotonic_create( name, &period );

if ( status != RTEMS_STATUS_SUCCESSFUL ) {

printf( "rtems_monotonic_create failed with status of %d.\n", rc );

exit( 1 );

}

 

 

while ( 1 ) {

if ( rtems_rate_monotonic_period( period, 100 ) == RTEMS_TIMEOUT )

break;

 

/* Perform some periodic actions */

}

 

/* missed period so delete period and SELF */

 

status = rtems_rate_monotonic_delete( period );

if ( status != RTEMS_STATUS_SUCCESSFUL ) {

printf( "rtems_rate_monotonic_delete failed with status of %d.\n", status );

exit( 1 );

}

 

status = rtems_task_delete( SELF ); /* should not return */

printf( "rtems_task_delete returned with status of %d.\n", status );

exit( 1 );

}

上述的任务在任务初始化时创建了一个单调周期 , 在进入循环时 , rtems_rate_monotonic_period 函数创建了一个 100 滴哒的周期然后返回。rtems_rate_monotonic_period 函数的后来启用将会为 100 的剩余者造成任务阻断勾号时期。 如果,因为什么特殊原因,循环体执行时间超过 100个滴哒,rtems_rate_monotonic_period 函数将会返回 RTEMS_TIMEOUT。如果任务超过了它的截止期限, 它将会删除单调周期和它本身。

20.3.8 : 具有多个周期的任务

下面的代码中,任务Periodic_task中有两个单调周期,分别是40和100滴哒。

rtems_task Periodic_task(rtems_task_argument arg)

{

rtems_name name_1, name_2;

rtems_id period_1, period_2;

rtems_status_code status;

 

name_1 = rtems_build_name( 'P', 'E', 'R', '1' );

name_2 = rtems_build_name( 'P', 'E', 'R', '2' );

 

(void ) rtems_rate_monotonic_create( name_1, &period_1 );

(void ) rtems_rate_monotonic_create( name_2, &period_2 );

 

while ( 1 ) {

if ( rtems_rate_monotonic_period( period_1, 100 ) == TIMEOUT )

break;

 

if ( rtems_rate_monotonic_period( period_2, 40 ) == TIMEOUT )

break;

 

/*

* Perform first set of actions between clock

* ticks 0 and 39 of every 100 ticks.

*/

 

if ( rtems_rate_monotonic_period( period_2, 30 ) == TIMEOUT )

break;

 

/*

* Perform second set of actions between clock 40 and 69

* of every 100 ticks. THEN ...

*

* Check to make sure we didn't miss the period_2 period.

*/

 

if ( rtems_rate_monotonic_period( period_2, STATUS ) == TIMEOUT )

break;

 

(void) rtems_rate_monotonic_cancel( period_2 );

}

 

/* missed period so delete period and SELF */

 

(void ) rtems_rate_monotonic_delete( period_1 );

(void ) rtems_rate_monotonic_delete( period_2 );

(void ) task_delete( SELF );

}

循环第一次执行 , rtems_rate_monotonic_period 函数将 period_1 设置为 100 个滴哒然后返回。次后循环中 rtems_rate_monotonic_period( period_1, 100 ) 将会被阻塞 100 个滴哒。period_2用来控制每个100滴哒周期中的两种动作。rtems_rate_monotonic_cancel( period_2) 函数保证了period_2 任务在 period_1 时期上被阻塞的时候,周期period_2不会期满。如果不运行取消操作, 除了进入循环的第一次,以后每一次调用 rtems_rate_monotonic_period(period_2,40)都会返回RTEMS_TIMEOUT。

如果,因为任何原因,任务超出了任何一个截止期,rtems_rate_monotonic_period 函数将会返回RTEMS_TIMEOUT 函数状态。 如果上述任务超过了他自己的截止期限, 它将会删除单调周期以及他自己。

 

 

 
嵌入式软硬件设计咨询 • 8位 16位 32位 64位 RISC DSP
主页文章 方案 产品 下载反馈
 
2004 RTEMS.NET 版权所有