Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Как сигналить из прерывания в scmRTOS?
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
_Макс
Здравствуйте,

В main.cpp объявил свой экземпляр класса TEventFlag. Какой включить заголовочный файл в файл с обработчиками прерывания stm32f10x_it.c, чтобы компилятор не ругался на неизвестный идентификатор при попытке просигналить функцией SignalISR()?

Пробовал выносить объявление экземпляра TEventFlag в новый файл h и включать его в main.cpp и stm32f10x_it.c, ругается компоновщик на двойное определение в файлах компилятора.

Что я делаю не правильно? Какая правильно пользоватся заголовочными файлами, чтобы все работало?

Спасибо!
AHTOXA
Создайте отдельный заголовочный файл, например, main.h, и в нём опишите свой флаг как extern:
Код
extern TEventFlag myFlag;

и уже этот main.h включайте в stm32f10x_it.c.

ЗЫ. По scmRTOS есть специальный форум.
Сергей Борщ
Цитата(_Макс @ Apr 21 2010, 13:32) *
Что я делаю не правильно?
Приведите исходный код. Требования те же, что и к обычным глобальным переменным. Вот такое должно работать:
Код
test.h:
#ifndef TEST_H__
#define TEST_H__
#include  <scmRTOS.h>

extern OS::TEventFlag Myflag;
#endif // TEST_H__

test.cpp:
#include  "test.h
OS::TEventFlag Myflag;

void test()
{
    Myflag.Wait();
}

isr.cpp:
#include  "test.h

OS_INTERRUPT void isr()
{
    OS::TISRW  isrw;

    Myflag.Signal();
}
Не знаю, как точно оформляются прерывания у кортексов, но принцип должен быть понятен.
_Макс
Для чего используется extern? Моя проблема в том, что я не знал о применении extern.
dxp
Цитата(_Макс @ Apr 21 2010, 18:25) *
Для чего используется extern? Моя проблема в том, что я не знал о применении extern.

А как бы вы объявили глобальную переменную? Ну, чтобы она (одна и та же) была видна во всех единицах трансляции (исходных файлах)?
_Макс
Цитата(dxp @ Apr 21 2010, 14:58) *
А как бы вы объявили глобальную переменную? Ну, чтобы она (одна и та же) была видна во всех единицах трансляции (исходных файлах)?

Думал глобальная это когда объявлена в файле за пределами любого из блоков.
dxp
Цитата(_Макс @ Apr 22 2010, 01:27) *
Думал глобальная это когда объявлена в файле за пределами любого из блоков.

Это переменная с областью видимости (scope) в пределах единицы трансляции. А глобальные - это с областью видимости во всем проекте. Так вот, в языках С/С++ глобальная переменная создается двумя действиями. В одной единице трансляции делается объявление переменной, например:

// file1.cpp
int a;

а во всех единицах трансляции делается объявление вида:

extern int a;

Для удобства такое объявление обычно помещают в заголовочный файл. Объявление int a; порождает выделение памяти под объект "a". А объявление extern int a; не порождает никакого выделения памяти и просто говорит компилятору, что где-то есть вот такой объект указанного типа, и компилятор просто ссылается на это имя, которое потом на этапе линковки заменяется конкретным адресом.
_Макс
Действительно, это был пробел в моих знаниях.
Что означает static и чем отличается от const?
dxp
Цитата(_Макс @ Apr 22 2010, 17:20) *
Что означает static и чем отличается от const?

static в разных контекстах означает очень разное. const - это спецификация константного, т.е. неизменяемого во время выполнения программы объекта. Надо бы вам книжки, что-ли, почитать по С/С++, ведь то, что вы спрашиваете, это азы.
_Макс
Вы правы. Прочитал вот это:
Цитата
Спецификатор static

По поводу локальных, все понятно. Остаюсь в недоумении зачем глабальную переменную объявлять, как static если int a; и так глобальная, между вызовами не меняется и без extern действует только в пределах файла.


Модератор. Столь объемные цитаты нужно прикреплять в виде файла или просто давать ссылку на текст, расположенный в Интернете. Цитата удалена
dxp
Цитата(_Макс @ Apr 22 2010, 19:22) *
Прочитал вот это:

Еще есть статические члены классов. Там совсем другая семантика. А ключевое слово используется это же.

Цитата(_Макс @ Apr 22 2010, 19:22) *
По поводу локальных, все понятно. Остаюсь в недоумении зачем глабальную переменную объявлять, как static если int a; и так глобальная, между вызовами не меняется и без extern действует только в пределах файла.

Чтобы гарантировать, что объект за пределами данной единицы трансляции недоступен. Например, если есть библиотека в скомпилированном виде, то ничего не мешает, зная имена, получить к ним доступ, объявив их как extern. Еще для того, чтобы намеренно ограничить область видимости пространством имен данной единицы трансляции - например, в одном файле есть static int a, в другом тоже есть int a, глобальная. Это будут разные объекты.

Еще конкретно в С (не в С++) имеет смысл объявлять константы в заголовочных файлах как static const - при этом константа будет иметь гарантировано внутреннее связывание, что позволяет компилятору не размещать ее в памяти, а просто использовать значение.
_Макс
Спасибо!
baralgin
Цитата(dxp @ Apr 22 2010, 16:08) *
Чтобы гарантировать, что объект за пределами данной единицы трансляции недоступен. Например, если есть библиотека в скомпилированном виде, то ничего не мешает, зная имена, получить к ним доступ, объявив их как extern. Еще для того, чтобы намеренно ограничить область видимости пространством имен данной единицы трансляции - например, в одном файле есть static int a, в другом тоже есть int a, глобальная. Это будут разные объекты.


Кстати вопрос на эту тему:
что предпочтительнее с точки зрения крастоты/правильности кода употреблять: non static object и extern где нужно или static но с геттером типа "(const) object* get()" ? (язык си имеется ввиду)
Способен ли умный компилятор подставлять реальный адрес объекта вместо вызова этого get?
dxp
Цитата(baralgin @ Apr 23 2010, 02:13) *
что предпочтительнее с точки зрения крастоты/правильности кода употреблять: non static object и extern где нужно или static но с геттером типа "(const) object* get()" ? (язык си имеется ввиду)
Способен ли умный компилятор подставлять реальный адрес объекта вместо вызова этого get?

Не совсем понял вопрос. Зачем делать статик если тут же дать возможность доступа к нему? Делать сокрытие (инкапсуляцию) имеет смысл, если предполагается делать ограниченный доступ. Например, сам объект скрыт, но есть доступ к какому-то его свойству. А просто выдать указатель - так это выдать полный доступ. Кстати, часто лучше выдавать не указатель, а ссылку.
baralgin
Цитата(dxp @ Apr 23 2010, 08:25) *
А просто выдать указатель - так это выдать полный доступ.

Ну так extern тоже даст полный доступ(даже ещё полнее). В этом и вопрос что лучше smile.gif . Этот вопрос из серии "можно ли пользоваться операторм безусловного перехода или нет". extern не из той же серии?
dxp
Цитата(baralgin @ Apr 23 2010, 13:17) *
Ну так extern тоже даст полный доступ(даже ещё полнее). В этом и вопрос что лучше smile.gif .

Даст. А разве не это надо? Как еще создать глобальный объект? А если вам надо объект спрятать внутри единицы трансляции, то статик в сочетании с функцией, возвращающей указатель на объект и имеющей глобальную область видимости, приведет ровно к такому же результату. Только этот вариант более запутанный. Зачем это?

Если хотите реально закрыть какие-то данные и/или предоставить ограниченный интерфейс, то тут придумывать ничего не надо, надо использовать классы, представление помещать в закрытую (private) часть, а интерфейс - в открытую (public).

Цитата(baralgin @ Apr 23 2010, 13:17) *
Этот вопрос из серии "можно ли пользоваться операторм безусловного перехода или нет". extern не из той же серии?

Нет, не из этой. extern - совершенно необходимое средство для связывания имен, без него никуда. А goto - это средство для решения частного случая (выход из вложенных циклов), больше в нем нигде необходимости не возникает.
baralgin
Цитата(dxp @ Apr 23 2010, 12:02) *
Только этот вариант более запутанный. Зачем это?

Видимо попытка(с моей стороны) писать с++ программу на языке си - завернуть в классы потом будет легче. И это потом уже наступило - заворачиваю текущий проект. Ладно, понял, спасибо rolleyes.gif .
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.