Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Помогите начать работать с RTX для ARM в Keil
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
Mik174
Помогите начать работать с RTX для ARM в Keil
Никак не получается стартовать, простейшая программа не работает...

Пробую сделать программу, которая просто мигает светодиодами, подключенными к контроллеру LPC2148.
Идея такая: есть две задачи, в одной светодиоды зажигаются, в другой гаснут.
За основу взял программу, приведенную в описании на RTX, только увеличил длительность пауз - вместо 20 и 50 мс стало по 100 мс, и добавил в начале строку настройки портов, а в функциях, описывающих задачи, добавил две строки - в одной зажигание светодиодов, во второй - их погашение.
Для того, чтобы убедиться в том, что нет ошибки с портами, в самом начале, до инициализации ядра ОС, сделал цикл, в котором светодиоды должны мигнуть 10 раз.
При включении светодиоды мигают, и на этом все останавливается...
Пробовал убирать все из функции main(), кроме инициализации ядра, все равно не работает...
В настройках проекта указал Operating system: RTX kernel
Длительность одного тика не изменял, стоит как по-умолчанию - 10 мс.

Текст программы:
Код
#include <LPC214x.h>
#include <RTL.h>                      // RTX kernel functions & defines

OS_TID id1, id2;    // id1, id2 will contain task identifications at run-time

/* Forward reference */
void task1 (void) __task;
void task2 (void) __task;

//----------------------------------------------------------------------------
//   Task 1:  RTX Kernel starts this task with os_sys_init (task1)
//---------------------------------------------------------------------------
void task1 (void) __task
{
   id1 = os_tsk_self ();                // Obtain own system task identification number
   id2 = os_tsk_create (task2, 1);        // Assign system identification number of task2 to id2
   for (;;)        // do-this
  {    
   os_evt_set (0x0004, id2);            // Indicate to task2 completion of do-this
   os_evt_wait_or (0x0004, 0xffff);        // Wait for completion of do-that (0xffff means no time-out)

   IOSET1 = 0x00ff0000;

   os_dly_wait (10);                    // Wait now for 100 ms
  }
}

//----------------------------------------------------------------------------
//   Task 2:  RTX Kernel starts this task with os_tsk_create (task2, 1)
//---------------------------------------------------------------------------
void task2 (void) __task
{                // do-that
  for (;;)
  {    
    os_evt_wait_or (0x0004, 0xffff);    // Wait for completion of do-this (0xffff means no time-out)    

    IOCLR1 = 0x00ff0000;

    os_dly_wait (10);                    // Pause for 100 ms until signaling event to task1
    os_evt_set (0x0004, id1);            // Indicate to task1 completion of do-that
  }
}

//----------------------------------------------------------------------------
//        Main: Initialize and start RTX Kernel
//---------------------------------------------------------------------------
int main (void)
{
  unsigned long delay, num;

  IODIR1 = 0x00ff0000;

for(num=0;num<10;num++)
{
  IOSET1 = 0x00ff0000;
  for (delay=0;delay<0x70000;delay++);

  IOCLR1 = 0x00ff0000;
  for (delay=0;delay<0x70000;delay++);
}

os_sys_init (task1);
}

//----------------------------------------------------------------------------
// end of file
//---------------------------------------------------------------------------
VAI
Разбиратся в коде времени нет, извините.
"...Keil\ARM\Boards\Keil\MCB2140\RTX_Blinky\" смотрели?
Много примеров в папках:
"...Keil\ARM\Boards"
"...Keil\ARM\Examples"
"...Keil\ARM\RL\RTX\Examples\"
Ну и файл хелпа "...\Keil\ARM\Hlp\rlarm.chm"
DmitryV
Варианты:

1. В стартовом коде не убрана заглушка для программного прерывания (SWI). Это надо сделать в двух местах, или ОС не будет работать. Еще нужно сделать IMPORT SWI_Handler.
2. Может быть ошибка в синхронизации между задачами. Попробуйте для начала сделать мигание в одной задаче.
Paramon
С таким примером не знаком. У меня подругому
Код
...
OS_TID tsk1, tsk2, tsk3;
...

void task1 (void) __task;
void task2 (void) __task;
void task3 (void) __task;
...

// task1
void task1 (void) __task



С таким примером не знаком. У меня подругому
[code]

...
OS_TID tsk1, tsk2, tsk3;
...

void task1 (void) __task;
void task2 (void) __task;
void task3 (void) __task;
...

// task1
void task1 (void) __task
{
tsk2 = os_tsk_create (task2, 0); // Уточните приоритет 0 - авто (у вас 1 !!!!!!)
tsk3 = os_tsk_create (task3, 0); //
.... //тут "грохнуть task1
}

void task2 (void) __task




С таким примером не знаком. У меня подругому
[code]

...
OS_TID tsk1, tsk2, tsk3;
...

void task1 (void) __task;
void task2 (void) __task;
void task3 (void) __task;
...

// task1
void task1 (void) __task
{
tsk2 = os_tsk_create (task2, 0); // Уточните приоритет 0 - авто (у вас 1 !!!!!!)
tsk3 = os_tsk_create (task3, 0); //
.... //тут "грохнуть" task1
}

void task2 (void) __task
{
while(1)
{
...
}
}

void task3 (void) __task
{
while(1)
{
...
}
}


void main(void)
{
....
  os_sys_init (task1);
//....
}


мне сомнителен парметр приоритета. Возмодно я не прав (давно это было).
В Кейле в симуляторе посмотрите распределение времени для процессов. Там очень легко это выяснить.
с уважением Paramon!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.