реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Как объявить / сослаться на глобальную стуктуру, Или может как - то по-другому реализовать?
Димон Безпарольн...
сообщение Jun 9 2016, 17:21
Сообщение #1


Знающий
****

Группа: Участник
Сообщений: 734
Регистрация: 29-11-10
Пользователь №: 61 247



Смысл в том, что нужно читать АЦП 8 каналов и записать в структуру. Структура объявляется глобальной в файле ADC, а сам АЦП считывается в файле прерываний. Не знаю как сослаться на эту структуру, объявленную в файле ADC.

Спасибо.

Сообщение отредактировал Димон Безпарольный - Jun 9 2016, 17:21
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jun 9 2016, 18:13
Сообщение #2


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



extern квалификатор примените
Go to the top of the page
 
+Quote Post
Димон Безпарольн...
сообщение Jun 9 2016, 18:38
Сообщение #3


Знающий
****

Группа: Участник
Сообщений: 734
Регистрация: 29-11-10
Пользователь №: 61 247



Цитата(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


Сообщение отредактировал Димон Безпарольный - Jun 9 2016, 18:40
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jun 9 2016, 18:59
Сообщение #4


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



В h файле:
typedef struct {
...
} ADC_Micro_TypeDef;

В c файле:
ADC_Micro_TypeDef ADC_Micro;

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


А если так:
extern struct ADC ADC_Micro;
Go to the top of the page
 
+Quote Post
Димон Безпарольн...
сообщение Jun 10 2016, 05:18
Сообщение #5


Знающий
****

Группа: Участник
Сообщений: 734
Регистрация: 29-11-10
Пользователь №: 61 247



В первом случае ругается на:
Код
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


Сообщение отредактировал Herz - Jun 13 2016, 14:54
Причина редактирования: Избыточное цитирование
Go to the top of the page
 
+Quote Post
ViKo
сообщение Jun 10 2016, 05:36
Сообщение #6


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Заголовочный файл h должен быть включен в проект, причем, один раз. Для этого есть способ:
#ifndef F_H
#define F_H
...
#endif
Книжку K&R скачайте, иначе счастья не будет.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Jun 10 2016, 07:06
Сообщение #7


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(ViKo @ Jun 10 2016, 08:36) *
#ifndef F_H
#define F_H
...
#endif

Так уже не модно, лучше #pragma once


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
x893
сообщение Jun 10 2016, 08:43
Сообщение #8


Профессионал
*****

Группа: Свой
Сообщений: 1 333
Регистрация: 27-10-08
Из: Планета Земля
Пользователь №: 41 226



Без книжки счастья не будет - точно
Go to the top of the page
 
+Quote Post
ar__systems
сообщение Jun 10 2016, 13:00
Сообщение #9


self made
****

Группа: Свой
Сообщений: 855
Регистрация: 7-03-09
Из: Toronto, Canada
Пользователь №: 45 795



обучение программированию по гуглу в действии
Go to the top of the page
 
+Quote Post
Lagman
сообщение Jun 10 2016, 14:41
Сообщение #10


Знающий
****

Группа: Свой
Сообщений: 875
Регистрация: 28-10-05
Пользователь №: 10 245



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

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

Кстати, те кто программирует камни не понимая что происходит внутри в корне неправы. Я таких программистов на работе спрашивал. Слово "регистр" приводит их в ужас. Толку от таких ноль. Только гонор и поучительный тон.
Go to the top of the page
 
+Quote Post
Димон Безпарольн...
сообщение Jun 11 2016, 20:16
Сообщение #11


Знающий
****

Группа: Участник
Сообщений: 734
Регистрация: 29-11-10
Пользователь №: 61 247



Срач не удался. Обидно, да? Кстати, по поводу Куба ответил в теме.

Получилось. Вроде. Ошибок не выдает - попробовать еще не успел.
В файле 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;
};

Всем спасибо. Доброго здоровья.
Go to the top of the page
 
+Quote Post
Baser
сообщение Jun 11 2016, 21:34
Сообщение #12


Просто Che
*****

Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881



Вам же ViKo сразу написал, как это делать правильно, через typedef.
Так как написали вы, работать тоже будет, но при этом структуру придется объявлять в полном виде (дублировать) в каждом файле, где она применяется. Это "не есть хорошо". Когда нужно будет изменить структуру, вам придется ее править в н'адцати местах.
typedef как раз для этих целей и предназначен, хотя Керниган&Ритчи почему то этот вопрос обходят стороной.
Go to the top of the page
 
+Quote Post
Димон Безпарольн...
сообщение Jun 12 2016, 07:06
Сообщение #13


Знающий
****

Группа: Участник
Сообщений: 734
Регистрация: 29-11-10
Пользователь №: 61 247



Я в С не силен, увы. Понимаю что делаю не правильно, но совета не понял. Курение матчасти привело пока только к такому решению. Буду изучать дальше.
Go to the top of the page
 
+Quote Post
Baser
сообщение Jun 12 2016, 18:32
Сообщение #14


Просто Che
*****

Группа: Свой
Сообщений: 1 567
Регистрация: 22-05-07
Из: ExUSSR
Пользователь №: 27 881



В одном хидер-файле объявляете структуру (например в 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
Go to the top of the page
 
+Quote Post
aaarrr
сообщение Jun 12 2016, 23:52
Сообщение #15


Гуру
******

Группа: Свой
Сообщений: 10 713
Регистрация: 11-12-04
Пользователь №: 1 448



Цитата(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 поместите в заголовок.
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 20th June 2025 - 10:50
Рейтинг@Mail.ru


Страница сгенерированна за 0.01505 секунд с 7
ELECTRONIX ©2004-2016