Перейти к содержанию
    

Добрый день, коллеги!

 

Мучаю пример от Keil конфигурации ОСРВ RL-ARM для USB Device класса HID на отладочной плате MCB1700. Как только добавляю еще один процесс в ОСРВ, она сразу же перестает работать. А конкретнее, только разкомментирую строчки, где создается task KEYREAD и само описание KEYREAD, на дисплее даже надписи не высвечиваются, а также компьютер не видит USB устройство. Подскажите, с чем это может быть связано?

 

/*----------------------------------------------------------------------------

* RL-ARM - USB

*----------------------------------------------------------------------------

* Name: USBD_Demo.c

* Purpose: USB Device Demonstration

* Rev.: V4.20

*----------------------------------------------------------------------------

* This code is part of the RealView Run-Time Library.

* Copyright © 2004-2011 KEIL - An ARM Company. All rights reserved.

*---------------------------------------------------------------------------*/

 

#include <RTL.h>

#include <rl_usb.h>

#include "GLCD.h"

#include <LPC17xx.h>

#include "KBD.h"

#include "stdio.h"

 

 

OS_TID t_keyread; /* assigned task id of task: keyread */

 

 

 

__task void keyread (void);

 

 

 

/*----------------------------------------------------------------------------

* Task 1 'init': Initialize

*---------------------------------------------------------------------------*/

 

__task void init (void) {

GLCD_Init ();

GLCD_Clear (Blue);

GLCD_SetBackColor (Blue);

GLCD_SetTextColor (White);

GLCD_DisplayString (4, 0, 1, " USB HID ");

GLCD_DisplayString (5, 0, 1, " DRM Manage ");

KBD_Init ();

 

os_tsk_prio_self(100);

usbd_init(); /* USB Device Initialization */

usbd_connect(__TRUE); /* USB Device Connect */

// t_keyread = os_tsk_create (keyread,0); /* start keyread task */

 

os_tsk_delete_self(); /* Terminate Task */

}

 

int main (void) {

 

os_sys_init(init); /* Init RTX and start 'init' */

}

 

///*----------------------------------------------------------------------------

// * Task 6 'keyread'

// *---------------------------------------------------------------------------*/

__task void keyread (void) {

uint32_t kbd_val;

short AD_value;

kbd_val = (LPC_GPIO1->FIOPIN >> 20) & KBD_MASK;

while (1) { /* endless loop */

 

if (KBD_Get () !=0x079) {

AD_value = kbd_val;

printf ("AD value = 0x%03x\n\r",AD_value);

}

// os_dly_wait (5); /* wait for timeout: 5 ticks */

}

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И еще один вопрос, знаете ли Вы программы-аналоги Bushound (требуется отслеживать прием трафика по USB и самое главное - отсылать команды)? это удачная программа, но запускается только в демо режиме.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

И еще один вопрос, знаете ли Вы программы-аналоги Bushound (требуется отслеживать прием трафика по USB и самое главное - отсылать команды)? это удачная программа, но запускается только в демо режиме.

на торренте лежит с таблеткой

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

на торренте лежит с таблеткой

 

А не могли бы Вы подсказать на каком конкретно торренте? Ибо я искал Bushound и на торрентах тоже... Не нашел (

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А не могли бы Вы подсказать на каком конкретно торренте? Ибо я искал Bushound и на торрентах тоже... Не нашел (

rutracker.org

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

rutracker.org

Спасибо! Действительно там лежала, родимая! И работает)

 

 

А вот проблема, озвученная/написанная в начале темы, так и не исчезла... Наверное я с операционной системой неправильно работаю? Если в режиме отладки смотреть, то запущен task os_idle_demon, остальные (USBD_RTX_Core и USBD_RTX_EndPoint1) находятся в состоянии wait_or. Если же строчки моего кода раскомментировать, то вообще все ломается... и даже в режиме отладки не работает

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Какие приоритеты у остальных задач, созданных в системе?

А эта строчка

// os_dly_wait (5); /* wait for timeout: 5 ticks */

была закомментирована, когда вставлялось создание keyread? Если все задачи с одинаковым приоритетом, то без os_dly_wait, keyread управление не отдаст.

 

на дисплее даже надписи не высвечиваются, а также компьютер не видит USB устройство.

тут надо видеть код GLCD_DisplayString (4, 0, 1, " USB HID "); реализации чтоб делать выводы почему ничего не отображается. Возможно причина та же - почему-то не передается управление между задачами.

Если же строчки моего кода раскомментировать, то вообще все ломается... и даже в режиме отладки не работает

Что значит ничего не работает? До какого места доходит отладчиком? Точки останова в начале main и init ставились? до них доходит?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Что значит ничего не работает? До какого места доходит отладчиком? Точки останова в начале main и init ставились? до них доходит?

В случае разкомментированного кода: отладчик в файле startup_LPC17xx.s проходит SystemInit, доходит до __main и после на строчку BX R0. После этого в окне "Disassembly" попадает на строчку BEAB BKPT 0xAB и там останавливается...

Reset_Handler   PROC
                EXPORT  Reset_Handler             [WEAK]
                IMPORT  SystemInit
                IMPORT  __main
                LDR     R0, =SystemInit
                BLX     R0
                LDR     R0, =__main

Изменено пользователем cinema_effect

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В случае разкомментированного кода: отладчик в файле startup_LPC17xx.s проходит SystemInit, доходит до __main и после на строчку BX R0. После этого в окне "Disassembly" попадает на строчку BEAB BKPT 0xAB и там останавливается...

хм... тут дело даже не в RTX... какая-то фигня на этапе линковки... Или с конфигурацией чего-то не то...

Может чего подсказал бы более конкретно, но для этого надо видеть проект. У себя в Keil'е я этого примера не нашел.

 

 

Изменено пользователем Shein

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вроде разобрался тут с RTX, переписал task'и и заставил делать ОС различные задачки. Вроде все работало, однако потом решил все-таки что-нибудь вывести по COM. как только появляется функция printf - опять сразу ломается, на том же месте... Хм......

/*----------------------------------------------------------------------------
*      RL-ARM - USB
*----------------------------------------------------------------------------
*      Name:    USBD_Demo.c
*      Purpose: USB Device Demonstration
*      Rev.:    V4.20
*----------------------------------------------------------------------------
*      This code is part of the RealView Run-Time Library.
*      Copyright (c) 2004-2011 KEIL - An ARM Company. All rights reserved.
*---------------------------------------------------------------------------*/

#include <RTL.h>
#include <rl_usb.h>
#include "GLCD.h"
#include <LPC17xx.h>
#include "KBD.h"
#include "stdio.h"

extern void getline (char *, int);    /* external function:  input line      */
extern int  getkey  (void);           /* external function:  input character */

OS_TID t_UART;                      /* assigned task id of task: lights    */
OS_TID t_keyread;                     /* assigned task id of task: keyread   */
OS_TID t_Command_to_GLSD_from_Joystick;                          /* Add by Me     */
OS_TID t_USB_Out_report;                      /* Add by Me     */

__task void keyread (void);
__task void Command_to_GLSD_from_Joystick (void);
__task void USB_Out_report (void);
__task void UART (void);

/*----------------------------------------------------------------------------
*        Task 1 'init': Initialize
*---------------------------------------------------------------------------*/

__task void init (void) {
  GLCD_Init          ();
  GLCD_Clear         (Blue);
  GLCD_SetBackColor  (Blue);
  GLCD_SetTextColor  (White);
  GLCD_DisplayString (4, 0, 1, "  USB HID      ");
  GLCD_DisplayString (5, 0, 1, "  DRM Manage   ");
  KBD_Init ();

  os_tsk_prio_self(100);
  usbd_init();                          /* USB Device Initialization          */
  usbd_connect(__TRUE);                 /* USB Device Connect                 */
  t_keyread = os_tsk_create (keyread,0); /* start keyread task               */
  t_Command_to_GLSD_from_Joystick = os_tsk_create (Command_to_GLSD_from_Joystick, 0);
  os_tsk_delete_self();                 /* Terminate Task                     */
}

int main (void) {

  os_sys_init(init);                    /* Init RTX and start 'init'          */
//  t_keyread = os_tsk_create (keyread,0);
//  t_Command_to_GLSD_from_Joystick = os_tsk_create (Command_to_GLSD_from_Joystick, 0);
}

///*----------------------------------------------------------------------------
// *        Task 2 'keyread'
// *---------------------------------------------------------------------------*/
__task void keyread (void) {

  while (1) {                                 /* endless loop                */
    if (INT0_Get() == 0) {                    /* if key pressed              */
      os_evt_set (0x0010, t_UART);          /* send signal to task UART  */
    }

    if (KBD_Get () !=0x079) {
      os_evt_set (0x0004, t_Command_to_GLSD_from_Joystick);

      }

  }
}

///*----------------------------------------------------------------------------
// *        Task 3 'Command_to_GLSD_from_Joystick'
// *---------------------------------------------------------------------------*/
__task void Command_to_GLSD_from_Joystick (void) {
    uint32_t kbd_val;

     while (1) {

     os_evt_wait_or (0x0004, 0xffff);

kbd_val = (LPC_GPIO1->FIOPIN >> 20) & KBD_MASK;

  
  if ((kbd_val & KBD_UP)     == 0) GLCD_DisplayString (4, 0, 1, "  USB UP      ");/* up     pressed means 0    */
  if ((kbd_val & KBD_LEFT)   == 0) GLCD_DisplayString (5, 0, 1, "  USB Left      "); /* left   pressed means 0    */
  if ((kbd_val & KBD_RIGHT)  == 0) GLCD_DisplayString (6, 0, 1, "  USB Right      "); /* right  pressed means 0    */
  if ((kbd_val & KBD_SELECT) == 0) GLCD_DisplayString (7, 0, 1, "  USB Select      "); /* select pressed means 0    */
  if ((kbd_val & KBD_DOWN)   == 0) GLCD_DisplayString (8, 0, 1, "  USB Down      "); /* down   pressed means 0    */


      }
    }

///*----------------------------------------------------------------------------
// *        Task 4 'UART'
// *---------------------------------------------------------------------------*/
__task void UART (void) {
   

   while (1) {
       os_evt_wait_or (0x0010, 0xffff);
//     printf ("\nCommand: ");
     os_dly_wait (50);
        }

}

 

Стоит разкомментировать строчку с printf в task UART и сразу же те же проблемы

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как уже написали выше, для работы printf нужно определить функцию fputc.

Как это сделать можно взять из примеров, там, как правило, есть файл serial.c (бывает еще и retarget.c) Там определяется fputc. иногда и fgetc. Естественно, перед первым вызовом printf UART уже должен бть инициализирован.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как уже написали выше, для работы printf нужно определить функцию fputc.

Как это сделать можно взять из примеров, там, как правило, есть файл serial.c (бывает еще и retarget.c) Там определяется fputc. иногда и fgetc. Естественно, перед первым вызовом printf UART уже должен бть инициализирован.

Спасибо, точно именно этого и не хватало! Сейчас заработало и выводится то, что нужно. Конечно еще остались некоторые проблемы, видимо не правильно использую функцию os_evt_ХХХ.

 

Насколько я понял из документации, os_evt_set (флаг, task) - устанавливает флаг и соответствующую ему задачу.

 

os_evt_wait_or (флаг, время ожидания флага) - должна быть прописана в task и как раз и ждет флага. когда os_evt_set (флаг, task) устанавливает этот флаг, os_evt_wait_or (флаг, время ожидания флага) дождавшись его начинает выполнение соответствующего task

 

os_evt_clear (флаг, task) - когда нужно ее применять и где правильно необходимо применять?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

os_evt_clear (флаг, task) - когда нужно ее применять и где правильно необходимо применять?

да как раз перед ожиданием флага, его, родимого, и сбрасываем для уверенности :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

os_evt_clear (флаг, task) - когда нужно ее применять и где правильно необходимо применять?

никогда, нигде... IMHO.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...