Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: flash память
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > Cредства разработки для МК > IAR
laryc
Добрый писать и День! Нигде не могу найти подходящую информацию как и извлекать информацию из флешь памяти (есть такая насущность) в IAR.
На ассемблере таких проблем почемуто не возникало.

#include <pgmspace.h>
.......................

unsigned char tt;
const char __flash Sound[3] = {0,1,2};

...включаем компилятор - всё ОК!
..........
далее хочу взять константу из flash ... пишу

tt = Sound[2]; ( .....пробовал _flash Sound[3] ..и по всякому менял синтаксис)

компилятор выдаёт ошибку:

Ошибка [Pe077]: эта декларация не имеет класса хранения или спецификатор типа
Ошибка [Pe147]: декларация несовместима с "неподписанные символ ТТ"
Ошибка [Pe028]: выражение должно иметь постоянное значение
amiller
Вам надо было указать платформу, для которой пытаетесь писать.
Насколько помню, объявления в IAR различаются в зависимости от платформы.
Для STM32 и STM8 достаточно написать:
const char Sound[3] = {0,1,2};
А для AVR нужно:
__flash const char Sound[3] = {0,1,2};
У вас вероятно нарушен правильный порядок объявления.
А обращение во всех случаях одинаково:
tt = Sound[2];
laryc
исправил... платформа IAR AVR 6.12

char tt;
__flash const char Sound[] = {0,1,2};

tt = Sound[2];
компилируем имеем

Error[Pe077]: this declaration has no storage class or type specifier C:\pistol\main.h 14
Error[Pe147]: declaration is incompatible with "char tt" (declared at line 11) C:\pistol\main.h 14
Error[Pe028]: expression must have a constant value C:\pistol\main.h 14
Error while running C/C++ Compiler
Total number of errors: 3

Три ошибки в слове х..... многовато даже для двоешника


причем порядок ключевых слов при объявлении массива компилятор пропускает в любом порядке ,но как только константу из флеша присваиваю переменноц так три ошибки


одну ошибку извел объявив переменную int

__flash const char Sound = 6;
int tt;
tt = Sound;


имеем

Error[Pe077]: this declaration has no storage class or type specifier C:\pistol\main.h 14
Error[Pe028]: expression must have a constant value C:\pistol\main.h 14
Error while running C/C++ Compiler

Total number of errors: 2
Total number of warnings: 0

Сергей Борщ
QUOTE (laryc @ Feb 20 2017, 16:51) *
Три ошибки в слове х..... многовато даже для двоешника
Простите, а вы на ассемблере тоже команды писали в любой файл в любое место? Попробуйте так:
файл main.c
CODE
__flash const char Sound[] = {0,1,2};
void main()
{
     char tt = Sound[2];
}
И если это сработает - читайте букварь по языку Си.
k155la3
Обратите внимание на "коварность" (в хорошме смысле) оптимизатора IAR.
Если ОН обнаружит что некая переменная на ЕГО взгляд не используется,
то код для ее "обслуживания" вполне может не сгенерироваться.
Отключайте в отладке оптимизацию.

ps - если есть атрибут в версии AVR IAR __root - попробуйте его.
Смотрите распределение памяти в map-файле.
Obam
Цитата(k155la3 @ Feb 23 2017, 19:04) *
Обратите внимание на "коварность" (в хорошме смысле) оптимизатора IAR.
Если ОН обнаружит что некая переменная на ЕГО взгляд не используется,
то код для ее "обслуживания" вполне может не сгенерироваться.
Отключайте в отладке оптимизацию.

ps - если есть атрибут в версии AVR IAR __root - попробуйте его.
Смотрите распределение памяти в map-файле.


А от себя добавлю, даже с отключенной оптимизацией гарантирует наличие чего-либо "__required"
Сергей Борщ
QUOTE (k155la3 @ Feb 23 2017, 17:04) *
Отключайте в отладке оптимизацию.
Простите за прямоту, но это вредный, если не сказать грубее, совет. Вместо прятанья головы в песок путем отключения оптимизации надо разбираться, почему именно оптимизированный код делает не то, что хотел программист. Практика показывает, что в подавляющем большинстве случаев причина в недостаточной квалификации программиста и решение таких проблем эту квалификацию повышает.
k155la3
Цитата(Сергей Борщ @ Feb 23 2017, 21:51) *
Простите за прямоту, но это вредный, если не сказать грубее, совет.

Разбираться, почему не работает оптимизированный код - сильно укрепляет мозг, но не все готовы на такие жертвы sm.gif
В идеале - надо идеально знать процессор, компилятор, язык программирования и ошибок не допускать.
А на "старте", в том числе для изучения оптимизатора - можно использовать вышеуказанный способ. IMHO.
Сергей Борщ
QUOTE (k155la3 @ Feb 24 2017, 09:02) *
А на "старте", в том числе для изучения оптимизатора - можно использовать вышеуказанный способ. IMHO.
Хорошо, отключили вы оптимизацию, как бы отладили программу, включили оптимизацию - программа не работает. И что толку от потраченного на эту отладку времени? Какие следующие действия неокрепшего мозга? А я вам скажу: "Аааа!!!! Компилятор глючит! Отдадим в производство программу без оптимизации и надо всем советовать писать программы с выключенной оптимизацией!"

В конце концов программированием занимаются не первокласники, которым на старте проще сказать "на ноль делить нельзя".
Obam
По поводу main{} присоединяюсь: ТС троллить пытается...

Цитата(Сергей Борщ @ Feb 24 2017, 12:14) *
Хорошо, отключили вы оптимизацию, как бы отладили программу, включили оптимизацию - программа не работает. И что толку от потраченного на эту отладку времени?

И вот тут правильный новичок начнёт разбираться что да как, но имея в качестве соломки, да пусть неоптимизированный, но работающий код.
И ко второму проекту правильный шеф получит молодого специалиста (:

Цитата
В конце концов программированием занимаются не первокласники, которым на старте проще сказать "на ноль делить нельзя".


До первого курса универа, пока пределы и неопределённости не введены как понятие, да - "на ноль делить нельзя"; и в контроллерах, пока обработчик исключения (если есть это исключение) не прописан - не стоит (читай - нельзя) (;
Сергей Борщ
QUOTE (Obam @ Feb 24 2017, 12:17) *
И вот тут правильный новичок начнёт разбираться что да как
Правильный начал бы разбираться сразу, не отключая оптимизацию.

Честное слово, напоминает ситуацию - "ищи под фонарем, там светлее".
jcxz
Цитата(k155la3 @ Feb 24 2017, 09:02) *
Разбираться, почему не работает оптимизированный код - сильно укрепляет мозг, но не все готовы на такие жертвы sm.gif

Сергей прав - если так замазали проблему, не найдя причину ошибки, то она всё равно после вылезет ещё и ещё, или с оптимизацией или без.
Только потом найти её причину будет в разы сложнее и дольше.
А если постоянно так делать, то весь код превратиться в одно сплошное глюкалово.
Как только такой баг вылез - надо сразу искать его причину и не убирать оптимизацию, а наоборот - зафиксировать условия, при которых он стабильно проявляется.
zltigo
Цитата(k155la3 @ Feb 24 2017, 09:02) *
Разбираться, почему не работает оптимизированный код - сильно укрепляет мозг, но не все готовы на такие жертвы sm.gif

Невозможно укреплять то, чего нет sad.gif. Увы sad.gif

scifi
А я просто ещё раз напомню, что оптимизация требуется редко. Обычно всё работает и без неё, и памяти тоже хватает.
Вы же предлагаете использовать оптимизацию не по прямому назначению, а с целью вытряхнуть из кода некий класс глюков. Интересная концепция, конечно, но немного спорная laughing.gif
k155la3
Цитата(jcxz @ Feb 24 2017, 18:06) *
Сергей прав - если так замазали проблему, не найдя причину ошибки, то она всё равно после вылезет ещё и ещё, или с оптимизацией или без.
Только потом найти её причину будет в разы сложнее и дольше.
А если постоянно так делать, то весь код превратиться в одно сплошное глюкалово.
Как только такой баг вылез - надо сразу искать его причину и не убирать оптимизацию, а наоборот - зафиксировать условия, при которых он стабильно проявляется.

Я только "за". Один из методов анализа при поиске багов, своих и и чужих.
Никак не метод устранения ошибок-глюков.
Ошибка или глюк, причина которых не установлена на 100 проц - исправленным не является.

MrYuran
Цитата(Obam @ Feb 23 2017, 18:45) *
А от себя добавлю, даже с отключенной оптимизацией гарантирует наличие чего-либо "__required"

О, спасибо. Вчера полдня потратил, чтобы найти в ИАРе аналог человеческого __attribute__(("used"))
Немного не так:
Цитата
Example
const char copyright[] = "Copyright by me";
#pragma required=copyright


ну все не как у людей smile3046.gif
beer.gif
jcxz
Цитата(MrYuran @ Aug 1 2017, 10:10) *
Немного не так:

Гораздо читабельнее:
Код
__root char const __codeSignature[] @ ".codeSignature" =
  "COMPUTER=" ICC_COMPUTER ";" "USER=" ICC_USER ";"
  "DATE=" __DATE__ ";" "TIME=" __TIME__ ";"
  "SVN_revision=" TO_STRING(SVN_REVISION) ";"
  "DEVICE=" concat(FIRMWARE_TARGET_STR_, FIRMWARE_TARGET);
Obam
Невольно зачётный троллинг получился (;
Ведь у себя сделал:

#pragma location = ".intvec"
const uint8_t Logo[] = {0x2A, 0x2A, 0x2A, 0x20, 0x52, 0x33… ну и т.д.
#pragma required=Logo

а когда пост писал приглючилось, что не может не быть квалификатора "__req…".
Поскольку, это из cstartup.с, то больше к этому не возвращался.

И самое примечательное, что документацию, один хрен, никто не читает (;
jcxz
Цитата(Obam @ Aug 1 2017, 11:09) *
И самое примечательное, что документацию, один хрен, никто не читает (;

не надо говорить за всех...
Obam
Тут тот самый случай.
Полгода в треде ни единого возражения (; и "знающий - не говорит".
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.