CodeVision AVR в вопросах и ответах

Обсуждаем контроллеры компании Atmel.
Ответить
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница

Сообщение urry »

удалить как пост ?
Последний раз редактировалось urry Сб мар 03, 2012 09:07:12, всего редактировалось 1 раз.
Контактная информация:
Реклама
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница

Сообщение urry »

сделайте и структуру и массив в одном флаконе, используя union

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

union{
 struct {
    int  cnt_X ;          //рабочий счетчик X
    int  cnt_Y ;          //рабочий счетчик Y
    int  cnt_Z ;          //рабочий счетчик Z
    unsigned char cnt_c ; //размер основных врезок
    unsigned char cnt_n ; //кол-во отрезов
    unsigned char cnt_t ; //пауза стола
    }wrk;
  unsigned char arr[9];
}un;
Я плохо знаю кодевижин - вроде юнионы не работали в младших версиях - где-то с 2.3.4 надо версию
Контактная информация:
Реклама
Опытный кот
Сообщения: 812
Зарегистрирован: Ср мар 18, 2009 21:14:33

Сообщение demiurg301 »

urry писал(а):Я плохо знаю кодевижин - вроде юнионы не работали в младших версиях - где-то с 2.3.4 надо версию
Работают и в младших.На 1.25.5 по крайней мере я их использовал.
Последний раз редактировалось demiurg301 Сб мар 03, 2012 10:08:35, всего редактировалось 1 раз.
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница

Сообщение urry »

demiurg301 я ничего не говорю. лишь бы ляпнуть - мне откровенно влом искать 4-х летней давности проект, но я отчетливо помню глюк именно с битовыми полями в юнионах, который вылечился переходом на версию 2.3.4
Это была одна из причин, после чего я плюнул на кодевижин и перешел на винавр.
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Опытный кот
Сообщения: 812
Зарегистрирован: Ср мар 18, 2009 21:14:33

Сообщение demiurg301 »

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

 Вот и как поэлементно скопировать структуру в структуру, если непонятно как к элементу структуры обращаться по его порядковому номеру в структуре?
Можно вот так

typedef struct {
int cnt_X ; //рабочий счетчик X
int cnt_Y ; //рабочий счетчик Y
int cnt_Z ; //рабочий счетчик Z
unsigned char cnt_c ; //размер основных врезок
unsigned char cnt_n ; //кол-во отрезов
unsigned char cnt_t ; //пауза стола
}
wrk;
typedef eeprom struct {
int cnt_X ; //рабочий счетчик X
int cnt_Y ; //рабочий счетчик Y
int cnt_Z ; //рабочий счетчик Z
unsigned char cnt_c ; //размер основных врезок
unsigned char cnt_n ; //кол-во отрезов
unsigned char cnt_t ; //пауза стола
}
ee_wrk;

wrk X;
ee_wrk Y;

void copy(eeprom unsigned char *pE, unsigned char *pR)
{
unsigned char L=sizeof(*pE);
while (L--)
{
*pE++=*pR++;
};
};

гдето в программе
copy((eeprom unsigned char*)&Y,(unsigned char*)&X);

Но тут при переходе на другую платформу могут вылезти грабли.ПО идее...
Реклама
Грызет канифоль
Сообщения: 293
Зарегистрирован: Сб май 29, 2010 00:08:48
Откуда: Харьков

Сообщение R_ura »

demiurg301 писал(а):
wrk X;
ee_wrk Y;
А что это за действия? Не нравится компилятору эти строчки.
Реклама
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

это не действия это комментарий должен быть типа один юнион это х а второй это у.
там дальше где применение понятно становится.

Обновление блин что я пишу... Это объявление переменных свежеобъявленных типов (ee_wrk и wrk)
Последний раз редактировалось vitalik_1984 Пн мар 05, 2012 22:19:42, всего редактировалось 1 раз.
В поисках истины человек развивается.
Контактная информация:
Опытный кот
Сообщения: 812
Зарегистрирован: Ср мар 18, 2009 21:14:33

Сообщение demiurg301 »

R_ura писал(а): А что это за действия? Не нравится компилятору эти строчки.
Чо пишет?
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

кстати у меня не на эти строчки ругается...

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

}ee_wrk; 
Warning: C:\Docs\Платы\Проекты AVR\1\1.c(18): 'eeprom' memory attribute ignored for type storage
атрибут памяти игнорирован для типа данных.
Проверил данные не помещаются в еепром

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

copy((eeprom unsigned char*)&Y,(unsigned char*)&X); 
Warning: C:\Docs\Платы\Проекты AVR\1\1.c(35): suspicious pointer conversion
Подозрительная конверсия указателя.
В поисках истины человек развивается.
Контактная информация:
Опытный кот
Сообщения: 812
Зарегистрирован: Ср мар 18, 2009 21:14:33

Сообщение demiurg301 »

Не знаю, я так во внешнюю ПЗУшину пишу структуру из 15 массивов по 10 байт. Правда , насколько я понял, такая фишка возможна только в 8битках, потому как "выравнивает" по машинному слову.
А что это за действия? Не нравится компилятору эти строчки.
Вот так запиши.

wrk X;
eeprom ee_wrk Y;
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

подозрительная ошибка исчезла :)

Не нужно писать ЕЕпром при объявлении структуры.
А при объявлении переменной объявленного типа просто помещать в ее область вот так:

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

typedef struct {
int cnt_X ; //рабочий счетчик X
int cnt_Y ; //рабочий счетчик Y
int cnt_Z ; //рабочий счетчик Z
unsigned char cnt_c ; //размер основных врезок
unsigned char cnt_n ; //кол-во отрезов
unsigned char cnt_t ; //пауза стола
}
type_wrk;

type_wrk X;
eeprom type_wrk Y; 
В поисках истины человек развивается.
Контактная информация:
Опытный кот
Сообщения: 812
Зарегистрирован: Ср мар 18, 2009 21:14:33

Сообщение demiurg301 »

В CV?
Видимо это фишка CVAVR - вот что в хелпе по этому поводу:

/* type definitions */
typedef eeprom struct {
int a;
char b[5];
} eeprom_struct_type;

/* variable declaration */
eeprom eeprom_struct_type struct1;
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

Именно тема ведь про него, но в таком виде как я написал все компилируется и помещается в ее сектор.
И вообще мне непонятно зачем создавать какие то лишние типы данных.

Что смысл меняется разве, если вы файл будете хранить на жестком диске или на внешнем флеш накопителе.Тип файла то от этого не поменяется.

demiurg301 писал(а):В CV?
Видимо это фишка CVAVR - вот что в хелпе по этому поводу:

/* type definitions */
typedef eeprom struct {
int a;
char b[5];
} eeprom_struct_type;

/* variable declaration */
eeprom eeprom_struct_type struct1;
Странно у вас похоже какой то другой хелп

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

[<memory attribute>] struct [<structure tag-name>] {
    [<type> <variable-name>[,<variable-name>, ...]];
    [<type> [<bitfield-id>]:<width>[,[<bitfield-id>]:<width>, ...]];
    ...} [<structure variables>]; 

Пример:

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

/* Global structure located in EEPROM */
eeprom struct eeprom_structure {
             char a;
             int  b;
             char c[15];
             } se; 
А когда добавляете typedef eeprom игнорируется.

Вот про typedef

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

typedef <type definition> <identifier>; 

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

/* type definitions */
typedef unsigned char byte;
typedef struct {
               int a;
               char b[5];
               } struct_type;
 

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

/* structure stored in EEPROM */
eeprom struct_type struct3;
 
В поисках истины человек развивается.
Контактная информация:
Опытный кот
Сообщения: 812
Зарегистрирован: Ср мар 18, 2009 21:14:33

Сообщение demiurg301 »

А что за версия? Я из 1.25.5 выложил.

Даёт error и говорит - область переменной должна соответствовать области описания.

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

Что смысл меняется разве, если вы файл будете хранить на жестком диске или на внешнем флеш накопителе.Тип файла то от этого не поменяется.
Логика мне понятна - она не понятна компилятору :)
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница

Сообщение urry »

ну намутили... Покажите, как сделать на юнионах и все - тем более, что еепром склонна к порче и необходимо считать контрольную сумму.
И, demiurg301,я что, один вижу подводный камень в этом выражении ??? Размер чего вернет ??? :)

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

{
unsigned char L=sizeof(*pE); 
Контактная информация:
Опытный кот
Сообщения: 812
Зарегистрирован: Ср мар 18, 2009 21:14:33

Сообщение demiurg301 »

urry писал(а): И, demiurg301,я что, один вижу подводный камень в этом выражении ??? Размер чего вернет ??? :)
Действительно. Туда надо
sizeof(wrk);
:)))
А контрольную сумму можно хранить в этой же структуре.

PS А вот кстати - а если сделать на юнионах, то будет ли это работать везде, на любой платформе? У мну такая же хрень просто с преобразованием структуры в массив. При этом структура содержит ещё одну структуру :))
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница

Сообщение urry »

Это нормально,юнионы работают везде. Единственно, что при 16-32 битных компиляторах нельзя забывать о выравнивании по байту, иначе структура может занять неожиданное количество байт.
Например, так - для visual

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

#pragma pack(push,1)
union bla bla bla
#pragma pack(pop)
Контактная информация:
Поставщик валерьянки для Кота
Аватара пользователя
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень

Сообщение vitalik_1984 »

demiurg301 писал(а):А что за версия? Я из 1.25.5 выложил.
Версия 2.05.5а EVAL
demiurg301 писал(а):Логика мне понятна - она не понятна компилятору
Ну вроде как в хелпе так и написано делать как я показал.Значит таким образом понятно.Тем более компилируется.
И в ее сектор помещает убираешь eeprom из объявления переменной - не помещает.
urry писал(а):Например, так - для visual
visual что? studio?
В поисках истины человек развивается.
Контактная информация:
Сверлит текстолит когтями
Аватара пользователя
Сообщения: 1262
Зарегистрирован: Пн дек 08, 2008 10:58:48
Откуда: Винница

Сообщение urry »

ага
Контактная информация:
Грызет канифоль
Сообщения: 293
Зарегистрирован: Сб май 29, 2010 00:08:48
Откуда: Харьков

Сообщение R_ura »

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

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

#include <mega32.h>
//#include <stdlib.h>
//#include <string.h>
//#include <alcd.h>
//#include <delay.h>

//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
// определить тип данных
typedef struct {
int cnt_X ; //рабочий счетчик X
int cnt_Y ; //рабочий счетчик Y
int cnt_Z ; //рабочий счетчик Z
unsigned char cnt_c ; //размер основных врезок
unsigned char cnt_n ; //кол-во отрезов
unsigned char cnt_t ; //пауза стола
}
type_wrk;

type_wrk    wrk, prg;                // определить переменнse wrk, prg в рам типа    type_wrk
eeprom type_wrk    ee_wrk_1;  // определить переменную ee_wrk_1 в eeprom типа    type_wrk
eeprom type_wrk    ee_wrk_2;  // определить переменную ee_wrk_2 в eeprom типа    type_wrk
 
//................... 
 
//Ф-ция записывает данные в структуру *pE /EEprom/ из струтуры *pR /RAM/ 
void write_struct_to_eeprom (eeprom unsigned char *pE, unsigned char *pR, unsigned char size)
{
 while (size--){*pE++=*pR++;};
};
//....................
 
//Ф-ция копирует данные в структуру *pR /RAM/ из струтуры *pE /EEprom/    
void read_struct_from_eeprom (unsigned char *pR,eeprom unsigned char *pE,  unsigned char size)
{
while (size--){*pR++=*pE++;};
};
//............

//Ф-ция копирует данные в структуру *pR /RAM/ из струтуры *pE /EEprom/    
void copy_struct_to_struct_in_eeprom (eeprom unsigned char *pR,eeprom unsigned char *pE,  unsigned char size)
{
while (size--){*pR++=*pE++;};
};
//....................
 
//Ф-ция копирует данные в структуру *p1 /RAM/ из струтуры *p2 /RAM/  
void copy_struct_to_struct (unsigned char *p1,  unsigned char *p2,  unsigned char size)
{
while (size--){*p1++=*p2++;};
};
//xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx 
void main(void)
{ 
 
while (1)
      {
write_struct_to_eeprom  ((eeprom unsigned char*)&ee_wrk_1,(unsigned char*)&wrk, sizeof(wrk));   
read_struct_from_eeprom ((unsigned char*)&wrk,(eeprom unsigned char*)&ee_wrk_1,sizeof(prg));  
copy_struct_to_struct   ((unsigned char*) &wrk,  (unsigned char*)&prg,  sizeof(prg)); 
copy_struct_to_struct_in_eeprom ((eeprom unsigned char*)&ee_wrk_2,(eeprom unsigned char*)&ee_wrk_1,sizeof(ee_wrk_1)); 
      }
}
Неясны некоторые моменты.
При вызове функции

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

write_struct_to_eeprom  ((eeprom unsigned char*)&ee_wrk_1,(unsigned char*)&wrk, sizeof(wrk));  
зачем перед &ee_wrk_1 определять тип данных (eeprom unsigned char*)&ee_wrk_1 и почему в скобках? Это такая особенность КВ или стандартная сишная вещь?

Что-то вообще непонятное возникло ... Вот скриншот отладчика. Дело в том, что функция чтения из еепром ( против нее стоит желтая стрелка), почему-то меняет значение ee_wrk_1.cnt_X, расположенного в ЕЕпром. Причем это изменение наблюдается только в окне Watch, а в окне памяти ЕЕпром не меняется.
К тому же обведенная красным строчка не меняет содержимое wrk.cnt_X, хотя в него должно скопироваться из ee_wrk_1.cnt_X то значение, которое он имеет в окне Watch. При этом та же строчка правильно копирует из еепром в рам значение, если его устновить в поле памяти ЕЕпром вручную.
Как это понимать, как глюк студии?
З.Ы. Где-то читал ,что из каких-то соображений ( не помню уже) рекомендовали не использовать начальные адреса еепром.

Изображение

Да! нельзя ли где-то видеть, по какому адресу в еепром компилятор разместил ту или иную переменную?
Последний раз редактировалось R_ura Вт мар 06, 2012 23:12:35, всего редактировалось 4 раза.
Ответить

Вернуться в «AVR»