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
.org0x034
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:
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.
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
voidudd_interrupt(void);// To avoid GCC warning
16
voidudd_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 !!!
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 :)
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.
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