Thanks David!
I do not think I agree with all of it (e.g. sdcc is
actively developed with regular releases and supports
tiny devices which are used for extreme low-power
applications) and I do not personally think that only
C++ counts nowadays, especially in the embedded world,
but we do not need to discuss this now. I still very
much appreciate your input!
Note that I am involved with C standardization, but
TR 18307 precedes this.
Martin
Am Mittwoch, dem 05.07.2023 um 13:34 +0200 schrieb David Brown:
>
>
> On 05/07/2023 11:25, Martin Uecker wrote:
> > Am Mittwoch, dem 05.07.2023 um 11:11 +0200 schrieb David Brown:
> > > On 05/07/2023 10:05, Rafał Pietrak via Gcc wrote:
> >
> > ...
> > >
> > > In my personal opinion (which you are all free to disregard),
> > > named
> > > address spaces were an interesting idea that failed. I was
> > > enthusiastic
> > > about a number of the extensions in TR 18307 "C Extensions to
> > > support
> > > embedded processors" when the paper was first published. As I
> > > learned
> > > more, however, I saw it was a dead-end. The features are too
> > > under-specified to be useful or portable, gave very little of use
> > > to
> > > embedded programmers, and fit badly with C. It was an attempt to
> > > standardise and generalise some of the mess of different
> > > extensions
> > > that
> > > proprietary toolchain developers had for a variety of 8-bit CISC
> > > microcontrollers that could not use standard C very effectively.
> > > But
> > > it
> > > was all too little, too late - and AFAIK none of these
> > > proprietary
> > > toolchains support it. GCC supports some of the features to some
> > > extent
> > > - a few named address spaces on a few devices, for "gnuc" only
> > > (not
> > > standard C, and not C++), and has some fixed point support for
> > > some
> > > targets (with inefficient generated code - it appears to be
> > > little
> > > more
> > > than an initial "proof of concept" implementation).
> > >
> > > I do not think named address spaces have a future - in GCC or
> > > anywhere
> > > else. The only real use of them at the moment is for the AVR for
> > > accessing data in flash, and even then it is of limited success
> > > since
> > > it
> > > does not work in C++.
> >
> > Can you explain a little bit why you think it is a dead-end? It
> > seems an elegant solution to a range of problems to me.
>
> Named address spaces are not standardised in C, and I do not expect
> they
> ever will be. The TR18307 document is not anywhere close to being of
> a
> quality that could be integrated with the C standards, even as
> optional
> features, and much of it makes no sense in practice (I have never
> heard
> of the IO stuff being implemented or used).
>
> The few compilers that implement any of it do so in different ways -
> the
> "__flash" address space in AVR GCC is slightly different from the
> same
> extension in IAR's AVR compiler. For existing compilers, there is a
> strong inconsistency as to whether such things are "named address
> spaces", "extension keywords", "type qualifiers", "attributes", or
> other
> terms, all with subtly (or not so subtly) different effects on how
> they
> are used, what restrictions exist, conversions between types, and how
> errors can be diagnosed. Sometimes these features are considered
> part
> of the data type, sometimes of pointer types, sometimes they are just
> about data placement.
>
> Since every compiler targeting these small awkward microcontrollers
> has
> a different idea of what something like "const __flash int x = 123;"
> means, and has been implementing their own ideas for a decade or two
> before TR18307 ever proposed "named address spaces", the TR hasn't a
> hope of being a real standard.
>
> Named address spaces are not implemented at all, anywhere (AFAIK),
> for
> C++. (Some embedded toolchains have limited support for C++ on such
> microcontrollers, but these are again not really named address
> spaces.)
> Since C++ usage is heavily increasing in the small embedded system
> world, this is important. (GCC has much of the honour for that - as
> ARM
> took a bigger share of the market and GCC for ARM improved, the
> toolchain market was no longer at the mercy of big commercial vendors
> who charged absurd amounts for their C++ toolchains.) A feature
> which
> is only for C, and not supported by C++, is almost guaranteed to be
> dead-end.
>
> And of course the type of processor for which named address spaces or
> other related extensions are essential, are a dying breed. The AVR
> is
> probably the only one with a significant future. Part of the appeal
> of
> ARM in the embedded world is it frees you from the pains of
> target-specific coding with some of your data in "near" memory, some
> in
> "extended" memory, some in "flash" address spaces or "IO" address
> spaces. It all works with standard C or C++. The same applies to
> challengers like RISC-V, MIPS, PPC, and any other core - you have a
> single flat address space for normal data.
>
> >
> > I have no idea how much the GCC features are actually used,
> > but other compilers for embedded systems such as SDCC also
> > support named address spaces.
> >
>
> And the targets supported by SDCC are also dead-end devices - there
> is
> not a single one of them that I would consider for a new project.
> These
> microcontrollers are now used almost exclusively for legacy projects
> -
> updates to existing hardware or software, and rely on compatibility
> with
> existing C extensions (whether they are called "named address
> spaces",
> "extension keywords", or anything else).
>
>
> Now, there are things that I would like to be able to write in my
> code
> that could appear to be candidates for some kind of named address
> space.
> For example, I might want data that is placed in an external eeprom
> -
> it could be nice to be able to define, declare, read and write it
> like
> normal data in the code. But key to this would be the ability to
> define
> the way this works in /user/ code - named address spaces require
> changing the toolchain, which is out of the question in almost all
> use-cases. And it would spoil one of C's key advantages over
> alternative languages - to a fair extent (though not as completely as
> many people believe), you can guess what is happening from the code.
> You assume that "x = eeprom_var;" is small and efficient, while "x =
> read_eeprom(eeprom_var)" might take significant time to execute.
> People
> don't like hidden things in their C code.
>
> It would be conceivable for GCC to add extensions that could be used
> to
> define your own named address spaces in user code. But doing so
> would
> require a lot of syntax and features that already exist in C++.
>
> I would rather see better ways of controlling placement of data added
> to
> the compiler. In another post, I suggested allowing variable
> attributes
> - such as "section" - to be attached to types. I'd also like to see
> a
> way to specify the section name by compile-time evaluated code, not
> just
> a string literal. I'd like to be able to give sub-sections, and
> section
> flags in a convenient way. And - perhaps most importantly - I'd like
> to
> be able to use #pragma's to give sections for code or data for a
> block
> of code and data at a time, rather than having to specify it
> individually on each function. (That could perhaps also be done by
> allowing section attributes on namespaces in C++.)
>
>
> David
>