Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как объявить / сослаться на глобальную стуктуру
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
Димон Безпарольный
Смысл в том, что нужно читать АЦП 8 каналов и записать в структуру. Структура объявляется глобальной в файле ADC, а сам АЦП считывается в файле прерываний. Не знаю как сослаться на эту структуру, объявленную в файле ADC.

Спасибо.
ViKo
extern квалификатор примените
Димон Безпарольный
Цитата(ViKo @ Jun 9 2016, 21:13) *
extern квалификатор примените

Вот его то у меня как раз и не получается применить. Кейл С. Вот объявление:

Код
struct ADC {
    unsigned int ADC_CH3;
    unsigned int ADC_CH4;
    unsigned int ADC_CH5;
    unsigned int ADC_CH6;
    unsigned int ADC_CH7;
    unsigned int ADC_CH8;
    unsigned int ADC_CH15;
    unsigned int ADC_CH16;
    unsigned int ADC_Show;
    unsigned int ADC_CH_Step;
} ADC_Micro;


Когда пишу:
Код
extern ADC_Micro

не ругается. А когда обращаюсь:
Код
ADC_Micro.ADC_CH_Step = 0;

ругается:

Цитата
../Src/stm32l4xx_it.c(244): error: #20: identifier "ADC_Micro" is undefined
ViKo
В h файле:
typedef struct {
...
} ADC_Micro_TypeDef;

В c файле:
ADC_Micro_TypeDef ADC_Micro;

В других файлах:
extern ADC_Micro_TypeDef ADC_Micro;


А если так:
extern struct ADC ADC_Micro;
Димон Безпарольный
В первом случае ругается на:
Код
extern ADC_Micro_TypeDef ADC_Micro;

Цитата
../Src/stm32l4xx_it.c(49): error: #20: identifier "ADC_Micro_TypeDef" is undefined


В текущем файле, где структура объявлена глобальной не ругается.

Во втором случае ругается при использовании:
Код
ADC_Micro.ADC_CH_Step = 0;

в сторонних файлах:

Цитата
../Src/stm32l4xx_it.c(248): warning: #111-D: statement is unreachable
ViKo
Заголовочный файл h должен быть включен в проект, причем, один раз. Для этого есть способ:
#ifndef F_H
#define F_H
...
#endif
Книжку K&R скачайте, иначе счастья не будет.
MrYuran
Цитата(ViKo @ Jun 10 2016, 08:36) *
#ifndef F_H
#define F_H
...
#endif

Так уже не модно, лучше #pragma once
x893
Без книжки счастья не будет - точно
ar__systems
обучение программированию по гуглу в действии
Lagman
Начинает проясняться после таких тем и ранее таких высказываний (из темы из раздела ARM)
Цитата(Димон Безпарольный @ May 15 2016, 19:04) *
К черту куб и ХАЛ. С тех пор как я увидел что сгенертровал куб, я перестал доверять обоим. Буду вертеть регистрамт пока не пойму в чем дело. Куб генерит нерабочий код. В этом я уже убедился по UART. Написал все ручками с нуля и заработало.

В данном случае сгенерированный кубом код не работает также как и мой. Только нырять в дебри ХАЛА мне лень.

Кстати, те кто программирует камни не понимая что происходит внутри в корне неправы. Я таких программистов на работе спрашивал. Слово "регистр" приводит их в ужас. Толку от таких ноль. Только гонор и поучительный тон.
Димон Безпарольный
Срач не удался. Обидно, да? Кстати, по поводу Куба ответил в теме.

Получилось. Вроде. Ошибок не выдает - попробовать еще не успел.
В файле ADC объявил структуру:
Код
struct ADC {
    unsigned int ADC_CH3;
    unsigned int ADC_CH4;
    unsigned int ADC_CH5;
    unsigned int ADC_CH6;
    unsigned int ADC_CH7;
    unsigned int ADC_CH8;
    unsigned int ADC_CH15;
    unsigned int ADC_CH16;
    unsigned int ADC_Show;
    unsigned int ADC_CH_Step;
}ADC_Micro;


В файле прерываний, где заполняются поля:
Код
extern struct ADC ADC_Micro;


Не хватало этого в файле прерываний:
Код
struct ADC {
    unsigned int ADC_CH3;
    unsigned int ADC_CH4;
    unsigned int ADC_CH5;
    unsigned int ADC_CH6;
    unsigned int ADC_CH7;
    unsigned int ADC_CH8;
    unsigned int ADC_CH15;
    unsigned int ADC_CH16;
    unsigned int ADC_Show;
    unsigned int ADC_CH_Step;
};

Всем спасибо. Доброго здоровья.
Baser
Вам же ViKo сразу написал, как это делать правильно, через typedef.
Так как написали вы, работать тоже будет, но при этом структуру придется объявлять в полном виде (дублировать) в каждом файле, где она применяется. Это "не есть хорошо". Когда нужно будет изменить структуру, вам придется ее править в н'адцати местах.
typedef как раз для этих целей и предназначен, хотя Керниган&Ритчи почему то этот вопрос обходят стороной.
Димон Безпарольный
Я в С не силен, увы. Понимаю что делаю не правильно, но совета не понял. Курение матчасти привело пока только к такому решению. Буду изучать дальше.
Baser
В одном хидер-файле объявляете структуру (например в adc.h):
Код
typedef struct {
    unsigned int ADC_CH3;
    unsigned int ADC_CH4;
    unsigned int ADC_CH5;
    unsigned int ADC_CH6;
    unsigned int ADC_CH7;
    unsigned int ADC_CH8;
    unsigned int ADC_CH15;
    unsigned int ADC_CH16;
    unsigned int ADC_Show;
    unsigned int ADC_CH_Step;
} adc_t;

Теперь это новый тип данных - adc_t - и его можно применять под этим именем везде, где этот тип объявлен.
А объявить его в других файлах, где он будет применятся, можно при помощи подключения хидера adc.h:
#include "adc.h"

Вышенаписанное объявление типа не выделяет память под структуру. Так что выделять память нужно отдельно в файле на Си:
adc_t ADC_Micro;

Чтобы эта структура была видна в других файлах, в файле adc.h, ниже typedef нужно добавить:
extern adc_t ADC_Micro;

Все.
В файлы, где вам нужна работа с этой структурой просто включаете
#include "adc.h"
и работаете.

Именно это вам и пытался сказать ViKo sm.gif
aaarrr
Цитата(Baser @ Jun 12 2016, 00:34) *
Вам же ViKo сразу написал, как это делать правильно, через typedef.

То есть
typedef struct {} type; - правильно, а
struct ID {}; - нет?

Цитата(Baser @ Jun 12 2016, 00:34) *
Так как написали вы, работать тоже будет, но при этом структуру придется объявлять в полном виде (дублировать) в каждом файле, где она применяется. Это "не есть хорошо". Когда нужно будет изменить структуру, вам придется ее править в н'адцати местах.

Нет, не придется.
Цитата(Димон Безпарольный @ Jun 11 2016, 23:16) *
В файле ADC объявил структуру:
Код
struct ADC {
     unsigned int ADC_CH3;
     unsigned int ADC_CH4;
     unsigned int ADC_CH5;
     unsigned int ADC_CH6;
     unsigned int ADC_CH7;
     unsigned int ADC_CH8;
     unsigned int ADC_CH15;
     unsigned int ADC_CH16;
     unsigned int ADC_Show;
     unsigned int ADC_CH_Step;
}ADC_Micro;

Это лишнее. Просто
Код
struct ADC ADC_Micro;

А описание struct ADC поместите в заголовок.
Димон Безпарольный
Вроде разобрался. Вынес в хидер. И пара include. Да и с typedef тоже работает:

Код
typedef struct ADC {
    unsigned int ADC_CH3;
    unsigned int ADC_CH4;
    unsigned int ADC_CH5;
    unsigned int ADC_CH6;
    unsigned int ADC_CH7;
    unsigned int ADC_CH8;
    unsigned int ADC_CH15;
    unsigned int ADC_CH16;
    unsigned int ADC_Show;
    unsigned int ADC_CH_Step;
}ADC;
ADC ADC_Micro;

Всем спасибо и доброго здоровья.
Димон Безпарольный
Со структурой все понятно. Как теперь сослаться на структуру чтобы получить адрес первого элемента? Мне необходимо сконфигурировать DMA чтобы эта структура заполнялась автоматом с помощью DMA.

Как будет правильно? Выбрать адрес первого элемента DMA1_Channel1->CMAR = (uint32_t)&ADC_Micro.ADC_CH3;

или адрес структуры DMA1_Channel1->CMAR = (uint32_t)&ADC_Micro?
zltigo
QUOTE (Димон Безпарольный @ Jun 13 2016, 15:51) *
Как теперь....

Читайте, пожалуйста! описание языка. Иначе потопите форум "вопросами" ни о чем sad.gif. Какого вообще возникла "мысль"при необходимости получения адреса сруктуры указывать адрес ее первого элемента, хотя это, конечно, одно и то же.
ar__systems
Как вообще люди имееют наглсмелость пытаться делать что-то с dma если они на С двух слов связать не могут?

Афтор, реально, возьмите книжку по С.

Димон Безпарольный
Да расслабтесь, господа. Давно все заработало. И не только DMA...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.