|
|
|
|||||
|
|
作者 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 版权所有 |
||||||||||||||||