Arduino, PROGMEM (лыжи встали)

Модератор: Модераторы разделов

Аватара пользователя
Bizdelnick
Модератор
Сообщения: 21351
Статус: nulla salus bello
ОС: Debian GNU/Linux

Arduino, PROGMEM

Сообщение Bizdelnick »

Взялся ковырять старый, некогда работавший, скетч и обнаружил, что он не собирается. Весь его приводить не буду, ограничусь простым примером:

Код: Выделить всё

#include <avr/pgmspace.h>

prog_char somestring[] PROGMEM = "Some string";

void setup()
{
  Serial.begin();
  Serial.print(somestring);
}

void loop()
{}

Сие хозяйство не компилируется, утверждая, что не знает типа prog_char:

Arduino

sketch_aug04a.cpp:6:1: error: ‘prog_char’ does not name a type sketch_aug04a.cpp: In function ‘void setup()’: sketch_aug04a.cpp:10:16: error: ‘somestring’ was not declared in this scope


Тип, как и положено, определяется в /usr/lib/avr/include/avr/pgmspace.h. С год назад такого безобразия точно не наблюдалось. С тех пор практически весь avr-стек я зачем-то обновил до состояния Debian Wheezy.
Spoiler
<div class="conheader">%
<pre class="conbody">

Код: Выделить всё

% dpkg-query -p avr-libc gcc-avr arduino-core
Package: avr-libc
Priority: extra
Section: otherosfs
Installed-Size: 28741
Maintainer: Hakan Ardo <hakan@debian.org>
Architecture: all
Version: 1:1.8.0-2
Depends: gcc-avr (>= 1:4.7-1), binutils-avr (>= 2.20.1-2)
Size: 5765994
Description: Standard C library for Atmel AVR development
 Standard library used to the development of C programs for the
 Atmel AVR micro controllers. This package contains static
 libraries as well as the header files needed.

Package: gcc-avr
Priority: extra
Section: devel
Installed-Size: 32987
Maintainer: Hakan Ardo <hakan@debian.org>
Architecture: amd64
Version: 1:4.7.0-2
Provides: c-compiler-avr
Depends: libc6 (>= 2.11), libgmp10, libmpc2, libmpfr4 (>= 3.1.0), zlib1g (>= 1:1.1.4), binutils-avr (>= 2.18-4)
Suggests: task-c-devel, gcc-doc (>= 4:4.0.2-1), gcc-4.2, avr-libc (>= 1:1.6.2-2)
Conflicts: avr-libc (<= 1:1.7.1-2)
Size: 13221708
Description: The GNU C compiler (cross compiler for avr)
 This is the GNU C compiler, a fairly portable optimizing compiler which
 supports multiple languages.  This package includes support for C.

Package: arduino-core
Priority: extra
Section: electronics
Installed-Size: 4422
Maintainer: Scott Howard <showard@debian.org>
Architecture: all
Source: arduino
Version: 1:1.0.1+dfsg-4
Depends: gcc-avr (>= 4.7.0), avrdude, gcc, avr-libc (>= 1.8.0)
Suggests: arduino-mk
Size: 717424
Description: Code, examples, and libraries for the Arduino platform
 Arduino is an open hardware microcontroller platform.  This package contains
 the minimal set of tools to allow one to program an Arduino.  It also contains
 examples and libraries. For a CLI, see the 'arduino-mk' package.
 .
 This package does not include the Java based Integrated Development
 Environment, which can be found in the 'arduino' package.
Homepage: http://www.arduino.cc
</pre>
</div>
Подскажите, люди добрые, в каком направлении копать, учитывая, что в программировании микроконтроллеров и в C++ я полнейший нуб.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
IMB
Сообщения: 2567
ОС: Debian

Re: Arduino, PROGMEM

Сообщение IMB »

Код: Выделить всё

$ apt-file search avr/pgmspace.h
avr-libc: /usr/lib/avr/include/avr/pgmspace.h

usr/lib/avr/include входит в $PATH ?
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 21351
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Arduino, PROGMEM

Сообщение Bizdelnick »

Я понятия не имею, в каком окружении Arduino IDE запускает компилятор. Но если бы он не мог найти файл, ошибка была бы другая:

Arduino

sketch_aug04a.cpp:1:25: fatal error: avr/pgspace.h: Нет такого файла или каталога compilation terminated.

Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
IMB
Сообщения: 2567
ОС: Debian

Re: Arduino, PROGMEM

Сообщение IMB »

Проверьте используемый Makefile, возможно в него надо дописать некий define или указать его в используемом IDE.
Как пример:

Код: Выделить всё

man 3 fprintf
...................
Feature Test Macro Requirements for glibc (see feature_test_macros(7)):

       snprintf(), vsnprintf():
           _BSD_SOURCE || _XOPEN_SOURCE >= 500 || _ISOC99_SOURCE ||
           _POSIX_C_SOURCE >= 200112L;
           or cc -std=c99
..............
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 21351
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Arduino, PROGMEM

Сообщение Bizdelnick »

Ответ нашёлся здесь.
Рабочий вариант:

Код: Выделить всё

#define __PROG_TYPES_COMPAT__
#include <avr/pgmspace.h>

const prog_char somestring[] PROGMEM = "Some string";

void setup()
{
  Serial.begin();
  Serial.print(somestring);
}

void loop()
{}

Либо так, но, как я понимаю, совместимость со старыми версиями avr-libc потеряется:

Код: Выделить всё

#include <avr/pgmspace.h>

const char somestring[] PROGMEM = "Some string";

void setup()
{
  Serial.begin();
  Serial.print(somestring);
}

void loop()
{}


Upd. Всё фигня. Ушёл читать http://www.nongnu.org/avr-libc/user-manual/pgmspace.html.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали: