Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Функция main как метод класса
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > ARM
InsolentS
хочу сделать функцию main методом класса, например
Код
class Program
{
  private:
    Program(){};
    static int main(void);
};

Program program;

int Program::main(void)
{
  while(1);
}
...

но проблема в том, что не знаю как обратится к такой функции из ассемблера, т.е. на что заменить строки startup файла
Код
; Enter the C code

                IMPORT  __main
                LDR     R0, =__main
                BX      R0

?
KRS
А вы для начала опишите обычную функцию main
Код
void main(void)
{
  program.main();
}

и сгенерируйте листинг и/или файл на асм и посмотрите как там вызывается.
тут главное какое имя сгенерируется для program.main
InsolentS
Цитата(KRS @ Feb 14 2008, 13:21) *
А вы для начала опишите обычную функцию main
Код
void main(void)
{
  program.main();
}

и сгенерируйте листинг и/или файл на асм и посмотрите как там вызывается.
тут главное какое имя сгенерируется для program.main

Сгенерировалось имя _ZN7Program9MainEv.
Это не то, надо явно указать компилятору, что хотим вызвать из ассемблерного кода метод класса.
Т.е. вопрос сводится к как вызвать метод класса из ассемблера?
Класс глобальный, в каком месте он инициализируется я не понял, но до main()
KRS
Цитата(InsolentS @ Feb 14 2008, 20:10) *
Сгенерировалось имя _ZN7Program9MainEv.
Это не то, надо явно указать компилятору, что хотим вызвать из ассемблерного кода метод класса.
Т.е. вопрос сводится к как вызвать метод класса из ассемблера?

Так в листинге на ассемблере и посмотрите как вызывается.
Поставте галочку include asm в листинге или просто асм файл сгенерируйте
aaarrr
__main - это не пользовательский main, а библиотечная функция.
meister
Цитата(InsolentS @ Feb 14 2008, 20:10) *
Сгенерировалось имя _ZN7Program9MainEv.
Это не то, надо явно указать компилятору, что хотим вызвать из ассемблерного кода метод класса.


Как раз то. C++ для того, чтобы была возможна перегрузка делает декорацию имен (манглинг), из-за которого имена становятся такими страшными.

Можно еще помедитировать, как вызывать из ассемблера одну определенную из таких функций:

void foo(int);
void foo(char const *);

PS
Я из ассемблера только extern "C" вызываю по этой причине.
InsolentS
Цитата(aaarrr @ Feb 15 2008, 00:29) *
__main - это не пользовательский main, а библиотечная функция.

Как её тогда перегрузить?
dxp
Цитата(InsolentS @ Feb 15 2008, 04:52) *
Как её тогда перегрузить?

Вопрос в сторону, прошу прощения: а зачем все это?
tag
Цитата(InsolentS @ Feb 15 2008, 01:52) *
Как её тогда перегрузить?

...main это не библиотечная функция и перегрузить ее нельзя. Более того она не отделима от программы на C, т.е должна существовать обязательно иначе компилятор на этапе линковки выдаст ошибку. Можно поменять так называемую точку входа (например MS Visual C это позволяет, впрочем и IAR for ARM тоже). Точка входа это тот адрес по которому передается управление приложению операционной системой по завершению создания образа приложения (если говорить про операционные системы) или адрес с которого стартует программа (если это программа для микроконтроллера и не используется ОС). Точкой входа может быть любая метка. Точка входа задается в линковщике.
aaarrr
Цитата(tag @ Feb 15 2008, 10:43) *
...main это не библиотечная функция и перегрузить ее нельзя.

__main в Keil'е (речь о нем, как я понимаю) это именно что библиотечная функция, занимающаяся подготовкой окружения и передающая управление пользовательскому main.

Цитата(tag @ Feb 15 2008, 10:43) *
Более того она не отделима от программы на C, т.е должна существовать обязательно иначе компилятор на этапе линковки выдаст ошибку.

Вполне отделима - достаточно сказать линкеру, что стандартные библиотеки не используются.
tag
Цитата(aaarrr @ Feb 15 2008, 11:54) *
__main в Keil'е (речь о нем, как я понимаю) это именно что библиотечная функция, занимающаяся подготовкой окружения и передающая управление пользовательскому main.
Вполне отделима - достаточно сказать линкеру, что стандартные библиотеки не используются.



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