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

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Как сигналить из прерывания в scmRTOS?
_Макс
сообщение Apr 21 2010, 10:17
Сообщение #1


Знающий
****

Группа: Участник
Сообщений: 691
Регистрация: 24-05-07
Пользователь №: 27 945



Здравствуйте,

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

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

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

Спасибо!
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Apr 21 2010, 10:38
Сообщение #2


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



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

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

ЗЫ. По scmRTOS есть специальный форум.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Apr 21 2010, 10:43
Сообщение #3


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Цитата(_Макс @ 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();
}
Не знаю, как точно оформляются прерывания у кортексов, но принцип должен быть понятен.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
_Макс
сообщение Apr 21 2010, 11:10
Сообщение #4


Знающий
****

Группа: Участник
Сообщений: 691
Регистрация: 24-05-07
Пользователь №: 27 945



Для чего используется extern? Моя проблема в том, что я не знал о применении extern.

Сообщение отредактировал _Макс - Apr 21 2010, 11:10
Go to the top of the page
 
+Quote Post
dxp
сообщение Apr 21 2010, 11:43
Сообщение #5


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(_Макс @ Apr 21 2010, 18:25) *
Для чего используется extern? Моя проблема в том, что я не знал о применении extern.

А как бы вы объявили глобальную переменную? Ну, чтобы она (одна и та же) была видна во всех единицах трансляции (исходных файлах)?


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
_Макс
сообщение Apr 21 2010, 18:12
Сообщение #6


Знающий
****

Группа: Участник
Сообщений: 691
Регистрация: 24-05-07
Пользователь №: 27 945



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

Думал глобальная это когда объявлена в файле за пределами любого из блоков.
Go to the top of the page
 
+Quote Post
dxp
сообщение Apr 22 2010, 02:23
Сообщение #7


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



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

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

// file1.cpp
int a;

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

extern int a;

Для удобства такое объявление обычно помещают в заголовочный файл. Объявление int a; порождает выделение памяти под объект "a". А объявление extern int a; не порождает никакого выделения памяти и просто говорит компилятору, что где-то есть вот такой объект указанного типа, и компилятор просто ссылается на это имя, которое потом на этапе линковки заменяется конкретным адресом.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
_Макс
сообщение Apr 22 2010, 10:05
Сообщение #8


Знающий
****

Группа: Участник
Сообщений: 691
Регистрация: 24-05-07
Пользователь №: 27 945



Действительно, это был пробел в моих знаниях.
Что означает static и чем отличается от const?
Go to the top of the page
 
+Quote Post
dxp
сообщение Apr 22 2010, 11:04
Сообщение #9


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(_Макс @ Apr 22 2010, 17:20) *
Что означает static и чем отличается от const?

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


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
_Макс
сообщение Apr 22 2010, 12:07
Сообщение #10


Знающий
****

Группа: Участник
Сообщений: 691
Регистрация: 24-05-07
Пользователь №: 27 945



Вы правы. Прочитал вот это:
Цитата
Спецификатор static

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


Модератор. Столь объемные цитаты нужно прикреплять в виде файла или просто давать ссылку на текст, расположенный в Интернете. Цитата удалена

Сообщение отредактировал rezident - Apr 22 2010, 14:31
Причина редактирования: Нарушение п.3.4 Правил форума.
Go to the top of the page
 
+Quote Post
dxp
сообщение Apr 22 2010, 12:53
Сообщение #11


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



Цитата(_Макс @ Apr 22 2010, 19:22) *
Прочитал вот это:

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

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

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

Еще конкретно в С (не в С++) имеет смысл объявлять константы в заголовочных файлах как static const - при этом константа будет иметь гарантировано внутреннее связывание, что позволяет компилятору не размещать ее в памяти, а просто использовать значение.


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
_Макс
сообщение Apr 22 2010, 14:10
Сообщение #12


Знающий
****

Группа: Участник
Сообщений: 691
Регистрация: 24-05-07
Пользователь №: 27 945



Спасибо!
Go to the top of the page
 
+Quote Post
baralgin
сообщение Apr 22 2010, 18:58
Сообщение #13


Частый гость
**

Группа: Участник
Сообщений: 92
Регистрация: 23-12-08
Из: Кишинёв
Пользователь №: 42 680



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


Кстати вопрос на эту тему:
что предпочтительнее с точки зрения крастоты/правильности кода употреблять: non static object и extern где нужно или static но с геттером типа "(const) object* get()" ? (язык си имеется ввиду)
Способен ли умный компилятор подставлять реальный адрес объекта вместо вызова этого get?
Go to the top of the page
 
+Quote Post
dxp
сообщение Apr 23 2010, 05:10
Сообщение #14


Adept
******

Группа: Свой
Сообщений: 3 469
Регистрация: 6-12-04
Из: Novosibirsk
Пользователь №: 1 343



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

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


--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
Go to the top of the page
 
+Quote Post
baralgin
сообщение Apr 23 2010, 06:02
Сообщение #15


Частый гость
**

Группа: Участник
Сообщений: 92
Регистрация: 23-12-08
Из: Кишинёв
Пользователь №: 42 680



Цитата(dxp @ Apr 23 2010, 08:25) *
А просто выдать указатель - так это выдать полный доступ.

Ну так extern тоже даст полный доступ(даже ещё полнее). В этом и вопрос что лучше smile.gif . Этот вопрос из серии "можно ли пользоваться операторм безусловного перехода или нет". extern не из той же серии?
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 29th May 2024 - 01:00
Рейтинг@Mail.ru


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