Forum: Mikrocontroller und Digitale Elektronik Atmel UC3A (ECVK1100) - FreeRTOS und USB (CDC)


von brechbunkt (Gast)


Lesenswert?

Ich versuche gerade auf meinem Atmel UC3 das FreeRTOS und(!) USB (CDC) 
zum laufen zu bringen. Einzeln funktioniert es recht gut. Nur zusammen 
bringen lassen sie sich einfach nicht. Wenn ich die auskommentierte 
Zeile im Code (unten) einfüge, geht schon nichts mehr. Halte ich den 
Controller im Debug-Mode dann, sehe ich dass er in der Datei exception.S 
bei diesen Zeile steht:
1
  .org  0x034
2
  // Data Address (Read).
3
_handle_Data_Address_Read:
4
  rjmp $

Da mein Problem allerdings sogar dann schon besteht, wenn ich die 
compiler-Optimierung von -O1 auf -O0 setzte, vermute ich jedoch, dass 
das Problem nicht unbedingt bei dieser einen Zeile bestehen muss.
Ob, und welche Interrupts eventuell nicht rechtzeitig für die 
USB-Kommunikation ausgeführt werden, kann ich irgendwie nicht erkennen. 
Werde da einfach nicht schlau draus.

Hat jemand vielleicht einen Tipp für mich? Suche nun schon ewig und wäre 
sehr dankbar.
1
    // source to Osc0.
2
    pcl_switch_to_osc(PCL_OSC0, FOSC0, OSC0_STARTUP);
3
4
    // Authorize interrupts
5
    irq_initialize_vectors();
6
    cpu_irq_enable();
7
8
    // Initialize the sleep manager service
9
    sleepmgr_lock_mode(SLEEPMGR_IDLE);
10
11
    // Initialize the clock service
12
    sysclk_init();
13
14
    // Enable USB Stack Device
15
    udc_start();
16
17
18
    // ---> wenn ich die nachfolgende Zeile einfüge, hängt sich der Mikrocontroller auf:
19
    //xTaskCreate(usb_task,(signed char*)"USB", configMINIMAL_STACK_SIZE, NULL, tskIDLE_PRIORITY+1, &usb_handle);
20
21
    while (true);

von brechbunkt (Gast)


Lesenswert?

Da ich einfach nicht mehr weiß wo ich noch suchen könnte, möchte ich 
diesen Beitrag noch mal hoch bringen...

von holger (Gast)


Lesenswert?

Wie gross ist configTOTAL_HEAP_SIZE bei dir?

von brechbunkt (Gast)


Lesenswert?

1
/* configTOTAL_HEAP_SIZE is not used when heap_3.c is used. */
2
#define configTOTAL_HEAP_SIZE     ( ( size_t ) ( 1024*25 ) )

Die Datei heap_3.c ist im Projekt mit eingebunden. Da dort allerdings 
"nur" Funktionen für malloc() und free() enthalten sind, jedoch keine 
weiteren Angaben für die maximale heap-size, kann ich hier keine 
Einschränkung der Größe sehen.

von brechbunkt (Gast)


Lesenswert?

Ein klein wenig konnte ich nun doch noch die Stelle eingrenzen, an der 
sich der Code aufhängt, wenn ich die Optimierung auf -O0 stelle.

Im nun zusammengewürfelten Projekt aus FreeRTOS+USB ist somit auch das 
Symbol "FREERTOS_USED" definiert. Unter anderem wird es bei der IRQ 
verwendet:

file: usbb_device.c
1
/**
2
 * \brief Function called by USBB interrupt to manage USB device interrupts
3
 *
4
 * USB Device interrupt events are split in three parts:
5
 * - USB line events (SOF, reset, suspend, resume, wakeup)
6
 * - control endpoint events (setup reception, end of data transfer, underflow, overflow, stall)
7
 * - bulk/interrupt/isochronous endpoints events (end of data transfer)
8
 *
9
 * Note:
10
 * Here, the global interrupt mask is not clear when an USB interrupt is enabled
11
 * because this one can not be occurred during the USB ISR (=during INTX is masked).
12
 * See Technical reference $3.8.3 Masking interrupt requests in peripheral modules.
13
 */
14
#ifdef UHD_ENABLE
15
void udd_interrupt(void); // To avoid GCC warning
16
void udd_interrupt(void)
17
#else
18
#  ifdef FREERTOS_USED
19
#    include "FreeRTOS.h"
20
#    include "task.h"
21
ISR_FREERTOS(udd_interrupt, AVR32_USBB_IRQ_GROUP, UDD_USB_INT_LEVEL)    // <-- geht nicht!!!
22
#  else
23
ISR(udd_interrupt, AVR32_USBB_IRQ_GROUP, UDD_USB_INT_LEVEL)        // <-- geht !!!
24
#  endif
25
#endif
26
{
27
  if (Is_udd_sof()) {
28
    udd_ack_sof();
29
    if (Is_udd_full_speed_mode()) {
30
      udc_sof_notify();
31
    }
32
   ...

Wenn ich nun die somit verwendete Zeile
1
ISR_FREERTOS(udd_interrupt, AVR32_USBB_IRQ_GROUP, UDD_USB_INT_LEVEL)
durch die "normale" ISR() austausche läuft wieder alles wie geschmiert.

Die Definition für ISR_FREERTOS() liegt in der Datei portmacro.h
Diese sieht allerdings hochgradig kompliziert aus :)
1
#define ISR_FREERTOS(func, int_grp, int_lvl)    \
2
  __attribute__((__noinline__)) static portBASE_TYPE func##_not_naked(void); \
3
  __attribute__((__naked__)) static void func(void) \
4
  { \
5
    portENTER_SWITCHING_ISR(); \
6
    func##_not_naked(); \
7
    /* portEXIT_SWITCHING_ISR() expects an input parameter in R12. */ \
8
    /* This parameter is the return value of func##_not_naked() */ \
9
    portEXIT_SWITCHING_ISR(); \
10
  } \
11
  __attribute__((__noinline__)) static portBASE_TYPE func##_not_naked(void)

Das in der ISR_FREERTOS() nun zur eigentlichen ISR noch ein Teil davor 
und danach ausgeführt wird, habe ich soweit verstanden. Jedoch kann ich 
das ja nicht einfach so weg lassen, sonst läuft es später an anderer 
Stelle schief.

von Sebastian (Gast)


Lesenswert?

Hallo brechbunkt,

hast du das Problem denn jetzt lösen können?

Ich habe genau dasselbe Problem, dass beim Aufruf von udc_start() sich 
der µC an dieser Stelle aufhängt. Im Gegensatz zu dir möchte ich ein HID 
Generic mit FreeRTOS betreiben. Aber im Prinzip erfolgt ja die 
Initialisierung genauso. Mein HID Generic Device kann sich nicht am Host 
PC anmelden, ABER jetzt das interessante, und ich verstehe es (noch) 
nicht so ganz:

int main( void )
{
        irq_initialize_vectors();
        cpu_irq_enable();

  // Initialize the sleep manager service
  sleepmgr_init();
  // Initialize the clock service
  sysclk_init();

  ui_init();
  ui_powerdown();


  vSemaphoreCreateBinary(main_trans_semphr); //*ACHTUNG!
  Assert( main_trans_semphr != NULL );       //*ACHTUNG!


  // Enable USB Stack Device
  udc_start();

        //starte Scheduler usw..

        return 0; // never reached here
}

siehe *ACHTUNG! : wenn ich diese Zeilen Kommentiere (oder lösche), hängt 
er sich auf; lasse ich diese ZEilen so stehen, kann sich das Device am 
Host ohne Probleme anmelden (also enumieren und konfigurieren).
(Mit den Hid_Reports klappts bei mir aber noch nicht in Kombination mit 
FreeRtos, hab da bisher auch keine Idee wieso)


die beiden Zeilen " *ACHTUNG! " habe ich von dem Beispielprojekt EVK1100 
mit MSC und FreeRTOS aus dem Atmel Studio 6.2 entnommen.

Frohe Weihnachten an alle!
Sebastian

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.