реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> Помогите начать работать с RTX для ARM в Keil
Mik174
сообщение Jul 15 2008, 14:55
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 357
Регистрация: 6-01-07
Пользователь №: 24 139



Помогите начать работать с 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
//---------------------------------------------------------------------------
Go to the top of the page
 
+Quote Post
VAI
сообщение Jul 16 2008, 03:32
Сообщение #2


Профессионал
*****

Группа: Модераторы
Сообщений: 1 120
Регистрация: 17-06-04
Пользователь №: 37



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


--------------------
Если зайца бить, его можно и спички научить зажигать
Сколько дурака не бей - умнее не будет. Зато опытнее
Go to the top of the page
 
+Quote Post
DmitryV
сообщение Jul 18 2008, 09:12
Сообщение #3


Участник
*

Группа: Новичок
Сообщений: 31
Регистрация: 16-06-06
Пользователь №: 18 105



Варианты:

1. В стартовом коде не убрана заглушка для программного прерывания (SWI). Это надо сделать в двух местах, или ОС не будет работать. Еще нужно сделать IMPORT SWI_Handler.
2. Может быть ошибка в синхронизации между задачами. Попробуйте для начала сделать мигание в одной задаче.
Go to the top of the page
 
+Quote Post
Paramon
сообщение Jul 18 2008, 12:37
Сообщение #4


Частый гость
**

Группа: Участник
Сообщений: 128
Регистрация: 5-10-06
Пользователь №: 20 997



С таким примером не знаком. У меня подругому
Код
...
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!
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 21st June 2025 - 12:03
Рейтинг@Mail.ru


Страница сгенерированна за 0.0137 секунд с 7
ELECTRONIX ©2004-2016