IAR в вопросах и ответах
Не подскажет ли кто, куда в IAR AVR (4.10) помещается контрольная сумма всего кода при настройках проекта (закладка link/processing) и как ее лучше всего проверить?
Хочу организовать проверку всего кода на корректность при каждой загрузке прибора....Проверял ли кто?
А кота своего я назвал квадратом...
- Реклама
- Сообщения: 703
- Зарегистрирован: Вс янв 18, 2009 21:12:49
Всем форумчанам, Привет!
2factorial:
В IAR-е неудачно реализован подсчёт checksum. Теоретически, сделать такое можно, но неоправданно сложно. Параметр "-h" работает только один раз! в проекте и по умолчанию занят заполнением векторов прерывания (RETI).
Вы пробовали ковырять xcl файлы? Если да, то пишете полностью свой xcl файл проекта. Курить "Linker and Library Tools" параметры: -J и -h (без "h" checksum не работает). В зарезервированном сегменте "CHECKSUM" указываете куда помещать результат вычислений.
Ошибся... не xml а xcl файл...
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
Трудности при переходе с ассемблера (как там было просто!) на C.
В Help приводится тьма-тьмущая сегментов. А объяснение - буквально в двух словах. Запутался. Что-то для стека данных... Что-то для переменных таких, что-то для сяких... Что-то для кучи... Как всем этим хозяйством управлять? И нужно ли? Даже при размещении констант во flash - какие-то __near, __far, __huge...
Кто в курсе, есть документ, где это описано более внятно, с примерами?
Понимаю дилетантизм вопроса - но всё-же?
Проще было бы для начала поработать в CodeVision, да уж больно неоптимальный код он генерирует, мне никак не подходит.
В Help приводится тьма-тьмущая сегментов. А объяснение - буквально в двух словах. Запутался. Что-то для стека данных... Что-то для переменных таких, что-то для сяких... Что-то для кучи... Как всем этим хозяйством управлять? И нужно ли? Даже при размещении констант во flash - какие-то __near, __far, __huge...
Кто в курсе, есть документ, где это описано более внятно, с примерами?
Понимаю дилетантизм вопроса - но всё-же?
Проще было бы для начала поработать в CodeVision, да уж больно неоптимальный код он генерирует, мне никак не подходит.
- Сообщения: 703
- Зарегистрирован: Вс янв 18, 2009 21:12:49
Не думаю, что есть перевод "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.
В 99% не стоит трогать сегменты (FAR_ID, HUGE_F, TINY_Z и ещё список на лист A4). При создании проекта они автоматически настраиваются при выборе процессора в General options -> Target -> Processor configuration.
А вот __near, __far, __huge и прочее - это указатели типов данных. С ними тоже не стоит заморачиваться. Самые востребованные из них
__flash и __eeprom.
- Сообщения: 70
- Зарегистрирован: Пт янв 30, 2009 18:02:40
Понятно, спасибо. Тогда ещё вопросец - если я применяю __flash - разместятся ли соответствующие данные в старших 64K Flash (ну, или там частично - в младших 64K, частично - в старших)? А то у меня куча массивов в проекте...asteroid7 писал(а):А вот __near, __far, __huge и прочее - это указатели типов данных. С ними тоже не стоит заморачиваться. Самые востребованные из них
__flash и __eeprom.
Собственно, это я к тому, что не лучше ли __hugeflash, например?
Да, ещё: мне не нужен "переведённый" ответ на сабж, устроит и английский текст... Лишь бы было понятно для чайников, с примерами. Желательно даже с картинками
- Реклама
- Сообщения: 703
- Зарегистрирован: Вс янв 18, 2009 21:12:49
- Сообщения: 70
- Зарегистрирован: Пт янв 30, 2009 18:02:40
Очередная непонятка:
Как мне применить константу, назначенную посредством #define в другом файле? Т.е. например, переменную я объявляю как extern. А в этом случае что делать?
(Так, в частности, у меня заданы символические имена битов в байте. Объявлять их в header очень неудобно, они привязаны к переменным. Дублировать объявления как-то тоже не хочется).
Как мне применить константу, назначенную посредством #define в другом файле? Т.е. например, переменную я объявляю как extern. А в этом случае что делать?
(Так, в частности, у меня заданы символические имена битов в байте. Объявлять их в header очень неудобно, они привязаны к переменным. Дублировать объявления как-то тоже не хочется).
- Сообщения: 703
- Зарегистрирован: Вс янв 18, 2009 21:12:49
#define-ом назначается имя константы, но никак не константа.
extern нужна, когда собирается один проект из двух и более внешних отдельно компилящихся файлов. Вот чтобы проект знал какие внешние переменные и функции использовать, их и описывают extern-ом.
Вероятнее всего, у Вас файлы добавлены в проект через Workspace окно. Удалите все кроме основного (где функция main()) и пристегните их через #include.
extern нужна, когда собирается один проект из двух и более внешних отдельно компилящихся файлов. Вот чтобы проект знал какие внешние переменные и функции использовать, их и описывают extern-ом.
Вероятнее всего, у Вас файлы добавлены в проект через Workspace окно. Удалите все кроме основного (где функция main()) и пристегните их через #include.
- Сообщения: 70
- Зарегистрирован: Пт янв 30, 2009 18:02:40
Это-то понятно, но файлы действительно должны отдельно компилироваться, они используются в разных проектах. А для настройки используется условная копмиляция. Для этого я хочу где-то вовне определить #define ALPHA 0, а в текущем файле - использовать это самое ALPHA. Ну и ещё, как говорил, биты в байте хочу определить извне, т.е. иногда #define SygnalInput 3, а иногда, например, #define SygnalInput 5. Ещё раз повторюсь, делать это в заголовочном файле крайне неудобно (в этом конкретном случае), по ряду причин.asteroid7 писал(а):Вероятнее всего, у Вас файлы добавлены в проект через Workspace окно. Удалите все кроме основного (где функция main()) и пристегните их через #include.
А что ещё можно придумать?
- Сообщения: 703
- Зарегистрирован: Вс янв 18, 2009 21:12:49
Разруливать компиляцию нескольких проектов - только условной компиляцией. Других вариантов незнаю. Обычно, создаётся общий .H файл для всех, в нём и мудрят.
Может такое пригодится:
Может такое пригодится:
Код: Выделить всё
#if SygnalInput == 5 // или проще #ifdef SygnalInput
#undef SygnalInput
#endif
#define SygnalInput 3
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.
На перед спасибо тому кто подскажет....
Вообщем с помощью -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
Пример реализации. Считаем во flash для 16 байт.
p.s. В форуме блок сode "бьёт" содержимое. Не получилось вставить С код...
и тут не xml а xcl файл...
Код: Выделить всё
//xcl
-Z(CODE)CHECKSUM=0010 //расположение CRC
-HFF -h(CODE)0-000F
-J2,crc16,,,CHECKSUM,1,0=(CODE)0-000F
и тут не xml а xcl файл...
- Вложения
-
- checksum.c
- (841 байт) 483 скачивания
Не сходится, мало того, когда я меняю что то в коде то меняется контрольная сумма, подсчитанная 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.
-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
Сейчас проверил в 5.10A - всё работает. Где то вы ошиблись.
CRC для блока из 256 значений заполненных 0xDD = 0x1F75. Посмотрите в симуляторе что компилятор генерит.
CRC для блока из 256 значений заполненных 0xDD = 0x1F75. Посмотрите в симуляторе что компилятор генерит.
- Вложения
-
- checksum.GIF
- мой скриншот симулятора
- (16.23 КБ) 370 скачиваний
Решил попробовать С++. И возник вопос:
Как обявить template метода в не класса.
К примеру, я имею функцию Write_Data(unsigned int adr, T *data):
Я хочу ее использовать в классе. Как мне ее обявить??
Пробовал такие варианты, ругаеться:
И еще куча всяких вариантов..... Подскажите
Я в итоге пока обявил кучу одинаковых по построению функций с разнымы типами..., вместо того чтобы это делал компилятор.
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: Пример условный. Использование шаблона класса не подходит, так как по всей видимости тогда нужно обявлять несколько объектов
Как обявить 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);
}
------------------------------------------------------------
Я в итоге пока обявил кучу одинаковых по построению функций с разнымы типами..., вместо того чтобы это делал компилятор.
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: Пример условный. Использование шаблона класса не подходит, так как по всей видимости тогда нужно обявлять несколько объектов
А кота своего я назвал квадратом...


