int main() {
  int rv = 0;	/* Program exit code */

  qos_log_debug("Initializing qres library");
  qos_chk_ok_exit(qres_init());

  pthread_t child_tid;
  void *child_rv;
  qos_chk_exit(pthread_create(&child_tid, NULL, main_loop, (void *) &params) == 0);

  main_loop(&params);

  pthread_join(child_tid, &child_rv);

  qos_log_debug("Finalizing QRES library");
  qos_chk_ok_exit(qres_cleanup());

  /* Failure of either father or child implies failure of program */
  return rv | (int) (long) child_rv;	// Double cast needed for 64-bit compatibility
}
Exemple #2
0
rtems_task Init(
  rtems_task_argument argument
)
{
  rtems_status_code status;
  qres_sid_t server_id, server_id2;
  time_t approved_budget, exec_time, abs_time, current_budget;
  qres_params_t params, params1, params2, params3, params4;

  Priority = 30;
  Period    = 30;
  Execution = 10;
  Phase = 0;

  params.P = 1;
  params.Q = 1;

  params1 = params2 = params3 = params4 = params;
  params1.Q = -1;
  params2.Q = SCHEDULER_EDF_PRIO_MSB + 1;
  params3.P = -1;
  params4.P = SCHEDULER_EDF_PRIO_MSB + 1;

  TEST_BEGIN();


  status = rtems_task_create(
    rtems_build_name( 'P', 'T', '1', ' ' ),
    Priority,
    RTEMS_MINIMUM_STACK_SIZE * 4,
    RTEMS_DEFAULT_MODES,
    RTEMS_DEFAULT_ATTRIBUTES,
    &Task_id
  );
  directive_failed( status, "rtems_task_create loop" );

  printf( "Init: Initializing the qres library\n" );
  if ( qres_init() )
    printf( "ERROR: QRES INITIALIZATION FAILED\n" );

  /* Error checks for Create server and Destroy server  */
  printf( "Init: Create server and Destroy server\n" );
  if ( qres_destroy_server( -5 ) !=
       QOS_E_INVALID_PARAM )
    printf( "ERROR: DESTROY SERVER PASSED UNEXPECTEDLY\n" );
  if ( qres_destroy_server( 5 ) !=
       QOS_E_INVALID_PARAM )
    printf( "ERROR: DESTROY SERVER PASSED UNEXPECTEDLY\n" );
  if ( qres_destroy_server( 0 ) != QOS_E_NOSERVER )
    printf( "ERROR: DESTROY SERVER PASSED UNEXPECTEDLY\n" );
  if ( qres_create_server( &params1, &server_id ) !=
       QOS_E_INVALID_PARAM )
    printf( "ERROR: CREATE SERVER PASSED UNEXPECTEDLY\n" );
  if ( qres_create_server( &params2, &server_id ) !=
       QOS_E_INVALID_PARAM )
    printf( "ERROR: CREATE SERVER PASSED UNEXPECTEDLY\n" );
  if ( qres_create_server( &params3, &server_id ) !=
       QOS_E_INVALID_PARAM )
    printf( "ERROR: CREATE SERVER PASSED UNEXPECTEDLY\n" );
  if ( qres_create_server( &params4, &server_id ) !=
       QOS_E_INVALID_PARAM )
    printf( "ERROR: CREATE SERVER PASSED UNEXPECTEDLY\n" );
  if ( qres_create_server( &params, &server_id2 ) )
    printf( "ERROR: CREATE SERVER FAILED\n" );
  if ( qres_create_server( &params, &server_id ) )
    printf( "ERROR: CREATE SERVER FAILED\n" );
  if ( qres_create_server( &params, &server_id ) !=
       QOS_E_FULL )
    printf( "ERROR: CREATE SERVER PASSED UNEXPECTEDLY\n" );

  /* Error checks for Attach thread and Detach thread */
  printf( "Init: Attach thread\n" );
  if ( qres_attach_thread( -5, 0, RTEMS_SELF ) !=
       QOS_E_INVALID_PARAM )
    printf( "ERROR: ATTACH THREAD PASSED UNEXPECTEDLY\n" );
  if ( qres_attach_thread( 5, 0, RTEMS_SELF ) !=
       QOS_E_INVALID_PARAM )
    printf( "ERROR: ATTACH THREAD PASSED UNEXPECTEDLY\n" );
  if ( qres_attach_thread( server_id, 0, 1234 ) !=
       QOS_E_INVALID_PARAM )
    printf( "ERROR: ATTACH THREAD PASSED UNEXPECTEDLY\n" );
  if ( qres_attach_thread( server_id, 0, RTEMS_SELF ) )
    printf( "ERROR: ATTACH THREAD FAILED\n" );
  if ( qres_attach_thread( server_id, 0, RTEMS_SELF ) !=
       QOS_E_FULL )
    printf( "ERROR: ATTACH THREAD AGAIN PASSED UNEXPECTEDLY\n" );
  if ( qres_attach_thread( server_id, 0, Task_id ) !=
       QOS_E_FULL )
    printf( "ERROR: ATTACH THREAD TO FULL SERVER PASSED UNEXPECTEDLY \n" );
  if ( qres_destroy_server( server_id ) )
    printf( "ERROR: DESTROY SERVER WITH THREAD ATTACHED FAILED\n" );
  if ( qres_attach_thread( server_id, 0, RTEMS_SELF ) !=
       QOS_E_NOSERVER )
    printf( "ERROR: ATTACH THREAD PASSED UNEXPECTEDLY\n" );

  printf( "Init: Detach thread\n" );
  if ( qres_detach_thread( -5, 0, RTEMS_SELF ) !=
       QOS_E_INVALID_PARAM )
    printf( "ERROR: DETACH THREAD PASSED UNEXPECTEDLY\n" );
  if ( qres_detach_thread( 5, 0, RTEMS_SELF ) !=
       QOS_E_INVALID_PARAM )
    printf( "ERROR: DETACH THREAD PASSED UNEXPECTEDLY\n" );
  if ( qres_detach_thread( server_id2, 0, 1234 ) !=
       QOS_E_INVALID_PARAM )
    printf( "ERROR: DETACH THREAD PASSED UNEXPECTEDLY \n" );
  if ( qres_detach_thread( server_id, 0, RTEMS_SELF ) !=
       QOS_E_NOSERVER )
    printf( "ERROR: DETACH THREAD PASSED UNEXPECTEDLY4\n" );
  qres_destroy_server( server_id2 );

  /* Error checks for Set params and Get params */
  printf( "Init: Set params and Get params\n" );
  if ( qres_set_params( -5, &params ) !=
       QOS_E_INVALID_PARAM )
    printf( "ERROR: SET PARAMS PASSED UNEXPECTEDLY\n" );
  if ( qres_set_params( 5, &params ) !=
       QOS_E_INVALID_PARAM )
    printf( "ERROR: SET PARAMS PASSED UNEXPECTEDLY\n" );
  if ( qres_set_params( server_id, &params ) !=
       QOS_E_NOSERVER )
    printf( "ERROR: SET PARAMS PASSED UNEXPECTEDLY\n" );

  if ( qres_get_params( -5, &params ) !=
       QOS_E_INVALID_PARAM )
    printf( "ERROR: GET PARAMS PASSED UNEXPECTEDLY\n" );
  if ( qres_get_params( 5, &params ) !=
       QOS_E_INVALID_PARAM )
    printf( "ERROR: GET PARAMS PASSED UNEXPECTEDLY\n" );
  if ( qres_get_params( server_id, &params ) !=
       QOS_E_NOSERVER )
    printf( "ERROR: GET PARAMS PASSED UNEXPECTEDLY\n" );

  if ( qres_set_params( server_id, &params1 ) !=
       QOS_E_INVALID_PARAM )
    printf( "ERROR: SET PARAMS PASSED UNEXPECTEDLY\n" );
  if ( qres_set_params( server_id, &params2 ) !=
       QOS_E_INVALID_PARAM )
    printf( "ERROR: SET PARAMS PASSED UNEXPECTEDLY\n" );
  if ( qres_set_params( server_id, &params3 ) !=
       QOS_E_INVALID_PARAM )
    printf( "ERROR: SET PARAMS PASSED UNEXPECTEDLY\n" );
  if ( qres_set_params( server_id, &params4 ) !=
       QOS_E_INVALID_PARAM )
    printf( "ERROR: SET PARAMS PASSED UNEXPECTEDLY\n" );

  /* Error checks for Get server id */
  printf( "Init: Get server id\n" );
  if ( qres_get_sid( 0, RTEMS_SELF, &server_id ) !=
       QOS_E_NOSERVER )
    printf( "ERROR: GET SERVER ID PASSED UNEXPECTEDLY\n" );

  /* Error checks for Get approved budget */
  printf( "Init: Get approved budget\n" );
  if ( qres_get_appr_budget( -5, &approved_budget ) !=
       QOS_E_INVALID_PARAM )
    printf( "ERROR: GET APPROVED BUDGET PASSED UNEXPECTEDLY\n" );
  if ( qres_get_appr_budget( 5, &approved_budget ) !=
       QOS_E_INVALID_PARAM )
    printf( "ERROR: GET APPROVED BUDGET PASSED UNEXPECTEDLY\n" );
  if ( qres_get_appr_budget( server_id, &approved_budget ) !=
       QOS_E_NOSERVER )
    printf( "ERROR: GET APPROVED BUDGET PASSED UNEXPECTEDLY\n" );

  /* Error checks for Get current budget */
  printf( "Init: Get current budget\n" );
  if ( qres_get_curr_budget( -5, &current_budget ) !=
       QOS_E_INVALID_PARAM )
    printf( "ERROR: GET REMAINING BUDGET PASSED UNEXPECTEDLY\n" );
  if ( qres_get_curr_budget( 5, &current_budget ) !=
       QOS_E_INVALID_PARAM )
    printf( "ERROR: GET REMAINING BUDGET PASSED UNEXPECTEDLY\n" );
  if ( qres_get_curr_budget( server_id, &current_budget ) !=
       QOS_E_NOSERVER )
    printf( "ERROR: GET REMAINING BUDGET PASSED UNEXPECTEDLY\n" );

  /* Error checks for Get execution time */
  printf( "Init: Get execution time\n" );
  if ( qres_get_exec_time( -5, &exec_time, &abs_time ) !=
       QOS_E_INVALID_PARAM )
    printf( "ERROR: GET EXECUTION TIME PASSED UNEXPECTEDLY\n" );
  if ( qres_get_exec_time( 5, &exec_time, &abs_time ) !=
       QOS_E_INVALID_PARAM )
    printf( "ERROR: GET EXECUTION TIME PASSED UNEXPECTEDLY\n" );
  if ( qres_get_exec_time( server_id, &exec_time, &abs_time ) !=
       QOS_E_NOSERVER )
    printf( "ERROR: GET EXECUTION TIME PASSED UNEXPECTEDLY\n" );

  /* Restart QRES library */
  printf( "Init: Cleaning up QRES\n" );
  if ( qres_cleanup() )
    printf( "ERROR: QRES CLEANUP FAILED\n" );
  printf( "Init: Initializing the QRES\n" );
  if ( qres_init() )
    printf( "ERROR: QRES INITIALIZATION FAILED\n" );

  /* Start periodic task */
  printf( "Init: Starting periodic task\n" );
  status = rtems_task_start( Task_id, Task_Periodic, 1 );
  directive_failed( status, "rtems_task_start periodic" );

  status = rtems_task_delete( RTEMS_SELF );
  directive_failed( status, "rtems_task_delete of RTEMS_SELF" );
}
Exemple #3
0
/** Initialize the module - Register the character device	*/
static int qres_init_module(void) {

  qos_rv rv;
  kal_irq_state flags;

  //kal_spin_lock_irqsave(rres_get_spinlock(), &flags);

  qres_init();
  qos_log_debug("Initing QSUP");
  if ((rv = qsup_init_ks()) != QOS_OK) {
    qos_log_crit("qsup_init_ks() failed: %s", qos_strerror(rv));
    qres_cleanup();
    goto err;
  }

//  start_timer_thread();

#ifdef QSUP_DYNAMIC_RECLAIM
  write_lock(&hook_lock);
  old_block_hook = block_hook;
  old_unblock_hook = unblock_hook;
  old_stop_hook = stop_hook;
  old_continue_hook = continue_hook;
  block_hook = qres_block_hook;
  unblock_hook = qres_unblock_hook;
  stop_hook = qres_stop_hook;
  continue_hook = qres_continue_hook;
  write_unlock(&hook_lock);
#endif

  qos_log_debug("qres module initialization finished");

  //kal_spin_unlock_irqrestore(rres_get_spinlock(), &flags);

  /* Device registration should be done when kernel module is
   * already able to accept ioctl requests. Furthermore, spinlocks
   * cannot be held because it might sleep.
   */
  if (qos_dev_register(&qres_dev_info, QRES_DEV_NAME, QRES_MAJOR_NUM, &Fops) != QOS_OK) {
    qos_log_crit("Registration of device %s failed", QRES_DEV_NAME);
  } else {
    qos_log_info("Registered QRES device with major device number %d.", MAJOR(qres_dev_info.dev_num));
    qos_log_info("If you want to talk to the device driver,");
    qos_log_info("you'll have to create a device file. ");
    qos_log_info("We suggest you use:");
    qos_log_info("mknod %s c %d 0", QRES_DEV_NAME, MAJOR(qres_dev_info.dev_num));
  }

  qsup_dev_register();

  /** ProcFS-related functions may sleep, so no spinlock should be held **/
  if (qres_proc_register())
    qos_log_err("Failed to register qres module in /proc filesystem");

  return 0;

 err:

  //kal_spin_unlock_irqrestore(rres_get_spinlock(), &flags);
  return -1;
}