Возможно без знакомства с ассемблером освоить Си?

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Аватара пользователя
hybroid
Друг Кота
Сообщения: 8007
Зарегистрирован: Вс ноя 14, 2010 19:24:26
Откуда: Лукалэнд

Re: Возможно без знакомства с ассемблером освоить Си?

Сообщение hybroid »

Блин, ну юморист :)))
Реклама
ATtiny13
Встал на лапы
Сообщения: 110
Зарегистрирован: Пт окт 21, 2011 15:05:18

Re: Возможно без знакомства с ассемблером освоить Си?

Сообщение ATtiny13 »

Всем спасибо за коментарии
Понял что надо хотя бы поверхностно познакомиться с асамблером чтобы хоть немного понимать принцип действия и архитектуру мк
мне на си нужно хотябы знать как написать бегущий огонь таймер или что-то не очень сложное :)
Реклама
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: Возможно без знакомства с ассемблером освоить Си?

Сообщение Мастер Ломастер »

ATtiny13 писал(а):Понял что надо хотя бы поверхностно познакомиться с асамблером чтобы хоть немного понимать принцип действия и архитектуру мк
либо объясняли вам плохо, либо вы поняли не так. архитектура МК - это голая аппаратура, логика - на уровне регистров, триггеров и т.п. чтобы понять, как она работает, нужно немного шарить в цифровой схемотехнике, хотя бы на уровне "что такое 2И-НЕ" или "что такое параллельный регистр с третьим состоянием выходов". взаимодействие отдельных аппаратных частей МК можно на первых порах понять на уровне "когда сюда поступает такой-то сигнал, то здесь происходит вот это" - буквально "на пальцах". для всего этого ассемблер совершенно не нужен.
далее нужно понять, что такое двоичная система счисления и как происходят математические и логические операции над числами внутри МК. это, в общем-то, чистая математика и логика, опять же - ассемблер не при делах. на этом этапе главное понять, что ЧИСЛО внутри МК хранится и обрабатывается, и при этом совершенно безразлично, в какой именно системе это делается. то есть важно понять, что ЧИСЛО - оно одно и то же не зависимо от системы счисления - с этим у многих начинающих проблемы, нередко можно встретить просьбы типа "как вывести двоичное число в десятичном виде - ведь в МК все в двоичном коде". в частности, этот вопрос ПРАВИЛЬНО формулируется так: "как вывести ЧИСЛО из мк в десятичном формате" - то есть задумываться о том, что внутри МК число в какой-то иной системе НЕ НУЖНО.

таким образом, для начала программирования МК не нужно знать ассемблер даже поверхностно. по крайней мере до тех пор, пока основная задача - помигать светодиодами и попищать динамиком, понажимать кнопки и т.п. умение разделить сложную задачу на более простые части, умение описать алгоритмически действия над данными (числами) для получения нужного результата - это наиболее важное в программировании. и в этом разрезе ассемблер не более важен и полезен, чем паскаль, Си или фортран (на котором для Мк вообще никто не пишет).
битва с дураками проиграна, победители торжествуют. слава победителям!
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: Возможно без знакомства с ассемблером освоить Си?

Сообщение ploop »

Как бы тут не холиварили, я бы советовал первые программы начинать писать на асме.
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
BOB51
Друг Кота
Сообщения: 15575
Зарегистрирован: Вт мар 16, 2010 22:02:27
Откуда: ДОНЕЦК

Re: Возможно без знакомства с ассемблером освоить Си?

Сообщение BOB51 »

опять бесконечная тема "кто первый - курица или яйцо?"
да все хороши, только вот пока досконально все изучить успееш - того и гляди
мелкосхемку уж с производства сняли :tea:
Реклама
Аватара пользователя
МитяРа
Модератор
Сообщения: 11492
Зарегистрирован: Чт дек 11, 2008 14:52:26
Откуда: град Нижний

Re: Возможно без знакомства с ассемблером освоить Си?

Сообщение МитяРа »

BOB51 писал(а):пока досконально все изучить успееш - того и гляди
мелкосхемку уж с производства сняли
Пушистый, те-то чё волноваться, ты-же у нас "многостаночник"..
Да и 51-е знаешь, а у них за все 34 года выпуска система команд не менялась.. :))
[img]http://radiokot.ru/forum/download/file.php?id=93376[/img][i][color=#000080][size=85]Между людьми возникает напряжение, если у них разный потенциал...[/size][/color][/i]
Реклама
Sergi
Мучитель микросхем
Сообщения: 412
Зарегистрирован: Ср янв 04, 2012 11:57:40
Откуда: Алчевск

Re: Возможно без знакомства с ассемблером освоить Си?

Сообщение Sergi »

Я так думаю: одно другому не мешает. На С все красиво и понятно как в школе на BASICе, но когда сражаешься со временем (или размером) приходится переходить на вставки из ASMа. Вот я так и борюсь. С уважением.
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: Возможно без знакомства с ассемблером освоить Си?

Сообщение YS »

Могу сказать, что на моем любимом M3 это делается еще легче и без необходимости прибегать к машинным кодам.
Пример последовательного вывода байта на С под C-M3 в студию!
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Аватара пользователя
hybroid
Друг Кота
Сообщения: 8007
Зарегистрирован: Вс ноя 14, 2010 19:24:26
Откуда: Лукалэнд

Re: Возможно без знакомства с ассемблером освоить Си?

Сообщение hybroid »

немного понимать принцип действия и архитектуру мк
А вы даташит на МК прочтите. Для этого не нужны знания ни Assembler, ни C :)
В остальном соглашусь с Мастером Ломатером, весьма хорошо человек расписал..
vAv
Прорезались зубы
Сообщения: 221
Зарегистрирован: Пн июн 13, 2011 20:04:59
Откуда: Новочебоксарск
Контактная информация:

Re: Возможно без знакомства с ассемблером освоить Си?

Сообщение vAv »

ploop писал(а):Как бы тут не холиварили, я бы советовал первые программы начинать писать на асме.
У с/с++ есть одно неоспоримое преимущество - навыки программирования на нем могут пригодится абсолютно на любой платформе, т.к. язык напрямую не привязан к железу.
А для начинающих тем более предпочтительно изучить си - проще сначала разобраться с языком высокого уровня и потом, если приспичит, изучить и нижний уровень. Иначе неудачи при работе с асмом могут вообще отбить охоту программировать.
И я, к примеру, могу кодить на z80, на x86 и на STL STEP7 (ну и вообще на LD и тд), но изучать еще асм авр или pic уже тупо вломы. :)
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: Возможно без знакомства с ассемблером освоить Си?

Сообщение ploop »

Я же не говорил, что Си не нужен :)
Аватара пользователя
hybroid
Друг Кота
Сообщения: 8007
Зарегистрирован: Вс ноя 14, 2010 19:24:26
Откуда: Лукалэнд

Re: Возможно без знакомства с ассемблером освоить Си?

Сообщение hybroid »

Вот я и хотел сказать, кстати, похожую мысль, как у vAv.
Вот станет человек богом ассемблера, потом приспичит ему сесть на си или другой высокоуровневый язык - и будет ужоснах :) Как начнёт применять стиль программирования на ассемблере к сям - получится сплошной говно-, быдлокод и прочий индусский код :) Будем потом сами же сидеть и рыдать (ржать, умирать от инфарктов, сбегать в ужасе) :)))
Конечно можно сказать, что всё зависит от человека.. Но чаще всего получается, что откладывается один раз на подкорке - и всё, крандец, ресурс обучаемости исчерпан :tea:
Аватара пользователя
Satyr
Друг Кота
Сообщения: 7439
Зарегистрирован: Чт ноя 04, 2010 01:56:36
Откуда: г. Москва

Re: Возможно без знакомства с ассемблером освоить Си?

Сообщение Satyr »

YS писал(а): Пример последовательного вывода байта на С под C-M3 в студию!
http://infocenter.arm.com/help/index.js ... cjiic.html
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: Возможно без знакомства с ассемблером освоить Си?

Сообщение YS »

Я просил пример кода. :) А про bit-banding я и так знаю. И сомневаюсь, что с ним будет удобнее и быстрее, чем с использованием переноса.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: Возможно без знакомства с ассемблером освоить Си?

Сообщение YS »

ОК, вот для затравки:

Код: Выделить всё

uint8_t byte,i;

...

for (i=0; i<8; i++)
{
  if (byte & 1)
  {
    //"1" bit code
  }
  else
  {
    //"0" bit code
  }

  byte=byte >> 1;
}
А теперь покажите мне то же самое, только с bit-banding'ом. :)
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Аватара пользователя
Satyr
Друг Кота
Сообщения: 7439
Зарегистрирован: Чт ноя 04, 2010 01:56:36
Откуда: г. Москва

Re: Возможно без знакомства с ассемблером освоить Си?

Сообщение Satyr »

Если ты знаком, чего тебе не понятно ? :))
Вобще делать ничего не надо, только инкрементить указатель, по которому уже и так читается 0 или 1 в зависимости от бита, в который транслируется адрес
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: Возможно без знакомства с ассемблером освоить Си?

Сообщение YS »

Если ты знаком, чего тебе не понятно ?
Ну, знаете ли, интересно поглядеть на свежее решение. :) Покажите код, это ведь несложно. :) А я поучусь.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Аватара пользователя
ploop
Модератор
Сообщения: 13490
Зарегистрирован: Ср ноя 26, 2008 16:34:25
Откуда: Тамбовская обл.

Re: Возможно без знакомства с ассемблером освоить Си?

Сообщение ploop »

YS писал(а):ОК, вот для затравки:
Я как бы кроме AVR мало с чем знаком, кто-нибудь может показать, во что превратит этот код компилятор?
Аватара пользователя
Goodefine
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср апр 16, 2008 13:22:54
Откуда: Приднестровье, Тирасполь

Re: Возможно без знакомства с ассемблером освоить Си?

Сообщение Goodefine »

Я примерно такой функцией делаю обычно:

Код: Выделить всё

void transmit_byte(unsigned char const *byte)
{
unsigned char  mask;
for (mask=0x80;mask;mask>>1) (*byte&mask)? (PORTW|=(1<<BIT)):(PORTW&=~(1<<BIT));
}
Если нужно иметь возможность изменять направление (первый байт младший или старший), то примерно так:

Код: Выделить всё

void transmit_byte(unsigned char const *byte, unsigned char direct)
{
unsigned char  mask;
for (mask=(direct)? 1:0x80;mask;mask=(direct)? mask<<1:mask>>1)
(*byte&mask)? (PORTW|=(1<<BIT)):(PORTW&=~(1<<BIT));
}
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
Аватара пользователя
Goodefine
Держит паяльник хвостом
Сообщения: 906
Зарегистрирован: Ср апр 16, 2008 13:22:54
Откуда: Приднестровье, Тирасполь

Re: Возможно без знакомства с ассемблером освоить Си?

Сообщение Goodefine »

ploop писал(а): Я как бы кроме AVR мало с чем знаком, кто-нибудь может показать, во что превратит этот код компилятор?
Этот код (Atmega8):

Код: Выделить всё

#include <avr/io.h>

#define PORTW   PORTD
#define BIT     1

void transmit_byte(unsigned char const byte)
{
unsigned char  mask;
for (mask=0x80;mask;mask>>1) (byte&mask)? (PORTW|=(1<<BIT)):(PORTW&=~(1<<BIT));
}

int main(void)
{

unsigned char data=0;

    for(;;)
    {
     transmit_byte(data);
     data++;
    }

return 0;
}
Компилятор (WinAVR-20100110) превращает в такой (пролог/эпилог опущен):

Код: Выделить всё

void transmit_byte(unsigned char const byte)
{
unsigned char  mask;
for (mask=0x80;mask;mask>>1) (byte&mask)? (PORTW|=(1<<BIT)):(PORTW&=~(1<<BIT));
  38:	80 78       	andi	r24, 0x80	; 128
  3a:	88 23       	and	r24, r24
  3c:	11 f0       	breq	.+4      	; 0x42 <__SREG__+0x3>
  3e:	91 9a       	sbi	0x12, 1	; 18
  40:	01 c0       	rjmp	.+2      	; 0x44 <__SREG__+0x5>
  42:	91 98       	cbi	0x12, 1	; 18
  44:	92 b3       	in	r25, 0x12	; 18
  46:	f9 cf       	rjmp	.-14     	; 0x3a <transmit_byte+0x2>

00000048 <main>:
}

int main(void)
{
  48:	1f 93       	push	r17
  4a:	10 e0       	ldi	r17, 0x00	; 0

unsigned char data=0;

    for(;;)
    {
     transmit_byte(data);
  4c:	81 2f       	mov	r24, r17
  4e:	f4 df       	rcall	.-24     	; 0x38 <transmit_byte>
     data++;
  50:	1f 5f       	subi	r17, 0xFF	; 255
  52:	fc cf       	rjmp	.-8      	; 0x4c <main+0x4>

...
Здесь указатель не использовался, он больше подходит для массива, чем для байта.
Код выше

Код: Выделить всё

#include <avr/io.h>

#define PORTW   PORTD
#define BIT     1

void transmit_byte(unsigned char  byte)
{
unsigned char i;

for (i=0; i<8; i++)
{
  if (byte & 1)
  {
    PORTW|=1<<BIT; //"1" bit code
  }
  else
  {
    PORTW&=~(1<<BIT);//"0" bit code
  }

  byte=byte >> 1;
}
}

int main(void)
{

unsigned char data=0;

    for(;;)
    {
     transmit_byte(data);
     data++;
    }

return 0;
}
получается в:

Код: Выделить всё

void transmit_byte(unsigned char  byte)
{
  38:	90 e0       	ldi	r25, 0x00	; 0
unsigned char i;

for (i=0; i<8; i++)
{
  if (byte & 1)
  3a:	80 ff       	sbrs	r24, 0
  3c:	02 c0       	rjmp	.+4      	; 0x42 <__SREG__+0x3>
  {
    PORTW|=1<<BIT; //"1" bit code
  3e:	91 9a       	sbi	0x12, 1	; 18
  40:	01 c0       	rjmp	.+2      	; 0x44 <__SREG__+0x5>
  }
  else
  {
    PORTW&=~(1<<BIT);//"0" bit code
  42:	91 98       	cbi	0x12, 1	; 18

void transmit_byte(unsigned char  byte)
{
unsigned char i;

for (i=0; i<8; i++)
  44:	9f 5f       	subi	r25, 0xFF	; 255
  46:	98 30       	cpi	r25, 0x08	; 8
  48:	11 f0       	breq	.+4      	; 0x4e <__SREG__+0xf>
  else
  {
    PORTW&=~(1<<BIT);//"0" bit code
  }

  byte=byte >> 1;
  4a:	86 95       	lsr	r24
  4c:	f6 cf       	rjmp	.-20     	; 0x3a <transmit_byte+0x2>
  4e:	08 95       	ret

00000050 <main>:
}
}

int main(void)
{
  50:	1f 93       	push	r17
  52:	10 e0       	ldi	r17, 0x00	; 0

unsigned char data=0;

    for(;;)
    {
     transmit_byte(data);
  54:	81 2f       	mov	r24, r17
  56:	f0 df       	rcall	.-32     	; 0x38 <transmit_byte>
     data++;
  58:	1f 5f       	subi	r17, 0xFF	; 255
  5a:	fc cf       	rjmp	.-8      	; 0x54 <main+0x4>
Что несколько хуже первого варианта (примерно на 8 байт). Мож кто сделает еще лучше руками на асме?
Любой, заслуживающий внимания, опыт приобретается себе в убыток...
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»