请教使用RTEMS人工任务轮转rtems_task_wake_after(RTEMS_YIELD_PROCESSOR)的问题

67 views
Skip to first unread message

张冰雪

unread,
Aug 10, 2010, 11:28:05 PM8/10/10
to rtems-chines...@googlegroups.com
各位好~我创建了多个任务,任务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。
    麻烦大家帮我分析一下是怎么回事?从哪里入手解决呢?

baconxu

unread,
Aug 19, 2010, 11:00:58 PM8/19/10
to rtems-chinese-user-group
请问各位 Object_Information 中定义的:
 
Objects_Thread_queue_Extract_callout extract;
 
它主要完成的功能是什么?是做以下的工作吗?
 
当任务就绪从任务队列中解链时,如果是多处理器系统,任务需要告知该任务等待的实例,该对象已经由阻塞态进入就绪态。由于等待的实例和任务
有可能不在同一个节点上,需通过~MPCI~层通讯以同步所有处理器上该实例的状态。
 
谢谢
 baconxu

 2010-08-20
 
Reply all
Reply to author
Forward
0 new messages