|
Как сигналить из прерывания в scmRTOS? |
|
|
|
Apr 21 2010, 10:38
|
фанат дивана
Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684
|
Создайте отдельный заголовочный файл, например, main.h, и в нём опишите свой флаг как extern: Код extern TEventFlag myFlag; и уже этот main.h включайте в stm32f10x_it.c. ЗЫ. По scmRTOS есть специальный форум.
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Apr 21 2010, 10:43
|
Гуру
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Apr 22 2010, 02:23
|
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; не порождает никакого выделения памяти и просто говорит компилятору, что где-то есть вот такой объект указанного типа, и компилятор просто ссылается на это имя, которое потом на этапе линковки заменяется конкретным адресом.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Apr 22 2010, 12:07
|
Знающий
Группа: Участник
Сообщений: 691
Регистрация: 24-05-07
Пользователь №: 27 945
|
Вы правы. Прочитал вот это: Цитата Спецификатор static По поводу локальных, все понятно. Остаюсь в недоумении зачем глабальную переменную объявлять, как static если int a; и так глобальная, между вызовами не меняется и без extern действует только в пределах файла. Модератор. Столь объемные цитаты нужно прикреплять в виде файла или просто давать ссылку на текст, расположенный в Интернете. Цитата удалена
Сообщение отредактировал rezident - Apr 22 2010, 14:31
Причина редактирования: Нарушение п.3.4 Правил форума.
|
|
|
|
|
Apr 22 2010, 12:53
|
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 - при этом константа будет иметь гарантировано внутреннее связывание, что позволяет компилятору не размещать ее в памяти, а просто использовать значение.
--------------------
«Отыщи всему начало, и ты многое поймёшь» К. Прутков
|
|
|
|
|
Apr 22 2010, 18:58
|
Частый гость
Группа: Участник
Сообщений: 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?
|
|
|
|
|
Apr 23 2010, 06:02
|
Частый гость
Группа: Участник
Сообщений: 92
Регистрация: 23-12-08
Из: Кишинёв
Пользователь №: 42 680
|
Цитата(dxp @ Apr 23 2010, 08:25) А просто выдать указатель - так это выдать полный доступ. Ну так extern тоже даст полный доступ(даже ещё полнее). В этом и вопрос что лучше . Этот вопрос из серии "можно ли пользоваться операторм безусловного перехода или нет". extern не из той же серии?
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|