IAR в вопросах и ответах

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Открыл глаза
Аватара пользователя
Сообщения: 56
Зарегистрирован: Пн дек 25, 2006 02:29:15
Откуда: г.Винница Украина

Сообщение factorial »

Не подскажет ли кто, куда в IAR AVR (4.10) помещается контрольная сумма всего кода при настройках проекта (закладка link/processing) и как ее лучше всего проверить? :idea: Хочу организовать проверку всего кода на корректность при каждой загрузке прибора....Проверял ли кто?
А кота своего я назвал квадратом...
Контактная информация:
Реклама
Опытный кот
Аватара пользователя
Сообщения: 703
Зарегистрирован: Вс янв 18, 2009 21:12:49

Сообщение asteroid7 »

Всем форумчанам, Привет!

2factorial:
В IAR-е неудачно реализован подсчёт checksum. Теоретически, сделать такое можно, но неоправданно сложно. Параметр "-h" работает только один раз! в проекте и по умолчанию занят заполнением векторов прерывания (RETI).
Вы пробовали ковырять xcl файлы? Если да, то пишете полностью свой xcl файл проекта. Курить "Linker and Library Tools" параметры: -J и -h (без "h" checksum не работает). В зарезервированном сегменте "CHECKSUM" указываете куда помещать результат вычислений.

Ошибся... не xml а xcl файл...
Последний раз редактировалось asteroid7 Чт фев 12, 2009 19:42:28, всего редактировалось 2 раза.
Реклама
Открыл глаза
Сообщения: 70
Зарегистрирован: Пт янв 30, 2009 18:02:40

Сообщение mackerel »

Трудности при переходе с ассемблера (как там было просто!) на C.
В Help приводится тьма-тьмущая сегментов. А объяснение - буквально в двух словах. Запутался. Что-то для стека данных... Что-то для переменных таких, что-то для сяких... Что-то для кучи... Как всем этим хозяйством управлять? И нужно ли? Даже при размещении констант во flash - какие-то __near, __far, __huge...
Кто в курсе, есть документ, где это описано более внятно, с примерами?
Понимаю дилетантизм вопроса - но всё-же?

Проще было бы для начала поработать в CodeVision, да уж больно неоптимальный код он генерирует, мне никак не подходит.
Опытный кот
Аватара пользователя
Сообщения: 703
Зарегистрирован: Вс янв 18, 2009 21:12:49

Сообщение asteroid7 »

Не думаю, что есть перевод "AVR® IAR C/C++ Compiler Reference Guide".
В 99% не стоит трогать сегменты (FAR_ID, HUGE_F, TINY_Z и ещё список на лист A4). При создании проекта они автоматически настраиваются при выборе процессора в General options -> Target -> Processor configuration.
А вот __near, __far, __huge и прочее - это указатели типов данных. С ними тоже не стоит заморачиваться. Самые востребованные из них
__flash и __eeprom.
Реклама
Эиком - электронные компоненты и радиодетали
Открыл глаза
Сообщения: 70
Зарегистрирован: Пт янв 30, 2009 18:02:40

Сообщение mackerel »

asteroid7 писал(а):А вот __near, __far, __huge и прочее - это указатели типов данных. С ними тоже не стоит заморачиваться. Самые востребованные из них
__flash и __eeprom.
Понятно, спасибо. Тогда ещё вопросец - если я применяю __flash - разместятся ли соответствующие данные в старших 64K Flash (ну, или там частично - в младших 64K, частично - в старших)? А то у меня куча массивов в проекте...
Собственно, это я к тому, что не лучше ли __hugeflash, например?

Да, ещё: мне не нужен "переведённый" ответ на сабж, устроит и английский текст... Лишь бы было понятно для чайников, с примерами. Желательно даже с картинками :)
Реклама
Опытный кот
Аватара пользователя
Сообщения: 703
Зарегистрирован: Вс янв 18, 2009 21:12:49

Сообщение asteroid7 »

Так у Вас камень с flash > 64kb?
Если да, и программа или массив > 64kb, то без __hugeflash не обойтись.

PDF "Compiler Reference Guide" поставляется с каждым IARом. В Help-е, обычно, 6-ая ссылка сверху.
Реклама
Открыл глаза
Сообщения: 70
Зарегистрирован: Пт янв 30, 2009 18:02:40

Сообщение mackerel »

Очередная непонятка:
Как мне применить константу, назначенную посредством #define в другом файле? Т.е. например, переменную я объявляю как extern. А в этом случае что делать?
(Так, в частности, у меня заданы символические имена битов в байте. Объявлять их в header очень неудобно, они привязаны к переменным. Дублировать объявления как-то тоже не хочется).
Опытный кот
Аватара пользователя
Сообщения: 703
Зарегистрирован: Вс янв 18, 2009 21:12:49

Сообщение asteroid7 »

#define-ом назначается имя константы, но никак не константа.

extern нужна, когда собирается один проект из двух и более внешних отдельно компилящихся файлов. Вот чтобы проект знал какие внешние переменные и функции использовать, их и описывают extern-ом.

Вероятнее всего, у Вас файлы добавлены в проект через Workspace окно. Удалите все кроме основного (где функция main()) и пристегните их через #include.
Открыл глаза
Сообщения: 70
Зарегистрирован: Пт янв 30, 2009 18:02:40

Сообщение mackerel »

asteroid7 писал(а):Вероятнее всего, у Вас файлы добавлены в проект через Workspace окно. Удалите все кроме основного (где функция main()) и пристегните их через #include.
Это-то понятно, но файлы действительно должны отдельно компилироваться, они используются в разных проектах. А для настройки используется условная копмиляция. Для этого я хочу где-то вовне определить #define ALPHA 0, а в текущем файле - использовать это самое ALPHA. Ну и ещё, как говорил, биты в байте хочу определить извне, т.е. иногда #define SygnalInput 3, а иногда, например, #define SygnalInput 5. Ещё раз повторюсь, делать это в заголовочном файле крайне неудобно (в этом конкретном случае), по ряду причин.
А что ещё можно придумать?
Опытный кот
Аватара пользователя
Сообщения: 703
Зарегистрирован: Вс янв 18, 2009 21:12:49

Сообщение asteroid7 »

Разруливать компиляцию нескольких проектов - только условной компиляцией. Других вариантов незнаю. Обычно, создаётся общий .H файл для всех, в нём и мудрят.
Может такое пригодится:

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

#if SygnalInput == 5 // или проще #ifdef SygnalInput
#undef SygnalInput
#endif
#define SygnalInput 3
Открыл глаза
Аватара пользователя
Сообщения: 56
Зарегистрирован: Пн дек 25, 2006 02:29:15
Откуда: г.Винница Украина

Сообщение factorial »

asteroid7:
Вообщем с помощью -H я забил лишнее пространство кода rjm-ом на свою функцию (для регистрации ошибки), а неиспользуемые вектора с помощю asm файла инструкцией reti (для того чобы не дублировать -H). Но вот с crc толком сделать ничего не могу. В Xlink.pdf описан такой алгоритм посчета:
unsigned long
crc(int bit, unsigned long oldcrc)
{
unsigned long newcrc = (oldcrc << 1) ^ bit;
if (oldcrc & 0x80000000)
newcrc ^= POLY;
return newcrc;
}
(POLY = 0x11021, bit - входное слово, начальное crc = 0)

Для проверки подсчитываю для одного слова.
Записываю такую строку:
-J,crc16,1=0-1
не сходится...
От непомнимая делаю еще такое:
-J,crc16,1=0-2
-J,crc16,2=0-1
-J,crc16,2=0-2
И получаю результаты в дебагере и все отличные от подсчитанного за выше указанным алгоритмом и между собой :?
Не могу понять где эту зависимость можно увидеть в алгоритме..... :? .

И несильно понятно, что значит и для чего вот это:
flag
flag can be used to specify complement and/or the bit-order of the checksum
1 Specifies one’s complement.
2 Specifies two’s complement.
m Mirrored bytes. Reverses the order of the bits within each byte when
calculating the checksum. You can specify just m, or m in combination
with either 1 or 2.

На перед спасибо тому кто подскажет....
А кота своего я назвал квадратом...
Контактная информация:
Опытный кот
Аватара пользователя
Сообщения: 703
Зарегистрирован: Вс янв 18, 2009 21:12:49

Сообщение asteroid7 »

Пример реализации. Считаем во flash для 16 байт.

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

//xcl
-Z(CODE)CHECKSUM=0010 //расположение CRC
-HFF -h(CODE)0-000F
-J2,crc16,,,CHECKSUM,1,0=(CODE)0-000F
p.s. В форуме блок сode "бьёт" содержимое. Не получилось вставить С код...

и тут не xml а xcl файл...
Вложения
checksum.c
(841 байт) 483 скачивания
Открыл глаза
Аватара пользователя
Сообщения: 56
Зарегистрирован: Пн дек 25, 2006 02:29:15
Откуда: г.Винница Украина

Сообщение factorial »

Не сходится, мало того, когда я меняю что то в коде то меняется контрольная сумма, подсчитанная IARом, как будто он считает ее для всего кода...и в тоже время, когда я меняю область подсчитывания в xml файле, скажем с
-J2,crc16,,,CHECKSUM,1,0=(CODE)0-000F
на
-J2,crc16,,,CHECKSUM,1,0=(CODE)0-0005
то crc меняеться также...., тоесть ограничение области подсчитывания работает, но почему при изменении кода также изм. crc...., когда сам код в эту облясть 100% не входит... :? .
И самое интересное оно не сходиться как я только не меняю....та и понятно почему (((, ведь подсчет все за тем же алгортмом не изменяться...

Тоесть проблема в подсчете crc IARом.
Не понятно, в чем дело, у меня версия 5.11full. :?
А кота своего я назвал квадратом...
Контактная информация:
Опытный кот
Аватара пользователя
Сообщения: 703
Зарегистрирован: Вс янв 18, 2009 21:12:49

Сообщение asteroid7 »

Сейчас проверил в 5.10A - всё работает. Где то вы ошиблись.
CRC для блока из 256 значений заполненных 0xDD = 0x1F75. Посмотрите в симуляторе что компилятор генерит.
Вложения
checksum.GIF
мой скриншот симулятора
(16.23 КБ) 370 скачиваний
Открыл глаза
Аватара пользователя
Сообщения: 56
Зарегистрирован: Пн дек 25, 2006 02:29:15
Откуда: г.Винница Украина

Сообщение factorial »

Решил попробовать С++. И возник вопос:
Как обявить template метода в не класса.
К примеру, я имею функцию Write_Data(unsigned int adr, T *data):

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

template <class T> bool Mem::Write_Data(unsigned int adr, T *data)
{
    Типонезависимый код;
}
Я хочу ее использовать в классе. Как мне ее обявить??
Пробовал такие варианты, ругаеться:

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

class Mem
{
    public:
       template <class T> bool Write_Data(unsigned int adr, T *data);
}

main
{
    Mem mem;
    char data = 5;
    unsigned int adr = 1;
    mem.Write_Data(adr, &data);
    ...
}
-------------------------------------------------------------
class Mem
{
      public:
        bool Write_Data(unsigned int adr, char *data);
}
------------------------------------------------------------
И еще куча всяких вариантов..... Подскажите :roll:
Я в итоге пока обявил кучу одинаковых по построению функций с разнымы типами..., вместо того чтобы это делал компилятор.
bool Mem::Write_Data(unsigned int adr, char *data)
bool Mem::Write_Data(unsigned int adr, unsigned int *data)
bool Mem::Write_Data(unsigned int adr, float *data)
.....
PS: Пример условный. Использование шаблона класса не подходит, так как по всей видимости тогда нужно обявлять несколько объектов
А кота своего я назвал квадратом...
Контактная информация:
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»