роботы робототехника микроконтроллеры


 Страниц (2): [1] 2 »   

> Описание: Не могу определить адрес функции во время исполнения
vik49 Post Id



Капитан


Сообщений всего: 46
Дата рег-ции: Апр. 2012  



Есть ли в WinAVR способ определения адреса процедуры или функции на С.
В ARMах проблемы нет есть значёк разыменования &.
Ставишь его перед именем функции и всё .
Но как это сделать в WinAVR.

Помогите ...
 
 Top
elmot Post Id



Гуру


Сообщений всего: 1141
Дата рег-ции: Дек. 2010  



vik49 пишет:
Есть ли в WinAVR способ определения адреса процедуры или функции на С.
В ARMах проблемы нет есть значёк разыменования &.
Ставишь его перед именем функции и всё .
Но как это сделать в WinAVR.

Помогите ...

вообще это не зависит - арм не арм, это стандартная фича С
 
 Top
vik49 Post Id



Капитан


Сообщений всего: 46
Дата рег-ции: Апр. 2012  



Вот фрагмент проги на C, вернее на этом варианте компилятора.
.
.
.
W2S(0x1234);
//adr = &Planner;
//adr = (word*)Planner;
//adr = Planner;
adr = (word)Planner; //без замечаний <= только здесь без замечаний
W2S(adr);cr;

while (1);
}

/***************
*
* Planner
*
****************/
void Planner(void)
{
cr;
STR_P(PSTR("Hi Planner !!!"Подмигивающий);cr;
}

И кроме того результат должен быть = 0x0924
а здесь получается 0x0492 ????
Так что язык то один, а версий компиляторов море.
Поэтому на C компиляторе IAR EW 6.10, всё без ненужных проблем!!!
Может я что то не так делаю ?
Нужна помощь...
 
 Top
elmot Post Id



Гуру


Сообщений всего: 1141
Дата рег-ции: Дек. 2010  



Это не кусок кода. Это бред какой-то.
 
 Top
vik49 Post Id



Капитан


Сообщений всего: 46
Дата рег-ции: Апр. 2012  



И что же там не так ?
(Добавление)
Приведите пример кода без бреда.
 
 Top
elmot Post Id



Гуру


Сообщений всего: 1141
Дата рег-ции: Дек. 2010  



vik49 пишет:
И что же там не так ?

куча непонятных макосов или функций, без доки и определений:
W2S()
STR_P()
PSTR()
cr
Как это понять-то можно?

Вы хотите кода чьего кода без бреда? Просто на С?
тогда прошу
https://github.com/torvalds/linux

Хотите моего кода на С? Я не могу гарантировать, что он без бреда, но все же
http://sourceforge.net/p/blutle/...nk/firmware/src/
 
 Top
vik49 Post Id



Капитан


Сообщений всего: 46
Дата рег-ции: Апр. 2012  



Покажите как вы применяете символ разыменования & для получения адреса функции.
(Добавление)
Извини но я пока не нашел примера разыменования функции ?
Дайте одну строчку такого примера.
(Добавление)
Представь себе есть некая функция на которую я хочу передать управление.
Для этого мне нужно её разыменовать.
Всё остальное не проблема...
Теперь президент вы поняли ...
Извини я часто бываю тороплив ...
Жду от вас строки кода.
 
 Top
elmot Post Id



Гуру


Сообщений всего: 1141
Дата рег-ции: Дек. 2010  



Ничего не понял. Есть функция, так? Нужен а) указатель на функцию, б)вызов функции, на которую указывает указатель, так?
Тогда вот:

CODE:

//Функция
void stand()
{
// Something
}

//Функция, где указатель используется
bool runCmdNoParam(void (*funcToRun)(void))
{
// Something
funcToRun();
// Something
}

// Вызов
cmdPerformed = runCmdNoParam(stand);



Код надерган из реальной работающей прошивки. Компилятор - Raisonance C for STM8
 
 Top
killgur Post Id



Гуру


Сообщений всего: 1189
Дата рег-ции: Февр. 2010  



код заказывали?


CODE:

//Определяем прототипы функций
int sum_value(int); //Функция будет принимать обычный параметр
int sum_ref(int &); //Функция будет принимать ссылку
int sum_ptr(int *); //Функция будет принимать указатель

//Определяем функции. 3 функции по прототипам + main
int sum_value(int x) //В переменную x присваивается значение извне. x- обычный параметр
{
x=x+1; //x увеличивается на один
return x; //возвращаем полученный x
}

int sum_ref(int &x) //В функцию передается ссылка, она ссылается на объект извне
{
x=x+1; //Увеличили x на один
return x; //возвращаем полученный x
}

int sum_ptr(int *x) //В функцию передается указатель. Указатель это адрес переменной извне
{
*x=*x+1; //Для того, чтоб работать с указателем как с переменной, нужно его разыменовать
return *x; //Если не прописать звездочки, будет выведен адрес, а не значение объекта
}

//Внутри функции main функции вызываются по очереди
void main()
{
clrscr();
int value=10; //Переменная value будет выступит передаваемым параметром в функцию

cout<<sum_value(value)<<endl; //Первое обращение. Передача в функцию обычного параметра
cout<<value<<endl<<endl;

cout<<sum_ref(value)<<endl; //Второе обращение. Передача в функцию параметра ссылки
cout<<value<<endl<<endl;

cout<<sum_ptr(&value)<<endl; //Третье обращение. Передача в функцию параметра указателя
cout<<value<<endl<<endl;

getch();
return;
}
 
 Top
elmot Post Id



Гуру


Сообщений всего: 1141
Дата рег-ции: Дек. 2010  



Так нечестно. Во-первых, это плюсы. Во-вторых ТС просил указатель на функцию.
 
 Top
killgur Post Id



Гуру


Сообщений всего: 1189
Дата рег-ции: Февр. 2010  



да нет проблем, но все аналогично.
CODE:

// Определяем указатель функции
int (*pt2Function) (float, char, char);

//Присваиваем адрес указателю
int DoIt (float a, char b, char c){ return a+b+c; }
pt2Function = &DoIt; // присвоение

sum = pt2Function (1,2,3);



основной смысл не ошибиться с типами.

такое должны знать все компляторы, это основные конструкции.

(Отредактировано автором: 26 Марта, 2013 - 11:02:04)

 
 Top
elmot Post Id



Гуру


Сообщений всего: 1141
Дата рег-ции: Дек. 2010  



+1
Вызов по указателю добавьте, а то у меня в теле функции вызывается, а вызова из переменной под рукой не оказалось.

(Отредактировано автором: 26 Марта, 2013 - 10:37:16)

 
 Top
killgur Post Id



Гуру


Сообщений всего: 1189
Дата рег-ции: Февр. 2010  



elmot пишет:
+1
Вызов по указателю добавьте, а то у меня в теле функции вызывается, а вызова из переменной под рукой не оказалось.


Ваш пример это передача функции как параметра (более популярный ИМХО вариант), ну можно еще создать массив указателей на функции и заполнить массив сразу результатами функций, что тоже полезно иногда.
 
 Top
vik49 Post Id



Капитан


Сообщений всего: 46
Дата рег-ции: Апр. 2012  



Нет мне нужен просто адрес функции.
А использовать этот адрес я буду по другому.
И ещё я пишу на С WinAVR GCC.
(Добавление)
Функция имеет имя.
У этого имени есть адрес.
Этот адрес мне и нужен.
Этот адрес и есть стартовый адрес этой функции.
Это всё что мне нужно.
 
 Top
elmot Post Id



Гуру


Сообщений всего: 1141
Дата рег-ции: Дек. 2010  



тогда в чем был вопрос? Адрес функции рандомный? это нормально. Зависит от архитектуры проца, распределения памяти, компилятора, ключей компилятора, звезд на небе и т.д.
 
 Top
Страниц (2): [1] 2 »
« Программирование микроконтроллеров »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 





Powered by Exclusive Bulletin Board
ExBB FM 1.0 RC1 Smiles by Fool from Foolstown
  Яндекс.Метрика   Рейтинг@Mail.ru