Hallo,
ich habe mich damit auch mal befasst wie das funktioniert. Das was ich
da bisher rausgefunden habe ist folgendes:
Vorweg, ich benutz Mac OS. Wo die Pfade bei Windows oder Linux liegen,
weiß ich leider nicht. Daher gebe ich hier nur die Pfade von der Mac IDE
an.
Es gibt den Ordner
Arduino.app/Contents/Resources/Java/hardware/arduino/sam/system/CMSIS/De
vice/ATMEL/sam3xa/source/gcc
Dort findest du die Datei startup_sam3xa.c und folgenden Codeausschnitt:
1 | void Reset_Handler(void)
|
2 | {
|
3 | uint32_t *pSrc, *pDest;
|
4 |
|
5 | /* Initialize the relocate segment */
|
6 | pSrc = &_etext;
|
7 | pDest = &_srelocate;
|
8 |
|
9 | if (pSrc != pDest) {
|
10 | for (; pDest < &_erelocate;) {
|
11 | *pDest++ = *pSrc++;
|
12 | }
|
13 | }
|
14 |
|
15 | ...
|
16 | }
|
Dieser wird aufgerufen, wenn du den Controller startest. Dieser
Codeausschnitt macht nichts anderes als Code von dem Flash in den RAM zu
kopieren. Die Definitionen von _etext, _srelocate befinden sich im
Linkerscript in sam3x_sram.ld und sam3x_flash.ld, welche sich ebenfalls
in dem oben genannten Ordner befinden.
Nun ist er Arduino gestartet. Jetzt kann man sich mal das USB Subsystem
anschauen. Dort gibt es folgendes. In der Datei
Arduino.app/Contents/Resources/Java/hardware/arduino/sam/cores/arduino/U
SB/CDC.cpp
Befindet sich die Funktion
1 | bool WEAK CDC_Setup(Setup& setup)
|
2 | {
|
3 | uint8_t r = setup.bRequest;
|
4 | uint8_t requestType = setup.bmRequestType;
|
5 | ...
|
6 |
|
7 | if (REQUEST_HOSTTODEVICE_CLASS_INTERFACE == requestType)
|
8 | {
|
9 | ...
|
10 | if (CDC_SET_CONTROL_LINE_STATE == r)
|
11 | {
|
12 | _usbLineInfo.lineState = setup.wValueL;
|
13 | // auto-reset into the bootloader is triggered when the port, already
|
14 | // open at 1200 bps, is closed.
|
15 | if (1200 == _usbLineInfo.dwDTERate)
|
16 | {
|
17 | // We check DTR state to determine if host port is open (bit 0 of lineState).
|
18 | if ((_usbLineInfo.lineState & 0x01) == 0)
|
19 | initiateReset(250);
|
20 | else
|
21 | cancelReset();
|
22 | }
|
23 | return true;
|
24 | }
|
25 | }
|
26 | return false;
|
27 | }
|
Wenn diese aufgerufen wird, kann ein Reset getriggert werden. Schau dir
den Code einfach mal an. Der Reset wird nach 250 Ticks ausgeführt wobei
1 Tick = 1ms sind. Folgende Datei führt den Reset aus:
Arduino.app/Contents/Resources/Java/hardware/arduino/sam/cores/arduino/R
eset.cpp
Dort findest du auch die erste Funktion die Mittels eines Pargmas in den
RAM während des Startups geschoben wurde.
Die Funktion tickReset() in der Datei
Arduino.app/Contents/Resources/Java/hardware/arduino/sam/cores/arduino/c
ortex_handlers.c
zyklisch aufgerufen.
Ich hoffe, ich konnte damit ein wenig helfen.
MfG
Heinrich