Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Не работает os_wait для RTX-166 Tiny (Keil)
Форум разработчиков электроники ELECTRONIX.ru > Cистемный уровень проектирования > Операционные системы
IvanObs
Доброго времени суток! Не работает os_wait для RTX-166 Tiny (Keil).

Задача:
- мигать диодом

Код
#include <reg166.h>                  // special function registers 80C166
#include <rtx166t.h>                 // RTX-166 tiny functions & defines

#define BLINKING  0                   // task number of task:  blinking

sbit  vd = P2^1;                         // I/O Pin:  vd    lamp output

/******************************************************************************/
//                              Task 0 'blinking'
/******************************************************************************/
void blinking (void) _task_ BLINKING  {        // blink vd
  DP2 = 0xFFFF;                                          // data direction register
  vd = 0;                                                    // all lights off
  while (1)  {                                              // endless loop

    vd = 1;                                                 // vd light on
    os_wait (K_TMO, 300, 0);                       // wait for timeout: 300 ticks
    vd = 0;                                                 // vd light off
    os_wait (K_TMO, 300, 0);                       // wait for timeout: 300 ticks
  }

}


Причём:
- в дебагере работает, а на железе - нет
- сам hex-файл загружается нормально.

То что грузиться нормально, проверил так:
- сначала загрузил этот код:
Код
#include <reg166.h>                  // special function registers 80C166
#include <rtx166t.h>                 // RTX-166 tiny functions & defines

#define BLINKING  0                   // task number of task:  blinking

sbit  vd = P2^1;                         // I/O Pin:  vd    lamp output

/******************************************************************************/
//                              Task 0 'blinking'
/******************************************************************************/
void blinking (void) _task_ BLINKING  {        // blink vd
  DP2 = 0xFFFF;                                          // data direction register
  vd = 0;                                                    // all lights off
  while (1)  {                                              // endless loop
  }

}


Диод не загорелся.

- потом загрузил этот код:
Код
#include <reg166.h>                  // special function registers 80C166
#include <rtx166t.h>                 // RTX-166 tiny functions & defines

#define BLINKING  0                   // task number of task:  blinking

sbit  vd = P2^1;                         // I/O Pin:  vd    lamp output

/******************************************************************************/
//                              Task 0 'blinking'
/******************************************************************************/
void blinking (void) _task_ BLINKING  {       // blink vd
  DP2 = 0xFFFF;                                         // data direction register
  vd = 1;                                                   // vd light on
  while (1)  {                                             // endless loop
  }

}


Диод загорелся.

А мигать не получается

Использовал Startup по умолчанию.
gosha
Внутрисхемная отладка не работает?
IvanObs
Цитата(gosha @ Jun 2 2011, 09:20) *
Внутрисхемная отладка не работает?


Я не знаю, как её реализовать. Если есть возможность по шагам выполнять программу прямо на аппаратуре, то было бы проще. Очень нужно что бы эта программа заработала. Мучаюсь не могу разобраться.

Моё последнее достижение - проверка того, что возвращает функция os_wait (K_TMO, 1000, 0), здесь K_TMO-таймаут (задержка) на 1 секунду. В зависимости от возвращаемого значения загорается тот или иной диод. У меня загорается VD4. Пробовал на разных контроллерах. Проверил, что VD4 загорается в тему, менял VD4 (на другие порты). То есть os_wait () срабатывает с ошибкой и возвращает не то что нужно.

Ещё оно наблюдение. Если раскомментировать настройку последовательного канала передачи, то диод вообще не загорится. И я не могу проверить какое число возвращает функция os_wait().

Лазал в исходный код этой операционной систеты (RTX-166 Tiny). Там есть реализация os_wait() на ассемблере, буду разбираться, может пойму. Может внутрисхемная отладка выручит?

Код:
Код
#include <reg166.h>                   /* special function registers 80C166    */
#include <rtx166t.h>                  /* RTX-166 tiny functions & defines     */

#define BLINKING  0                   /* task number of task:  blinking       */

sbit  vd1 = P2^1;                      /* I/O Pin:  vd    lamp output          */
sbit  vd2 = P2^2;                      /* I/O Pin:  vd    lamp output          */
sbit  vd3 = P2^3;                      /* I/O Pin:  vd    lamp output          */
sbit  vd4 = P2^0;                      /* I/O Pin:  vd    lamp output          */
int idata event;
/******************************************************************************/
/*        Task 3 'blinking':                       */
/******************************************************************************/
void blinking (void) _task_ BLINKING  {        /* blink vd                    */

//  P3  |= 0x0400;             /* set PORT 3.10 output latch (TXD)              */
//  DP3 |= 0x0400;             /* set PORT 3.10 direction control (TXD output)  */
//  DP3 &= 0xF7FF;             /* reset PORT 3.11 direction control (RXD input) */
//  S0TIC = 0x45;              /* transmit interrupt enable; ILVL = 1; GLVL = 1 */
//  S0RIC = 0x46;              /* receive  interrupt enable; ILVL = 1; GLVL = 2 */
//  S0BG  = 15;              /* set baudrate to 57600 BAUD                    */
//  S0CON = 0x8011;            /* set serial mode                               */

  DP2 = 0xFFFF;                                /* data direction register     */
  
  vd1 = 0;                                      /* all lights off              */
  vd2 = 0;                                      /* all lights off              */
  vd3 = 0;                                      /* all lights off              */
  vd4 = 0;                                      /* all lights off              */

    event = os_wait (K_TMO, 1000, 0);                  /* wait for timeout: 1000 ticks */
  switch (event)
    {
    case NOT_OK:
      vd1 = 1;
      break;
    case TMO_EVENT:
      vd2 = 1;

      break;
    case SIG_EVENT:
      vd3 = 1;
      break;
    default:
      vd4 = 1;
      break;
   }

  while (1)  {                                 /* endless loop                */
  }


}
Аматер
Я обычно брал стандартный пример и переделывал.
С 166 не работал, но думаю стоит обратить внимание на startup.
IvanObs
Цитата(Аматер @ Jun 14 2011, 12:03) *
Я обычно брал стандартный пример и переделывал.
С 166 не работал, но думаю стоит обратить внимание на startup.

Спасибо! Но пока я проблему не решил, но буду пытаться. На данный момент плюнул на RTOS для С166 решил начать с малого. Написал программатор для at89s52. Мне только несколько раз удалось его прошить, теперь не хочет. Идея есть - прошить в него RTOS 8052 от того же Keil'a. Прошить at89s52 ничем больше не удавалось. Перепробовал множество программаторов. Не везёт, так не везёт crying.gif
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.