Форум Микро-Чип
Поиск и заказ электронных компонентов
 

Вернуться   Форум Микро-Чип > Продукция MICROCHIP

Продукция MICROCHIP Технические вопросы по всей продукции Microchip

Ответ
 
Опции темы Опции просмотра
Старый 17.02.2020, 01:32   #1
Lunatic
Senior Member
 
Аватар для Lunatic
 
Регистрация: 26.03.2007
Сообщений: 122
Вес репутации: 102/51
Lunatic will become famous soon enoughLunatic will become famous soon enough
По умолчанию указатели в Hi-tech

Ребята, пните ногой:
Почему не работает код:

Код:
int *rbuf;
int tmp;
...

	tmp=0x36;
	
	rbuf=&tmp;
	*rbuf++;

 	WriteUART2(*rbuf);
	*rbuf++;
	WriteUART2(tmp);
Компилятор Hi-tech для dsPIC
Такое впечатление, что ссылки вообще не присваиваются (
Lunatic вне форума   Ответить с цитированием
Старый 17.02.2020, 08:54   #2
Pasha_Bi
Senior Member
 
Регистрация: 24.07.2009
Адрес: г. Иваново
Возраст: 45
Сообщений: 296
Вес репутации: 640/48
Pasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to all
По умолчанию Re: указатели в Hi-tech

*rbuf++;
Берется значение по указателю rbuf (это значение загружается в аккумулятор), затем указатель сдвигается на размер типа данных int.
Вы именно это хотели?
Может *rbuf=*rbuf+1?
Pasha_Bi вне форума   Ответить с цитированием
Старый 17.02.2020, 09:31   #3
Марк
Senior Member
 
Аватар для Марк
 
Регистрация: 18.08.2007
Адрес: Московская область
Возраст: 60
Сообщений: 3,092
Вес репутации: 4015/117
Марк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond repute
По умолчанию Re: указатели в Hi-tech

Цитата:
Сообщение от Lunatic Посмотреть сообщение
Такое впечатление, что ссылки вообще не присваиваются (
XC16 сгенерировал совершенно нормальный код. Немного не оптимальный, но рабочий.
Приведите листинг дизасма - в нем легко посмотреть о чем речь.
Марк на форуме   Ответить с цитированием
Старый 17.02.2020, 09:33   #4
Марк
Senior Member
 
Аватар для Марк
 
Регистрация: 18.08.2007
Адрес: Московская область
Возраст: 60
Сообщений: 3,092
Вес репутации: 4015/117
Марк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond repute
По умолчанию Re: указатели в Hi-tech

Цитата:
Сообщение от Pasha_Bi Посмотреть сообщение
*rbuf++;
Берется значение по указателю rbuf (это значение загружается в аккумулятор), затем указатель сдвигается на размер типа данных int.
Какая разница? В этой платформе указатели имеют нативную разрядность 16. Поэтому указатель никуда не сдвигается.
Марк на форуме   Ответить с цитированием
Старый 17.02.2020, 09:41   #5
Pasha_Bi
Senior Member
 
Регистрация: 24.07.2009
Адрес: г. Иваново
Возраст: 45
Сообщений: 296
Вес репутации: 640/48
Pasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to all
По умолчанию Re: указатели в Hi-tech

unsigned char* pCh;
pCh++ - указатель сдвигается на 1 (размер данных unsigned char - 1 байт).
int* pInt;
pInt++ - указатель сдвигается на 2 (размер данных int - 2 байта).
long* pLng;
pLng++ - указатель сдвигается на 4 (размер данных long - 4 байта).
Вот что я имел ввиду.
Pasha_Bi вне форума   Ответить с цитированием
Старый 17.02.2020, 10:26   #6
Марк
Senior Member
 
Аватар для Марк
 
Регистрация: 18.08.2007
Адрес: Московская область
Возраст: 60
Сообщений: 3,092
Вес репутации: 4015/117
Марк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond repute
По умолчанию Re: указатели в Hi-tech

Инкремент указателя всегда будет соответствовать разрядности содержимого по этому указателю. Как не пиши инкремент- сокращенно или полностью.
Я скомпилил представленный код в ХС16 (только заменил функцию УАРТа на простую пересылку в порт) и получил совершенно нормальный код, где указатель инкрементируется инструкцией inc2, то есть НА ДВА.
Марк на форуме   Ответить с цитированием
Старый 17.02.2020, 10:34   #7
Pasha_Bi
Senior Member
 
Регистрация: 24.07.2009
Адрес: г. Иваново
Возраст: 45
Сообщений: 296
Вес репутации: 640/48
Pasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to all
По умолчанию Re: указатели в Hi-tech

Тут дело то в последовательности как раз. Вы не уловили мысль мою. После первой инструкции *rbuf++, указатель сдвинулся с адреса переменной tmp.
Pasha_Bi вне форума   Ответить с цитированием
Старый 17.02.2020, 10:46   #8
Марк
Senior Member
 
Аватар для Марк
 
Регистрация: 18.08.2007
Адрес: Московская область
Возраст: 60
Сообщений: 3,092
Вес репутации: 4015/117
Марк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond repute
По умолчанию Re: указатели в Hi-tech

Я это воспринял как замысел автора. Но разницы между *rbuf++ и *rbuf=*rbuf+1 нет никакой. И там и там инкремент сдвинет значение указателя на 2. Кстати, иначе это вызовет при исполнении исключение по ошибке адреса, так как нечетный адрес для двухбайтных переменных быть не может.
Марк на форуме   Ответить с цитированием
Старый 17.02.2020, 10:54   #9
Pasha_Bi
Senior Member
 
Регистрация: 24.07.2009
Адрес: г. Иваново
Возраст: 45
Сообщений: 296
Вес репутации: 640/48
Pasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to all
По умолчанию Re: указатели в Hi-tech

Цитата:
Сообщение от Марк Посмотреть сообщение
...разницы между *rbuf++ и *rbuf=*rbuf+1 нет никакой. И там и там инкремент сдвинет значение указателя на 2...
Нет!
Pasha_Bi вне форума   Ответить с цитированием
Старый 17.02.2020, 10:59   #10
Pasha_Bi
Senior Member
 
Регистрация: 24.07.2009
Адрес: г. Иваново
Возраст: 45
Сообщений: 296
Вес репутации: 640/48
Pasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to allPasha_Bi is a name known to all
По умолчанию Re: указатели в Hi-tech

Марк, Вы меня тут "носом тыкать" заканчивайте. Я знаю как с указателями работать. *rbuf=*rbuf+1: Берется значение переменной, расположенной по адресу rbuf; к этому значению добавляется 1; полученное значение записиывается в область памяти rbuf.
Pasha_Bi вне форума   Ответить с цитированием
Старый 17.02.2020, 11:20   #11
besogon
Senior Member
 
Регистрация: 12.07.2012
Возраст: 33
Сообщений: 2,308
Вес репутации: 4401/96
besogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond reputebesogon has a reputation beyond repute
По умолчанию Re: указатели в Hi-tech

Марк
Я это воспринял как замысел автора. Но разницы между *rbuf++ и *rbuf=*rbuf+1 нет никакой. - приоритет операций в Си https://www.viva64.com/ru/t/0064/

так как нечетный адрес для двухбайтных переменных быть не может. - еще как может. если кому-то зачем-то нужно расположить переменную по невыровненному адресу, то он вполне может это сделать в рамках как Си, так и xc16.
besogon вне форума   Ответить с цитированием
Старый 17.02.2020, 11:23   #12
Марк
Senior Member
 
Аватар для Марк
 
Регистрация: 18.08.2007
Адрес: Московская область
Возраст: 60
Сообщений: 3,092
Вес репутации: 4015/117
Марк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond repute
По умолчанию Re: указатели в Hi-tech

Я носом не тыкаю Вас, Павел. Я просто беседую, извините. И да, я ошибся. Теперь понял. Спасибо.
Марк на форуме   Ответить с цитированием
Старый 17.02.2020, 19:21   #13
Greg
Super Moderator
 
Регистрация: 25.02.2007
Адрес: Moscow, ODBS
Сообщений: 7,015
Вес репутации: 6060/179
Greg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond repute
По умолчанию Re: указатели в Hi-tech

Цитата:
Сообщение от Марк Посмотреть сообщение
И да, я ошибся
ну да, скобки типа не поставил, а столько крику сразу...
а совершенно, кстати, порочная практика использование этого пост-инк(дек)ремента.
выглядит конечно солидно, как у профессионалов из интернета...
а на деле там ведь полный треш чаще всего творится https://www.iar.com/support/resource...friendly-code/

Последний раз редактировалось Greg; 17.02.2020 в 19:35.
Greg вне форума   Ответить с цитированием
Старый 17.02.2020, 23:27   #14
Lunatic
Senior Member
 
Аватар для Lunatic
 
Регистрация: 26.03.2007
Сообщений: 122
Вес репутации: 102/51
Lunatic will become famous soon enoughLunatic will become famous soon enough
Unhappy Re: указатели в Hi-tech

Собственно с чего возник трэш:

Код:
unsigned char tmp;
const char *rbuf;
...
static const char bound[]  = "hello";

	tmp=0x34;
	WriteUART2(tmp); 
	rbuf=&bound;
	tmp=*rbuf;
	WriteUART2(tmp);
На выходе порта имеем 0x34 и еще какой-то рандомный символ из фих знает какой области...

Раньше такая конструкция срабатывала, (PICC18), но для dsPIC разработчики поленились приложить примеров кода.
rbuf=&bound; - кстати ругается на символ &

И вот надо добить функцией древний проект, и я в печали

Код:
15:                static const char bound[]  = "hello";
16:                
17:                	tmp=0x34;
  A4A0  780280     mov.w 0x0000,0x000a
  A4A2  200340     mov.w #0x34,0x0000
  A4A4  B7E8A6     mov.b 0x0000,0x08a6
18:                	WriteUART2(tmp); 
  A4A6  208A66     mov.w #0x8a6,0x000c
  A4A8  784016     mov.b [0x000c],0x0000
  A4AA  07FFE5     rcall 0x00a476
19:                	rbuf=&bound;
  A4AC  2810A6     mov.w #0x810a,0x000c
  A4AE  780386     mov.w 0x000c,0x000e
  A4B0  2081E6     mov.w #0x81e,0x000c
  A4B2  780B07     mov.w 0x000e,[0x000c]
20:                	tmp=*rbuf;
  A4B4  2081E6     mov.w #0x81e,0x000c
  A4B6  780396     mov.w [0x000c],0x000e
  A4B8  208A66     mov.w #0x8a6,0x000c
  A4BA  784B17     mov.b [0x000e],[0x000c]
21:                	WriteUART2(tmp);
Lunatic вне форума   Ответить с цитированием
Старый 18.02.2020, 00:26   #15
DmitrijVDN
Senior Member
 
Регистрация: 09.04.2010
Сообщений: 857
Вес репутации: 1630/62
DmitrijVDN has a brilliant futureDmitrijVDN has a brilliant futureDmitrijVDN has a brilliant futureDmitrijVDN has a brilliant futureDmitrijVDN has a brilliant futureDmitrijVDN has a brilliant futureDmitrijVDN has a brilliant futureDmitrijVDN has a brilliant futureDmitrijVDN has a brilliant futureDmitrijVDN has a brilliant futureDmitrijVDN has a brilliant future
По умолчанию Re: указатели в Hi-tech

Цитата:
rbuf=&bound; - кстати ругается на символ &
что вполне логично...

https://cpp.com.ru/shildt_spr_po_c/04/0402.html или нет?
DmitrijVDN вне форума   Ответить с цитированием
Старый 18.02.2020, 05:34   #16
bzx
Senior Member
 
Аватар для bzx
 
Регистрация: 25.02.2007
Адрес: St. Petersburg
Возраст: 46
Сообщений: 509
Вес репутации: 1159/65
bzx has much to be proud ofbzx has much to be proud ofbzx has much to be proud ofbzx has much to be proud ofbzx has much to be proud ofbzx has much to be proud ofbzx has much to be proud ofbzx has much to be proud ofbzx has much to be proud of
Отправить сообщение для bzx с помощью ICQ Отправить сообщение для bzx с помощью Skype™
По умолчанию Re: указатели в Hi-tech

Цитата:
Сообщение от Lunatic Посмотреть сообщение
rbuf=&bound; - кстати ругается на символ &
bound - и есть указатель. Т.е. надо использовать:
Код:
rbuf=&bound[0];
или
Код:
rbuf=bound;
__________________
Для связи email: info собака qbit.su
bzx вне форума   Ответить с цитированием
Старый 18.02.2020, 09:03   #17
Lunatic
Senior Member
 
Аватар для Lunatic
 
Регистрация: 26.03.2007
Сообщений: 122
Вес репутации: 102/51
Lunatic will become famous soon enoughLunatic will become famous soon enough
По умолчанию Re: указатели в Hi-tech

Конечно логично! Но сути дела это не меняет.
Толи статические строки должны бить специфично оформлены, то ли что...

Все вышесказанное удаляет ругань компилятора, но не приводит к работоспособности кода. Беда в том, что найти документацию на это семейство по хайтэчу проблема, и примеры проблема. Может у кого были проекты, где использовались статические строки. Без них огород придется городить епический...

Последний раз редактировалось Lunatic; 18.02.2020 в 09:15.
Lunatic вне форума   Ответить с цитированием
Старый 18.02.2020, 10:24   #18
Рак
Senior Member
 
Регистрация: 02.04.2008
Адрес: Кременчуг
Возраст: 34
Сообщений: 1,412
Вес репутации: 2524/84
Рак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond repute
По умолчанию Re: указатели в Hi-tech

Цитата:
Сообщение от Lunatic Посмотреть сообщение
Конечно логично! Но сути дела это не меняет.
Толи статические строки должны бить специфично оформлены, то ли что...

Все вышесказанное удаляет ругань компилятора, но не приводит к работоспособности кода. Беда в том, что найти документацию на это семейство по хайтэчу проблема, и примеры проблема. Может у кого были проекты, где использовались статические строки. Без них огород придется городить епический...
Вы хотите, что бы был вывод строки целиком?
Рак вне форума   Ответить с цитированием
Старый 18.02.2020, 10:49   #19
Lunatic
Senior Member
 
Аватар для Lunatic
 
Регистрация: 26.03.2007
Сообщений: 122
Вес репутации: 102/51
Lunatic will become famous soon enoughLunatic will become famous soon enough
По умолчанию Re: указатели в Hi-tech

Ну да, до нулевого символа... классический вывод в порт строки по указателю, как раз это и не получается.
Ну или хотя бы чтобы строку в буффер по указателю копировать... Вобщем что-либо сделать со строкой по указателю... )))
Lunatic вне форума   Ответить с цитированием
Старый 18.02.2020, 11:13   #20
Рак
Senior Member
 
Регистрация: 02.04.2008
Адрес: Кременчуг
Возраст: 34
Сообщений: 1,412
Вес репутации: 2524/84
Рак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond reputeРак has a reputation beyond repute
По умолчанию Re: указатели в Hi-tech

Цитата:
Сообщение от Lunatic Посмотреть сообщение
Ну да, до нулевого символа... классический вывод в порт строки по указателю, как раз это и не получается.
Ну или хотя бы чтобы строку в буффер по указателю копировать... Вобщем что-либо сделать со строкой по указателю... )))
Я в xc16 не силён, но Вы уверены, что WriteUART2 отправляет именно строку, а не значение, которое ей передали?
Рак вне форума   Ответить с цитированием
Старый 18.02.2020, 11:48   #21
Lunatic
Senior Member
 
Аватар для Lunatic
 
Регистрация: 26.03.2007
Сообщений: 122
Вес репутации: 102/51
Lunatic will become famous soon enoughLunatic will become famous soon enough
По умолчанию Re: указатели в Hi-tech

WriteUART2 отправляет один символ. Не в этом суть... Суть в том, что не правильно ссылаюсь на строку символов. В размещенном выше примере, из строки не удается выудить через ссылку ничего толком.
Lunatic вне форума   Ответить с цитированием
Старый 18.02.2020, 13:06   #22
Марк
Senior Member
 
Аватар для Марк
 
Регистрация: 18.08.2007
Адрес: Московская область
Возраст: 60
Сообщений: 3,092
Вес репутации: 4015/117
Марк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond reputeМарк has a reputation beyond repute
По умолчанию Re: указатели в Hi-tech

Код:
15:                static const char bound[]  = "hello"; компилятор засунул эту строку во флеш по адресу 0x010a
16:                
17:                	tmp=0x34;
  A4A0  780280     mov.w W0,W5
  A4A2  200340     mov.w #0x34,W0
  A4A4  B7E8A6     mov.b W0,0x08a6
18:                	WriteUART2(tmp); 
  A4A6  208A66     mov.w #0x8a6,W6
  A4A8  784016     mov.b [W6],W0
  A4AA  07FFE5     rcall 0x00a476
19:                	rbuf=&bound;
  A4AC  2810A6     mov.w #0x810a,W6
  A4AE  780386     mov.w W6,W7
  A4B0  2081E6     mov.w #0x81e,W6
  A4B2  780B07     mov.w W7,[W6]  ;  ---> rbuf=0x810a - PSV-доступ   
20:                	tmp=*rbuf;
  A4B4  2081E6     mov.w #0x81e,W6
  A4B6  780396     mov.w [W6],W7
  A4B8  208A66     mov.w #0x8a6,W6
  A4BA  784B17     mov.b [W7],[W6]
21:                	WriteUART2(tmp);
Из приведенного дизасма следует, что rbuf=0x810a - указателю присвоено значение из области PSV. Для работы этого механизма его нужно включить: bset CORCON, #PSV . Есть такое мнение, что компилятор не справился с этой задачей.
Марк на форуме   Ответить с цитированием
Старый 18.02.2020, 18:18   #23
Greg
Super Moderator
 
Регистрация: 25.02.2007
Адрес: Moscow, ODBS
Сообщений: 7,015
Вес репутации: 6060/179
Greg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond reputeGreg has a reputation beyond repute
По умолчанию Re: указатели в Hi-tech

Цитата:
Сообщение от Lunatic Посмотреть сообщение
[/CODE]Компилятор Hi-tech для dsPIC
из глубин памяти - это были несочетаемые понятия, т.е. забить
Greg вне форума   Ответить с цитированием
Ответ


Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с Hi Tech 9.60 SuSLiK Продукция MICROCHIP 2 25.09.2013 21:24
Проблема HI TECH. PIC18F25K20 Продукция MICROCHIP 4 07.03.2013 02:24
Вопрос начинающего по PIC18+HI TECH ivved Продукция MICROCHIP 1 07.10.2010 16:03
Указатели на массив как параметры функции gontharov Продукция MICROCHIP 9 18.05.2010 17:55
Передача значения локальной переменной на asm в Hi Tech PICC Zenth Продукция MICROCHIP 6 06.01.2008 21:56


Часовой пояс GMT +3, время: 18:36.


Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, Jelsoft Enterprises Ltd. Перевод: zCarot