Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Gcc 4.7.x AVR и PROGMEM
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > GNU/OpenSource средства разработки
sherr
Где-то встречал, что начиная с какой-то из свежих версий GCC AVR для размещения констант в флеш-памяти вместо модификатора
PROGMEM достаточно указывать const (как у GCC ARM), но повторно найти это не могу ...
Подтвердите или опровергните, пожалуйста ...
Сергей Борщ
Опровергаю. Там появились адресные пространства, теперь можно указывать __flash и обращаться без всяких pgm_read_xxx(). Но только в Си, в плюсах этого нет и, по всей видимости, не будет. А const добавлять надо, да - ибо данные-то неизменяемые.
ReAl
Цитата(Сергей Борщ @ Jan 26 2013, 21:36) *
Но только в Си, в плюсах этого нет и, по всей видимости, не будет.
Что меня очень удручает…
Ну да, это из С-шного стандарта, как бы к C++ отношения не имеет. Но в режиме gnu++ могли бы и сделать.

p.s. А const и при PROGMEM правильно писать (неправильно не писать).


Цитата(sherr @ Jan 26 2013, 16:56) *
PROGMEM достаточно указывать const (как у GCC ARM)
Это невозможно в принципе.
Точнее, возможно только в случае, если все указатели в языке будут «универсальные», хранящие где-то в старших битах признак ОЗУ/флеш и при любом обращении будет идти проверка тех битов, условный переход на LD/LPM.
Я лично не такое не согласен :-)

Чтобы это понять, достаточно знать, что в C означает квалификатор const.
Смотрите:
Код
char const *p; // Указатель на char, который мы не имеем права менять

char const cc; // char, который мы не имеем права менять
char cn;       // char, который мы имеем право менять


    p = &cc; // ну тут понятно
    if (*p == 'a') …

    p = &cn;
    // дальше мы просто не сможем поменять значение cn, пользуясь указателем p,
    // но мы должны иметь возможность прочитать cn
    if (*p == 'b') …
А вот представьте себе, что char const cc; затолкало cc во флеш и обращение по указателю char const *p; считывает флеш. В результате после p = &cn; ничего не заработает. А должно работать, так как и то, и то — данные.

Помещение const-объектов для архитектур с единым адресным пространством в ПЗУ — это просто такая оптимизация расходов ОЗУ, ничего не меняющая в работе кода. Те же самые команды так же работают. В функцию puts(char const *str); мы можем передать как константную, так и неконстантную строку и все будет работать. Она даже не будет знать, что ей передали не константную строку, просто она обещает относиться к ней как константной и всё.

При разных адресных пространствах, как у AVR, такое помещение изменит ситуацию кардинально.
amaora
Написать свой срипт линкера который отправляет .rodata во флеш, я так делаю чтобы объявлять строковые константы как обычно а не через это место. Но надо помнить, что все const попадают во флеш и читать их надо от туда.

Про __flash не знал, пойду посмотрю, спасибо.
_Pasha
Цитата(amaora @ Jan 28 2013, 19:10) *
я так делаю чтобы объявлять строковые константы как обычно а не через это место.

Эх. Если бы еще была такая возможность:
например, задаем в большом кол-ве printf() строки, а они складываются в секцию без повторений. Дас ист фантастиш.
ReAl
Цитата(_Pasha @ Jan 28 2013, 18:34) *
Эх. Если бы еще была такая возможность:
например, задаем в большом кол-ве printf() строки, а они складываются в секцию без повторений. Дас ист фантастиш.
А ещё чтобы хвосты сшивал (и слюнки потекли…), т.е. для "write: done" и "done" заводил одну строку и для "done" показывал в её хвост…

Но это беда AVR.
Код
// merge.c
#include <stdio.h>

extern void foo();

void moo()
{
        printf("-%s-\n", "fooo");
}

int main()
{
        foo();
        moo();
}

Код
// foo.c
#include <stdio.h>

void foo()
{
        puts("fooo");
        puts("another fooo");
}

Цитата
$ avr-gcc -O2 -o merge merge.c foo.c
$ strings merge
(кучка случайной чепухи)
-%s-
fooo
fooo
another fooo
У более других с этим вроде легче:
Цитата
$ gcc -O2 -s -o merge merge.c foo.c
$ strings merge
/lib64/ld-linux-x86-64.so.2
__gmon_start__
(кучка разного и случайной чепухи)
-%s-
another fooo
Цитата
$ arm-kgp-eabi-gcc -mcpu=cortex-m3 -mthumb -O2 -s -o merge merge.c foo.c
$ strings merge
(гора случайной чепухи)
-%s-
another fooo
0000000000000000INF
0123456789ABCDEF
0123456789abcdef


p.s. -fmerge-constants -fmerge-all-constants для avr-gcc не помогает, для остальных и не нужен оказался
demiurg_spb
Цитата(amaora @ Jan 28 2013, 20:10) *
Про __flash не знал, пойду посмотрю, спасибо.
Рано радоваться...
Только вчера сделал bug report
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.