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

 
 
> C++, Keil, FreeRTOS, Не могу получить указатель на функцию.
Nikitoc
сообщение Sep 23 2011, 16:15
Сообщение #1


Местный
***

Группа: Validating
Сообщений: 207
Регистрация: 14-01-09
Из: Днепропетровск
Пользователь №: 43 367



Здравствуйте. Несколько дней потрачено впустую на безуспешные попытки получить указатель на нестатическую функцию-член класса напр. "Process" (она же является задачей, которую необходимо создать с помощью:
Код
xTaskCreate(Process, " Process ",  configMINIMAL_STACK_SIZE, NULL, 1, NULL);



Если функцию объявить как static, то все работает она создается и крутится. Если static не писать, компилятор ругается:
Код
a pointer to a bound function may only be used to call the function
Что это значит? В чем может быть проблема? Кто нибудь сталкивался с подобным? Убедительная просьба отвечать только по теме.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов (1 - 7)
sergeeff
сообщение Sep 23 2011, 17:53
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Вы почитайте http://www.newty.de/fpt/fpt.html. Лучше читать pdf'ку, более внятные примеры там.
Go to the top of the page
 
+Quote Post
Nikitoc
сообщение Sep 27 2011, 12:02
Сообщение #3


Местный
***

Группа: Validating
Сообщений: 207
Регистрация: 14-01-09
Из: Днепропетровск
Пользователь №: 43 367



Спасибо. Очень полезная дока. Удобно использовать в качестве справочника. Адрес функции мне удалось получить и присвоить указателю. Он корректен (проверял по map-файлу). Но функция xTaskCreate (freeRTOS) наверное неправильно использует его, т.к. при попытке вызова этой задачи из планировщика происходит HardFault_Exception. В регистре перехода содержится почему-то значение 0xFFFFFFFD, вместо корректного 0x08002599.
Может необходимо произвести какое-нибудь приведение типов перед передачей указателя в xTaskCreate?
P.S.: Если тема вопроса имеет большее отношение к freeRTOS, просьба к модераторам - перенести в соответствующий раздел.

Добавлено:
Мда... Эта функция (xTaskCreate) в чисто Си-шном варианте принимает указатель на статическую функцию (с точки зрения С++), а я пытаюсь передать указатель на нестатическую. Получается нужно допиливать исходники freeRTOS? Тоскливо как-то... Может быть кто-то использовал freeRTOS под плюсами? Какие доработки необходимо сделать?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Sep 27 2011, 15:13
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



QUOTE (Nikitoc @ Sep 27 2011, 15:02) *
Получается нужно допиливать исходники freeRTOS? Тоскливо как-то... Может быть кто-то использовал freeRTOS под плюсами? Какие доработки необходимо сделать?
Напишите статическую или "внеклассовую" функцию, которая будет вызывать функцию-член с конкретным объектом. И уже указатель на эту функцию передавайте куда нужно.

CODE
void myfunc()
{
   MyObject.MyMethod();
}



--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
Nikitoc
сообщение Sep 28 2011, 13:02
Сообщение #5


Местный
***

Группа: Validating
Сообщений: 207
Регистрация: 14-01-09
Из: Днепропетровск
Пользователь №: 43 367



Спасибо большое. Так получилось. Это немного не то, что планировалось, но некоторыми мелочами приходится жертвовать :-)
Go to the top of the page
 
+Quote Post
Nikitoc
сообщение Sep 29 2011, 13:24
Сообщение #6


Местный
***

Группа: Validating
Сообщений: 207
Регистрация: 14-01-09
Из: Днепропетровск
Пользователь №: 43 367



Понемногу продвигаюсь :-) Сейчас пытаюсь сделать так, чтобы конкретный обработчик прерывания был расположен в конкретном классе. Я понимаю, что он должен быть статическим методом класса, но как в стартапе указать его адрес? Импортировать имя метода вместе с именем класса никак не получается (типа IMPORT Class::Function).
Go to the top of the page
 
+Quote Post
sergeeff
сообщение Sep 29 2011, 13:37
Сообщение #7


Профессионал
*****

Группа: Свой
Сообщений: 1 481
Регистрация: 10-04-05
Пользователь №: 4 007



Нет никакой возможности сообщить С++'ое (mangled) имя в АСМ. Посему делайте, как вам советовал Сергей Борщ, через промежуточную С функцию.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Sep 29 2011, 15:41
Сообщение #8


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(Nikitoc @ Sep 29 2011, 19:24) *
Сейчас пытаюсь сделать так, чтобы конкретный обработчик прерывания был расположен в конкретном классе.

Посмотрите вот этот топик, возможно пригодится.


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post

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

 


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


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