Easyelectronics.ru

Электроника для всех
Текущее время: 25 май 2018, 17:38

Часовой пояс: UTC + 5 часов



    • JLCPCB - Платы прототипов всего за 2$ c бесплатной доставкой (при первом заказе)
    • 10 PCBs за $2 для 2 слоев, $15 для 4 слойной, $74 для 6 слойной платы.
    • Крупнейший китайский производитель прототипных плат. 290000+ клиентов & 8000+ заказов в день!
    • LCSC - Крупнейший китайский онлайн магазин радиодеталей.

Начать новую тему Ответить на тему  [ Сообщений: 107 ]  На страницу Пред.  1, 2, 3, 4, 5  След.
Автор Сообщение
 Заголовок сообщения: Re: AVR Studio
СообщениеДобавлено: 16 янв 2018, 08:24 
Старожил

Зарегистрирован: 06 фев 2011, 15:16
Сообщения: 611
Откуда: Челябинск
rmb писал(а):
Вот покопался, нашел IAR. тот же код абсолютно нормально работает. ну и что это было? мне что-то не хочется в IAR'е работать - чет мне он не приглянулся.

Вообще-то, корректно было бы так:
Код:
#define BUFFER_SIZE 10
struct Buffer {
              char array[BUFFER_SIZE] ;
              char stInd;
              char endInd;
              }
bfr;

char pushBuffer(struct Buffer *bp, char Item)
         {
         char  i = bp->stInd;
         if (i >= BUFFER_SIZE)         // Out of range
               return 0;               // then error
         bf->array[bf->stInd++] = Item;
         return 1;                     // OK!
         }


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR Studio
СообщениеДобавлено: 16 янв 2018, 10:40 
Только пришел

Зарегистрирован: 15 янв 2018, 17:18
Сообщения: 11
ну, допустим я тупанул и массив переполнится. ради чистоты эксперимента поправил код... он все равно он не работает. переменная i подсвечивается красненьким и почему-то в "выхлоп" не попадает. при этом компилятор ни на что не ругается. Ткните меня еще разок и покажите что не так? повторюсь: в IAR такого не наблюдается.


Вложения:
Безымянный3.jpg
Безымянный3.jpg [ 173.13 Кб | Просмотров: 835 ]
Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR Studio
СообщениеДобавлено: 16 янв 2018, 11:07 
Старожил
Аватара пользователя

Зарегистрирован: 05 фев 2013, 00:58
Сообщения: 2813
Откуда: Тольятти
От переменной i не зависят ветвления, вот компилятор и выкинул проверку. Зачем, если все равно делать надо все то же самое? Одна строка сразу после while() заставит его сделать проверку.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR Studio
СообщениеДобавлено: 16 янв 2018, 11:23 
Только пришел

Зарегистрирован: 15 янв 2018, 17:18
Сообщения: 11
а можно "разжевать"? попробовал поиграться с параметрами оптимизации. код работает либо без оптимизации либо с оптимизацией для дебага, любая другая оптимизация делает программу не работоспособной.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR Studio
СообщениеДобавлено: 16 янв 2018, 11:37 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3463
Откуда: Новосибирск
rmb писал(а):
а можно "разжевать"? попробовал поиграться с параметрами оптимизации. код работает либо без оптимизации либо с оптимизацией для дебага, любая другая оптимизация делает программу не работоспособной.

Короче, вы тупо копируете и пробуете. Нужно понимать что значит каждый знак, который вы пишете в своем коде. У вас в коде логические ошибки. Разбирайтесь. Что вы написали, что вы тупо скопипастили. Подсказка. Ошибка в самой функции и в main.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR Studio
СообщениеДобавлено: 16 янв 2018, 11:57 
Только пришел

Зарегистрирован: 15 янв 2018, 17:18
Сообщения: 11
заблудился в 3-х соснах...подозреваю, что это не мое(


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR Studio
СообщениеДобавлено: 16 янв 2018, 12:03 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3463
Откуда: Новосибирск
rmb писал(а):
заблудился в 3-х соснах...подозреваю, что это не мое(

Ваше дело... Легко сдаетесь? Каюсь, когда начинал, тоже не раз было пораженческое настроение. Бросал. Возвращался снова. На самом деле не так все сложно. В определенный момент поступающая информация превышает критический порог и наступает понимание. Запомните это на будущее.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR Studio
СообщениеДобавлено: 16 янв 2018, 12:04 
Старожил
Аватара пользователя

Зарегистрирован: 14 апр 2014, 11:06
Сообщения: 1212
Откуда: Курск
rmb писал(а):
заблудился в 3-х соснах...подозреваю, что это не мое(

Show Не дрейфь


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR Studio
СообщениеДобавлено: 16 янв 2018, 12:06 
Только пришел

Зарегистрирован: 15 янв 2018, 17:18
Сообщения: 11
ну сейчас посижу, посмотрю на одну строку, потуплю в монитор может придет озарение) но пока это выше моего понимания


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR Studio
СообщениеДобавлено: 16 янв 2018, 12:24 
Старожил

Зарегистрирован: 25 фев 2011, 18:45
Сообщения: 3463
Откуда: Новосибирск
rmb писал(а):
ну сейчас посижу, посмотрю на одну строку, потуплю в монитор может придет озарение) но пока это выше моего понимания

Изучайте материалы. Ищите в инете указатели массивы структуры


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR Studio
СообщениеДобавлено: 16 янв 2018, 12:38 
Старожил

Зарегистрирован: 06 фев 2011, 15:16
Сообщения: 611
Откуда: Челябинск
rmb писал(а):
ну сейчас посижу, посмотрю на одну строку, потуплю в монитор может придет озарение) но пока это выше моего понимания

Так исправьте, чтобы работала при любой оптимизации
Код:
   for (i = 0; i < 10; ++i)
        pushBuf(&bfr, i);


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR Studio
СообщениеДобавлено: 16 янв 2018, 12:45 
Заглядывает иногда

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 127
rmb писал(а):
ну сейчас посижу, посмотрю на одну строку, потуплю в монитор может придет озарение) но пока это выше моего понимания

Очень хорошо помогает прямо на бумажке "выполнять" вашу программу. И начинайте с простого. Зачем сразу в функцию адрес структуры передавать? Можно было просто в цикле for этот массив заполнить. Оптимизацию отключите и сосредоточьтесь на правильности кода. Корректный код оптимизация не испортит.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR Studio
СообщениеДобавлено: 16 янв 2018, 13:23 
Только пришел

Зарегистрирован: 15 янв 2018, 17:18
Сообщения: 11
я согласен. на АСМе я так порой и делал - там все до безобразия понятно - что написал, то и получи. тут как то по-другому


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR Studio
СообщениеДобавлено: 16 янв 2018, 14:16 
Заглядывает иногда

Зарегистрирован: 10 фев 2016, 19:55
Сообщения: 183
Цикл 'do ... while()' -- это цикл с постусловием: сначала выполняем, а потом проверяем.
Код:
while(1)
{
   do
   {
      pushBuf(&dfr, 10);
      i++;
   } while (i < 10);
}

  1. Сначала входим в цикл 'while(1)', потом в цикл 'do .. while', цикл 'do ... while' будет крутиться пока 'i < 10'.
  2. После выходим из цикла.
  3. Далее проверка 'while(1)' -- бесконечный цикл.
  4. Далее опять входим в цикл 'do ... while', вызываем 'pushBuf' -- уже с переполнением, увеличиваем i -- становится равно 11 (12, 13, 14 и т.д.) .
  5. Проверяем 'while (i < 10)', 'i' при этом уже 11 -- условие не выполняется выходим из цикла.
  6. Переходим в пункт 3 и далее до бесконечности.
При оптимизации компилятор должен выкинуть 'do ... while' как бесполезный.
Оставить только:
Код:
while(1)
{
   pushBuf(&dfr, 10);
}


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR Studio
СообщениеДобавлено: 16 янв 2018, 14:32 
Только пришел

Зарегистрирован: 15 янв 2018, 17:18
Сообщения: 11
Спасибо Тебе добрый человек! это довольно показательно и будет мне наукой.
я понял, вся соль в строке: bf->arr[bf->enInd++]=Item;
по моей логике поле enInd должно увеличиваться. по факту элементы массива выбираются правильно, но сама переменная в структуре не меняется - это меня вводит в ступор.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR Studio
СообщениеДобавлено: 16 янв 2018, 15:00 
Заглядывает иногда

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 127
rmb писал(а):
там все до безобразия понятно - что написал, то и получи. тут как то по-другому

Вы не поверите, тут тоже самое - что написал то и получил. Фигню написал - фигню получил. :)

Ну вот, к примеру, Sphynx55 на той странице выкладывал
Код:
char mc_cr_getchar()
{
   switch(mc_cr_src){
      case cr_src_usart:{
         char temp;
         while(MCU_RX_Get(&temp)){
            mc_core_stat = cr_wait ;
            asm("sleep");
            mc_core_stat = cr_busy ;
         }
         if (temp==';')mcu_com_task();
         return temp;
      } break;
      default : {}
   }
}

Ну ведь каша в голове у писавшего это. Уберу шелуху, чтобы было наглядней
Код:
char mc_cr_getchar()
{
  switch(mc_cr_src)
  {
    case cr_src_usart:   
      сhar temp;
      while(MCU_RX_Get(&temp))
      {
        mc_core_stat = cr_wait ;
        asm("sleep");
        mc_core_stat = cr_busy ;
      }
      if (temp==';') mcu_com_task();
      return temp;
  }
}

С ходу вопрос: что вернёт функция, если mc_cr_src чудесным образом не будет равна cr_src_usart? Хорошо было бы mc_cr_src передать параметром в функцию. Да, накладные расходы, но так лучше. Кстати, хорошим тоном будет cr_src_usart написать CR_SRC_USART, чтобы видно было что это не переменная. То же самое с cr_wait и cr_busy.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR Studio
СообщениеДобавлено: 16 янв 2018, 15:09 
Старожил
Аватара пользователя

Зарегистрирован: 05 фев 2013, 00:58
Сообщения: 2813
Откуда: Тольятти
rmb писал(а):
потуплю в монитор может придет озарение

Делайте как я. За день набираете вопросов. На какие-то удаётся ответить, на какие-то нет. Вечером перед сном акцентируете на тех загадках, решить которые не удалось. И ложитесь спать. Утром просыпаетесь, вспоминаете проблему и вдруг обнаруживаете в голове её готовое решение. Мозг работает всю ночь. Может быть, не так быстро, как днем, но и не совсем бездействует. Но продукцию выдаёт, только если загружены исходные данные.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR Studio
СообщениеДобавлено: 16 янв 2018, 17:34 
Заглядывает иногда

Зарегистрирован: 10 фев 2016, 19:55
Сообщения: 183
rmb писал(а):
я понял, вся соль в строке: bf->arr[bf->enInd++]=Item;
по моей логике поле enInd должно увеличиваться. по факту элементы массива выбираются правильно, но сама переменная в структуре не меняется - это меня вводит в ступор.

Не знаю как код выглядит сейчас, но судя по скриншоту (вкладка с дизассемблированным кодом) в массив 'arr[10]' укладывается число '10' в позицию, задаваемую значением поля 'enInd', затем поле 'enInd' инкрементируется (правда в качестве памяти, хранящей значение поля 'enInd' используется регистр R24 и значение этого регистра обратно в память не сохраняется, т.к. компилятор так с оптимизировал код. А сделал он так потому, что нет такой необходимости в соответствии с логикой Си-шной программы -- поле 'enInd' больше ни где не используется, поэтому зачем тратить время на сохранение его значения обратно в память из регистра R24.). Чтобы значение поля 'enInd' поменялось в памяти нужно в Си-шном коде далее каким-то образом это значение использовать (при чём так, чтобы компилятор опять не "соптимизировал").


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR Studio
СообщениеДобавлено: 16 янв 2018, 17:37 
Заглядывает иногда

Зарегистрирован: 10 фев 2016, 19:55
Сообщения: 183
iev91 писал(а):
rmb писал(а):
потуплю в монитор может придет озарение

Делайте как я. За день набираете вопросов. На какие-то удаётся ответить, на какие-то нет. Вечером перед сном акцентируете на тех загадках, решить которые не удалось. И ложитесь спать. Утром просыпаетесь, вспоминаете проблему и вдруг обнаруживаете в голове её готовое решение. Мозг работает всю ночь. Может быть, не так быстро, как днем, но и не совсем бездействует. Но продукцию выдаёт, только если загружены исходные данные.

Рабочий метод.
Бывает бьёшься над решением несколько дней, а потом с утра под душем -- "Б**, вот же оно - решение-то!!!".


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR Studio
СообщениеДобавлено: 16 янв 2018, 20:21 
Заглядывает иногда

Зарегистрирован: 19 июн 2013, 08:23
Сообщения: 57
Show

Почему каша, мне кажется все понятно, и ничего лишнего.
Код:
Получить символ:
   Если текущий источник USART, то проверим буфер.
      Если буфер пустой, то поставим маркер что процесс находится в ожидании,
         и уснем чтоб не кушать батарею.
      Как только получили символ из буфера проверим не бряк ли это (';').
         Если бряк, то полностью перезапустим процесс.
         Если нет, то вернем полученный символ обработчику.
      Все, выходим.   
   Если источник не USART, то просто выходим, на текущий момент это не реализовано.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR Studio
СообщениеДобавлено: 16 янв 2018, 22:52 
Заглядывает иногда

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 127
Sphynx55 писал(а):
Почему каша, мне кажется все понятно, и ничего лишнего.

1. Зачем между case: и break код заключён в {} ?
2. Зачем после return стоит break ?
3. Зачем ничего не делающий default ?
4. Что возвращает функция ясли ни одна ветка switch не сработает?
Мне кажется для 10 строчек кода слишком много несуразностей.

Вы варнинги компилятора в /dev/null перенаправили?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR Studio
СообщениеДобавлено: 16 янв 2018, 23:22 
Заглядывает иногда

Зарегистрирован: 10 фев 2016, 19:55
Сообщения: 183
В логику работы не вдавался -- может и есть какие косяки, а так:
VladislavS писал(а):
1. Зачем между case: и break код заключён в {} ?

Внутри блока '{}' объявлена временная переменная 'temp', фигурные скобки ограничат область видимости этой переменной.
VladislavS писал(а):
2. Зачем после return стоит break ?

Привычка писать 'break' после каждого 'case' -- у меня тоже такая привычка есть.
VladislavS писал(а):
3. Зачем ничего не делающий default ?

Затем, что в "переключателе" должны обрабатываться все случаи. default -- для всех остальных.
VladislavS писал(а):
4. Что возвращает функция ясли ни одна ветка switch не сработает?

Это ошибка. defaut должен был за это отвечать.
VladislavS писал(а):
Мне кажется для 10 строчек кода слишком много несуразностей.

Всего одна несуразность, связанная с возвратом из функции.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR Studio
СообщениеДобавлено: 16 янв 2018, 23:43 
Заглядывает иногда

Зарегистрирован: 13 янв 2018, 21:36
Сообщения: 127
Netzschlange писал(а):
Внутри блока '{}' объявлена временная переменная 'temp', фигурные скобки ограничат область видимости этой переменной.

Вы сами то в это верите? После использования глобальной mc_cr_src автор локальной temp область видимости ограничил. Ага, ага :D О чем вам говорит вот это - default: {} ?

Netzschlange писал(а):
Привычка писать 'break' после каждого 'case' -- у меня тоже такая привычка есть.

Ещё раз верю. Особенно когда у default по привычке break не обнаружен.

Netzschlange писал(а):
Затем, что в "переключателе" должны обрабатываться все случаи. default -- для всех остальных.

Того то я вижу прямо кучу случаев. Аж один. Ну да ладно, к этому я не придирался - понятно, что это заготовка на будущее.

Извините за грубость, но это и есть говнокод в чистом виде.


Последний раз редактировалось VladislavS 17 янв 2018, 00:32, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR Studio
СообщениеДобавлено: 17 янв 2018, 00:06 
Заглядывает иногда

Зарегистрирован: 10 фев 2016, 19:55
Сообщения: 183
VladislavS писал(а):
это и есть говнокод в чистом виде.

Здесь Вы слишком заблуждаетесь.
Если ставить лишние скобки, break'и, табуляции и т.п. -- это можно отнести к говно-стилю оформления кода, но ни как к говно-коду.
А вот, например, если Вы в объявлении функции укажете, что она принимает только один параметр типа 'char *', а в самой функции с таким параметром будете работать как со строкой определённой длины. Или Ваша функция будет возвращать указатель на память, выделенной (malloc, new) внутри этой самой функции. То вот это и есть говно-код.
Это всего лишь пара примеров реального говно-кода, коих великое множество...


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: AVR Studio
СообщениеДобавлено: 17 янв 2018, 00:18 
Заглядывает иногда

Зарегистрирован: 10 фев 2016, 19:55
Сообщения: 183
VladislavS писал(а):
Извините за грубость, но это и есть говнокод в чистом виде.

Пока сочинял предыдущее сообщение Вы изменили свой пост, поэтому несколько дополнительных комментариев:
VladislavS писал(а):
Вы сами то в это верите? После использования глобальной mc_cr_src автор локальной temp область видимости ограничил.

Относительно верю (ещё раз повторю -- всю логику не смотрел). Переменная 'mc_cr_src' используется в качестве ключа для 'switch', А переменная 'temp' локальная внутри определённого 'case'. Если в кавычки '{}' не включить, то область видимости выйдет за пределы 'case', в котором объявлена переменная.
VladislavS писал(а):
Ещё раз верю. Особенно когда у default по привычке break не обнаружен.

У default оператор break не нужен. default всегда располагается последним в switch.
VladislavS писал(а):
Того то я вижу прямо кучу случаев. Аж один. Ну да ладно, к этому я не придирался - понятно, что это заготовка на будущее.

Не важно сколько случаев. И Вы правы код похож на заготовку с учетом будущего рефакторинга.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 107 ]  На страницу Пред.  1, 2, 3, 4, 5  След.

Часовой пояс: UTC + 5 часов


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB