Форум myROBOT.ru » Шаг за шагом » Программирование микроконтроллеров » адрес функции или процедуры

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

1. vik49 - 24 Марта, 2013 - 22:34:10 - перейти к сообщению
Есть ли в WinAVR способ определения адреса процедуры или функции на С.
В ARMах проблемы нет есть значёк разыменования &.
Ставишь его перед именем функции и всё .
Но как это сделать в WinAVR.

Помогите ...
2. elmot - 24 Марта, 2013 - 22:56:00 - перейти к сообщению
vik49 пишет:
Есть ли в WinAVR способ определения адреса процедуры или функции на С.
В ARMах проблемы нет есть значёк разыменования &.
Ставишь его перед именем функции и всё .
Но как это сделать в WinAVR.

Помогите ...

вообще это не зависит - арм не арм, это стандартная фича С
3. vik49 - 25 Марта, 2013 - 18:32:46 - перейти к сообщению
Вот фрагмент проги на 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, всё без ненужных проблем!!!
Может я что то не так делаю ?
Нужна помощь...
4. elmot - 25 Марта, 2013 - 20:23:38 - перейти к сообщению
Это не кусок кода. Это бред какой-то.
5. vik49 - 25 Марта, 2013 - 20:40:20 - перейти к сообщению
И что же там не так ?
(Добавление)
Приведите пример кода без бреда.
6. elmot - 25 Марта, 2013 - 21:03:52 - перейти к сообщению
vik49 пишет:
И что же там не так ?

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

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

Хотите моего кода на С? Я не могу гарантировать, что он без бреда, но все же
http://sourceforge.net/p/blutle/...nk/firmware/src/
7. vik49 - 25 Марта, 2013 - 21:59:19 - перейти к сообщению
Покажите как вы применяете символ разыменования & для получения адреса функции.
(Добавление)
Извини но я пока не нашел примера разыменования функции ?
Дайте одну строчку такого примера.
(Добавление)
Представь себе есть некая функция на которую я хочу передать управление.
Для этого мне нужно её разыменовать.
Всё остальное не проблема...
Теперь президент вы поняли ...
Извини я часто бываю тороплив ...
Жду от вас строки кода.
8. elmot - 25 Марта, 2013 - 22:24:43 - перейти к сообщению
Ничего не понял. Есть функция, так? Нужен а) указатель на функцию, б)вызов функции, на которую указывает указатель, так?
Тогда вот:

CODE:

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

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

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



Код надерган из реальной работающей прошивки. Компилятор - Raisonance C for STM8
9. killgur - 25 Марта, 2013 - 22:36:02 - перейти к сообщению
код заказывали?


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;
}
10. elmot - 25 Марта, 2013 - 22:39:40 - перейти к сообщению
Так нечестно. Во-первых, это плюсы. Во-вторых ТС просил указатель на функцию.
11. killgur - 26 Марта, 2013 - 07:14:58 - перейти к сообщению
да нет проблем, но все аналогично.
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);



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

такое должны знать все компляторы, это основные конструкции.
12. elmot - 26 Марта, 2013 - 10:36:41 - перейти к сообщению
+1
Вызов по указателю добавьте, а то у меня в теле функции вызывается, а вызова из переменной под рукой не оказалось.
13. killgur - 26 Марта, 2013 - 11:17:12 - перейти к сообщению
elmot пишет:
+1
Вызов по указателю добавьте, а то у меня в теле функции вызывается, а вызова из переменной под рукой не оказалось.


Ваш пример это передача функции как параметра (более популярный ИМХО вариант), ну можно еще создать массив указателей на функции и заполнить массив сразу результатами функций, что тоже полезно иногда.
14. vik49 - 26 Марта, 2013 - 11:42:34 - перейти к сообщению
Нет мне нужен просто адрес функции.
А использовать этот адрес я буду по другому.
И ещё я пишу на С WinAVR GCC.
(Добавление)
Функция имеет имя.
У этого имени есть адрес.
Этот адрес мне и нужен.
Этот адрес и есть стартовый адрес этой функции.
Это всё что мне нужно.
15. elmot - 26 Марта, 2013 - 12:49:42 - перейти к сообщению
тогда в чем был вопрос? Адрес функции рандомный? это нормально. Зависит от архитектуры проца, распределения памяти, компилятора, ключей компилятора, звезд на небе и т.д.