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

 
 
 
Reply to this topicStart new topic
> Hi-Tech PRO PIC10/12/16 V9.65PL1 & PCLATH
ViKo
сообщение Dec 3 2009, 14:45
Сообщение #1


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Что сделать, чтобы компилятор не сбрасывал биты выбора страниц памяти в PCLATH там, где не надо (они и так всегда сброшены). Пример его работы:

Код
  0009    120A     BCF 0xa, 0x4
  000A    118A     BCF 0xa, 0x3
  000B    27F4     CALL 0x7f4
  000C    120A     BCF 0xa, 0x4
  000D    118A     BCF 0xa, 0x3
Go to the top of the page
 
+Quote Post
Herz
сообщение Dec 3 2009, 19:10
Сообщение #2


Гуру
******

Группа: Модераторы
Сообщений: 10 983
Регистрация: 23-11-05
Пользователь №: 11 287



А в чём проблема?
Go to the top of the page
 
+Quote Post
ViKo
сообщение Dec 4 2009, 09:03
Сообщение #3


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(Herz @ Dec 3 2009, 21:10) *
А в чём проблема?

Проблем нет, просто испытываю дискомфорт, изучая код, созданный компилятором. Показываю более полный пример - исходник и результат:

Код
      Out = 0;  Delay10K(30);    // 0.3 s
      Out = 1;  Delay10K(50);    // 0.5 s
      Out = 0;  Delay10K(30);    // 0.3 s
      Out = 1;  Delay10K(50);    // 0.5 s
      Out = 0;  Delay10K(30);    // 0.3 s
      Out = 1;  Delay10K(50);    // 0.5 s


Код
61:                      Out = 0;  Delay10K(30);    // 0.3 s
  0027    1008     BCF 0x8, 0
  0028    301E     MOVLW 0x1e
  0029    120A     BCF 0xa, 0x4
  002A    118A     BCF 0xa, 0x3
  002B    27F3     CALL 0x7f3
62:                      Out = 1;  Delay10K(50);    // 0.5 s
  002C    1408     BSF 0x8, 0
  002D    3032     MOVLW 0x32
  002E    120A     BCF 0xa, 0x4
  002F    118A     BCF 0xa, 0x3
  0030    27F3     CALL 0x7f3
63:                      Out = 0;  Delay10K(30);    // 0.3 s
  0031    1008     BCF 0x8, 0
  0032    301E     MOVLW 0x1e
  0033    120A     BCF 0xa, 0x4
  0034    118A     BCF 0xa, 0x3
  0035    27F3     CALL 0x7f3
64:                      Out = 1;  Delay10K(50);    // 0.5 s
  0036    1408     BSF 0x8, 0
  0037    3032     MOVLW 0x32
  0038    120A     BCF 0xa, 0x4
  0039    118A     BCF 0xa, 0x3
  003A    27F3     CALL 0x7f3
65:                      Out = 0;  Delay10K(30);    // 0.3 s
  003B    1008     BCF 0x8, 0
  003C    301E     MOVLW 0x1e
  003D    120A     BCF 0xa, 0x4
  003E    118A     BCF 0xa, 0x3
  003F    27F3     CALL 0x7f3
66:                      Out = 1;  Delay10K(50);    // 0.5 s
  0040    1408     BSF 0x8, 0
  0041    3032     MOVLW 0x32
  0042    120A     BCF 0xa, 0x4
  0043    118A     BCF 0xa, 0x3
  0044    27F3     CALL 0x7f3


Когда я писал на ассемблере, я выбирал страницы по мере необходимости. А тут весь код в одной странице, зачем же "перетрахивать" ненужные биты? И памяти жалко, и времени...
Go to the top of the page
 
+Quote Post
Herz
сообщение Dec 4 2009, 09:18
Сообщение #4


Гуру
******

Группа: Модераторы
Сообщений: 10 983
Регистрация: 23-11-05
Пользователь №: 11 287



Цитата(ViKo @ Dec 4 2009, 11:03) *
Проблем нет, просто испытываю дискомфорт, изучая код, созданный компилятором. Показываю более полный пример - исходник и результат:

Код
    ...
         0044    27F3  CALL 0x7f3


Когда я писал на ассемблере, я выбирал страницы по мере необходимости. А тут весь код в одной странице, зачем же "перетрахивать" ненужные биты? И памяти жалко, и времени...

Не стоит их жалеть, ведь, как Вы сами сказали, проблем нет и на производительности (как я понимаю) это не сказывается. Тем более, что программные задержки по типу ваших уж никак примером эффективности служить не могут - в них потеряете больше... Кроме того, Вы уверены что при вызове функции не происходит переход на другую страницу? Где находится 0x7f3 ?
Go to the top of the page
 
+Quote Post
ViKo
сообщение Dec 4 2009, 09:33
Сообщение #5


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(Herz @ Dec 4 2009, 11:18) *
программные задержки по типу ваших уж никак примером эффективности служить не могут - в них потеряете больше...
Где находится 0x7f3 ?

Мне большего не требуется. Простая задача, простая программа. Речь не о ней. Так будет везде, в любой программе.
А 0x7f3 находится в конце нулевой страницы. В данном вопросе компилятор молодец, разместил подпрограмму в конце, чтобы не "путалась под ногами".
Go to the top of the page
 
+Quote Post
Herz
сообщение Dec 4 2009, 13:32
Сообщение #6


Гуру
******

Группа: Модераторы
Сообщений: 10 983
Регистрация: 23-11-05
Пользователь №: 11 287



Цитата(ViKo @ Dec 4 2009, 11:33) *
Мне большего не требуется. Простая задача, простая программа. Речь не о ней. Так будет везде, в любой программе.
А 0x7f3 находится в конце нулевой страницы. В данном вопросе компилятор молодец, разместил подпрограмму в конце, чтобы не "путалась под ногами".

Да, я тоже заметил, что компилятор молодец biggrin.gif и часто делает за нас нашу работу иногда лучше нас самих. Так что не спешите тревожится: будут проблемы - будут и решения... laughing.gif А то , что обратили внимание: по-моему, хорошо и пока достаточно.
Go to the top of the page
 
+Quote Post
xemul
сообщение Dec 4 2009, 14:35
Сообщение #7



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Цитата(ViKo @ Dec 3 2009, 17:45) *
Что сделать, чтобы компилятор не сбрасывал биты выбора страниц памяти в PCLATH

Предложите htsoft'у 100% алгоритм определения при компиляции
Цитата
там, где не надо

и они с удовольствием его реализуют.
Пока их компиляторы для пиков перед вызовом функций безусловно устанавливают PCLATH на требуемую страницу.
Зачем? Из-за ограничений архитектуры мелких пиков. Посмотрите, во что развернётся обращение к const или к (*)(), если объект обращения живёт на другой странице.
Вы таким не пользуетесь? А кому-то оно надо.
Go to the top of the page
 
+Quote Post
ViKo
сообщение Dec 4 2009, 15:58
Сообщение #8


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Цитата(xemul @ Dec 4 2009, 16:35) *
Предложите htsoft'у 100% алгоритм определения при компиляции
и они с удовольствием его реализуют.

А как я, программируя на ассемблере, всегда знал, на какой странице нахожусь?
Нужно пробежаться по коду еще раз и посмотреть, где находишься при вызове (переходе), в каком состоянии PCLATH и в каком он должен быть для вызова (перехода). А может быть, и не нужно "еще раз...", а сразу при генерации кода (как это делается - не в моей компетенции).
Точно нельзя какую-нибудь опцию подправить, чтоб было, как хочу? smile.gif
Go to the top of the page
 
+Quote Post
xemul
сообщение Dec 4 2009, 16:32
Сообщение #9



*****

Группа: Свой
Сообщений: 1 928
Регистрация: 11-07-06
Пользователь №: 18 731



Цитата(ViKo @ Dec 4 2009, 18:58) *
А как я, программируя на ассемблере, всегда знал, на какой странице нахожусь?
Нужно пробежаться по коду еще раз и посмотреть, где находишься при вызове (переходе), в каком состоянии PCLATH и в каком он должен быть для вызова (перехода). А может быть, и не нужно "еще раз...", а сразу при генерации кода (как это делается - не в моей компетенции).

"Не читал, но осуждаю."
Архитектура мелких пиков очень неудобна для оптимизирующих компиляторов организацией и памяти программ, и памяти данных, и способами адресации. "где находишься при вызове (переходе)" компилятору вообще должно быть неинтересно - это проблема линкера, но из-за особенностей архитектуры ему приходится думать о каком-то PCLATH.
Поэтому и компиляторов под них чуть да ничего. А вменяемых компиляторов ещё меньше.
Цитата
Точно нельзя какую-нибудь опцию подправить, чтоб было, как хочу? smile.gif

Пока нет. Точно.
Может когда-нить htsoft и допилит Omniscient Code GenerationTM до состояния, когда качество его кода начнёт устраивать мастеров ассемблера, но, имхо, мелкие пики отомрут раньше.
Go to the top of the page
 
+Quote Post
Евгений Германов...
сообщение Dec 6 2009, 09:25
Сообщение #10


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

Группа: Свой
Сообщений: 1 079
Регистрация: 24-06-07
Из: г.Екатеринбург
Пользователь №: 28 654



Цитата(xemul @ Dec 4 2009, 20:32) *
Может когда-нить htsoft и допилит Omniscient Code GenerationTM до состояния, когда качество его кода начнёт устраивать мастеров ассемблера, но, имхо, мелкие пики отомрут раньше.

Почему Вы их не любите? Я про мелкие пики. И как Вы их классифицируете? По числу ног или по разрядности?
Go to the top of the page
 
+Quote Post
ViKo
сообщение Dec 7 2009, 10:25
Сообщение #11


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



Мое мнение - семейства PIC10/12/16 не блещут производительностью по сравнению с AVR, например. Выбирая сейчас, может быть я выбрал бы микроконтроллеры Atmel. Но, во-первых - привык к PIC, знаю их в совершенстве (и команд мало, легко запомнить, и средства программирования мне кажутся удобными и доступными). Во-вторых, не доверяю фирме Atmel с их глюками в железе и документации (личное субъективное мнение, отстаивать не буду). В мире есть много интересных микроконтроллеров, но там, где можно, я буду применять PIC10/12/16, возможно PIC18. А там где нельзя - STM32, например (опять же, субъективный выбор, не настаиваю на правильности).
В-общем, что любить или не любить - личное дело каждого.
Go to the top of the page
 
+Quote Post
Herz
сообщение Dec 7 2009, 11:10
Сообщение #12


Гуру
******

Группа: Модераторы
Сообщений: 10 983
Регистрация: 23-11-05
Пользователь №: 11 287



Цитата(ViKo @ Dec 7 2009, 12:25) *
В-общем, что любить или не любить - личное дело каждого.

Не втягивайтесь в бесполезный трёп, это к делу не относится... wassat.gif
Go to the top of the page
 
+Quote Post
ViKo
сообщение Mar 19 2010, 08:43
Сообщение #13


Универсальный солдатик
******

Группа: Модераторы
Сообщений: 8 634
Регистрация: 1-11-05
Из: Минск
Пользователь №: 10 362



А вот гляньте на следующий код! Та же программа, что демонстрировал вначале, была слегка модернизирована. Компилятор, правда, 9.70. Но, думаю, дело не в нем, а неком "стечении обстоятельств", позволяющих компилятору решить, что биты выбора страниц "ператрахивать" не надо.
Код
      Out = 0;  Delay10K(Time);    // 0.05 .. 0.4 s
   036    1105     BCF 0x5, 0x2
   037    0825     MOVF 0x25, W
   038    23F2     CALL 0x3f2
95:                      Out = 1;  Delay10K(30);    // 0.3 s
   039    1505     BSF 0x5, 0x2
   03A    301E     MOVLW 0x1e
   03B    23F2     CALL 0x3f2
96:                      // Out = 0;  Delay10K(20);    // 0.2 s
97:                      Out = 0;  Delay10K(Time);    // 0.05 .. 0.4 s
   03C    1105     BCF 0x5, 0x2
   03D    0825     MOVF 0x25, W
   03E    23F2     CALL 0x3f2
98:                      Out = 1;  Delay10K(30);    // 0.3 s
   03F    1505     BSF 0x5, 0x2
   040    301E     MOVLW 0x1e
   041    23F2     CALL 0x3f2
99:                      // Out = 0;  Delay10K(20);    // 0.2 s
100:                     Out = 0;  Delay10K(Time);    // 0.05 .. 0.4 s
   042    1105     BCF 0x5, 0x2
   043    0825     MOVF 0x25, W
   044    23F2     CALL 0x3f2
101:                     Out = 1;  Delay10K(30);    // 0.3 s
   045    1505     BSF 0x5, 0x2
   046    301E     MOVLW 0x1e
   047    23F2     CALL 0x3f2

В-общем, все не так просто. Найти бы эти "обстоятельства"...
Go to the top of the page
 
+Quote Post

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

 


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


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