mikrocontroller.net

Forum: Compiler & IDEs STM32 mit Simulink und TrueSTUDIO


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
Autor: xone92 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich probiere gerade ein STM32F4 Discoveryboard mit grafischer 
Programmierung in Simulink zum laufen zu bekommen.
Habe mit meine Toolchain mit CobeMX, Simulink, Embedded Coder und 
TrueSTUDIO eingerichtet. Wollte jetzt einfach nur mal ein LED mit einem 
Pulsegenarotor ansteuern:

test.c
/* Model step function */
void test_step(void)
{
  test_B.PulseGenerator = ((test_DW.clockTickCounter < 1000) &&
    (test_DW.clockTickCounter >= 0));
  if (test_DW.clockTickCounter >= 2999) {
    test_DW.clockTickCounter = 0;
  } else {
    test_DW.clockTickCounter++;
  }

  /* S-Function Block: <Root>/STM32_Config */

  /* S-Function Block: <Root>/GPIO_Write */
  if (test_B.PulseGenerator == 0)
    HAL_GPIO_WritePin(GPIOD, GPIO_PIN_14, GPIO_PIN_RESET);
  else
    HAL_GPIO_WritePin(GPIOD, GPIO_PIN_14, GPIO_PIN_SET);

  //
}

/* Model initialize function */
void test_initialize(void)
{
  /* Registration code */

  /* initialize error status */
  rtmSetErrorStatus(test_M, (NULL));

  /* block I/O */
  (void) memset(((void *) &test_B), 0,
                sizeof(B_test));

  /* states (dwork) */
  (void) memset((void *)&test_DW, 0,
                sizeof(DW_test));
  test_DW.clockTickCounter = 0;
}


Das ganze wirft aber beim compilieren einen Fehler und so gut kenne ich 
mich leider nicht in C aus das Problem zu beheben :/
.......startup\startup_stm32f407xx.o -mthumb -mcpu=cortex-m4 -mfloat-abi=hard -mfpu=fpv4-sp-d16 -T../STM32F407VG_FLASH.ld -specs=nosys.specs -static -Wl,-Map=test3.map -Wl,--gc-sections -Wl,--defsym=malloc_getpagesize_P=0x80 -Wl,--start-group -lc -lm -Wl,--end-group -specs=nano.specs 
Src\main.o: In function `main':

C:\Users\Desktop\stm32board_test\test3\Debug/..\Src/main.c:149: undefined reference to `test_initialize'
C:\Users\Desktop\stm32board_test\test3\Debug/..\Src/main.c:166: undefined reference to `test_step'
Src\main.o: In function `SysTick_Config':
C:\Users\Desktop\stm32board_test\test3\Drivers\CMSIS\Include/core_cm4.h:2031: undefined reference to `test_M'
collect2.exe: error: ld returned 1 exit Status

Hoffe ihr könnt mir weiterhelfen :)

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Es ist C.
Da ist die Reihenfolge des Aufrufs und der Deklaration schon wichtig.
Pack deine Funktionen VOR die main und dann besorgst du dir den K&R, den 
du dann durchliest und verstehst.

Autor: Christoph S. (christoph_s205)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
STK500-Besitzer schrieb:
> dann besorgst du dir den K&R

Was ist denn K&R?

Autor: Schwader (Gast)
Datum:

Bewertung
-3 lesenswert
nicht lesenswert
Kack & Reiz

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Christoph S. (christoph_s205)
Datum:

Bewertung
-2 lesenswert
nicht lesenswert
Danke Kameraden

Autor: xone92 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo STK500-Besitzer,

danke für deine Antwort (und für die Literaturempfehlung :) )

So wie ich das als Amateur sehe, ist die Funktion vor der main:
#include "main.h"
#include "usb_host.h"

I2C_HandleTypeDef hi2c1;
I2S_HandleTypeDef hi2s3;
SPI_HandleTypeDef hspi1;

void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_I2C1_Init(void);
static void MX_I2S3_Init(void);
static void MX_SPI1_Init(void);
void MX_USB_HOST_Process(void);

#include <stdio.h>
#include "test.h"                      /* Model's header file */
#include "rtwtypes.h"                  /* MathWorks types */

extern RT_MODEL_test *const test_M;
extern void test_SetEventsForThisBaseStep(boolean_T*);

static boolean_T OverrunFlags[1];
static volatile uint32_t autoReloadTimerLoopVal_S = 1;
static volatile uint32_t remainAutoReloadTimerLoopVal_S = 1;

int main(void)
{
  /* USER CODE BEGIN 1 */
  /* Data initialization */
  int_T i;

...

Mit test.h wird doch praktisch die Funktion in main mit eingebunden 
denke ich?

im test.h wird dann wiederum auf test.c (siehe oben) verlinkt:
#ifndef RTW_HEADER_test_h_
#define RTW_HEADER_test_h_
#include <stddef.h>
#include <string.h>
#include "STM32_Config.h"
#include "test_External_Functions.h"
#ifndef test_COMMON_INCLUDES_
# define test_COMMON_INCLUDES_
#include "rtwtypes.h"
#endif                                 /* test_COMMON_INCLUDES_ */

#include "test_types.h"

/* Macros for accessing real-time model data structure */
#ifndef rtmGetErrorStatus
# define rtmGetErrorStatus(rtm)        ((rtm)->errorStatus)
#endif

#ifndef rtmSetErrorStatus
# define rtmSetErrorStatus(rtm, val)   ((rtm)->errorStatus = (val))
#endif

/* Block signals (default storage) */
typedef struct {
  real_T PulseGenerator;               /* '<Root>/Pulse Generator' */
} B_test;

/* Block states (default storage) for system '<Root>' */
typedef struct {
  int32_T clockTickCounter;            /* '<Root>/Pulse Generator' */
} DW_test;

/* Real-time Model Data Structure */
struct tag_RTM_test {
  const char_T *errorStatus;
};

/* Block signals (default storage) */
extern B_test test_B;

/* Block states (default storage) */
extern DW_test test_DW;

/* Model entry point functions */
extern void test_initialize(void);
extern void test_step(void);

/* Real-time Model object */
extern RT_MODEL_test *const test_M;

#endif    

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
mal "main.c" mal "test.c"?

Das passt alles nicht, und ich esse gerne Salami, mag die danach 
benannte Taktik aber nicht.

Autor: Code Verschönerer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich rieche hier Programmcode (Funktionen) die im Header
stehen, nein nur riechen, nicht sehen ...

Aber schon mal vorab: Nein, nein das tut man nicht, das tut
man nicht! Programmcode gehört in *.c-Dateien und nicht in
Include-Dateien!

Nicht nur wegen der Schönheit.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.