> Wiadomość napisana przez David Brown <david.br...@hesbynett.no> w dniu 
> 24.02.2019, o godz. 12:13:
> 
> On 23/02/2019 19:38, Łukasz Kostka wrote:
>>> Wiadomość napisana przez David Brown <david.br...@hesbynett.no> w dniu 
>>> 23.02.2019, o godz. 16:34:
>>> 
>>> On 22/02/2019 23:34, Łukasz Kostka wrote:
>>>> Hi
>>>> I am using for a while now gcc and especially __progmem__ attribute. I’d 
>>>> like to report a feature request for gcc to handle reading from flash 
>>>> memory variables. Compiler has all the knowledge (target device, 
>>>> availability of LPM, ELPM instructions etc.) in order to properly 
>>>> interpret variable is accessed (eg. by array subscription).
>>>> This would remove need for any assembly code written to do this.
>>>> Make user code much cleaner.
>>>> GCC having all this knowledge can optimize end assembly code.
>>>> Simple attribute addition will switch from array in memory to array in 
>>>> flash.
>>>> Can serve as future implementations for other platforms.
>>>> What do you think ?
>>> 
>>> You don't need to write assembly to read flash data with AVR gcc - you have 
>>> never needed it.  To use the "progmem" attribute, include the 
>>> <avr/pgmspace.h> header and use the macros and functions from there, such 
>>> as "pgm_read_byte".
>>> 
>>> <https://www.nongnu.org/avr-libc/user-manual/pgmspace_8h.html>
>> That is my point. I still need to use "ppm_read_byte"
> 
> Using pgm_read-byte is not writing assembly code.  I agree that it is an 
> inconvenience, but it is far less of an inconvenience than writing assembly 
> would be.
> 
>>> 
>>> 
>>> Newer versions of AVR gcc have named address spaces, making the process 
>>> simpler.  I must admit I haven't written any AVR code since these were 
>>> added to the compiler, but I assume they work fine:
>>> 
>>> <https://gcc.gnu.org/onlinedocs/gcc/Named-Address-Spaces.html#Named-Address-Spaces
>>>  
>>> <https://gcc.gnu.org/onlinedocs/gcc/Named-Address-Spaces.html#Named-Address-Spaces>>
>>> 
>> Thx. I didn’t read this before. This works only for C. I use C++ and there 
>> are no named address spaces extensions :-(
> 
> Are you sure?  I don't have a recent AVR compiler handy, but I'd be a little 
> surprised if the named address spaces are C only.  (The gcc documentation 
> about extensions is not always very clear about whether extensions apply to C 
> and C++, or just C.)
> 
> With a little effort, I am confident that you could make C++ template classes 
> that cover the effects of the address spaces and hide the need for 
> pgm_read_byte (and friends) from user code.
https://pastebin.com/8km1GP9q
I use gcc 8.2.0
> 
>> My end goal is to use all variables in exactly same way as in regular code 
>> without <arv/pgmspace.h>
> 
> I think that will be a bit optimistic.  The big killer here is pointers.  It 
> would be reasonable for the compiler to know about direct access to 
> variables, and that is in fact what you get with the named address spaces.  
> But if you pass around a "char *" pointer, there is no way for the compiler 
> to know that it should point to flash memory rather than data memory.  You 
> either have to manually add "pgm_read_byte" and friends when using the 
> pointer, or annotate the pointer's type with an address space qualifier.
> 
> There is a "__memx" address space that can be used to make pointers and 
> accesses generic, but that turns pointers into 24-bits and makes access 
> significantly bigger and slower - you do not want that as the default.
> 
> This sort of thing has been an issue for all sorts of small microcontrollers, 
> and all their compilers, since their inception.  It is not solvable in an 
> ideal way that gives maximal convenience to programmers and still results in 
> efficient code.  The only good solution is to move away from such cpu designs 
> - there are very few reasons for choosing a core such as the AVR rather than 
> an ARM, MIPS or RISC-V alternative.  (You might choose the AVR device for its 
> peripherals, or pin package, or power usage - but not for its core.)
Yes I know that AVR are old architecture.
I will move sooner or later to RISC-V or ARM. In fact bought some board from 
sparkfun. 
Does it mean that in newer cpu designs storing read only variables in flash is 
easier than in AVR ?

Reply via email to