Forum: Mikrocontroller und Digitale Elektronik ARM M0: LPC1114 wie lange braucht eine Multiplikation


von chris (Gast)


Lesenswert?

Von NXP gibt es die kostengünstige ARM-Familie M0.

Dazu gibt es auch ein günstiges Entwicklungssystem:
http://www.embeddedartists.com/products/lpcxpresso/lpc1114_xpr.php

Ich versuche gerade herauszukriegen, wie schnell eine Multiplikation ist 
( Kann man gut für FIR-Filter gebrauchen ).
Ich finde nur das Datenblatt von ARM. Es gibt leider Prozessoren mit 
1Cycle und mit 32 Cycle. Wie viel braucht aber der LPC1114.

von someone (Gast)


Lesenswert?

Dann probiers doch mal aus. In ner ausreichend großen Schliefe solltest 
du 1 oder 32 gut erkennen können. Also herausfinden welche der beiden 
Multiply-Implementationen verwendet wurde.

Da es aber im DB und in den Broschüren zu den Cortex-M0 uC von NXP nicht 
ausgezeichnet wurde, würd ich davon ausgehen, dass die 32 Takte vVersion 
drin ist. (Schlachtet das Marketing doch sofort aus, oder?)

von chris (Gast)


Lesenswert?

>Dann probiers doch mal aus. In ner ausreichend großen Schliefe solltest
>du 1 oder 32 gut erkennen können. Also herausfinden welche der beiden
>Multiply-Implementationen verwendet wurde.

Kann ich nicht, weil ich noch keine habe. Ich überlege nur, ob ein M0 
für Filter geeignet wäre.

>Da es aber im DB und in den Broschüren zu den Cortex-M0 uC von NXP nicht
>ausgezeichnet wurde, würd ich davon ausgehen, dass die 32 Takte vVersion
>drin ist. (Schlachtet das Marketing doch sofort aus, oder?)

Da hast Du recht, das wäre ein starker Hinweis. Wenn der Arm allerdings 
32 Zyklen braucht, ist er auch nicht mehr so weit von einem AVR mit 
Hardware-Multiplizierer entfernt.
Wenn ich richtig gesehen habe, soll der M0 Kern ja mit 12000 Gates 
auskommen. Das wäre auch ein Argument gegen den 1-Zyklen Multiplizierer.

von Michael G. (let)


Lesenswert?

Im Internet bin ich dazu auf folgendes gestoßen:
1
Unfortunately, GCC currently assumes that you have the slower
2
multiplier (even though the LPC11xx actually uses the fast
3
implementation), and thus when it sees a multiplication by a constant,
4
it will do this using adds/shifts - which it thinks will be faster.
http://knowledgebase.nxp.com/showthread.php?t=591

Ich habe das mal mit dem gcc 4.5.1 getestet:
1
int multest(int var)
2
{
3
  return var * 23;
4
     93c:  0043        lsls  r3, r0, #1
5
     93e:  181b        adds  r3, r3, r0
6
     940:  00db        lsls  r3, r3, #3
7
     942:  1a18        subs  r0, r3, r0
8
}
9
10
int multest(int var1, int var2)
11
{
12
  return var1 * var2;
13
     93c:  4348        muls  r0, r1
14
}

von (prx) A. K. (prx)


Lesenswert?

LPC111x User Manual: "providing high-end processing hardware including a 
single-cycle multiplier."

von chris (Gast)


Lesenswert?

Erstaunlich, mit nur 12000 Gates. Ich frage mich, wie viel davon braucht 
wohl der 32x32 Multiplizierer?

von (prx) A. K. (prx)


Lesenswert?

Wer behauptet denn, dass der Cortex M0 Core mit Hardware-Multiplier 
mit 12K Gates auskommt? Zitat: "12K gates in the minimum configuration", 
also ohne.

von chris (Gast)


Lesenswert?

Welche Entwicklungsumgebung verwendet Ihr denn?

Soweit ich weiß, gibt es ein Plugin für Eclipse. Da ich schon relativ 
viel mit dem GCC gemacht habe, würde ich GCC einem Compiler von IAR 
vorziehen ( Code-Kompatiblität ). Allerdings habe ich auch keine Lust, 
eine Woche in die Installation der Entwicklungssoftware zu investieren.

von Michael G. (let)


Lesenswert?

Eclipse for C++ (ohne Plugin) / Codesourcery GCC

Aber warum muß es nochmal der M0 sein? Am Preis kann es nicht
liegen da die LPC13xx eher billiger sind.

100Stk Preise Farnell:
1
(8k Flash, 4k RAM)
2
LPC1111FHN33/201  1.58€
3
LPC1311FHN33      1.40€
4
5
(32k Flash, 8k RAM)
6
LPC1114FHN33/301  2.29€
7
LPC1313FHN33      2.05€
8
9
(24k Flash, 8k RAM)
10
LPC1113FBD48/301      2.58€
11
LPC1313FBD48 (32k/8k) 2.42€

Hinzu kommt das die 13er mit max. 72MHz laufen können.
Die Interrupt Latenz ist bei denen mit 12 Takten auch geringer
als beim M0 (16 Takte) und der M3 kann dividieren.

von chris (Gast)


Lesenswert?

>Eclipse for C++ (ohne Plugin) / Codesourcery GCC

Hmm, leider habe ich Deinen Post zu spät gelesen. Ich habe die IDE von 
Code-RED installiert, wie von der NXP-Seite empfohlen. Es ging noch eine 
Weile, bis ich den Treiber auf XP manuell installiert habe, dann lief es 
aber problemlos.
Wie kann ich den ein Programm zum LPCXpresso ohne die IDE übertragen?

>Aber warum muß es nochmal der M0 sein? Am Preis kann es nicht
>liegen da die LPC13xx eher billiger sind.

So richtig ist mir die Einteilung der ARMs in M0 und M3 nicht klar. Für 
mich sieht es so aus, als wenn die M3 meistens schneller und mit mehr 
Speicher ausgestattet sind.

Durch Zufall habe ich bei ebay ein LPC1114 XPresso ersteigert. 
Eigentlich wollte ich einen LPC1768. Jetzt werde ich erst mal ein wenig 
mit dem LPC1114 experimentieren.

von Michael G. (let)


Lesenswert?

Alles klar. Ich hatte das erst so verstanden das du dich auf
den M0 eingeschossen hattest weil der Chip so billig ist und
das LPCxpresso Board nur zur Evaluierung gedacht ist.
Mit dem klaren Ziel vor Augen irgendetwas in Stückzahlen
zu bauen.

Die LPCxpresso IDE ist ja ein Eclipse mit einem Plugin
und Treibern für dieses Board. Benutze ich dafür auch.
Das Board verwende ich aber nur zum Testen. Bei der "normalen"
SW-Entwicklung für die Zielschaltungen kommt dann das
nackte Eclipse zum Einsatz. Das nehme ich auch für AVR und STM32.

Der LPC1114 ist an sich nicht schlecht. Damit habe ich mir mal eine
Variante der Wordclock aufgebaut (mit 1MHz Takt). Reicht dafür
völlig aus. Es gibt nur leider wie auch beim LPC13xx keine große
Auswahl an Gehäusen.

von (prx) A. K. (prx)


Lesenswert?

chris schrieb:

> So richtig ist mir die Einteilung der ARMs in M0 und M3 nicht klar.

Der M0 Core ist kleiner und für den Hersteller ein paar Cent billiger. 
Für einen Kunden, der grosse Stückzahlen einsetzt, spielt jeder Cent 
eine Rolle. Bei Einzelstücken oder Kleinserien lohnt es aber eigentlich 
nicht, sich mit zwei etwas verschiedenen Controllern ähnlicher Klasse 
abzugeben.

> die M3 meistens schneller und mit mehr Speicher ausgestattet sind.

Wenn der Core aufgrund viel Flash und komplexer I/O einen eher kleinen 
Teil der gesamten Chipfläche ausmacht, dann spielt es für die 
Produktionskosten kaum noch eine Rolle, ob das nun ein M0 oder ein M3 
ist. Ein M0 lohnt sich also nur bei Controllern mit wenig Flash und 
einfacher I/O.

von chris (Gast)


Lesenswert?

Gerade eben habe ich ein Arm-Forum entdeckt, dass dem MC-Forum hier doch 
sehr ähnlich sieht:
http://embdev.net/forum/arm-gcc
Da gab es wohl ein Abspaltung.

Ein wenig habe ich auch das Gefühl, dass die ARM-Fraktion hier eher 
unterrepräsentiert ist.

von (prx) A. K. (prx)


Lesenswert?

chris schrieb:

> http://embdev.net/forum/arm-gcc
> Da gab es wohl ein Abspaltung.

Name: embdev.net
Address: 188.40.52.210

Name: mikrocontroller.net
Address: 188.40.52.210

Fällt dir wenigstens daran was auf? Wo du schon den unübersehbaren Text 
in "Neuer Betrag" nicht gesehen hast ;-) : "Neu: Beitrag in Englisch
Hier klicken, um den Beitrag in Englisch zu schreiben. Der Beitrag wird 
dann sowohl auf Mikrocontroller.net als auch auf Embdev.net eingeblendet 
und steht dadurch einem größeren Publikum zur Verfügung."

von chris (Gast)


Lesenswert?

Für meine ersten Experimente würde ich gerne einen kleinen 
Soundgenerator realisieren.

Dazu benötige ich eine Schleife die mit ca. 30KHz läuft und eine 8Bit 
PWM.
Die Frage ist jetzt, wie bekomme ich die Zeitkonstante Schleife hin.

Variante 1: Das ganze mit freertos realisieren. Dort ist mir aber 
unklar, mit welcher Rate die Tasks aufgerufen werden.

Variante 2: Die Ausgabe in den Timer-Interrupt einarbeiten. Es gibt in 
der "driver" lib Code für den Timer. Allerdings müsste ich dazu den 
Treiber "vermurksen", weil sich dort ja schon Code für den Interrupt 
befindet.

Wie würdet Ihr vorgehen?

von chris (Gast)


Lesenswert?

Hat jemand von euch schon einmal mit FreeRTOS gearbeitet?
Es hat einen Wikipedia Eintrag und dürfte ganz bekannt sein.

Von CodeRED wird ein Beispiel mit FreeRTOS mitgeliefert. Die 
Taskwechselfrequenz ist dort auf 1kHz eingestellt. Für Audioanwendungen 
bräuchte ich mindestens 20kHz, eher 40kHz.
Der Prozessor läuft mit 48MHz.

von Michael G. (let)


Lesenswert?

Tonausgaben macht man eigentlich in einem Timer Interrupt.
Der LPC11xx hat vier davon + den Systicker.

von chris (Gast)


Lesenswert?

Schon klar. Beim LPC1114 wird eine Driver-Library mitgeliefert. Dort 
gibt es schöne Treiber für die Timer ( einfach zu initialisieren ). 
Unpraktisch ist nur, dass in Treiberroutine im Interrupt nur ein 
Syscounter hochgezählt wird.
Ich wollte vermeiden, die Treiber-Lib zu verändern und dort in den 
Interrupt meinen Code reinzuquetschen.

von Michael G. (let)


Lesenswert?

Diese Driver Lib kenne ich nicht, muß ich mir mal ansehen.
Aber ein RTOS so schnell umschalten zu lassen halte ich für
keine gute Idee. Bin mir auch nicht sicher ob die Umschaltzeit
konstant ist. Da passiert ja doch einiges bei einem Context-switch
wenn es nicht gerade ein einfacher Scheduler ist.

von chris (Gast)


Lesenswert?

>Bin mir auch nicht sicher ob die Umschaltzeit konstant ist.

Hmm, dieses Argument habe ich noch nicht bedacht. Das würde natürlich 
auch dagegen sprechen.

Im Moment kämpfe ich mit der IDE. Ich habe das System von Code-RED 
heruntergeladen und installiert. Die IDE ist Eclipse basiert. Alle 
Code-Beispile lassen sich auch gut kompilieren.
Allerdings schaffe ich es nicht, eine neues Source-File ins Projekt 
aufzunehmen. Ich kann es zwar in den Projektordner rein kopieren, wenn 
ich aber kompilieren will, erhalte ich immer die Fehlermeldung 
"undefined reference to ..xyz.. ".
Die include Files sind im Header angegeben:

#include "...xyz...h".

Auch Eclipse selbst unterstreicht die Funktionen rot mit der Bemerkung 
...xyz... nicht zu finden. Wie zum Donnerwetter mache ich Eclipse klar, 
dass die Files da sind?

Wenn ich es richtig verstehe, setzt die Code-Red IDE auch auf das 
Eclipse plugin CDT auf.

von Michael G. (let)


Lesenswert?

> Ich kann es zwar in den Projektordner rein kopieren, wenn

Die Datei muß in das Projektmanagment aufgenommen werden. Bei Dateien
die über "New->Source file" erzeugt werden (z. B. rechte Maustaste
auf Projektordner) geschieht das automatisch.
Ansonsten mit rechter MT auf Projekt- bzw. einem Unterordnereintrag
und "Import..." auswählen. Dann unter "General->File System" den
Ordner mit der vorhandenen Datei auswählen. Im nächsten Schritt
lassen sich die gewünschten Dateien ankreuzen und in das Projekt
übernehmen.

von chris (Gast)


Lesenswert?

Michael, vielen Dank. Das sind sehr hilfreiche Hinweise.

Das ARM-CMSIS ( CMSIS - Cortex Microcontroller Software Interface 
Standard ) beinhaltet ein paar äußerst nützliche Treiber. Diese 
Abstraktionsschicht ist wohl ziemlich gut, wenn man von einem Controller 
auf den anderen wechseln will.
Leider  muss ich wohl doch die Timerroutine in der Tiefe selbst 
programmieren. Es gibt zwar einen PWM-Treiber, irgendwie wird der 
Timer-Interrupt aber nicht ausgelöst.

Im Moment bin ich noch auf der Suche nach dem Datenblatt für die Timer. 
Im Datenblatt zum LPC1114 steht leider nichts von der Belegung der 
Register drinn.

von ARMab (Gast)


Lesenswert?

chris schrieb:
> Das ARM-CMSIS ( CMSIS - Cortex Microcontroller Software Interface
> Standard ) beinhaltet ein paar äußerst nützliche Treiber.

Welche denn?

chris schrieb:
> Diese
> Abstraktionsschicht ist wohl ziemlich gut, wenn man von einem Controller
> auf den anderen wechseln will.
> Leider  muss ich wohl doch die Timerroutine in der Tiefe selbst
> programmieren.

Wohl doch nicht so gut? CMSIS kann nur den ARM-Core abstrahieren, bei 
der Peripherie von den Herstellern hilft nur der Hersteller-Treiber oder 
man setzt sich direkt mit der Hardware auseinander und schreibt sich die 
Software selbst. Letzteres ist leider die Regel, da die Treiber oft nur 
als sehr einfaches Beispiel dienen bzw. nur eine Initialisierungs-API 
bereitstellen.

chris schrieb:
> Im Moment bin ich noch auf der Suche nach dem Datenblatt für die Timer.
> Im Datenblatt zum LPC1114 steht leider nichts von der Belegung der
> Register drinn.

Wenn der Timer im ARM-Core sitzt musst du das Datenblatt von ARM zum M0 
lesen. Wenn der Timer vom Hersteller kommt, dann sollte die Beschreibung 
auf im Datenblatt auf der Herstellerseite stehen. Oft sind dort auch 
direkt die Datenblätter zum z.B. M0 usw. von ARM.


Grüße.

von Michael G. (let)


Lesenswert?

Die CMSIS kenne ich eigentlich. Haben die bei NXP jetzt die
eigene Peripherie dazu gebastelt? Passt gar nicht zu denen ;).

>Im Moment bin ich noch auf der Suche nach dem Datenblatt für die Timer.

Du hast wahrscheinlich nur das Datenblatt, brauchst aber das
User Manual:
http://www.nxp.com/documents/user_manual/UM10398.pdf

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.