Skip to main content
Nick Steele
Associate
October 6, 2017
Solved

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

  • October 6, 2017
  • 3 replies
  • 2567 views
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.

    This topic has been closed for replies.
    Best answer by Sirma Siang
    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

    3 replies

    john doe
    Senior III
    October 6, 2017
    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;
    }�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?�?

    Nick Steele
    Associate
    October 12, 2017
    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
    Raivis Strogonovs
    Associate
    October 13, 2017
    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.

    ST Technical Moderator
    October 30, 2017
    Posted on October 30, 2017 at 11:57

    Hello,

    This issue is reported internally to the appropriate team.

    Kind Regards

    Imen

    In order to give better visibility on the answered topics, please click on 'Best answer' on the reply which solved your issue or answered your question. Thanks
    Sirma Siang
    ST Employee
    October 30, 2017
    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

    Nick Steele
    Associate
    October 30, 2017
    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?

    Sirma Siang
    ST Employee
    October 30, 2017
    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