05.07.2013, 15:57
|
|
Заблокирован
Регистрация: 25.04.2013
Сообщений: 1,431
Сказал спасибо: 0
Сказали Спасибо 385 раз(а) в 254 сообщении(ях)
|
Re: Оптимальный старт в программировании МК на С
Сообщение от ilyamp
|
Перенос на другой контроллер, даже похожий, всё равно требует изменения обработки периферии, хотя бы по названию управляющих регистров, тут Си не поможет.
|
Потому что догмы АСМописания вам не дают этого сделать.
Цитата:
|
Правда, если из камня нужно выжать процентов 50-70 ресурсов, я лично предпочитаю асм ))
|
А если 80-90, то Си?
|
|
|
|
05.07.2013, 16:06
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.01.2007
Сообщений: 3,412
Сказал спасибо: 65
Сказали Спасибо 664 раз(а) в 443 сообщении(ях)
|
Re: Оптимальный старт в программировании МК на С
Сообщение от nahimovv
|
противоречит вашим знаниям
|
Вот, насчет знаний - это просто опечатка, видимо... Ибо, какие ж это знания? Это лишь вера, противоречащая очевидным фактам; слепая вера в то, что " как-нибудь пронесёт нелёгкая". Как уже говорилось выше - рассчитывать на глючный инструмент можно только в том случае, если известен точный перечень его глюков и способов их обхода. А поскольку перечень глюков неизвестен , можно только надеяться, что " всё обойдётся". Скажем, глюк с перебором элементов массива может существовать в разных вариантах и проявляться не только так, как в приводившемся примере, а ещё каким-нибудь, неизвестным пока образом, и что - жить крестясь "авось, не ***нёт"?
_________________________________
Сообщение от ilyamp
|
уже сам не всегда помнишь их типы, когда исправляешь очередную функцию.
|
Это вопрос стиля, а не количества переменных.
__________________
There's always more than one way to skin a cat.
Последний раз редактировалось tempora; 05.07.2013 в 16:08.
|
|
|
|
05.07.2013, 17:07
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Оптимальный старт в программировании МК на С
Сообщение от Uz_Sleep_Walker
|
есть люди которые не поклоняются божеству "IAR".
|
Что ж Вы упёртый-то какой?
Вам про язык и стандарт, а Вы о чём?
Пользуйте GCC со всеми плюсАми - слова никто не скажет.
Разница в нюансах компилятора.
Сообщение от ilyamp
|
Перенос на другой контроллер, даже похожий, всё равно требует изменения обработки периферии, хотя бы по названию управляющих регистров, тут Си не поможет.
|
Да ну?
Это АСМ платформозависим.
Меняете файл определений и макросы... и всё
Аль Вы в коде используете имена регистров/битов??
Это-то и называется "говнокодом".
Сообщение от nahimovv
|
Потому что догмы АСМописания вам не дают этого сделать.
|
Какие-такие догмы?
PHP код:
|
;********** Variables & Constants ************* .equ osc = 1600000 ; Частота генератора 1.6MHz .equ SendDel = 255;220 ;Константа задержки вывода на HT1611 .equ DelConst = 0 .equ LCD_Buf = 5 ;Адрес буфера LCD ;************** Порты ***************** .equ LCDPort = PORTB .equ LCDDir = DDRB .equ LCDPin = PINB .equ dout = PB0 ;Выход данных .equ sck = PB1 ;Выход тактовой .equ reset = PB2 ;Выход сброса .equ C_D = PB3 ;Выход команда/данные .equ CS = PB4 ;Выход Chip Select ;************** Регистры ***************** ; ************* Low ***************** .def delreg = R2 .def cntX = R3 ;Счётчик столбцов .def cntY = R4 ;Счётчик строк
.def TempSreg = R15 ;Регистр хранения SREG ; ************* High **************** .def temp = r16 ; Временный регистр
.def SendCnt = R27 ;Счетчик переданных на индикатор битов .def LCDreg = r28 ; Регистр данных для LCD .def delayreg = r29 ; Регистр задержки внешний ; ************* Индексные регистры **************** .def indL = r30 ; ZL Адрес таблицы символов .def indH = r31 ; ZH используется в прцедурах преобразования индикации ;******** End Variables *********** .macro Enable_3310 cbi LCDPort,CS ;Ножку CS в "0" .endm .macro Disable_3310 sbi LCDPort,CS ;Ножку CS в "1" .endm ;*************************************** .macro Command_3310 cbi LCDPort,C_D ;Ножку C_D в "0" .endm .macro Data_3310 sbi LCDPort,C_D ;Ножку C_D в "1" .endm ;*************************************** .macro wait_ms ldi delayreg,@0 rcall delay_ms ;Ждём 100 милисекунд .endm ;*************************************** .macro Send_Command ldi LCDreg,@0 rcall S_Command .endm
|
|
|
|
|
05.07.2013, 18:10
|
|
Заблокирован
Регистрация: 25.04.2013
Сообщений: 1,431
Сказал спасибо: 0
Сказали Спасибо 385 раз(а) в 254 сообщении(ях)
|
Re: Оптимальный старт в программировании МК на С
|
|
|
|
05.07.2013, 19:35
|
|
Прописка
Регистрация: 29.08.2007
Адрес: Рязань
Сообщений: 203
Сказал спасибо: 54
Сказали Спасибо 19 раз(а) в 16 сообщении(ях)
|
Re: Оптимальный старт в программировании МК на С
Сообщение от omercury
|
Это АСМ платформозависим.
Меняете файл определений и макросы... и всё
Аль Вы в коде используете имена регистров/битов??
|
Если меняешь тип контроллера, файл определений необходимо поменять как в Си так и в асме, макросы обычно тут ни причём, а код приходится править потому, что в другом контроллере часто бывает другая периферия, т.е. она отличается управлением, названиями регистров, которые всё равно необходимо исправлять, хотя бы в определениях имён. Обычно переназывать регистры управления периферийным модулем бессмысленно, зачем лишние псевдонимы.
Сообщение от tempora
|
Это вопрос стиля, а не количества переменных.
|
Это ещё и вопрос затраченного времени
Сообщение от nahimovv
|
А если 80-90, то Си?
|
Если 80-90 я меняю контроллер ))
код Си даже при хорошей оптимизации проигрывает процентов 15-20 по скорости и примерно вдвое больше по объёму по сравнению с асм кодом, если, конечно, асм код хорошо оптимизировать
В основном из-за вызовов функций, насколько я понимаю
Кроме того Си иногда не позволяет работать со вторым или ДСП-ядром без танцев с бубном
Но лучшая читаемость кода в Си это оправдывает, не спорю. Не всегда же нужно грузить камень на всю катушку
|
|
|
|
05.07.2013, 19:45
|
|
Заблокирован
Регистрация: 25.04.2013
Сообщений: 1,431
Сказал спасибо: 0
Сказали Спасибо 385 раз(а) в 254 сообщении(ях)
|
Re: Оптимальный старт в программировании МК на С
Сообщение от ilyamp
|
Если меняешь тип контроллера, файл определений необходимо поменять как в Си так и в асме, макросы обычно тут ни причём, а код приходится править потому, что в другом контроллере часто бывает другая периферия, т.е. она отличается управлением, названиями регистров, которые всё равно необходимо исправлять, хотя бы в определениях имён. Обычно переназывать регистры управления периферийным модулем бессмысленно, зачем лишние псевдонимы.
|
Не согласен! С АСМом всё намного хуже!
Цитата:
|
Если 80-90 я меняю контроллер ))
код Си даже при хорошей оптимизации проигрывает процентов 15-20 по скорости и примерно вдвое больше по объёму по сравнению с асм кодом, если, конечно, асм код хорошо оптимизировать
|
Можно я улыбнусь, вы улыбнётесь вместе со мной... и не будете больше ничего доказывать, ибо не получается это у вас.
|
|
|
|
05.07.2013, 20:41
|
|
Почётный гражданин KAZUS.RU
Регистрация: 25.05.2010
Адрес: г. Королёв
Сообщений: 8,497
Сказал спасибо: 30
Сказали Спасибо 3,072 раз(а) в 2,013 сообщении(ях)
|
Re: Оптимальный старт в программировании МК на С
Сообщение от ilyamp
|
Если меняешь тип контроллера, файл определений необходимо поменять как в Си так и в асме, макросы обычно тут ни причём, а код приходится править потому, что в другом контроллере часто бывает другая периферия
|
Ок.
Уж раз сам nahimovv обозвал
Сообщение от nahimovv
|
прожжёным АСМистом
|
, не будем разрушать стереотипы...
Вот Вам кусок определений из самого консервативного варианта - на АСМе.
PHP код:
|
.equ SPI_Port = PORTB
.equ SPI_Dir = DDRB
.equ SPI_Pin = PINB
.equ MISO = 5; PB5 ;(SDA) [Вход]
.equ MOSI = 6; PB6 ; [Выход]
.equ SCK = 7; PB7 ;(SCK) [Выход]
.equ RST = 4; PB4 ;(OC1B) [Выход]
.equ VCC = 3; PB3 ;(OC1A) [Выход]
.equ SerialPort = PORTB
.equ SerialDir = DDRB
.equ SerialPin = PINB
.equ DIN = 5; PB5 ;(SDA) [Вход] Для Serial Interface
.equ DOUT = 6; PB6 ; [Выход] Для Serial Interface
.equ CLK = 7; PB7 ;(SCK) [Выход] Для Serial Interface
.equ BUSY = 4; PB4 ;(OC1B) [Вход] Для Serial Interface
.equ LATCH = 4; PB4 ;(OC1B) [Выход] Для 595 Interface
;************************************************* *************************
; А также ПОРТ В для ввода-вывода PORT1
.equ Port1 = PORTB
.equ Dir1 = DDRB
.equ Pin1 = PINB
.equ P17 = 7; PB7
.equ P16 = 6; PB6
.equ P15 = 5; PB5
.equ P14 = 4; PB4
.equ P13 = 3; PB3
.equ P12 = 2; PB2
.equ P11 = 1; PB1
.equ P10 = 0; PB0
; А также ПОРТ D для ввода-вывода LED
.equ IRQPort = PORTD
.equ IRQDir = DDRD
.equ IRQPin = PIND
.equ IRQ = 3; PD3 ;(INT1)
; I2C порт
.equ I2CPort = PORTB
.equ I2CDir = DDRB
.equ I2CPin = PINB
.equ SDA = 5; PB5
.equ SCL = 7; PB7
;ПОРТ В для ввода-вывода PORT2
.equ Port2 = PORTD
.equ Dir2 = DDRD
.equ Pin2 = PIND
.equ P23 = 6; PD6
.equ P22 = 5; PD5
.equ P21 = 4; PD4
.equ P20 = 3; PD3
.equ P21 = 1; PD1
.equ P20 = 0; PD0
.equ Pio_Port = PORTB
.equ Pio_Dir = DDRB
.equ Pio_Pin = PINB
.equ inputport =PIND
.equ outputport =PORTD
.equ USBdirection =DDRD
|
Одни и те же порты я обозвал разными именами в зависимости от назначения и теперь, не меняя ни буквы в основной программе могу приспособить её к любому АВР от самой дохлой тиньки до самой крутой меги просто поменяв дефайны.
(справедливости ради следует отметить, что именно эту программу не удастся просто так приспособить для любого МК, так как здесь задействован софт-USB, но в других случаях это более чем реально)
То же самое и с макросами - если Вы нигде в программе не будете использовать явно ни одного регистра или ячейки памяти, а забьёте это всё в макросы, то Ваша программа будет элементарно переносима на любое ядро, независимо от разрядности и конфигурации периферии (лишь бы хватило).
Сообщение от nahimovv
|
Сообщение от ilyamp
|
Если 80-90 я меняю контроллер ))
код Си даже при хорошей оптимизации проигрывает процентов 15-20 по скорости и примерно вдвое больше по объёму по сравнению с асм кодом, если, конечно, асм код хорошо оптимизировать
|
Не согласен! С АСМом всё намного хуже!
|
По вложенной цитате:
Совсем даже и не факт.
Если вы пользуетесь универсальными функциями и библиотеками, не написанными специально для данного конкретного применения, то очень даже легко может случиться совсем наоборот - код, скомпилированный из С-исходника, в общем случае получается короче и быстрей. Здесь уже действует прямая зависимость от затраченного времени, класса программиста и расположения корней его рук.
To nahimovv - скорей согласен, чем нет.
|
|
|
|
05.07.2013, 22:05
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.01.2007
Сообщений: 3,412
Сказал спасибо: 65
Сказали Спасибо 664 раз(а) в 443 сообщении(ях)
|
Re: Оптимальный старт в программировании МК на С
__________________
There's always more than one way to skin a cat.
|
|
|
|
05.07.2013, 22:11
|
|
Гуру портала
Регистрация: 20.11.2004
Сообщений: 10,015
Сказал спасибо: 936
Сказали Спасибо 2,269 раз(а) в 1,563 сообщении(ях)
|
Re: Оптимальный старт в программировании МК на С
tempora, На счет "переменных-однобуквенных", tester в свое время информацию подогнал . Советую всем нубам заучить как молитву.
См: в аттаче :
Кстати однобуквенные используются в именах счетчиков циклов, координатах ...
__________________
Осторожно , злой кот
Последний раз редактировалось dosikus; 05.07.2013 в 22:24.
|
|
|
Сказали "Спасибо" dosikus
|
|
|
05.07.2013, 22:26
|
|
Почётный гражданин KAZUS.RU
Регистрация: 10.01.2007
Сообщений: 3,412
Сказал спасибо: 65
Сказали Спасибо 664 раз(а) в 443 сообщении(ях)
|
Re: Оптимальный старт в программировании МК на С
Сообщение от dosikus
|
tester в свое время информацию подогнал
|
По-моему, видел это уже. Не со всем там согласен, но идея правильная.
А почему предлагаешь именно мне - мой стиль хромает?
_____________________________
Сообщение от dosikus
|
Кстати однобуквенные используются в именах счетчиков циклов, координатах
|
Да, бог с ними, с исключениями и очевидностями - люди и так уже, как после "ам.горок", погодим.
__________________
There's always more than one way to skin a cat.
Последний раз редактировалось tempora; 05.07.2013 в 22:34.
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 12:43.
|
|