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

 
 
> Добавление смещения к указателю на функцию., Переменная типа указатель на функцию.
_Алекс
сообщение Dec 25 2006, 15:49
Сообщение #1


Местный
***

Группа: Свой
Сообщений: 252
Регистрация: 14-09-06
Пользователь №: 20 377



Объявил переменную – указатель на функцию, вызываю pf();, получилось. Стало необходимо добавить смещение к началу вызова функции, чтоб выполнялась с определенного места а не сначала, пытаюсь прибавить константу, пишет не совместимость типов. Не подскажите как правильно добавить смещение к указателю на функцию, в виде константы типа usigned int или char.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
_artem_
сообщение Dec 25 2006, 18:13
Сообщение #2


учащийся
*****

Группа: Свой
Сообщений: 1 065
Регистрация: 29-10-05
Из: города контрастов
Пользователь №: 10 249



Цитата(_Алекс @ Dec 25 2006, 14:49) *
Объявил переменную – указатель на функцию, вызываю pf();, получилось. Стало необходимо добавить смещение к началу вызова функции, чтоб выполнялась с определенного места а не сначала, пытаюсь прибавить константу, пишет не совместимость типов. Не подскажите как правильно добавить смещение к указателю на функцию, в виде константы типа usigned int или char.


имхо в С все траснформации с пойнтером разрешаются через void* тип. продекларируйте такой пойнтер а затем присвойте ему указатель функции с кастингом на void и прибавьте смешение. затем вызом функции через результируюший пойнтер с кастингом как указатель функции. Правда размерность смешения надо урегулировать.


--------------------
Зачем лаять на караван , когда на него можно плюнуть?

Go to the top of the page
 
+Quote Post
Rst7
сообщение Dec 26 2006, 09:26
Сообщение #3


Йа моск ;)
******

Группа: Модераторы
Сообщений: 4 345
Регистрация: 7-07-05
Из: Kharkiv-city
Пользователь №: 6 610



Цитата(_artem_ @ Dec 25 2006, 17:13) *
имхо в С все траснформации с пойнтером разрешаются через void* тип. продекларируйте такой пойнтер а затем присвойте ему указатель функции с кастингом на void и прибавьте смешение. затем вызом функции через результируюший пойнтер с кастингом как указатель функции. Правда размерность смешения надо урегулировать.


А с каких пор стали допустимы операции +, += и так далее с указателем типа void* ?


--------------------
"Практика выше (теоретического) познания, ибо она имеет не только достоинство всеобщности, но и непосредственной действительности." - В.И. Ленин
Go to the top of the page
 
+Quote Post
_artem_
сообщение Dec 26 2006, 16:29
Сообщение #4


учащийся
*****

Группа: Свой
Сообщений: 1 065
Регистрация: 29-10-05
Из: города контрастов
Пользователь №: 10 249



Цитата(Rst7 @ Dec 26 2006, 08:26) *
Цитата(_artem_ @ Dec 25 2006, 17:13) *

имхо в С все траснформации с пойнтером разрешаются через void* тип. продекларируйте такой пойнтер а затем присвойте ему указатель функции с кастингом на void и прибавьте смешение. затем вызом функции через результируюший пойнтер с кастингом как указатель функции. Правда размерность смешения надо урегулировать.


А с каких пор стали допустимы операции +, += и так далее с указателем типа void* ?


Вы правы - в написанном ошибка. Чтоб замалить прошение) написал пример который КОМПИЛИРУЕТСЯ без ошибок на bcc32 :

Код
void test(void)
{
    int i = 0;
    i++;
}


void main (void)
{

    void (*fp)(void);

    fp = (void(*)(void))((unsigned long int)(&test) + 100);

    fp();
}


Наверно надо обратить внимание на правильную размерность указателя на функцию когда делается кастинг перед сложением .


--------------------
Зачем лаять на караван , когда на него можно плюнуть?

Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Dec 26 2006, 18:16
Сообщение #5


Гуру
******

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



Цитата(_artem_ @ Dec 26 2006, 15:29) *
Наверно надо обратить внимание на правильную размерность указателя на функцию когда делается кастинг перед сложением .
Можно подключить stdint.h, там объявлен тип uintptr_t - беззнаковое целое в которое точно уместится указатель, и использовать этот тип. Но только для чего-нибудь полезного, а не для решения исходной задачи :-)


--------------------
На любой вопрос даю любой ответ
"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
_artem_
сообщение Dec 26 2006, 18:55
Сообщение #6


учащийся
*****

Группа: Свой
Сообщений: 1 065
Регистрация: 29-10-05
Из: города контрастов
Пользователь №: 10 249



Цитата(Сергей Борщ @ Dec 26 2006, 17:16) *
Цитата(_artem_ @ Dec 26 2006, 15:29) *

Наверно надо обратить внимание на правильную размерность указателя на функцию когда делается кастинг перед сложением .
Можно подключить stdint.h, там объявлен тип uintptr_t - беззнаковое целое в которое точно уместится указатель, и использовать этот тип. Но только для чего-нибудь полезного, а не для решения исходной задачи :-)


Хехе. данная тема рассматривалась мною как вырожденная, в котором отсутствует критерий бессмысленности самого вопроса.

Все таки нелепость применения данного подхода должна быть подробным образом обьяснена более словохотливым аффтаром.)


--------------------
Зачем лаять на караван , когда на него можно плюнуть?

Go to the top of the page
 
+Quote Post
_Алекс
сообщение Dec 27 2006, 15:51
Сообщение #7


Местный
***

Группа: Свой
Сообщений: 252
Регистрация: 14-09-06
Пользователь №: 20 377



Цитата(_artem_ @ Dec 26 2006, 18:55) *
Цитата(Сергей Борщ @ Dec 26 2006, 17:16) *
Цитата(_artem_ @ Dec 26 2006, 15:29) *

Наверно надо обратить внимание на правильную размерность указателя на функцию когда делается кастинг перед сложением .
Можно подключить stdint.h, там объявлен тип uintptr_t - беззнаковое целое в которое точно уместится указатель, и использовать этот тип. Но только для чего-нибудь полезного, а не для решения исходной задачи :-)


Хехе. данная тема рассматривалась мною как вырожденная, в котором отсутствует критерий бессмысленности самого вопроса.

Все таки нелепость применения данного подхода должна быть подробным образом обьяснена более словохотливым аффтаром.)


А вот что получилось: маленький кооперативный планировщик задач

void main( void ){
__disable_interrupt();
InitMega8();
OSCreatTask(TaskDI, 0); Регистрируем задачу с приоритетом о
__enable_interrupt();
while(1){
OSscheduler(); При каждом вызове вызывается новая задача.
};
};

А это задача.
//****************Обработка дискретных входов***********
struct T_DI static dDI;

void TaskDI(void){
while(1){
dDI.inDIa = DIInput();
OSDelay(10,0); здесь не стоим и не ждем уходим, давая возможность выполнять код другой задачи.
dDI.inDIb = DIInput(); здесь возвращаемся через 5 мс.
dDI.inDIa ^= dDI.inDIb;
OSDelay(50,0);
dDI.inDIb = DIInput(); здесь возвращаемся через 25 мс.
dDI.inDIa &= dDI.inDIb;
dDI.inDIa ^= dDI.inDIb;
dDI.bDI |= dDI.inDIb;
};

А вот ассемблер
void main( void ){
\ main:
9 __disable_interrupt();
\ 00000000 94F8 CLI
10 InitMega8();
\ 00000002 .... RCALL InitMega8
11 OSCreatTask(TaskDI, 0);
\ 00000004 E020 LDI R18, 0
\ 00000006 .... LDI R16, LOW(TaskDI/2)
\ 00000008 .... LDI R17, (TaskDI/2) >> 8
\ 0000000A .... RCALL OSCreatTask
12 OSCreatTask(TaskTemperature, 1);
\ 0000000C E021 LDI R18, 1
\ 0000000E .... LDI R16, LOW(TaskTemperature/2)
\ 00000010 .... LDI R17, (TaskTemperature/2) >> 8
\ 00000012 .... RCALL OSCreatTask
13 OutKR1561ID1_1(4);
\ 00000014 E004 LDI R16, 4
\ 00000016 .... RCALL OutKR1561ID1_1
14 __enable_interrupt();
\ 00000018 9478 SEI
15 while(1){
16 OSscheduler();
\ ??main_0:
\ 0000001A .... RCALL OSscheduler
\ 0000001C CFFE RJMP ??main_0
17 };
18 };

А вот задачи:
3 //****************Обработка дискретных входов***********

\ In segment NEAR_Z, align 1, keep-with-next
\ 00000000 REQUIRE `?<Segment init: NEAR_Z>`
4 struct T_DI static dDI;
\ dDI:
\ 00000000 DS 3
5

\ In segment CODE, align 2, keep-with-next
6 void TaskDI(void){
\ TaskDI:
\ 00000000 93BA ST -Y, R27
\ 00000002 93AA ST -Y, R26
\ 00000004 .... LDI R26, LOW(dDI)
\ 00000006 .... LDI R27, (dDI) >> 8
7 while(1){
8 dDI.inDIa = DIInput();
\ ??TaskDI_0:
\ 00000008 .... RCALL DIInput
\ 0000000A 930D ST X+, R16
9 OSDelay(10,0);
\ 0000000C E020 LDI R18, 0
\ 0000000E E00A LDI R16, 10
\ 00000010 E010 LDI R17, 0
\ 00000012 .... RCALL OSDelayFunc
\ 00000014 E020 LDI R18, 0
\ 00000016 B7ED IN R30, 0x3D
\ 00000018 B7FE IN R31, 0x3E
\ 0000001A 9731 SBIW R31:R30, 1
\ 0000001C 8100 LD R16, Z
\ 0000001E 8111 LDD R17, Z+1
\ 00000020 .... RCALL OSSaveAddres
\ 00000022 9508 ret
10 dDI.inDIb = DIInput();
\ 00000024 .... RCALL DIInput
\ 00000026 930C ST X, R16
11 dDI.inDIa ^= dDI.inDIb;
\ 00000028 911E LD R17, -X
\ 0000002A 2710 EOR R17, R16
\ 0000002C 931D ST X+, R17
12 OSDelay(50,0);
\ 0000002E E020 LDI R18, 0
\ 00000030 E302 LDI R16, 50
\ 00000032 E010 LDI R17, 0
\ 00000034 .... RCALL OSDelayFunc
\ 00000036 E020 LDI R18, 0
\ 00000038 B7ED IN R30, 0x3D
\ 0000003A B7FE IN R31, 0x3E
\ 0000003C 9731 SBIW R31:R30, 1
\ 0000003E 8100 LD R16, Z
\ 00000040 8111 LDD R17, Z+1
\ 00000042 .... RCALL OSSaveAddres
\ 00000044 9508 ret
13 dDI.inDIb = DIInput();
\ 00000046 .... RCALL DIInput
\ 00000048 930C ST X, R16
14 dDI.inDIa &= dDI.inDIb;
15 dDI.inDIa ^= dDI.inDIb;
\ 0000004A 911E LD R17, -X
\ 0000004C 2310 AND R17, R16
\ 0000004E 2710 EOR R17, R16
\ 00000050 931C ST X, R17
16 dDI.bDI |= dDI.inDIb;
\ 00000052 9612 ADIW R27:R26, 2
\ 00000054 911C LD R17, X
\ 00000056 2B10 OR R17, R16
\ 00000058 931C ST X, R17
\ 0000005A 9712 SBIW R27:R26, 2
\ 0000005C CFD5 RJMP ??TaskDI_0
17 };
18 };
19 //****************Обработка дискретных входов***********
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- _Алекс   Добавление смещения к указателю на функцию.   Dec 25 2006, 15:49
- - jorikdima   То есть чтоб функция не с начала начала работать??...   Dec 25 2006, 15:53
|- - _Алекс   Цитата(jorikdima @ Dec 25 2006, 15:53) То...   Dec 25 2006, 16:14
|- - zltigo   Цитата(_Алекс @ Dec 25 2006, 15:14) Нужно...   Dec 25 2006, 16:26
|- - dxp   Цитата(_Алекс @ Dec 25 2006, 19:14) Цитат...   Dec 25 2006, 16:27
- - sensor_ua   Механизм сопрограмм на макросах поможет и без RTOS...   Dec 25 2006, 16:58
|- - zltigo   Цитата(sensor_ua @ Dec 25 2006, 15:58) Ме...   Dec 25 2006, 17:32
- - vmp   Если нельзя, но очень хочется... Попробуйте привес...   Dec 25 2006, 17:05
- - sensor_ua   ЦитатаКонечный автомат уже поминался Согласен, но,...   Dec 25 2006, 17:53
|- - zltigo   Цитата(sensor_ua @ Dec 25 2006, 16:53) Ту...   Dec 25 2006, 18:04
|- - dxp   Цитата(Rst7 @ Dec 26 2006, 12:26) Цитата(...   Dec 26 2006, 15:58
- - _artem_   И где же Вы это применяете ?   Dec 27 2006, 16:29
- - wolfram   Такая штука, которую предлагает Алекс реализована ...   Dec 29 2006, 08:46
- - _artem_   В компиляторах понятно - процесс кодообразования к...   Dec 29 2006, 11:19


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

 


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


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