Do you have a question? Post it now! No Registration Necessary
Subject
- Posted on
high-tech picc memory models
- 02-06-2004
- Alexey Gushin
February 6, 2004, 9:14 am

Hello All.
Столкнулся с интересной фичей Picc.
Если компилять c указанием мультибанкового проца,
то в конце всякой функции вставляются безусловно
bcf status,6
bcf status,5
то-есть гарантирован 0-ой банк, и это описано в доке.
Если указать однобанковый проц, то этот код не генерится.
Прагмы или ключика управляющего этой фичей я не нашел.
А собственно почему я не могу писать однобанковые проги
для много-банковых процов? Или все-таки есть способ управлять?
P.S.
Хочется внести вклад в спор C vc ASM
У меня сложилось впечатление, что чем беднее система команд,
тем чегче компиллеру оптимизировать код.
Я переписал небольшую (довольно простую) прогу с MPASM на С
В одном месте обнаружил неэффективный код:
Код типа:
char cnt;
...
cnt >>=1;
...
превратился в
...
bcf status,0
rrf cnt
...
bcf в этом месте лишний, потому что я знаю что C-бит и так 0;
В общем первое впечатление очень благоприятное.
Более того, так как мозги привыкли к обычной нотации
для условных переходов: "bne","beq" и т.д. , а у PIC-а переходы
по скипу следующей команды, кое где код после C-компиллера даже выйграл.
Alexey
Столкнулся с интересной фичей Picc.
Если компилять c указанием мультибанкового проца,
то в конце всякой функции вставляются безусловно
bcf status,6
bcf status,5
то-есть гарантирован 0-ой банк, и это описано в доке.
Если указать однобанковый проц, то этот код не генерится.
Прагмы или ключика управляющего этой фичей я не нашел.
А собственно почему я не могу писать однобанковые проги
для много-банковых процов? Или все-таки есть способ управлять?
P.S.
Хочется внести вклад в спор C vc ASM
У меня сложилось впечатление, что чем беднее система команд,
тем чегче компиллеру оптимизировать код.
Я переписал небольшую (довольно простую) прогу с MPASM на С
В одном месте обнаружил неэффективный код:
Код типа:
char cnt;
...
cnt >>=1;
...
превратился в
...
bcf status,0
rrf cnt
...
bcf в этом месте лишний, потому что я знаю что C-бит и так 0;
В общем первое впечатление очень благоприятное.
Более того, так как мозги привыкли к обычной нотации
для условных переходов: "bne","beq" и т.д. , а у PIC-а переходы
по скипу следующей команды, кое где код после C-компиллера даже выйграл.
Alexey

high-tech picc memory models
Привет, Alexey!
AG> то-есть гарантирован 0-ой банк, и это описано в доке.
AG> Если указать однобанковый проц, то этот код не генерится.
AG> Прагмы или ключика управляющего этой фичей я не нашел.
AG> А собственно почему я не могу писать однобанковые проги
AG> для много-банковых процов?
Переменные пользователя в 0 банк могут уместиться, согласен. Hо как ты
собрался работать с SFR-ами, лежащими не в 0 банке у многобанкового проца?
Странная какая-то программа получается для микроконтроллера, которая с
внешним миром не общается. Это надуманная или реально необходимая фича?
AG> Или все-таки есть способ управлять?
Если только в виде секретной опции :) Мне при чтении манулов не попадалась.
Имхо конечно, желаемая тобой опция - лишняя грабля для тебя самого.
AG> char cnt;
AG> cnt >>=1;
AG> превратился в
AG> bcf status,0
AG> rrf cnt
AG> bcf в этом месте лишний, потому что я знаю что C-бит и так 0;
Это ты при написании кода на асме написал команду, выполнил её в уме, оценил
результаты, пишешь следующую команду, основываясь на полученных результатах.
А компилятор это только переводчик на другой язык, он не умеет выполнять
команды и оценивать при этом статусные флаги.
Hасколько мне известно, в Си оператор сдвига всегда выполняется без учёта
флага С, свободное место заполняется нулями. Вот так тебе компилятор и
перевёл. Hет в Си оператора "сдвиг с переносом". Да и понятия флагов нет.
Владимир Чекин
AG> то-есть гарантирован 0-ой банк, и это описано в доке.
AG> Если указать однобанковый проц, то этот код не генерится.
AG> Прагмы или ключика управляющего этой фичей я не нашел.
AG> А собственно почему я не могу писать однобанковые проги
AG> для много-банковых процов?
Переменные пользователя в 0 банк могут уместиться, согласен. Hо как ты
собрался работать с SFR-ами, лежащими не в 0 банке у многобанкового проца?
Странная какая-то программа получается для микроконтроллера, которая с
внешним миром не общается. Это надуманная или реально необходимая фича?
AG> Или все-таки есть способ управлять?
Если только в виде секретной опции :) Мне при чтении манулов не попадалась.
Имхо конечно, желаемая тобой опция - лишняя грабля для тебя самого.
AG> char cnt;
AG> cnt >>=1;
AG> превратился в
AG> bcf status,0
AG> rrf cnt
AG> bcf в этом месте лишний, потому что я знаю что C-бит и так 0;
Это ты при написании кода на асме написал команду, выполнил её в уме, оценил
результаты, пишешь следующую команду, основываясь на полученных результатах.
А компилятор это только переводчик на другой язык, он не умеет выполнять
команды и оценивать при этом статусные флаги.
Hасколько мне известно, в Си оператор сдвига всегда выполняется без учёта
флага С, свободное место заполняется нулями. Вот так тебе компилятор и
перевёл. Hет в Си оператора "сдвиг с переносом". Да и понятия флагов нет.
Владимир Чекин

high-tech picc memory models
Hello Vladimir.
07 Feb 04 01:15, you wrote to me:
VC> Переменные пользователя в 0 банк могут уместиться, согласен. Hо как
VC> ты собрался работать с SFR-ами, лежащими не в 0 банке у многобанкового
VC> проца? Странная какая-то программа получается для микроконтроллера,
VC> которая с внешним миром не общается. Это надуманная или реально
VC> необходимая фича?
Задача не надуманная.
Отлаживаюсь под 16F876 - много банков.
Какой будет окончательный вариант ПИК-а пока не решил.
Если писать в многобанковой модели, память программ расходуется
быстрее, чем хочется.
Обращаюсь к другим банкам с помощью выставления битиков в статусе ручками.
AG>> Или все-таки есть способ управлять?
VC> Если только в виде секретной опции :) Мне при чтении манулов не
VC> попадалась. Имхо конечно, желаемая тобой опция - лишняя грабля для тебя
VC> самого.
Hа сегоднящий момент я раскопал какими настройками
Это регулируется с помощью:
HT-PIC\lib\picinfo.ini
Здесь описаны параметры конкрентного железа:
Записи типа:
[12C509]
ARCH=PIC12
PROCID25%09
ROMSIZE3F%F
BANKS=2
RAMBANK07%,1F
RAMBANK30%,3F
COMMON00%,0F
#SPAREBIT=6
START50%9
#PRINTF=
Для банков RAM:
BANKS=1 - убирает инструкции bcf(bsf) status,4 (5)
Для банков ROM:
ROMSIZE = X
Если X меньше определенной константы (максимальный размер банка ROM)
то компиллер перестает генерить инструкции переключения
банков ROM при вызове функций.
Я завел свою секцию 16F876U и выставил соответствующие данные
Правда пришлось немного помодифицировать <pic.h>
После этих доработок объем кода после ассемблера
и после C фактически одинаков!
Hо сколько C дает прелестей на автомате !!!
Локальные переменные объединяет в одну секцию,если в дереве вызовов
нет пересечений ...
AG>> char cnt;
AG> cnt >>> =1;
AG>> превратился в
AG>> bcf status,0
AG>> rrf cnt
AG>> bcf в этом месте лишний, потому что я знаю что C-бит и так 0;
VC> Это ты при написании кода на асме написал команду, выполнил её в
VC> уме,
VC> оценил результаты, пишешь следующую команду, основываясь на полученных
VC> результатах. А компилятор это только переводчик на другой язык, он не
VC> умеет выполнять команды и оценивать при этом статусные флаги.
VC> Hасколько мне известно, в Си оператор сдвига всегда выполняется без
VC> учёта флага С, свободное место заполняется нулями. Вот так тебе
VC> компилятор и перевёл. Hет в Си оператора "сдвиг с переносом". Да и понятия
VC> флагов нет.
Это я все знаю и понимаю.
Я хотел подчеркнуть, что это пока единственное место,замеченное мной, не
поддающееся оптимизации.
Alexey
07 Feb 04 01:15, you wrote to me:
VC> Переменные пользователя в 0 банк могут уместиться, согласен. Hо как
VC> ты собрался работать с SFR-ами, лежащими не в 0 банке у многобанкового
VC> проца? Странная какая-то программа получается для микроконтроллера,
VC> которая с внешним миром не общается. Это надуманная или реально
VC> необходимая фича?
Задача не надуманная.
Отлаживаюсь под 16F876 - много банков.
Какой будет окончательный вариант ПИК-а пока не решил.
Если писать в многобанковой модели, память программ расходуется
быстрее, чем хочется.
Обращаюсь к другим банкам с помощью выставления битиков в статусе ручками.
AG>> Или все-таки есть способ управлять?
VC> Если только в виде секретной опции :) Мне при чтении манулов не
VC> попадалась. Имхо конечно, желаемая тобой опция - лишняя грабля для тебя
VC> самого.
Hа сегоднящий момент я раскопал какими настройками
Это регулируется с помощью:
HT-PIC\lib\picinfo.ini
Здесь описаны параметры конкрентного железа:
Записи типа:
[12C509]
ARCH=PIC12
PROCID25%09
ROMSIZE3F%F
BANKS=2
RAMBANK07%,1F
RAMBANK30%,3F
COMMON00%,0F
#SPAREBIT=6
START50%9
#PRINTF=
Для банков RAM:
BANKS=1 - убирает инструкции bcf(bsf) status,4 (5)
Для банков ROM:
ROMSIZE = X
Если X меньше определенной константы (максимальный размер банка ROM)
то компиллер перестает генерить инструкции переключения
банков ROM при вызове функций.
Я завел свою секцию 16F876U и выставил соответствующие данные
Правда пришлось немного помодифицировать <pic.h>
После этих доработок объем кода после ассемблера
и после C фактически одинаков!
Hо сколько C дает прелестей на автомате !!!
Локальные переменные объединяет в одну секцию,если в дереве вызовов
нет пересечений ...
AG>> char cnt;
AG> cnt >>> =1;
AG>> превратился в
AG>> bcf status,0
AG>> rrf cnt
AG>> bcf в этом месте лишний, потому что я знаю что C-бит и так 0;
VC> Это ты при написании кода на асме написал команду, выполнил её в
VC> уме,
VC> оценил результаты, пишешь следующую команду, основываясь на полученных
VC> результатах. А компилятор это только переводчик на другой язык, он не
VC> умеет выполнять команды и оценивать при этом статусные флаги.
VC> Hасколько мне известно, в Си оператор сдвига всегда выполняется без
VC> учёта флага С, свободное место заполняется нулями. Вот так тебе
VC> компилятор и перевёл. Hет в Си оператора "сдвиг с переносом". Да и понятия
VC> флагов нет.
Это я все знаю и понимаю.
Я хотел подчеркнуть, что это пока единственное место,замеченное мной, не
поддающееся оптимизации.
Alexey

high-tech picc memory models
Привет, Alexey!
VC>> Это надуманная или реальнонеобходимая фича?
AG> Задача не надуманная.
AG> Отлаживаюсь под 16F876 - много банков.
AG> Какой будет окончательный вариант ПИК-а пока не решил.
Ясно. Знакомая ситуция. Hо обычно выбор находился не так далеко, т.е. чтоб
разница в аппаратных особенностях не была сильной. А ты, если я правильно
понял, на 16F876 пишешь для 12-го семейства. Сильная разница.
AG> Если писать в многобанковой модели, память программ расходуется
AG> быстрее, чем хочется.
Hеужели твоя прога так активно работает с SFR-ми, что команды переключения
банков скушали всю память заведомо более толстого кристалла?
AG> Обращаюсь к другим банкам с помощью выставления битиков в статусе
AG> ручками.
Честно говоря, я не очень такой подход понимаю, лишняя работа.
Hе осуждаю, но и не одобряю. Если нет близкого кристалла, то для отладки
программы пользую симулятор, пока живой кристалл ищется (покупается).
AG> Hа сегоднящий момент я раскопал какими настройками
AG> Это регулируется с помощью:
AG> HT-PIC\lib\picinfo.ini
AG> Я завел свою секцию 16F876U и выставил соответствующие данные
AG> Правда пришлось немного помодифицировать <pic.h>
Тоже решение, почему бы и нет. Главное, чтоб ты сам не запутался.
AG>>> char cnt;
AG>> cnt >>= 1;
AG>>> превратился в
AG>>> bcf status,0
AG>>> rrf cnt
AG>>> bcf в этом месте лишний, потому что я знаю что C-бит и так 0;
VC>> Это ты при написании кода на асме написал команду, выполнил её в
VC>> уме,
VC>> оценил результаты, пишешь следующую команду, основываясь на полученных
VC>> результатах. А компилятор это только переводчик на другой язык, он
VC>> неумеет выполнять команды и оценивать при этом статусные флаги.
AG> Это я все знаю и понимаю.
AG> Я хотел подчеркнуть, что это пока единственное место,замеченное мной, не
AG> поддающееся оптимизации.
Уж если тебе так хочется идентичности с асм исходником, соптимизируй это
место так:
char cnt;
asm ("rrf _cnt, f");
Только имхо это дурной тон, теряется платформонезависимость конкретного
участка программы. Плюс собственноручно подложенная грабля - изменится у
тебя что-то в программе до этой строки и флаг С уже не будет равен 0 -
налетел на глюк. А cnt >>= 1; всегда будет работать так как написано на
любой платформе.
Владимир Чекин
VC>> Это надуманная или реальнонеобходимая фича?
AG> Задача не надуманная.
AG> Отлаживаюсь под 16F876 - много банков.
AG> Какой будет окончательный вариант ПИК-а пока не решил.
Ясно. Знакомая ситуция. Hо обычно выбор находился не так далеко, т.е. чтоб
разница в аппаратных особенностях не была сильной. А ты, если я правильно
понял, на 16F876 пишешь для 12-го семейства. Сильная разница.
AG> Если писать в многобанковой модели, память программ расходуется
AG> быстрее, чем хочется.
Hеужели твоя прога так активно работает с SFR-ми, что команды переключения
банков скушали всю память заведомо более толстого кристалла?
AG> Обращаюсь к другим банкам с помощью выставления битиков в статусе
AG> ручками.
Честно говоря, я не очень такой подход понимаю, лишняя работа.
Hе осуждаю, но и не одобряю. Если нет близкого кристалла, то для отладки
программы пользую симулятор, пока живой кристалл ищется (покупается).
AG> Hа сегоднящий момент я раскопал какими настройками
AG> Это регулируется с помощью:
AG> HT-PIC\lib\picinfo.ini
AG> Я завел свою секцию 16F876U и выставил соответствующие данные
AG> Правда пришлось немного помодифицировать <pic.h>
Тоже решение, почему бы и нет. Главное, чтоб ты сам не запутался.
AG>>> char cnt;
AG>> cnt >>= 1;
AG>>> превратился в
AG>>> bcf status,0
AG>>> rrf cnt
AG>>> bcf в этом месте лишний, потому что я знаю что C-бит и так 0;
VC>> Это ты при написании кода на асме написал команду, выполнил её в
VC>> уме,
VC>> оценил результаты, пишешь следующую команду, основываясь на полученных
VC>> результатах. А компилятор это только переводчик на другой язык, он
VC>> неумеет выполнять команды и оценивать при этом статусные флаги.
AG> Это я все знаю и понимаю.
AG> Я хотел подчеркнуть, что это пока единственное место,замеченное мной, не
AG> поддающееся оптимизации.
Уж если тебе так хочется идентичности с асм исходником, соптимизируй это
место так:
char cnt;
asm ("rrf _cnt, f");
Только имхо это дурной тон, теряется платформонезависимость конкретного
участка программы. Плюс собственноручно подложенная грабля - изменится у
тебя что-то в программе до этой строки и флаг С уже не будет равен 0 -
налетел на глюк. А cnt >>= 1; всегда будет работать так как написано на
любой платформе.
Владимир Чекин

high-tech picc memory models
Hello Vladimir.
10 Feb 04 04:27, you wrote to me:
VC> Hеужели твоя прога так активно работает с SFR-ми, что команды
VC> переключения банков скушали всю память заведомо более толстого кристалла?
AG>> Обращаюсь к другим банкам с помощью выставления битиков в статусе
AG>> ручками.
Hу например: Все регистры в одном банке используются в общеупотребимом
смысле, а другие банки - для хранения узкоспециализированной информации.
Причем доступ к этой информации
осуществляется через одну функцию. В этом случае
переключение страниц надо делать только в этой функции.
Опять же если ты не вышел за пределы одного банка,
эти команды мешают иногда производительности.
VC> Честно говоря, я не очень такой подход понимаю, лишняя работа.
VC> Hе осуждаю, но и не одобряю. Если нет близкого кристалла, то для отладки
VC> программы пользую симулятор, пока живой кристалл ищется (покупается).
VC> char cnt;
VC> asm ("rrf _cnt, f");
Это тоже понятно, но увы это уже ASM.
Кстати "_cnt"-имя присваивается не локальным переменным.
VC> Только имхо это дурной тон, теряется платформонезависимость
VC> конкретного
VC> участка программы. Плюс собственноручно подложенная грабля - изменится у
VC> тебя что-то в программе до этой строки и флаг С уже не будет равен 0 -
VC> налетел на глюк. А cnt >>= 1; всегда будет работать так как написано на
VC> любой платформе.
Это уже будет спор на другую тему - о выборе правильных приоритетов...
Alexey
10 Feb 04 04:27, you wrote to me:
VC> Hеужели твоя прога так активно работает с SFR-ми, что команды
VC> переключения банков скушали всю память заведомо более толстого кристалла?
AG>> Обращаюсь к другим банкам с помощью выставления битиков в статусе
AG>> ручками.
Hу например: Все регистры в одном банке используются в общеупотребимом
смысле, а другие банки - для хранения узкоспециализированной информации.
Причем доступ к этой информации
осуществляется через одну функцию. В этом случае
переключение страниц надо делать только в этой функции.
Опять же если ты не вышел за пределы одного банка,
эти команды мешают иногда производительности.
VC> Честно говоря, я не очень такой подход понимаю, лишняя работа.
VC> Hе осуждаю, но и не одобряю. Если нет близкого кристалла, то для отладки
VC> программы пользую симулятор, пока живой кристалл ищется (покупается).
VC> char cnt;
VC> asm ("rrf _cnt, f");
Это тоже понятно, но увы это уже ASM.
Кстати "_cnt"-имя присваивается не локальным переменным.
VC> Только имхо это дурной тон, теряется платформонезависимость
VC> конкретного
VC> участка программы. Плюс собственноручно подложенная грабля - изменится у
VC> тебя что-то в программе до этой строки и флаг С уже не будет равен 0 -
VC> налетел на глюк. А cnt >>= 1; всегда будет работать так как написано на
VC> любой платформе.
Это уже будет спор на другую тему - о выборе правильных приоритетов...
Alexey

high-tech picc memory models
Привет, Alexey!
VC>> Hеужели твоя прога так активно работает с SFR-ми, что команды
VC>> переключения банков скушали всю память заведомо более толстого кристалла?
AG>>> Обращаюсь к другим банкам с помощью выставления битиков в статусе
AG>>> ручками.
AG> Hу например: Все регистры в одном банке используются в
AG> общеупотребимомсмысле, а другие банки - для хранения
AG> узкоспециализированной информации.Причем доступ к этой информации
AG> осуществляется через одну функцию. В этом случае
AG> переключение страниц надо делать только в этой функции.
Если мне не изменяет склероз, то этот компилер так и делает: первый раз
переключит банк при первом обращении к переменной из другого банка и
переключит назад при выходе из процедуры.
AG> Опять же если ты не вышел за пределы одного банка,
Именно при таком условии.
AG> эти команды мешают иногда производительности.
Две асм команды в начале функции и две в конце функции становятся критичны...
А если потребуется дописать ещё несколько сишных операторов, то выходит,
совсем тупик - твоя функция не уложилась в отведённый интервал времени?
Что-то тут не так, или выбрана очень низкая частота генератора, а если
выбрана максимально возможная для данного камня, то значит неподходящая
платформа выбрана.
Вот есть у ПИКов это дурацкое переключение банков. Если оно так анноит, то
мож стоит подобрать процессор с линейным пространством и не мучаться.
Возможно, что у другого проца в системе команд будет арифметический сдвиг,
тогда второго зайца убъёшь: cnt >>= 1 будет в одну асм-команду компилиться.
Владимир Чекин
VC>> Hеужели твоя прога так активно работает с SFR-ми, что команды
VC>> переключения банков скушали всю память заведомо более толстого кристалла?
AG>>> Обращаюсь к другим банкам с помощью выставления битиков в статусе
AG>>> ручками.
AG> Hу например: Все регистры в одном банке используются в
AG> общеупотребимомсмысле, а другие банки - для хранения
AG> узкоспециализированной информации.Причем доступ к этой информации
AG> осуществляется через одну функцию. В этом случае
AG> переключение страниц надо делать только в этой функции.
Если мне не изменяет склероз, то этот компилер так и делает: первый раз
переключит банк при первом обращении к переменной из другого банка и
переключит назад при выходе из процедуры.
AG> Опять же если ты не вышел за пределы одного банка,
Именно при таком условии.
AG> эти команды мешают иногда производительности.
Две асм команды в начале функции и две в конце функции становятся критичны...
А если потребуется дописать ещё несколько сишных операторов, то выходит,
совсем тупик - твоя функция не уложилась в отведённый интервал времени?
Что-то тут не так, или выбрана очень низкая частота генератора, а если
выбрана максимально возможная для данного камня, то значит неподходящая
платформа выбрана.
Вот есть у ПИКов это дурацкое переключение банков. Если оно так анноит, то
мож стоит подобрать процессор с линейным пространством и не мучаться.
Возможно, что у другого проца в системе команд будет арифметический сдвиг,
тогда второго зайца убъёшь: cnt >>= 1 будет в одну асм-команду компилиться.
Владимир Чекин

high-tech picc memory models
Hello Vladimir.
10 Feb 04 22:38, you wrote to me:
VC> Если мне не изменяет склероз, то этот компилер так и делает: первый раз
VC> переключит банк при первом обращении к переменной из другого банка и
VC> переключит назад при выходе из процедуры.
VC> Две асм команды в начале функции и две в конце функции становятся
VC> критичны... А если потребуется дописать ещё несколько сишных
VC> операторов, то выходит, совсем тупик - твоя функция не уложилась в
VC> отведённый интервал времени?
Прога около ~300 байт.
c родными настройками для 16f876 ~370
с моими ~300.
20% съели эти переключения.
VC> Что-то тут не так, или выбрана очень низкая частота генератора, а
VC> если
VC> выбрана максимально возможная для данного камня, то значит неподходящая
VC> платформа выбрана.
VC> Вот есть у ПИКов это дурацкое переключение банков. Если оно так анноит, то
VC> мож стоит подобрать процессор с линейным пространством и не мучаться.
VC> Возможно, что у другого проца в системе команд будет арифметический сдвиг,
VC> тогда второго зайца убъёшь: cnt >>= 1 будет в одну асм-команду
VC> компилиться.
Твои рассуждения верны для случая когда есть выбор.
Я купил 876-ой, потому что он перекрывает все возможные варианты
при разработке изделия.
Разработка делается для производства.
Какой проц будет стоять в конечном устройстве - определимся на последних
стадиях разработки.
Hасколько я понимаю, чем в меньшем ROM я размещу функционал, Тем меньше
будет стоить конечный кристалл. Для производства это основополагающий
фактор. Это же правило можно сформулировать по-другому. В рамках
выбранного кристалла, при экономных подходах можно разместить бОльший
функционал. Опять же PIC вне конкуренции по цене/качество.
Alexey
10 Feb 04 22:38, you wrote to me:
VC> Если мне не изменяет склероз, то этот компилер так и делает: первый раз
VC> переключит банк при первом обращении к переменной из другого банка и
VC> переключит назад при выходе из процедуры.
VC> Две асм команды в начале функции и две в конце функции становятся
VC> критичны... А если потребуется дописать ещё несколько сишных
VC> операторов, то выходит, совсем тупик - твоя функция не уложилась в
VC> отведённый интервал времени?
Прога около ~300 байт.
c родными настройками для 16f876 ~370
с моими ~300.
20% съели эти переключения.
VC> Что-то тут не так, или выбрана очень низкая частота генератора, а
VC> если
VC> выбрана максимально возможная для данного камня, то значит неподходящая
VC> платформа выбрана.
VC> Вот есть у ПИКов это дурацкое переключение банков. Если оно так анноит, то
VC> мож стоит подобрать процессор с линейным пространством и не мучаться.
VC> Возможно, что у другого проца в системе команд будет арифметический сдвиг,
VC> тогда второго зайца убъёшь: cnt >>= 1 будет в одну асм-команду
VC> компилиться.
Твои рассуждения верны для случая когда есть выбор.
Я купил 876-ой, потому что он перекрывает все возможные варианты
при разработке изделия.
Разработка делается для производства.
Какой проц будет стоять в конечном устройстве - определимся на последних
стадиях разработки.
Hасколько я понимаю, чем в меньшем ROM я размещу функционал, Тем меньше
будет стоить конечный кристалл. Для производства это основополагающий
фактор. Это же правило можно сформулировать по-другому. В рамках
выбранного кристалла, при экономных подходах можно разместить бОльший
функционал. Опять же PIC вне конкуренции по цене/качество.
Alexey

high-tech picc memory models
Привет, Alexey!
AG> Прога около ~300 байт.
AG> c родными настройками для 16f876 ~370
AG> с моими ~300.
AG> 20% съели эти переключения.
Раз ты уже вычислил этот средний процент избыточности, почему спокойно не
писать прогу для 876 без всяких выкрутасов с inf-файлами, зная, что прога в
"чистом" виде для однобанкового кристалла будет занимать на 20% меньше. Тем
более всё легко проверяется: скомпилил для 876, посмотрел map-файл,
перекомпилил для однобанкового, опять посмотрел.
Владимир Чекин
AG> Прога около ~300 байт.
AG> c родными настройками для 16f876 ~370
AG> с моими ~300.
AG> 20% съели эти переключения.
Раз ты уже вычислил этот средний процент избыточности, почему спокойно не
писать прогу для 876 без всяких выкрутасов с inf-файлами, зная, что прога в
"чистом" виде для однобанкового кристалла будет занимать на 20% меньше. Тем
более всё легко проверяется: скомпилил для 876, посмотрел map-файл,
перекомпилил для однобанкового, опять посмотрел.
Владимир Чекин

high-tech picc memory models
Hello Vladimir.
12 Feb 04 23:16, you wrote to me:
VC> Раз ты уже вычислил этот средний процент избыточности, почему спокойно
VC> не писать прогу для 876 без всяких выкрутасов с inf-файлами, зная, что
VC> прога в "чистом" виде для однобанкового кристалла будет занимать на 20%
VC> меньше. Тем более всё легко проверяется: скомпилил для 876,
VC> посмотрел map-файл, перекомпилил для однобанкового, опять посмотрел.
В принципе я согласен, так тоже можно.
Перекомпиляция к сожалению не дает гарантии работоспособности проги.
Буквально недавно довольно долго искал причину поломки проги:
В какой-то момент, после очередного добавления файла
к проекту, вдруг перестала работать одна функция(заимствованная).
После изучения (довольно трудоемкого) оказалось, что в функции была применена
ассемблерная вставка c
addwf PCL
А эта инструкция "любит", когда PCL Hе перепрыгивает через
границу сегмента 256 байт...
Понятно, что "надо писать правильно", но я думаю что наверняка существуют
еще какие-нибудь нюансы...
Alexey
12 Feb 04 23:16, you wrote to me:
VC> Раз ты уже вычислил этот средний процент избыточности, почему спокойно
VC> не писать прогу для 876 без всяких выкрутасов с inf-файлами, зная, что
VC> прога в "чистом" виде для однобанкового кристалла будет занимать на 20%
VC> меньше. Тем более всё легко проверяется: скомпилил для 876,
VC> посмотрел map-файл, перекомпилил для однобанкового, опять посмотрел.
В принципе я согласен, так тоже можно.
Перекомпиляция к сожалению не дает гарантии работоспособности проги.
Буквально недавно довольно долго искал причину поломки проги:
В какой-то момент, после очередного добавления файла
к проекту, вдруг перестала работать одна функция(заимствованная).
После изучения (довольно трудоемкого) оказалось, что в функции была применена
ассемблерная вставка c
addwf PCL
А эта инструкция "любит", когда PCL Hе перепрыгивает через
границу сегмента 256 байт...
Понятно, что "надо писать правильно", но я думаю что наверняка существуют
еще какие-нибудь нюансы...
Alexey
Site Timeline
- » ASM / C / other
- — Next thread in » Microcontrollers (Russian)
-
- » состояние выводов mega163 при ISP ?
- — Previous thread in » Microcontrollers (Russian)
-
- » По моему это гениально
- — Newest thread in » Microcontrollers (Russian)
-
- » (PDF) Hair and Scalp Diseases by Amy J. McMichael
- — The site's Newest Thread. Posted in » Embedded Programming
-