Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Вызов функции с параметрами по ссылке!
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
DAndy_boy
Собственно вот какая проблема. Во флеш есть некая функция fun(unsignet int); И мне надо вызывать ее по ссылке. Т.е. что-то типа ( *( void( ** )()) 0xff00 )(); только как здесь параметры передавать? ohmy.gif
Kurt
Код
// Объявить тип указатель на нашу функцию
typedef void (*MY_FUN_PTR)(unsigned int);

void main(void)
{
      // Определить переменную - указатель на функцию и инициализировать адресом.
      MY_FUN_PTR fun = (MY_FUN_PTR) 0x1000;
      // Вызвать функцию с передачей параметров
      fun(100);
}
DAndy_boy
smile.gif smile.gif Похоже вычислил))
Оставлю, вдруг кому пригодиться))

//Flash_clr((const int*)0x1000); - функция которую нужно вызвать. Она находиться по адресу который лежит в ячейке 0xFFD2

// объявляем указатель
void (*Flash_clr_ptr) (const int*) =(void (*)(const int*)) *((int*)0xFFD2);

//и дальше уже используем просто как
...
Flash_clr_ptr((const int*)0x1000);
...


Всем удачи! smile.gif
zltigo
Цитата(DAndy_boy @ Aug 21 2006, 15:05) *
Оставлю, вдруг кому пригодиться))


Накручено и указатель промежуточный зачем?

#define F_LOCATION 0xFFD2
((void(*)( const int *))F_LOCATION)( 0x1000 );
DAndy_boy
Цитата(zltigo @ Aug 21 2006, 16:46) *
Накручено и указатель промежуточный зачем?

#define F_LOCATION 0xFFD2
((void(*)( const int *))F_LOCATION)( 0x1000 );


Может я чего недопонимаю, но в IAR эти строки не компиляться...
Я конечно не претендую на последнюю истину, но в моем варианте даже использовать проще.... Просто вызывать, как обычную функцию...Получается нагляднее
zltigo
Цитата(DAndy_boy @ Aug 22 2006, 07:57) *
Может я чего недопонимаю, но в IAR эти строки не компиляться...

Невероятно, ибо
0. все совершенно нетральный "C";
1. синтаксически это не отличается от Вашего варианта ничем;
2. именно под IAR (ARM) я такое использую.
Цитата
Я конечно не претендую на последнюю истину, но в моем варианте даже использовать проще.... Просто вызывать, как обычную функцию...

Только занимаете память под ненужный указатель.
Цитата
Получается нагляднее

Можете совершенно спокойно сделать и #define скрыв в нем все ненужные подробности и изобразив просто вызов функции.

#define funcx(x) ((void(*)( const int *))0xFFD2)( x )
DAndy_boy
zltigo, странно, но у меня проект скомпилился, но программа все равно не работает верно если объявлять так как вы предложили....
Kurt
Я не понимаю, чем не устраивает вариант который я предложил?
Использование #define и хитросплетение из скобочек из звездочек, конечно интересно,
но очень здорово ухудшает читаемость программы.
Использование в этом случае typedef, имхо, наиболее оптимально.
Кстати определение переменной не расходует память, а оптимизируется компилятором в прямой вызов.
zltigo
Цитата(DAndy_boy @ Aug 22 2006, 13:05) *
но программа все равно не работает верно если объявлять так как вы предложили....

Единственная РАЗНИЦА в Вашем варианте это присутствует явное преобразование
(const int*)0x1000

ну добавьте...






Цитата(Kurt @ Aug 22 2006, 16:00) *
Я не понимаю, чем не устраивает вариант который я предложил?

Вариантов может быть много и это естественно.
Цитата
хитросплетение из скобочек из звездочек

Ну не сказал-бы - ясное, четкое выражение хитросплетением не является :-)
Цитата
Кстати определение переменной не расходует память, а оптимизируется компилятором в прямой вызов.

Надеяться на оптимизатор, когда можно четко выразить свою мысль не хорошо :-(
Серёга_1
Вариант предложеный Kurt читается лучше и прост в понимании, я бы сделал также , без всяких лишних наворотов скобок и звёздочек.
DAndy_boy
Господа, хочу напомнить что в данном случае нам известен только адрес ячейки в которой храниться адрес самой функции... Возможно из-за этого то у нас и недопонимания?!
Kurt
Цитата(DAndy_boy @ Aug 24 2006, 23:54) *
Господа, хочу напомнить что в данном случае нам известен только адрес ячейки в которой храниться адрес самой функции... Возможно из-за этого то у нас и недопонимания?!


Действительно, вы правы, не заметили. Я же говорил, что хитросплетение из звездочек и скобочек, ухудшает читаемость программы. smile.gif

В таком случае, как вам такой вариант?

Код
__no_init void (*fun)(unsigned int addr) @ 0xFFD2;

void main(void)
{
  fun(0x1000);
}
zltigo
Цитата(Kurt @ Aug 25 2006, 09:27) *
В таком случае, как вам такой вариант?
Код
__no_init void (*fun)(unsigned int addr) @ 0xFFD2;

void main(void)
{
  fun(0x1000);
}

Вместо нормального портируемого "C" для "улучшения читабельности" :-) без всякой на то надобности
употреблены __no_init и @ из IARовского "диалекта".
Kurt
Но согласитесь, с расширениями IAR это получилось красиво smile.gif. Тем более практически все компиляторы имеют аналогичные расширения.
А условно портируемый вариант, можно представить в таком виде:
Код
typedef void (*MY_FUN_PTR)(unsigned int);

MY_FUN_PTR* fun = (MY_FUN_PTR*) 0xFFD2;
(*fun)(0x1000);

// или c проверкой
if(*fun) (*fun)(0x1000);


Я настаиваю на том, что код должен быть читаемым с первого взгляда. smile.gif
zltigo
Цитата(Kurt @ Aug 25 2006, 09:50) *
Я настаиваю на том, что код должен быть читаемым с первого взгляда. smile.gif

Вы будете смеяться, но я тоже считаю, что код должен код должен быть читаем с первого взгляда.
Cтепень скрытия сути в макросе для конечного применения может быть сделана любой "по вкусу" и не о ней сейчас речь, а сама суть должна быть читабельной. У нас разные предстваления о "читабельности", бывает :-(. Надеюсь Ваши будут прогрессировать :-))))))
Kurt
Пишите как Вам нравится, я не настаиваю. Скрывание "сути" в макросе, типа такого "#define funcx(x) ((void(*)( const int *))0xFFD2)( x )" в моем не прогрессивном понимании просто плохой стиль программирования.
Но спорить не буду, удачи Вам и терпения в больших проектах.
DAndy_boy
Ого, какие тут страсти без меня разгорелись))) . Ну что же, господа, думаю мы по крайне мере достигли желаемой цели). По этому чтобы не перешло до рукопашной smile3009.gif , предлагаю и закончить на этом cheers.gif . Всем большое спасибо за участие в данном вопросе!
zltigo
Цитата(Kurt @ Aug 25 2006, 11:45) *
Но спорить не буду, удачи Вам и терпения в большихпроектах.

Спасибо :-) Только в "больших" проектах я с середины 80x.
Сейчас как раз "маленькими" занялся, на "удачу" не уповаю, но от определенной доли "удачи" не откажусь :-).
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.