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

 
 
> использование пойнтера в прерывании, нуждаюсь в помощи
1921
сообщение Sep 29 2010, 12:56
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 56
Регистрация: 29-09-10
Пользователь №: 59 820



Товарищи!
Подскажите, как можно в прерывании использовать ссылку на строку. В качестве входного параметра не получается - в С прерывания не имеют параметров.
Хотелось бы, чтобы работало примерно так: вызывается подпрограмма с входными параметрами void Prog1(char *P). Она настраивает чего-то и разрешает прерывания от UART. UART по прерываниям получает данные, которые должны складываться в String, на которую указывает P. Вопрос: как мне указать в обработчике прерывания эту вот ссылку? Что-то ничего у меня не получается...
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
MrYuran
сообщение Sep 29 2010, 12:58
Сообщение #2


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



В модуле с функциями для UART объявляете нужный указатель, с которым потом работает обработчик прерываний.
Ваша Prog1() заносит туда нужный адрес, в который сохраняется строка.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
1921
сообщение Sep 29 2010, 13:01
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 56
Регистрация: 29-09-10
Пользователь №: 59 820



Цитата(MrYuran @ Sep 29 2010, 15:58) *
static переменная?

Это как? Я пока до таких высот не дошёл.
Go to the top of the page
 
+Quote Post
1921
сообщение Sep 29 2010, 13:09
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 56
Регистрация: 29-09-10
Пользователь №: 59 820



Или подскажите, что вообще можно сделать с пойнтером. Как положить его значение в int и как произвольный int сделать пойнтером. Как-то в ассемблере с этим было попроще.
Go to the top of the page
 
+Quote Post
1921
сообщение Sep 29 2010, 13:20
Сообщение #5


Участник
*

Группа: Участник
Сообщений: 56
Регистрация: 29-09-10
Пользователь №: 59 820



что не получается: Пойнтер *P объявлен глобально, но создаётся впечатление, что при выходе из подпрограмма void Prog(char *P) он разрушается, т.к. из другой подпрограммы (в данном случае из обработчика прерывания) он не виден. Чисто теоретически это выглядит так: все операции с *P, типа *(P+i), P[i] внутри процедуры транслируются в команды косвенной адресации без сохранения значения пойнтера в каком-либо регистре. И я никак не могу сохранить или получить адрес String в глобальную переменную типа int, которую внутри прерывания можно было бы (если вообще можно?) использовать как пойнтер.

Имеется ввиду, можно ли сделать что-то типа
int k;
chap *P;
k=P;
....
char i=*k

Сообщение отредактировал 1921 - Sep 29 2010, 13:25
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Sep 29 2010, 13:30
Сообщение #6


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(1921 @ Sep 29 2010, 17:20) *
Имеется ввиду, можно ли сделать что-то типа
int k;
chap *P;
k=P;

Жирно выделенное вам компилятор сделать не позволит, т.к. это явное нарушение типов.
Если
char *k;
k=P;
то пожалуйста.
Можно, конечно, вывернуться через ж.. и написать k=(int)P; (а лучше unsigned int), но это неправильно.
То есть вы говорите компилятору: спокойно, я знаю, что делаю. И он съедает.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
1921
сообщение Sep 29 2010, 13:39
Сообщение #7


Участник
*

Группа: Участник
Сообщений: 56
Регистрация: 29-09-10
Пользователь №: 59 820



Можно, конечно, вывернуться через ж.. и написать k=(int)P; (а лучше unsigned int), но это неправильно.
То есть вы говорите компилятору: спокойно, я знаю, что делаю. И он съедает.
[/quote]
Ну что же. Плохо! транслятор похоже вообще, оперирую с пойнтерами, в качестве выхода имеет только значение, лежащее по адресу. Неужели нет никакой возможности получить сам адрес той строки, на которую ссылается пойнтер, если мы передаём ссылку на неё? операции типа
char *P
char k
k=P идентичны k=P[0] и приводят к пересылке нулевого байта строки.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Sep 29 2010, 13:56
Сообщение #8


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата(1921 @ Sep 29 2010, 17:39) *
k=P идентичны k=P[0] и приводят к пересылке нулевого байта строки.

Не может такого быть.
Что за компилятор?
Как минимум, выругаться должен.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
Hoksmur
сообщение Oct 26 2010, 07:58
Сообщение #9


Участник
*

Группа: Участник
Сообщений: 23
Регистрация: 20-09-08
Пользователь №: 40 343



Попробуйте задействовать модификатор volatile- должен обьяснять компилятору, что переменная может изменяться в любой момент, в том числе - не только программой (прерыванием как её частью). Соответственно - выделит место в памяти принудительно.

Сообщение отредактировал Hoksmur - Oct 26 2010, 07:59
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 1921   использование пойнтера в прерывании   Sep 29 2010, 12:56
|- - MrYuran   Цитата(1921 @ Sep 29 2010, 17:01) Это как...   Sep 29 2010, 13:08
|- - MrYuran   Цитата(1921 @ Sep 29 2010, 17:09) Или под...   Sep 29 2010, 13:18
||- - MrYuran   Цитата(1921 @ Sep 29 2010, 17:20) Чисто т...   Sep 29 2010, 13:25
|- - 1921   Я просто по пикам помню, там пойнтеры лежали в опр...   Sep 29 2010, 13:28
- - rezident   Я видимо как-то слабо улавливаю проблему, но если ...   Sep 29 2010, 13:53
- - ih_   Цитата...Неужели нет никакой возможности получить ...   Oct 26 2010, 13:10
- - Hoksmur   Цитата(ih_ @ Oct 26 2010, 21:10) поинтер ...   Oct 27 2010, 02:37
- - Сергей Борщ   Цитата(Hoksmur @ Oct 27 2010, 05:37) Я хо...   Oct 27 2010, 08:22


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

 


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


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