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

 
 
 
Reply to this topicStart new topic
> Static в IAR AVR C++, помогите разобраться
IEC
сообщение Apr 10 2006, 08:32
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 263
Регистрация: 22-03-05
Из: г. Харьков, Украина
Пользователь №: 3 598



Есть класс:

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++?
Go to the top of the page
 
+Quote Post
vet
сообщение Apr 10 2006, 08:56
Сообщение #2


Знающий
****

Группа: Свой
Сообщений: 550
Регистрация: 16-06-04
Из: Казань
Пользователь №: 32



Первым аргументом в метод неявно передаётся указатель this.


--------------------
Главная линия этого опуса ясна мне насквозь!
Go to the top of the page
 
+Quote Post
dxp
сообщение Apr 10 2006, 08:59
Сообщение #3


Adept
******

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



Цитата(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), а есть язык С++ со своими правилами и прочим. Все вышеописанное относится к любой программной и/или аппаратной платформе, для которой существует С++.


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


Местный
***

Группа: Свой
Сообщений: 263
Регистрация: 22-03-05
Из: г. Харьков, Украина
Пользователь №: 3 598



Спасибо за ответы!
Поповоду формулировки - исправлюсь, просто хотелось уточнить среду разработки.
К методу передачи явного указателя класса в статическую функцию я и сам пришел.
Получается не очень красиво: вызывая статическую функцию класса необходимо передавать в качестве параметра ссылку на этот класс.
Хотелось бы узнать о наличии другого варианта!
Если он отсутствует - будет решать проблесу существующими методами!
Go to the top of the page
 
+Quote Post
AndyBig
сообщение Apr 10 2006, 11:27
Сообщение #5


Иногдящий
****

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



Цитата
Если он отсутствует

Увы, отсутствует. Или передавать явно или хранить в какой-то глобальной переменной.
Go to the top of the page
 
+Quote Post
dxp
сообщение Apr 10 2006, 12:39
Сообщение #6


Adept
******

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



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

А какая необходимость использовать статическую функцию? Если надо работать с данными объекта класса, то нестатические функции нативно, так сказать, решают эту задачу. Чем они не устраивают? Обрисуйте задачу?


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


Местный
***

Группа: Свой
Сообщений: 263
Регистрация: 22-03-05
Из: г. Харьков, Украина
Пользователь №: 3 598



Например: класс работы с УАПП, для каждого экземпляра класса свой буфер обмена, а флаг занятости дайвера и процедуры приема и передачи общие для всех экземпляров.
Go to the top of the page
 
+Quote Post
defunct
сообщение Apr 10 2006, 22:47
Сообщение #8


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



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

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

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

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

Оба класса не требуют наличия статических методов.
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 15th July 2025 - 12:36
Рейтинг@Mail.ru


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