Микроконтроллеры

Информация о пользователе

Привет, Гость! Войдите или зарегистрируйтесь.


Вы здесь » Микроконтроллеры » STM32 » Вопросы » stdio


stdio

Сообщений 1 страница 26 из 26

1

Для avr есть - https://www.nongnu.org/avr-libc/user-ma … io_8h.html
Для stm32 нет
Или где-то что-то какое-то всё-таки есть?

2

А какая вообще связь... между АВР и stdio... и для СТМ32 тем более ??? И что это вообще означает "Для stm32 нет" ???

3

Как это нет? Есть в newlib оно. syscalls.c только подпихнуть с заглушками, или nosys.spec использовать или -flto чтобы выкинуть отсылки на функции левые.

PS: речь о gcc, за другое понятия не имею, да и не нужно другое ничего.

Отредактировано NStorm (2019-07-04 07:19:42)

4

А я бы бил ломами по рукам тех, кто пихает куда ни попадя printf'ы и прочую гадость, коей на микроконтроллерах нет места!
Абдуринщики вообще иной раз до такого маразма доходят, что на своих абдуринах флоаты и даже даблы используют! А когда я вижу тригонометрические функции из math.h, мне становится совсем плохо...

5

Все ф-ции stdio работают на avr, для этого специально переделана libc [avr-libc]
Принципиальная разница с армами в том, что такое FILE для avr и arm

Вот например fgetc(uart1) - на avr сделать легко и просто, а как на stm32 ?

Отредактировано vt (2019-07-04 11:01:41)

6

А её разве нет в newlib для stm32?
https://github.com/eblot/newlib/blob/ma … io/fgetc.c
Не проверял и никогда не пользовался даже на AVR если честно. Может spec какой включить надо? Сейчас проверить негде особо.

7

NStorm, fgetc [и другим файловым ф-циям] из newlib вначале нужна fopen
А с fopen на мк проблемы )

Отредактировано vt (2019-07-05 10:44:36)

8

Ну и что??? Вся эта шняга большого серого брата... никогда на МК нормально работать не будет... даже на АВР... Проще сразу забыть...

9

Эта шняга вообще-то неотъемлемая часть си
Для avr она сделана и работает
А для кортексов - "здесь играйте, здесь не играйте, здесь рыбу заворачивали" )

10

vt написал(а):

Эта шняга вообще-то неотъемлемая часть си

Посмеялся...
В ноте к МСС18 прямо было написано... "только номинально, ограничено и без гарантий"... Если даже ИАР и Кейл этим не заморачиваются... значит это никому и не нужно...

11

HHIMERA написал(а):

даже ИАР и Кейл

Тоже посмеялся )

12

Над чем посмеялся??? Над "неотъемлемая часть си"??? Действительно... смешно... ))))))

13

HHIMERA, а как же Керниган и Ритчи, последние главы не читать?
Нет уж, если си, то со всеми плюшками
Или не си
Или трусы надеть, или крестик снять )

14

Если тебе надо, чтобы у тебя на микроконтроллере были stdin/stdout/stderr, то напиши соответствующие обертки над сисвызовами _write, _read и т.п.
Только нафиг оно нужно-то? Все эти говна из stdio годятся лишь для компьютера, на микроконтроллере это — жутчайший оверхед и признак абдурины головного мозга.

15

Не stdin/stdout/stderr, а usartN, spiN, i2cN и т.д. вплоть до gpio и adc

И о каком оверхеде речь, если всё "аппаратно", с dma и всё такое
Ф-ции stdio с буферами работают, не с железом

Отредактировано vt (2019-07-05 15:29:01)

16

vt написал(а):

getc [и другим файловым ф-циям] из newlib вначале нужна fopen

Ни fopen, а FILE *stream - тут и свой можно сделать. Ну и да, оберточки свои придется писать. Пока так вроде и советуют делать. Видимо вот прям такого, как в avr-libc не сделали.
Но честно, тоже не доверил бы такое библиотекам на кортексах. Ладно в AVR - всё просто и вариантов особо нет. А тут будет либа - да фиг его знает, как оно там сделано. Через DMA или еще как. Через жопу сделают как HAL... Ну т.е. ладно бы было к ним доверие, но нет ведь его.

17

vt написал(а):

И о каком оверхеде речь, если всё "аппаратно", с dma и всё такое

Ну так я и говорю: чтобы все работало, ты сам должен нижний уровень написать.
А оверхед как раз из-за использования говнофункций: printf/scanf и т.п.
Не надо STM32 превращать в абдурину всякими калокубами и stdio!

18

Вот что такое FILE в newlib

Код:
struct __sFILE {
  unsigned char *_p;	/* current position in (some) buffer */
  int	_r;    /* read space left for getc() */
  int	_w;    /* write space left for putc() */
  short	_flags;    /* flags, below; this FILE is free if 0 */
  short	_file;    /* fileno, if Unix descriptor, else -1 */
  struct __sbuf _bf;	/* the buffer (at least 1 byte, if !NULL) */
  int	_lbfsize;	/* 0 or -_bf._size, for inline putc */

#ifdef _REENT_SMALL
  struct _reent *_data;
#endif

  /* operations */
  void *	_cookie;	/* cookie passed to io functions */

  _READ_WRITE_RETURN_TYPE (*_read) (struct _reent *, void *,
        	   char *, _READ_WRITE_BUFSIZE_TYPE);
  _READ_WRITE_RETURN_TYPE (*_write) (struct _reent *, void *,
        	    const char *,
        	    _READ_WRITE_BUFSIZE_TYPE);
  _fpos_t (*_seek) (struct _reent *, void *, _fpos_t, int);
  int (*_close) (struct _reent *, void *);

  /* separate buffer for long sequences of ungetc() */
  struct __sbuf _ub;	/* ungetc buffer */
  unsigned char *_up;	/* saved _p when _p is doing ungetc data */
  int	_ur;    /* saved _r when _r is counting ungetc data */

  /* tricks to meet minimum requirements even when malloc() fails */
  unsigned char _ubuf[3];	/* guarantee an ungetc() buffer */
  unsigned char _nbuf[1];	/* guarantee a getc() buffer */

  /* separate buffer for fgetline() when line crosses buffer boundary */
  struct __sbuf _lb;	/* buffer for fgetline() */

  /* Unix stdio files get aligned to block boundaries on fseek() */
  int	_blksize;	/* stat.st_blksize (may be != _bf._size) */
  _off_t _offset;	/* current lseek offset */

#ifndef _REENT_SMALL
  struct _reent *_data;	/* Here for binary compatibility? Remove? */
#endif

#ifndef __SINGLE_THREAD__
  _flock_t _lock;	/* for thread-safety locking */
#endif
  _mbstate_t _mbstate;	/* for wide char stdio functions. */
  int   _flags2;        /* for future use */
};

А вот что такое FILE в avr-libc

Код:
struct __file {
	char	*buf;    /* buffer pointer */
	unsigned char unget;	/* ungetc() buffer */
	uint8_t	flags;    /* flags, see below */
#define __SRD	0x0001    /* OK to read */
#define __SWR	0x0002    /* OK to write */
#define __SSTR	0x0004    /* this is an sprintf/snprintf string */
#define __SPGM	0x0008    /* fmt string is in progmem */
#define __SERR	0x0010    /* found error */
#define __SEOF	0x0020    /* found EOF */
#define __SUNGET 0x040    /* ungetc() happened */
#define __SMALLOC 0x80    /* handle is malloc()ed */
#if 0
/* possible future extensions, will require uint16_t flags */
#define __SRW	0x0100    /* open for reading & writing */
#define __SLBF	0x0200    /* line buffered */
#define __SNBF	0x0400    /* unbuffered */
#define __SMBF	0x0800    /* buf is from malloc */
#endif
	int	size;    /* size of buffer */
	int	len;    /* characters read or written so far */
	int	(*put)(char, struct __file *);	/* function to write one char to device */
	int	(*get)(struct __file *);	/* function to read one char from device */
	void	*udata;    /* User defined and accessible data. */
};

19

Eddy_Em написал(а):

Не надо STM32 превращать в абдурину всякими калокубами и stdio!

Ладно куб, но stdio !?
Это ты на что покушаешься - на основы основ? )

20

stdio только на компьютере нужен, чтобы не изобретать каждый раз printf. А на МК оно нафиг не сдалось!

21

Вместо stdio каждый изобретает какую-то myio_v100500
И где после этого переносимость и повторное использование сишного софта на мк?
За что боролись [с ассемблером]?
Как белки в колесе )

Отредактировано vt (2019-07-05 17:20:12)

22

vt написал(а):

И где после этого переносимость и повторное использование сишного софта на мк?

Так бери сниппет, да копируй себе на здоровье. Я со своими так и делаю... Зато не сжирает лишний килобайт флеша и не тормозит так сильно.

23

Кто ищет, тот найдёт
Нашлось кое-что интересное
Finding a Libc for tiny embedded ARM systems - https://keithp.com/blogs/embedded-arm-libc/

24

Я так понял он портировал avr-libc для STM32? Занятно )

25

Нет, он только в newlib заменил родную stdio на stdio из avr-libc
Портировать всю libc это убиться )

Там на главной сайта есть ссылка на готовый дебиановский пакет с бинарниками
Автор кстати - это https://en.wikipedia.org/wiki/Keith_Packard

Отредактировано vt (2019-07-06 11:31:30)

26

В Espressif пошли другим путём - добавли к newlib Virtual filesystem
https://docs.espressif.com/projects/esp … e/vfs.html


Вы здесь » Микроконтроллеры » STM32 » Вопросы » stdio