Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Static в IAR AVR C++
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
IEC
Есть класс:

class TOS {
char Stack[14]; // стек регистров
static FuncExec func_Time[COUNT_MULTI];// адреса обработчиков тайм-аута

public:
BYTE ID;
TOS(){}
static void Manadger(void); // запуск менеджера файлов
__task void PUSH(void);
};

Вопрос:
1. Как заставить статический объект класса работать не только со статическими элементами класса.
2. Я обнаружил, что перед вызовом объекта a.PUSH() компилятор(??) в регистры R16:R17 загоняет ссылку на класс а! Как в функции можно это использовать, если функция написана на C++?
vet
Первым аргументом в метод неявно передаётся указатель this.
dxp
Цитата(IEC @ Apr 10 2006, 15:32) *
Есть класс:

class TOS {
char Stack[14]; // стек регистров
static FuncExec func_Time[COUNT_MULTI];// адреса обработчиков тайм-аута

public:
BYTE ID;
TOS(){}
static void Manadger(void); // запуск менеджера файлов
__task void PUSH(void);
};

Вопрос:
1. Как заставить статический объект класса работать не только со статическими элементами класса.
2. Я обнаружил, что перед вызовом объекта a.PUSH() компилятор(??) в регистры R16:R17 загоняет ссылку на класс а! Как в функции можно это использовать, если функция написана на C++?

В С++ при вызове нестатических функций-членов класса туда неявно передается еще один параметр - this, коий есть указатель на объект класса, для которого вызывается функция. Это совершенно необходимая вещь, т.к. функция-член должна "знать" с данными какого именно объекта (которых может быть много) она работает.

Статические функции-члены не привязаны к конкретному объекту. Фактически, это самые обычные функции, отличающиеся только областью видимости (статическая функция-член, как и все остальные функции-члены, находится в пространстве имен класса) и правами доступа к закрытым членам-данным класса. Если Вы хотите иметь доступ к членам данным из статической функции-члена класса, то придется явно указывать, с каким именно объеком Вы работаете. Или по имени, или через указатель. Способ с указателем, как уже сказал выше, используется с нестатическими функциями-членами, где этот указатель (this) передается автоматом неявно - в случае с IAR AVR - это делается через регистры r16-r17.

P.S. Формулировка темы некорректна: нет такого понятия как IAR AVR C++. Есть отдельно IAR, есть ее продукт для AVR (EWAVR), а есть язык С++ со своими правилами и прочим. Все вышеописанное относится к любой программной и/или аппаратной платформе, для которой существует С++.
IEC
Спасибо за ответы!
Поповоду формулировки - исправлюсь, просто хотелось уточнить среду разработки.
К методу передачи явного указателя класса в статическую функцию я и сам пришел.
Получается не очень красиво: вызывая статическую функцию класса необходимо передавать в качестве параметра ссылку на этот класс.
Хотелось бы узнать о наличии другого варианта!
Если он отсутствует - будет решать проблесу существующими методами!
AndyBig
Цитата
Если он отсутствует

Увы, отсутствует. Или передавать явно или хранить в какой-то глобальной переменной.
dxp
Цитата(IEC @ Apr 10 2006, 17:50) *
Спасибо за ответы!
Поповоду формулировки - исправлюсь, просто хотелось уточнить среду разработки.
К методу передачи явного указателя класса в статическую функцию я и сам пришел.
Получается не очень красиво: вызывая статическую функцию класса необходимо передавать в качестве параметра ссылку на этот класс.
Хотелось бы узнать о наличии другого варианта!
Если он отсутствует - будет решать проблесу существующими методами!

А какая необходимость использовать статическую функцию? Если надо работать с данными объекта класса, то нестатические функции нативно, так сказать, решают эту задачу. Чем они не устраивают? Обрисуйте задачу?
IEC
Например: класс работы с УАПП, для каждого экземпляра класса свой буфер обмена, а флаг занятости дайвера и процедуры приема и передачи общие для всех экземпляров.
defunct
Цитата(IEC @ Apr 10 2006, 16:45) *
Например: класс работы с УАПП, для каждого экземпляра класса свой буфер обмена, а флаг занятости дайвера и процедуры приема и передачи общие для всех экземпляров.

Непонятна суть такой организации.

Сделайте один class и заведите один или несколько, взависимости от наличия железа, статических экземпляров этого класса для обработки непосредственно каждого из УАППа/ов. Соответсвенно поля экземляров этого класса для каждого УАППа будут свои, включая вх/вых FIFO, флаги и пр., и никакой надобности в статических методах не возникнет.

Сделайте также еще один класс для обеспечения транспортного уровня. Задачей этого класса может быть - связь с одним из экземпляров предыдущего класса и выделение конкретного потока данных с размещением в буфере.

Оба класса не требуют наличия статических методов.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.