Mikrocontroller-Programmierung

Smalltalk
Antworten
Benutzeravatar
paedubucher
Beiträge: 855
Registriert: 22.02.2009 16:19:02
Lizenz eigener Beiträge: GNU Free Documentation License
Wohnort: Schweiz
Kontaktdaten:

Mikrocontroller-Programmierung

Beitrag von paedubucher » 20.10.2018 13:37:33

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. :roll: Nur damit ihr eine Ahnung bekommt, wie schwer es mir als Linux-User an dieser Schule ergeht :wink: )

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!
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.

TuxPeter
Beiträge: 1962
Registriert: 19.11.2008 20:39:02
Lizenz eigener Beiträge: MIT Lizenz

Re: Mikrocontroller-Programmierung

Beitrag von TuxPeter » 20.10.2018 17:59:40

paedubucher hat geschrieben: ↑ zum Beitrag ↑
20.10.2018 13:37:33
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.
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.

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.

Benutzeravatar
whisper
Beiträge: 3184
Registriert: 23.09.2002 14:32:21
Lizenz eigener Beiträge: GNU Free Documentation License
Kontaktdaten:

Re: Mikrocontroller-Programmierung

Beitrag von whisper » 20.10.2018 20:15:02

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

Benutzeravatar
schorsch_76
Beiträge: 2542
Registriert: 06.11.2007 16:00:42
Lizenz eigener Beiträge: MIT Lizenz

Re: Mikrocontroller-Programmierung

Beitrag von schorsch_76 » 20.10.2018 20:16:56

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 Debiangcc-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.

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
Ich fand das Toolchain File am unübersichtlichtsten und irgendwie war es nicht so einfach zu finden wie das geht.

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)        
Zum Debuggen braucht man ein paar Einstellungen im .gdbinit file. Das startet openocd und verbindet sich mit dem Target.

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                

Benutzeravatar
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

Beitrag von paedubucher » 21.10.2018 13:46:38

TuxPeter hat geschrieben: ↑ zum Beitrag ↑
20.10.2018 17:59:40
paedubucher hat geschrieben: ↑ zum Beitrag ↑
20.10.2018 13:37:33
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.
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.

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.
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.
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.

Benutzeravatar
schorsch_76
Beiträge: 2542
Registriert: 06.11.2007 16:00:42
Lizenz eigener Beiträge: MIT Lizenz

Re: Mikrocontroller-Programmierung

Beitrag von schorsch_76 » 21.10.2018 18:42:50

paedubucher hat geschrieben: ↑ zum Beitrag ↑
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.
Arduino ist an sich nur ein Atmega328. Den kannst du problemlos ohne die IDE direkt "baremetal" programmieren.

Antworten