各位好~我创建了多个任务,任务1~任务5,在任务1中使用了人工任务轮转rtems_task_wake_after(RTEMS_YIELD_PROCESSOR),想改变任务1的执行顺序。 |
我的代码是:
#include "s3c2410.h"
#include <bsp.h>
#include <stdlib.h>
#include <stdio.h>
#include <irq.h>
rtems_task Task_1( rtems_task_argument argument);
rtems_task Task_2( rtems_task_argument argument);
rtems_task Task_3( rtems_task_argument argument);
rtems_task Task_4( rtems_task_argument argument);
rtems_task Task_5( rtems_task_argument argument);
rtems_id Task_id[ 6 ]; /* array of task ids */
rtems_name Task_name[ 6 ]; /* array of task names */
rtems_task_priority Task_priority[ 6]; /* array of task priority*/
unsigned int TICKS_PER_SECOND;
rtems_status_code status;
int check_flag=0; /*检查位标志,通过他,任务一判断是否进行人工任务轮转,该值可通过中断处理函数改变*/
int SEC_Sleep=3;
rtems_isr Inj_Fault_T (rtems_vector_number ignored) /*中断处理函数,由按钮1触发,用以改变check_flag值*/
{
printk("@@check_flag=2@@\n");
check_flag=2;
ClearPending(BIT_EINT0);
}
rtems_isr Mod_Fault_T(rtems_vector_number ignored) /*中断处理函数,由按钮2触发,用以恢复check_flag值*/
{
printk("@@check_flag=0@@\n");
check_flag=0;
ClearPending(BIT_EINT2);
}
rtems_task Init (rtems_task_argument ignored)
{
rtems_isr_entry old_service_routine;
rtems_mode previous_mode;
printf("*******Enter task********\n");
/*挂接中断*/
rtems_irq_connect_data interrupt_isr_data0= { 0, Inj_Fault_T, NULL, NULL, NULL, 0, 0 };
rtems_irq_connect_data interrupt_isr_data2= { 2, Mod_Fault_T, NULL, NULL, NULL, 0, 0};
BSP_install_rtems_irq_handler(&interrupt_isr_data0);
BSP_install_rtems_irq_handler(&interrupt_isr_data2);
rtems_interrupt_disable(level);
rtems_interrupt_catch( Inj_Fault_T, 0,&old_service_routine);
rtems_interrupt_catch( Mod_Fault_T, 2,&old_service_routine);
rtems_interrupt_enable(level);
Task_name[ 1 ] = rtems_build_name( 'T', 'A', 'K', '1');
Task_name[ 2 ] = rtems_build_name( 'T', 'A', 'K', '2');
Task_name[ 3 ] = rtems_build_name( 'T', 'A', 'K', '3');
Task_name[ 4 ] = rtems_build_name( 'T', 'A', 'K', '4');
Task_name[ 5 ] = rtems_build_name( 'T', 'A', 'K', '5');
Task_priority[1]=5;
Task_priority[2]=5;
Task_priority[3]=5;
Task_priority[4]=5;
Task_priority[5]=5;
/*创建5个任务,优先级相同*/
status = rtems_task_create(
Task_name[1],
Task_priority[1],
RTEMS_MINIMUM_STACK_SIZE,
RTEMS_NO_PREEMPT|RTEMS_NO_TIMESLICE|RTEMS_INTERRUPT_LEVEL(0),
RTEMS_DEFAULT_ATTRIBUTES,
&Task_id[1]
);
status = rtems_task_create(
Task_name[2],
Task_priority[2],
RTEMS_MINIMUM_STACK_SIZE,
RTEMS_NO_PREEMPT|RTEMS_NO_TIMESLICE|RTEMS_INTERRUPT_LEVEL(0),
RTEMS_DEFAULT_ATTRIBUTES,
&Task_id[2]
);
status = rtems_task_create(
Task_name[3],
Task_priority[3],
RTEMS_MINIMUM_STACK_SIZE,
RTEMS_NO_PREEMPT|RTEMS_NO_TIMESLICE|RTEMS_INTERRUPT_LEVEL(0),
RTEMS_DEFAULT_ATTRIBUTES,
&Task_id[3]
);
status = rtems_task_create(
Task_name[4],
Task_priority[4],
RTEMS_MINIMUM_STACK_SIZE,
RTEMS_NO_PREEMPT|RTEMS_NO_TIMESLICE|RTEMS_INTERRUPT_LEVEL(0),
RTEMS_DEFAULT_ATTRIBUTES,
&Task_id[4]
);
status = rtems_task_create(
Task_name[5],
Task_priority[5],
RTEMS_MINIMUM_STACK_SIZE,
RTEMS_NO_PREEMPT|RTEMS_NO_TIMESLICE|RTEMS_INTERRUPT_LEVEL(0),
RTEMS_DEFAULT_ATTRIBUTES,
&Task_id[5]
);
/*开启5个任务*/
status = rtems_task_start( Task_id[ 1 ], Task_1, 0 );
status = rtems_task_start( Task_id[ 2 ], Task_2, 0 );
status = rtems_task_start( Task_id[ 3 ], Task_3, 0 );
status = rtems_task_start( Task_id[ 4 ], Task_4, 0 );
status = rtems_task_start( Task_id[ 5 ], Task_5, 0 );
status = rtems_task_delete( RTEMS_SELF );
}
rtems_task Task_1(rtems_task_argument argument) /*任务1通过判断check_flag值是否为0,来进行人工任务轮转调度*/
{
int task1_count=1;
while(1)
{
printf("Task_1 while*****%d\n",task1_count++);
if(check_flag==0)
{
printf("**rtems_task_wake_after will be called**\n");
rtems_task_wake_after(RTEMS_YIELD_PROCESSOR);
}
else
{
printf("**Go on**\n");
}
rtems_task_wake_after( 3*TICKS_PER_SECOND );
}
}
rtems_task Task_2(rtems_task_argument argument)
{
int task2_count=1;
while(1)
{
printf("Task_2 while*****%d\n",task2_count++);
rtems_task_wake_after( 3*TICKS_PER_SECOND );
}
}
rtems_task Task_3(rtems_task_argument argument)
{
int task3_count=1;
while(1)
{
printf("Task_3 while*****%d\n",task3_count++);
rtems_task_wake_after( 3*TICKS_PER_SECOND );
}
}
rtems_task Task_4(rtems_task_argument argument)
{
int task4_count=1;
while(1)
{
printf("Task_4 while*****%d\n",task4_count++);
rtems_task_wake_after( 3*TICKS_PER_SECOND );
}
}
rtems_task Task_5(rtems_task_argument argument)
{
int task5_count=1;
while(1)
{
printf("Task_5 while*****%d\n",task5_count++);
rtems_task_wake_after( 3*TICKS_PER_SECOND );
}
}
/* configuration information */
#define CONFIGURE_APPLICATION_NEEDS_CLOCK_DRIVER
#define CONFIGURE_APPLICATION_NEEDS_CONSOLE_DRIVER
#define CONFIGURE_TICKS_PER_TIMESLICE 100
#define CONFIGURE_RTEMS_INIT_TASKS_TABLE /*使用Classic API提供的初始化任务表*/
#define CONFIGURE_EXTRA_TASK_STACKS (5 * RTEMS_MINIMUM_STACK_SIZE)
#define CONFIGURE_MAXIMUM_TASKS 6/*该应用程序可以包含的最大任务数*/
#define CONFIGURE_INIT
#include <rtems/confdefs.h>
/* end of file */
5个任务的优先级都为5,顺序为1(运行人工任务轮转),2,3,4,5;则执行后任务顺序变为:3,2,1,4,5.首先,2,3的顺序变了,其次1没有挂接到队列的最后。
若任务的顺序为1,2(运行人工任务轮转),3,4,5;则执行后任务顺序变为:1,3,4,2,5。
麻烦大家帮我分析一下是怎么回事?从哪里入手解决呢?