|
О подходах к программированию, Вынесено из темы "Какой-то бред..." |
|
|
|
Jan 3 2008, 00:47
|

Местный
  
Группа: Свой
Сообщений: 222
Регистрация: 9-06-07
Пользователь №: 28 317

|
Цитата(IgorKossak @ Jan 2 2008, 23:07)  Для тех, кто читает не всё: порты - по Atmel (default value); глобальные переменные - по АНСИ СИ. Да действительно, прежде всего стоит смотреть в даташит, какие начальные значения у регистров - тут уж посыпаю голову пеплом. Насчет ANSI C, то он насколько я знаю убнуляет в том числе автоматические переменные. В любом случае, когда не уверен, то лучше сделать все вручную. Цитата(HCHUNTER @ Jan 2 2008, 23:36)  Цитата При этом не забудьте убрать цикл "while (1)" из мейна. А это для чего? что оно мне даст? куда же я тогда возвращаться-то буду... в "никуда" получается... Вы в цикле выставляете ногу порта в еденицу. Я прежде всего имел ввиду убрать именно это. Насчет возврата в никуда, не знаю как в CV, но в AVR GCC нет необходимсоти вставлять чечный цикл. Цитата(HCHUNTER @ Jan 2 2008, 23:36)  Цитата Хочу заметить, что всякие задержки в прерываниях (наподобее delay_us) крайне не рекоммендуются, прерывание - это критическая часть кода, из которого следует выходить как можно скорее. Вот это мне тоже, кстати, не совсем понятно... Звучит как заученная фраза из книжек. А если мне нужно по возникновении прерывания выполнить массу всего? Что мне тогда делать...? Тут уж я научен горьким опытом. Прерывание опасно тем, что создает многопоточность, но при этом с непресдсказуемым вызовом "потоков". Если нужно выполнить какое-то критичное по времени действие, то делайте его в прерывании; если вы к примеру семплируете звук в реалтайме, то обрабатывайте событие АЦП то-же в прерывании. В прерывании должен содержаться минимальный код, в крайнем случае, код прерывания должен выполняться минимальное время. Во всех остальных случаях в мейне должен крутиться цикл с провркой флагов. Притом, не забывайте, что для всез прерываний есть аппаратные флаги, таким образом, нет необходимсоти делать софтовый флаг, который будет устанавливаться в прерывании. Насчет инициализации таймеров, могу сослать на соседнюю тему - http://electronix.ru/forum/index.php?showtopic=41239# - там я писал про инициализацию таймера для отсчета секунды. То, что там написано, конечно, не истина в последней инстанции, но, во всяком случае, у меня работает.
|
|
|
|
|
 |
Ответов
|
Jan 3 2008, 18:28
|

Местный
  
Группа: Свой
Сообщений: 222
Регистрация: 9-06-07
Пользователь №: 28 317

|
Цитата(rezident @ Jan 3 2008, 19:17)  Они и еще регистровые (register) переменные не инициализируются нулями в отличие от глобальных и статических (static). Почитал документацию... Посыпаю голову пеплом... Цитата(zltigo @ Jan 3 2008, 20:23)  Совершенно не правильно  Когда не уверен, надо уверенность и твердость знаний приобретать а не заниматься инициализаций всего, чего попало неуверенными руками. Вот если бы все было заранее известно, что и как работает, то все было бы просто. В том и возникает сложность нашей работы, что постоянно существует некоторая неопределенность задачи. Единственный признак мастерства - это умение сужать эту неопределенность. Иногда такое такое как у Автора обнуление как раз помогает сузить круг поиска. А твердость знаний приобретается отнюдь не зубрежкой документации - все в конце концов делают все те же "неуверенные руки".
|
|
|
|
|
Jan 4 2008, 14:06
|

Местный
  
Группа: Свой
Сообщений: 222
Регистрация: 9-06-07
Пользователь №: 28 317

|
Цитата(zltigo @ Jan 3 2008, 21:45)  Зачем зубрежкой? Зубрежки категорически не надо. Так почитать всю перед сном разок для общей ориентировки. Ну а потом чтение избранных мест документации при необходимости и в случае возникновения неуверенности. Насчет зубрежки - выразился я несколько некорректно. Я говорю лишь о том, что нельзя все охватить на первом этапе. Всегда есть некоторая неопределенность, и в документации, право, тоже бывают ошибки. Поэтому подобные избыточные инициализации не всегда бывают лишними, подчас они следуют не из незнания документации, а из элементарного здравого смысла. Они подчас убирают ту самую неуверенность. Будьте уверены, когда Автор разберется в этом таймере, он пройдется по коду и удалит все лишнее. Ей богу, развели мы тут очередные религиозные споры...
Сообщение отредактировал Aesthete Animus - Jan 4 2008, 14:08
|
|
|
|
|
Jan 4 2008, 18:36
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(Aesthete Animus @ Jan 4 2008, 16:06)  Ей богу, развели мы тут очередные религиозные споры... Это для этой темы оффтопик, конечно, но отнюдь не религиозные споры. Отнюдь. С этим я, как модератор, справлюсь - выделю в отдельную тему. Цитата Будьте уверены, когда Автор разберется в этом таймере, он пройдется по коду и удалит все лишнее. Да? Я достаточно повидал всякого и могу утверждать, что с несоиразмеримо большей вероятностью произойдет все с точностью до наоборот  . Возьмем, например, Вас, как Автора. Вот Ваш небольшой, и соответственно легко обозримый кусочек исходника: Код Лично я делаю так: /****************************************************** * Преобразует в строку length младших битов * * слова word. Строка dest должна иметь размер * * по меньшей мере length + 1 * ******************************************************/ char* bitwise(uint32_t word, char* dest, uint8_t length) { register uint8_t i; for (i = 0; i < length; i++) dest[length - i - 1] = word & (1UL << i) ? '1' : '0'; dest[length] = '\0'; return dest; } Только бога ради, не воспринимайте ниженаписанное, как личный наезд - просто иллюстрация к утверждению, что "Автор потом...". Вы написали некую, функцию, добились ее рабоспособности и даже выложили на всеобщее обозрение. Однако не верю, что Вы после того, как "заработало" хоть несколько раз ее просмотрели, ибо в противном случае она просто обязана была выглядеть иначе. Например, так: Код char* bitwise(uint32_t word, char* dest, uint8_t length) { dest += length; *dest = '\0'; while( length-- ) { *--dest = (word & 1) + '0'; word >>= 1; } return dest; } Результат такой "чистки" в несколько раз меньший код, в том числе и в цикле и соответственно быстродействие. Я совершенно не берусь утверждать, что написанное мною является самым эффективным для AVR платформы - я просто прочитал и поправил на лету явное бросающееся в глаза. Еще раз - это не "наезд", такие-же ляпы найти можно у абсолютно любого - это просто констатация факта, что "откладывание на потом" совершенно губительно.
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
Сообщений в этой теме
Aesthete Animus О подходах к программированию Jan 3 2008, 00:47 rezident Цитата(Aesthete Animus @ Jan 3 2008, 05:4... Jan 3 2008, 16:17 zltigo Цитата(rezident @ Jan 3 2008, 18:17) ... Jan 3 2008, 17:23  rezident Цитата(zltigo @ Jan 3 2008, 22:23) Соверш... Jan 3 2008, 23:24   zltigo Цитата(rezident @ Jan 4 2008, 01:24) Скоб... Jan 3 2008, 23:38 Aesthete Animus Цитата(zltigo @ Jan 4 2008, 21:36) Только... Jan 4 2008, 21:44 zltigo Цитата(Aesthete Animus @ Jan 4 2008, 23:4... Jan 4 2008, 22:59 Aesthete Animus Цитата(zltigo @ Jan 5 2008, 01:59) Разниц... Jan 6 2008, 17:17 zltigo Цитата(Aesthete Animus @ Jan 6 2008, 19:1... Jan 6 2008, 18:38  Aesthete Animus Ей богу, я уже начинаю терять нить нашего с Вами с... Jan 6 2008, 20:49   zltigo Цитата(Aesthete Animus @ Jan 6 2008, 22:4... Jan 6 2008, 23:00   Herz Цитата(Aesthete Animus @ Jan 6 2008, 22:4... Jan 7 2008, 08:24 INT1 Как показалось, эта ветка скорей философская. Кому... Jan 6 2008, 20:35
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|