cancel
Showing results for 
Search instead for 
Did you mean: 

Is this bug? timezone definition in syscalls.c generated by cube mx

Nick Steele
Associate II
Posted on October 06, 2017 at 17:58

While compiling a project with syscalls.c generated by cube mx, there is a block like this:

  #ifdef _SYS_TIME_H_

  struct timezone {

    int tz_minuteswest; /* minutes west of Greenwich */

    int tz_dsttime; /* type of dst correction */

  };

#endif

and the file includes <time.h> at top. Since _SYS_TIME_H_ is defined in time.h, syscall.c redefines the timezone struct causing a compiler error. My guess is that it is supposed to be #ifndef _SYS_TIME_H_ ? I'm circumventing the error by adding  a preceding '#undef _SYS_TIME_H_' to syscalls.c in a /* USER CODE BEGIN */ section.

1 ACCEPTED SOLUTION

Accepted Solutions
Posted on October 30, 2017 at 18:42

The generated makefile has the following section:

♯ C defines

C_DEFS = \

-D_TIMEVAL_DEFINED \

-D_SYS_TIME_H_ \

-DUSE_HAL_DRIVER \

-DSTM32F107xC

Kind regards

Sirma

View solution in original post

10 REPLIES 10
john doe
Lead
Posted on October 06, 2017 at 19:46

where are you getting your syscalls.c from?

/**
*****************************************************************************
**
** File : syscalls.c
**
** Abstract : System Workbench Minimal System calls file
**
** For more information about which c-functions
** need which of these lowlevel functions
** please consult the Newlib libc-manual
**
** Environment : System Workbench for MCU
**
** Distribution: The file is distributed �as is,� without any warranty
** of any kind.
**
** (c)Copyright System Workbench for MCU.
** You may use this file as-is or modify it according to the needs of your
** project. Distribution of this file (unmodified or modified) is not
** permitted. System Workbench for MCU permit registered System Workbench(R) users the
** rights to distribute the assembled, compiled & linked contents of this
** file as part of an application binary file, provided that it is built
** using the System Workbench for MCU toolchain.
**
*****************************************************************************
*/
/* Includes */
#include <sys/stat.h>
#include <stdlib.h>
#include <errno.h>
#include <stdio.h>
#include <signal.h>
#include <time.h>
#include <sys/time.h>
#include <sys/times.h>

/* Variables */
//#undef errno
extern int errno;
#define FreeRTOS
#define MAX_STACK_SIZE 0x2000
extern int __io_putchar(int ch) __attribute__((weak));
extern int __io_getchar(void) __attribute__((weak));
#ifndef FreeRTOS
 register char * stack_ptr asm('sp');
#endif

register char * stack_ptr asm('sp');
char *__env[1] = { 0 };
char **environ = __env;

/* Functions */
void initialise_monitor_handles()
{
}
int _getpid(void)
{
return 1;
}
int _kill(int pid, int sig)
{
errno = EINVAL;
return -1;
}
void _exit (int status)
{
_kill(status, -1);
while (1) {}/* Make sure we hang here */
}
int _read (int file, char *ptr, int len)
{
int DataIdx;
for (DataIdx = 0; DataIdx < len; DataIdx++)
{
*ptr++ = __io_getchar();
}
return len;
}
int _write(int file, char *ptr, int len)
{
int DataIdx;
for (DataIdx = 0; DataIdx < len; DataIdx++)
{
__io_putchar(*ptr++);
}
return len;
}
caddr_t _sbrk(int incr)
{
extern char end asm('end');
static char *heap_end;
char *prev_heap_end;
if (heap_end == 0)
heap_end = &end;
prev_heap_end = heap_end;
if (heap_end + incr > stack_ptr)
{
//write(1, 'Heap and stack collision
', 25);
//abort();
errno = ENOMEM;
return (caddr_t) -1;
}
heap_end += incr;
return (caddr_t) prev_heap_end;
}
int _close(int file)
{
return -1;
}

int _fstat(int file, struct stat *st)
{
st->st_mode = S_IFCHR;
return 0;
}
int _isatty(int file)
{
return 1;
}
int _lseek(int file, int ptr, int dir)
{
return 0;
}
int _open(char *path, int flags, ...)
{
/* Pretend like we always fail */
return -1;
}
int _wait(int *status)
{
errno = ECHILD;
return -1;
}
int _unlink(char *name)
{
errno = ENOENT;
return -1;
}
int _times(struct tms *buf)
{
return -1;
}
int _stat(char *file, struct stat *st)
{
st->st_mode = S_IFCHR;
return 0;
}
int _link(char *old, char *new)
{
errno = EMLINK;
return -1;
}
int _fork(void)
{
errno = EAGAIN;
return -1;
}
int _execve(char *name, char **argv, char **env)
{
errno = ENOMEM;
return -1;
}�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?

Posted on October 12, 2017 at 16:33

I'm using the syscalls.c generated by cube mx v4.1 (attached)

________________

Attachments :

syscalls.c.zip : https://st--c.eu10.content.force.com/sfc/dist/version/download/?oid=00Db0000000YtG6&ids=0680X000006HyNA&d=%2Fa%2F0X0000000b6k%2FJmRKF9OzUPPKvIXfjSXXarzlrrCS.UPMyv5b38bNAZQ&asPdf=false
Posted on October 13, 2017 at 16:17

I don't know the answer, but I wanted to chime in, that I have exactly the same problem, with the latest cube mx 4.22.1 for F207ZG-NUCLEO board.

It seems to be an issue when generating with FreeRTOS. 

Anyway, I temporarily take out the syscall.c from makefile, and works fine for me at the moment until it get's fixed.

Imen.D
ST Employee
Posted on October 30, 2017 at 11:57

Hello,

This issue is reported internally to the appropriate team.

Kind Regards

Imen

When your question is answered, please close this topic by clicking "Accept as Solution".
Thanks
Imen
Sirma Siang
ST Employee
Posted on October 30, 2017 at 17:04

Hello

nicholas.steele

,

First I thank you for your feedback.

Same topic is discussed in the following thread

https://community.st.com/0D50X00009XkX6OSAV

.

Have you modified the generated makefile ?

If not, could you describe a bit more your environement, generation and build process (from Cube to your IDE), your OS ?

Kind regards

Sirma

Posted on October 30, 2017 at 17:56

I'm using a custom Makefile generated outside of CubeMX. I do use Cube for source file generation. I use cmake and gcc-arm-none-eabi version 6.3.1 compiler to generate a Makefile. I use Ubuntu 14.04 OS.

Is there something in the generated Makefile that fixes this?

Posted on October 30, 2017 at 18:40

Indeed,

The generated makefile has 

_SYS_TIME_H_

 defined, and thus the gcc header are not included (because of the reinclusion preventing mecanisme).

Kind regards

Sirma

Posted on October 30, 2017 at 18:42

The generated makefile has the following section:

♯ C defines

C_DEFS = \

-D_TIMEVAL_DEFINED \

-D_SYS_TIME_H_ \

-DUSE_HAL_DRIVER \

-DSTM32F107xC

Kind regards

Sirma

Posted on October 30, 2017 at 18:54

I will be incorporating this into my cmake build process.