Im Rahmen meines Informatik-Studiums an der Hochschule belege ich dieses Semester einen Mikrocontroller-Kurs. Wir verwenden dabei Codewarrior auf Windows, um auf einem proprietären Roboter auf Basis eines Freescale-Chips zu programmieren. Wir arbeiten mit Assembler und C. Nun möchte ich natürlich lieber nicht auf Windows arbeiten, aber einige der Tools konnte ich bisher noch nicht auf Linux zum Laufen bringen. Darum bleibe ich für den Kurs vorerst auf Windows, da mir die Materie noch nicht so vertraut ist, und ich zur Abwechslung einmal den leichten, vorgegebenen Weg zu wählen bereit bin. (Diese Woche wurde ich dafür kritisiert, dass ich im C-Teil des Kurses mit vim statt mit NetBeans gearbeitet und mein Makefile selbst geschrieben habe. Nur damit ihr eine Ahnung bekommt, wie schwer es mir als Linux-User an dieser Schule ergeht )
Da mich das Thema Mikrocontroller und ressourcenschonende Low-Level-Programmierung grundsätzlich interessiert, möchte ich mich (nach bestandenem Kurs) mal auf eigene Faust mit der Materie befassen. Das sollte dann ohne Windows und ohne aufgeblasene IDE vonstatten gehen. Nun zu meiner Frage: Welche Plattform soll ich wählen? Und wie würde die Toolchain dafür aussehen? Ich will den Mikrocontroller nicht produktiv einsetzen, es geht mir bloss ums Entdecken und um das Verständnis dahinter. Darum soll es eine möglichst einfache Plattform sein. Einfach aber nicht im Sinne von Arduino, wo die IDE als Motorhaube fungiert, damit man die Innereien nicht zu sehen bekommt. Hat jemand schon Erfahrungen in diesem Bereich gemacht? ARM-Chips sollen ja ein gewaltiges Instruction-Set verwenden, Freescale sei da schon einfacher. Oder spielt das keine Rolle, da man mit einer kleinen Untermenge der Befehle meistens problemlos zurecht kommt?
Ich wäre froh um einige Tipps und Erfahrungsberichte (gerne auch negative, um die Wahl nach dem Ausschlussverfahren einschränken zu können). Vielen Dank!
Mikrocontroller-Programmierung
- paedubucher
- Beiträge: 855
- Registriert: 22.02.2009 16:19:02
- Lizenz eigener Beiträge: GNU Free Documentation License
- Wohnort: Schweiz
-
Kontaktdaten:
Mikrocontroller-Programmierung
Habe nun, ach! Java
Python und C-Sharp,
Und leider auch Visual Basic!
Durchaus programmiert mit heissem Bemühn.
Da steh' ich nun, ich armer Tor!
Und bin so klug als wie zuvor.
Python und C-Sharp,
Und leider auch Visual Basic!
Durchaus programmiert mit heissem Bemühn.
Da steh' ich nun, ich armer Tor!
Und bin so klug als wie zuvor.
Re: Mikrocontroller-Programmierung
Ist das nicht ein Widerspruch? Schließlich kannst du die "Motorhaube" von Arduino jederzeit öffnen und nach Herzenlust darin herumwerkeln. Die Bequemlichkeiten dieser IDE nutzen, und bei Bedarf z.B. über Inline-Assembler tiefer einsteigen.paedubucher hat geschrieben:20.10.2018 13:37:33Darum soll es eine möglichst einfache Plattform sein. Einfach aber nicht im Sinne von Arduino, wo die IDE als Motorhaube fungiert, damit man die Innereien nicht zu sehen bekommt.
Ich bin jedenfalls von Arduino ziemlich angetan, und auch bei Nutzung nur der C-Oberfläche kommt man ziemlich weit. Man sollte allerdings eine neue Version direkt vom Arduino-Projekt nutzen, welche sich bei mir in Stretch völlig problemlos installieren ließ.
Weiß allerdings nicht, ob meine Antwort das ist, was du hören möchtest.
- whisper
- Beiträge: 3184
- Registriert: 23.09.2002 14:32:21
- Lizenz eigener Beiträge: GNU Free Documentation License
-
Kontaktdaten:
Re: Mikrocontroller-Programmierung
Du willst bei C und Assemmbler bleiben, nehme ich an.
Da bieten sich PIC18f* und AVR ATMEGA328 (aka Arduino) gerade zu an, beide kannst du sehr gut mit Bordmitteln unter Linux programmieren.
Ich gehe einen anderen Weg, indem ich Great Cow BASIC nutze.
Ich will mich in meinem Alter nicht mehr so tief in die Controller reinwühlen, obwohl dieser Basic Compiler einen sauberen und gut dokumentierten ASM Output liefert, der zum Lernen von Assembler auf den Systemen ermuntert.
Great Cow BASIC ist für beiden Platformen identisch, was ich sehr sympathisch finde.
Aber auch MSP430 ist eine wenn auch allerdings in Hobbykreisen nicht so verbreiteten Controller Familie von TI.
Hier ist C das Mittel der Wahl und ist Linux tauglich.
Ansonsten empfehle ich das https://www.mikrocontroller.net Forum und die dortigen Artikel.
Oder auch eine Kategorie höher einsteigen.
https://www.mikrocontroller.net/articles/Hauptseite#ARM
Da bieten sich PIC18f* und AVR ATMEGA328 (aka Arduino) gerade zu an, beide kannst du sehr gut mit Bordmitteln unter Linux programmieren.
Ich gehe einen anderen Weg, indem ich Great Cow BASIC nutze.
Ich will mich in meinem Alter nicht mehr so tief in die Controller reinwühlen, obwohl dieser Basic Compiler einen sauberen und gut dokumentierten ASM Output liefert, der zum Lernen von Assembler auf den Systemen ermuntert.
Great Cow BASIC ist für beiden Platformen identisch, was ich sehr sympathisch finde.
Aber auch MSP430 ist eine wenn auch allerdings in Hobbykreisen nicht so verbreiteten Controller Familie von TI.
Hier ist C das Mittel der Wahl und ist Linux tauglich.
Ansonsten empfehle ich das https://www.mikrocontroller.net Forum und die dortigen Artikel.
Oder auch eine Kategorie höher einsteigen.
https://www.mikrocontroller.net/articles/Hauptseite#ARM
- schorsch_76
- Beiträge: 2542
- Registriert: 06.11.2007 16:00:42
- Lizenz eigener Beiträge: MIT Lizenz
Re: Mikrocontroller-Programmierung
Ich vermute mal das ihr die Stm32 nutzt. Diese hab ich auch unter Linux programmiert. Hier geht auch CubeMX unter Linux um die Hardware und das Basisprojekt zu konfigurieren. Hier hab ich den gcc-arm-none-eabi unter Stetch genutzt und auch FreeRTOS als leichtes RTOS auf dem Mikrokontroller. Auch die AVR Serie kann man unter Linux programmieren. Die NXP Cortex-M MCU gehen auch mit dem oben genannten gcc. Diese hab ich aber noch nicht genutzt. Die Cortex M(0/3/4) und die R Serie der unterschiedlichen Hersteller haben meist eine andere Konfiguration des Oszillators. Es geht aber immer der gleiche gcc. Manche Memory Mapped IO Beriche sind anders und Hersteller abhängig. Die IRQ Register für die TImer etc sind auch meist etwas anderst. Es gibt aber eine HAL namens CMSIS 5. Diese wird von praktisch allen unterstützt.
Mit openocd und einem JTAG Adapter kann ich problemlos auf dem Arm debuggen.
Hier hab ich bsp. den Olimexino-Stm32 mit dem Stm32F103Rbt6 mit Freertos 10.1 am laufen und compliert und geflasht unter Linux.
Ich hab das ganze dann noch in CMake verpackt und mit einem Toolchain File wird dann der Cross Compiler gesetzt. Dazu gibt es noch ein nettes Makefile um ein paar Sachen zu vereinfachen.
Ich fand das Toolchain File am unübersichtlichtsten und irgendwie war es nicht so einfach zu finden wie das geht.
Zum Debuggen braucht man ein paar Einstellungen im .gdbinit file. Das startet openocd und verbindet sich mit dem Target.
Mit openocd und einem JTAG Adapter kann ich problemlos auf dem Arm debuggen.
Hier hab ich bsp. den Olimexino-Stm32 mit dem Stm32F103Rbt6 mit Freertos 10.1 am laufen und compliert und geflasht unter Linux.
Ich hab das ganze dann noch in CMake verpackt und mit einem Toolchain File wird dann der Cross Compiler gesetzt. Dazu gibt es noch ein nettes Makefile um ein paar Sachen zu vereinfachen.
Code: Alles auswählen
#BUILDTYPE=Debug
#BUILDTYPE=Release
#BUILDTYPE=RelWithDebinfo
BUILDTYPE=MinSizeRel
.PHONY: arm
arm:
rm -Rf build
mkdir build
cmake -Bbuild -DCMAKE_TOOLCHAIN_FILE:PATH=Stm32F103/toolchain-gcc-arm.cmake -DCMAKE_BUILD_TYPE=$(BUILDTYPE) -DFREERTOS_ROOT=/home/georg/Dokumente/Entwicklung/upstream/freertos-code/FreeRTOS -H.
make -C build all -j8
.PHONY: flash
flash: arm
/home/georg/NAS/georg-develop/stm32/openocd/bin/openocd -f /home/georg/NAS/georg-develop/stm32/openocd/bin/openocd.cfg -c "program build/FTest.hex verify reset exit"
.PHONY: gdb
gdb: flash
arm-none-eabi-gdb -ix .gdbinit -tui build/FTest
all: posix
posix:
rm -Rf build
mkdir build
cmake -Bbuild -DCMAKE_BUILD_TYPE=MinSizeRel -DFREERTOS_ROOT=/home/georg/Dokumente/Entwicklung/upstream/freertos-code/FreeRTOS -H.
make -C build all -j4
Code: Alles auswählen
cat Dokumente/Entwicklung/FTest/Stm32F103/toolchain-gcc-arm.cmake
set(CMAKE_SYSTEM_NAME Generic)
set(CMAKE_SYSTEM_PROCESSOR arm)
set(GCC_PATH "/usr/bin")
#set(GCC_PATH "/home/georg/Downloads/gcc-arm-none-eabi-7-2018-q2-update/bin")
set(CMAKE_ASM_COMPILER "${GCC_PATH}/arm-none-eabi-gcc")
set(CMAKE_C_COMPILER "${GCC_PATH}/arm-none-eabi-gcc")
set(CMAKE_CXX_COMPILER "${GCC_PATH}/arm-none-eabi-g++")
set(CMAKE_OBJCOPY "${GCC_PATH}/arm-none-eabi-objcopy" CACHE FILEPATH "The toolchain objcopy command " FORCE )
set(CMAKE_OBJDUMP "${GCC_PATH}/arm-none-eabi-objdump" CACHE FILEPATH "The toolchain objcopy command " FORCE )
set(CMAKE_SIZE "${GCC_PATH}/arm-none-eabi-size" CACHE FILEPATH "The toolchain size command " FORCE )
set(LINKER_SCRIPT "${CMAKE_SOURCE_DIR}/MCU/STM32F103RBTx_FLASH.ld" CACHE INTERNAL "")
set(CMAKE_ASM_FLAGS "-mcpu=cortex-m3 -mthumb" FORCE)
set(COMPILE_FLAGS "-MMD -MP -mcpu=cortex-m3 -mthumb -fdata-sections -ffunction-sections -fno-exceptions")
set(CMAKE_EXE_LINKER_FLAGS "--specs=nosys.specs -T${LINKER_SCRIPT} -Wl,--gc-sections" CACHE INTERNAL "")
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER)
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)
set(CMAKE_FIND_ROOT_PATH_MODE_PACKAGE ONLY)
set(CMAKE_EXECUTABLE_SUFFIX ".elf" FORCE)
Code: Alles auswählen
cat Dokumente/Entwicklung/FTest/.gdbinit
target extended-remote | /home/georg/NAS/georg-develop/stm32/openocd/bin/openocd -f /home/georg/NAS/georg-develop/stm32/openocd/bin/openocd.cfg -c "gdb_port pipe; log_output openocd.log"
monitor reset halt
load
- paedubucher
- Beiträge: 855
- Registriert: 22.02.2009 16:19:02
- Lizenz eigener Beiträge: GNU Free Documentation License
- Wohnort: Schweiz
-
Kontaktdaten:
Re: Mikrocontroller-Programmierung
Einen Widerspruch sehe ich nicht: Ich suche halt eine Plattform, die an und für sich einfach ist, nicht eine, bei der die Komplexität nur überdeckt wird. Habe ich dich richtig verstanden, dass Arduino auch unter der Haube eine eher einfache Plattform ist? Ich möchte halt möglichst reines C schreiben, nicht dieses aufgepfropfte *.ino-Zeugs. Oder verwendest du die vorgegebene IDE? Hier liegt eben mein Problem: Ich möchte eben vim und eigene Makefiles verwenden, damit ich die Sache auch wirklich verstehe.TuxPeter hat geschrieben:20.10.2018 17:59:40Ist das nicht ein Widerspruch? Schließlich kannst du die "Motorhaube" von Arduino jederzeit öffnen und nach Herzenlust darin herumwerkeln. Die Bequemlichkeiten dieser IDE nutzen, und bei Bedarf z.B. über Inline-Assembler tiefer einsteigen.paedubucher hat geschrieben:20.10.2018 13:37:33Darum soll es eine möglichst einfache Plattform sein. Einfach aber nicht im Sinne von Arduino, wo die IDE als Motorhaube fungiert, damit man die Innereien nicht zu sehen bekommt.
Ich bin jedenfalls von Arduino ziemlich angetan, und auch bei Nutzung nur der C-Oberfläche kommt man ziemlich weit. Man sollte allerdings eine neue Version direkt vom Arduino-Projekt nutzen, welche sich bei mir in Stretch völlig problemlos installieren ließ.
Weiß allerdings nicht, ob meine Antwort das ist, was du hören möchtest.
Nachtrag: Danke auch für die anderen beiden Antworten! Da ich bereits einen Arduino herumliegen habe, werde ich wohl in diese Richtung gehen, d.h. herausfinden, wie man den ohne IDE programmieren kann.
Habe nun, ach! Java
Python und C-Sharp,
Und leider auch Visual Basic!
Durchaus programmiert mit heissem Bemühn.
Da steh' ich nun, ich armer Tor!
Und bin so klug als wie zuvor.
Python und C-Sharp,
Und leider auch Visual Basic!
Durchaus programmiert mit heissem Bemühn.
Da steh' ich nun, ich armer Tor!
Und bin so klug als wie zuvor.
- schorsch_76
- Beiträge: 2542
- Registriert: 06.11.2007 16:00:42
- Lizenz eigener Beiträge: MIT Lizenz
Re: Mikrocontroller-Programmierung
Arduino ist an sich nur ein Atmega328. Den kannst du problemlos ohne die IDE direkt "baremetal" programmieren.paedubucher hat geschrieben:21.10.2018 13:46:38
Einen Widerspruch sehe ich nicht: Ich suche halt eine Plattform, die an und für sich einfach ist, nicht eine, bei der die Komplexität nur überdeckt wird. Habe ich dich richtig verstanden, dass Arduino auch unter der Haube eine eher einfache Plattform ist? Ich möchte halt möglichst reines C schreiben, nicht dieses aufgepfropfte *.ino-Zeugs. Oder verwendest du die vorgegebene IDE? Hier liegt eben mein Problem: Ich möchte eben vim und eigene Makefiles verwenden, damit ich die Sache auch wirklich verstehe.
Nachtrag: Danke auch für die anderen beiden Antworten! Da ich bereits einen Arduino herumliegen habe, werde ich wohl in diese Richtung gehen, d.h. herausfinden, wie man den ohne IDE programmieren kann.